使用WSL2在Windiows 10上玩AOSP踩坑

关键词: WSL2、Windows Terminal、ADB、虚拟磁盘、zsh、VScode、CUDA

记录WSL2配置环境时的一些注意事项,旨在补充使用细节,非WSL2安装、AOSP编译教程,配置好后即可十分流畅的玩耍,尽管win10上的wsl2使用起来还是有些别扭,但个人非常不习惯win11。

本文命令会在powershell和wsl2之间反复切换

技巧:Windows Terminal 使用时CTRL+Shift+P进入命令,下滑看到拆分窗口选项,可以上下、左右拆分窗口,高效地执行不同的shell命令。

shell.png

输出一个暴论,使用体验:Windows Terminal + WSL2 >= MacOS > Linux双系统 > Linux虚拟机

年轻时喜欢折腾黑苹果啥的,现在老了整不动了,黑历史如下

多系统引导背后的知识:磁盘、分区、文件系统、GPT、UEFI - Kryo - 博客园 (cnblogs.com)

p1.webp

AOSP的下载和编译、Android Studio For Platform(ASFP)的使用请参考其他文章。需要注意的是
WSL1 不支持AOSP编译,请勿浪费时间。

编译AOSP和使用ASFP浏览代码,WSL2 建议Windwos机器48G内存起步,给WSL2分配32GB以上。

aosp.png

扯的有点远了,列出目录,后面想到一些点会补充:

1、WSL2使用ADB

2、挂载磁盘

3、GUI问题

4、代理问题

5、配置zsh小技巧

6、迁移wsl2安装目录

7、串口

8、VScode查看uboot和kernel源码

9、CUDA

Reference

1、WSL2使用ADB

下面介绍如何在wsl2里面使用adb连android设备。

安装usbipd这里直接略过,可自行搜索安装,注意对应usbipd版本和wsl2内核版本。

Windows上执行usbipd list

1
2
3
4
5
6
7
8
9
vbnet复制代码Connected:
BUSID VID:PID DEVICE STATE
1-2 0b05:19af AURA LED Controller, USB 输入设备 Not shared
1-8 0b05:1a16 Realtek USB Audio, USB 输入设备 Not shared
1-14 8087:0026 英特尔(R) 无线 Bluetooth(R) Not shared
1-18 2207:0006 Android ADB Interface Attached
5-3 046d:c09d USB 输入设备 Not shared
5-4 258a:002a USB 输入设备 Not shared
7-4 0403:6001 USB Serial Converter Not shared

官方教程用的busid来挂载,但是每次插拔设备后busid都可能变化,这里推荐用 -i vid:pid的参数来挂载。

把USB设备挂载到WSL2,执行ps命令前需要关闭windows上的Android Studio等使用adb的程序,避免设备被占用,如果命令出现提示重启生效的黄色警告,可以忽略

1
2
3
powershell复制代码#以下命令需要在Window管理员下运行
usbipd bind -f -i 2207:0006
usbipd attach --wsl --hardware-id 2207:0006

执行完毕后,就可以在wsl2里面使用usb设备了

1
2
3
4
yaml复制代码$lsusb                              
Bus 002 Device 002: ID 2207:0006 Fuzhou Rockchip Electronics Company rk3399-Android11
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

如果不再使用,用下ps面命令还原为windows使用USB设备,这里比较坑的是如果不从wsl2里面卸载usb,windows睡眠唤醒后usb设备会在wsl2里面卡死

1
2
3
powershell复制代码#以下命令需要在Window管理员下运行
usbipd unbind -i 2207:0006
usbipd detach -i 2207:0006

2、挂载磁盘

在repo拉去aosp源码前,创建一个单独的磁盘来保存,建议不定期备份wsl2

不建议直接在wsl2系统的磁盘里放代码等资源,建议把aosp源码或者其他git项目放在独立磁盘。

1、Windows + X打开磁盘管理,选择任意磁盘,点击操作创建虚拟硬盘,选择VHDX和动态扩展,大小500G(看你需求,编译AOSP推荐不小于500G)

vhdx.png

2、K:\WSL\EXT\android11.vhdx 是我创建的磁盘路径,使用ps命令attach:

1
powershell复制代码Write-Output "\\.\PhysicalDrive$((Mount-VHD -Path K:\WSL\EXT\android11.vhdx -PassThru | Get-Disk).Number)"

命令返回得到挂载点\\.\PhysicalDrive5,一般创建磁盘后会默认attach到windows,用GET-CimInstance -query "SELECT * from Win32_DiskDrive"命令查询也可以看到虚拟磁盘

3、ps命令挂载到wsl2

1
powershell复制代码wsl --mount \\.\PhysicalDrive5 --bare

4、wsl2内运行lsblk查看挂载的磁盘为sde,这一步看仔细点,要格式化了

1
2
sh复制代码# 格式化为ext4
sudo mkfs -t ext4 -i 12000 /dev/sde

5、ps命令从wsl2卸载磁盘

1
powershell复制代码wsl.exe --unmount \\.\PhysicalDrive5

6、再次挂载磁盘到wsl2,挂载目录/mnt/wsl/repo:

1
powershell复制代码wsl --mount \\.\PhysicalDrive5 -t ext4 --name repo

wsl进入磁盘cd /mnt/wsl/repo

7、开机自动挂载磁盘

更改vhdx文件权限,选择用户User(当前用户),编辑权限允许的都勾了

chmod.png

WIN + R后运行shell:startup,创建wsl-startup.vbs文件

1
2
vbs复制代码set ws=wscript.CreateObject("wscript.shell")
ws.run "wsl --mount --vhd K:\WSL\EXT\android11.vhdx", 0

重启可以自动挂载磁盘

3、GUI问题

WSL2安装GUI很简单,只用执行以下命令即可,不建议安装完整的gnome和xface

1
bash复制代码sudo apt install nautilus -y

点一下WIN键看看,wsl2安装的gui程序系统会自动帮你把启动快捷方式放入Windows的启动菜单,直接双击启动即可,完全不需要Linux下的Desktop。

menu.png

SO

p2.png

如果GUI显示有问题可以尝试安装mesa驱动:

1
2
3
bash复制代码sudo add-apt-repository ppa:kisak/kisak-mesa
sudo apt-get update && sudo apt dist-upgrade
sudo apt install mesa-utils

4、代理问题(仅Win10需要,Win11有网络镜像模式应该可以不用配置)

4.1、代理服务器配置

WSL2安装后ipconfig.exe查看WSL网络桥接:

1
2
3
4
5
6
7
arduino复制代码以太网适配器 vEthernet (WSL):

连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::76be:f5ab:fb9b:2a17%52
IPv4 地址 . . . . . . . . . . . . : 172.19.80.1
子网掩码 . . . . . . . . . . . . : 255.255.240.0
默认网关. . . . . . . . . . . . . :

每次Windows系统重启后需要管理员运行命令解除Firewall限制,不然ping不通,如果有能永久生效的方案,请告诉我

1
powershell复制代码New-NetFirewallRule -DisplayName "WSL" -Direction Inbound  -InterfaceAlias "vEthernet (WSL)"  -Action Allow

wsl2内ping 172.19.80.1,如果ping的通执行下面的步骤,ping不同检查网络适配器名字、ip、防火墙

把这几行加到bashrc里面:

1
2
3
bash复制代码export hostip=172.19.80.1
export https_proxy="http://${hostip}:7890"
export http_proxy="http://${hostip}:7890"

4.2、自定义DNS

wsl2编辑/etc/wsl.conf,添加如下配置禁用dns自动生成

1
2
ini复制代码[network]
generateResolvConf=false

我的/etc/wsl.conf如下

1
2
3
4
5
6
7
conf复制代码[boot]
systemd=true
[network]
generateResolvConf=false
[interop]
enabled=false
appendWindowsPath=false # 不使用window的path执行windows上的程序

编辑/etc/resolv.conf,添加你喜欢的dns服务器,示例:

1
2
conf复制代码nameserver 114.114.114.114
nameserver 114.114.114.115

wsl –shuntdown 重启子系统,bash进入拉起子系统,看看能不能Google了

5、配置zsh后需要做的工作,直接输入zsh进入WSL

关于zsh的配置文章也烂大街了,zsh配置后,怎么在windows terminal快速以zsh打开参考以下配置:

配置powershell永久别名
原文链接:blog.csdn.net/qq_37186947…

1、首先使用Test-Path $profile查看是否有 profile 文件, 如果显示 flase 则执行2

2、New-Item -path $profile -itemtype file -Force 返回一个目录,去打开编辑这个文件

3、文件添加以下内容

1
ps复制代码function zsh {wsl -d Ubuntu-22.04 zsh}

4、打开管理员powershell,允许执行未签名的脚本

1
powershell复制代码set-executionpolicy remotesigned

5、重新打开一个 Powershell, 别名即可使用zsh进入WSL2的zsh终端

6、如果不想配置以上脚本,可以直接在Windows Terminal里面加一个新的窗口配置:

term.png

6、迁移WSL2安装目录

1
2
3
4
5
6
7
8
powershell复制代码# 导出/备份
wsl --export Ubuntu-22.04 K:\WSL\Ubuntu-22.04\Ubuntu-22.04.tar

# 导入/还原
wsl --import Ubuntu K:\WSL\Ubuntu-22.04 K:\WSL\Ubuntu-22.04\Ubuntu-22.04.tar --version 2

# 迁移完成后还原用户名,不然进入是root用户
Ubuntu-22.04 config --default-user kryo

7、串口

Windows可以同时运行wsl1和wsl2

1
2
3
4
5
sql复制代码PS C:\Users\Kryo> wsl -l -v
NAME STATE VERSION
* Ubuntu-22.04 Running 2
Ubuntu-18.04 Stopped 2
Ubuntu Running 1

wsl1能直接访问windows对应的com口,minicom可配置如下:

com.png

Q: 为什么不直接使用windows上的串口工具?

A: 可能是RockPi4 console 1.5m的波特率太大原因,几乎所有工具都显示乱码,而wsl1下的minicom正常

8、VScode查看uboot和kernel源码

Android内核和其他内核配置差不多,直接参考:

blog.csdn.net/Telly_/arti…

愉快的阅读kernel代码

vscode.png

9、CUDA

没错,这篇文章把CUDA配置也顺便讲了,简单来说,完全不需要再WSL2上配置任何东西,只需要在Windows上装好CUDA驱动,WSL2也能敲nvidia-smi

cuda.png

AND

py.png

p3.jpg

Reference

1、WSL 中的高级设置配置 learn.microsoft.com/zh-cn/windo…

未完待续

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%