使用WLS2在Windiows 10上玩AOSP踩坑
关键词: WSL2、Windows Terminal、ADB、虚拟磁盘、zsh、VScode、CUDA
记录WSL2配置环境时的一些注意事项,旨在补充使用细节,非WSL2安装、AOSP编译教程,配置好后即可十分流畅的玩耍,尽管win10上的wsl2使用起来还是有些别扭,但个人非常不习惯win11。
本文命令会在powershell和wsl2之间反复切换
技巧:Windows Terminal 使用时CTRL+Shift+P进入命令,下滑看到拆分窗口选项,可以上下、左右拆分窗口,高效地执行不同的shell命令。
输出一个暴论,使用体验:Windows Terminal + WSL2 >= MacOS > Linux双系统 > Linux虚拟机
年轻时喜欢折腾黑苹果啥的,现在老了整不动了,黑历史如下
AOSP的下载和编译、Android Studio For Platform(ASFP)的使用请参考其他文章。需要注意的是 WSL1 不支持AOSP编译,请勿浪费时间。
编译AOSP和使用ASFP浏览代码,WSL2 建议Windwos机器48G内存起步,给WSL2分配32GB以上。
扯的有点远了,列出目录,后面想到一些点会补充:
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
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的程序,避免设备被占用,如果命令出现提示重启生效的黄色警告,可以忽略
powershell
#以下命令需要在Window管理员下运行
usbipd bind -f -i 2207:0006
usbipd attach --wsl --hardware-id 2207:0006
执行完毕后,就可以在wsl2里面使用usb设备了
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里面卡死
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)
2、K:\WSL\EXT\android11.vhdx 是我创建的磁盘路径,使用ps命令attach:
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
powershell
wsl --mount \\.\PhysicalDrive5 --bare
4、wsl2内运行lsblk
查看挂载的磁盘为sde
,这一步看仔细点,要格式化了
sh
# 格式化为ext4
sudo mkfs -t ext4 -i 12000 /dev/sde
5、ps命令从wsl2卸载磁盘
powershell
wsl.exe --unmount \\.\PhysicalDrive5
6、再次挂载磁盘到wsl2,挂载目录/mnt/wsl/repo:
powershell
wsl --mount \\.\PhysicalDrive5 -t ext4 --name repo
wsl进入磁盘cd /mnt/wsl/repo
7、开机自动挂载磁盘
更改vhdx文件权限,选择用户User(当前用户),编辑权限允许的都勾了
WIN + R
后运行shell:startup
,创建wsl-startup.vbs
文件
vbs
set ws=wscript.CreateObject("wscript.shell")
ws.run "wsl --mount --vhd K:\WSL\EXT\android11.vhdx", 0
重启可以自动挂载磁盘
3、GUI问题
WSL2安装GUI很简单,只用执行以下命令即可,不建议安装完整的gnome和xface
bash
sudo apt install nautilus -y
点一下WIN键看看,wsl2安装的gui程序系统会自动帮你把启动快捷方式放入Windows的启动菜单,直接双击启动即可,完全不需要Linux下的Desktop。
SO
如果GUI显示有问题可以尝试安装mesa驱动:
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网络桥接:
arduino
以太网适配器 vEthernet (WSL):
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::76be:f5ab:fb9b:2a17%52
IPv4 地址 . . . . . . . . . . . . : 172.19.80.1
子网掩码 . . . . . . . . . . . . : 255.255.240.0
默认网关. . . . . . . . . . . . . :
每次Windows系统重启后需要管理员运行命令解除Firewall限制,不然ping不通,如果有能永久生效的方案,请告诉我
powershell
New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow
wsl2内ping 172.19.80.1,如果ping的通执行下面的步骤,ping不同检查网络适配器名字、ip、防火墙
把这几行加到bashrc里面:
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自动生成
ini
[network]
generateResolvConf=false
我的/etc/wsl.conf如下
conf
[boot]
systemd=true
[network]
generateResolvConf=false
[interop]
enabled=false
appendWindowsPath=false # 不使用window的path执行windows上的程序
编辑/etc/resolv.conf,添加你喜欢的dns服务器,示例:
conf
nameserver 114.114.114.114
nameserver 114.114.114.115
wsl --shuntdown 重启子系统,bash进入拉起子系统,看看能不能Google了
5、配置zsh后需要做的工作,直接输入zsh进入WSL
关于zsh的配置文章也烂大街了,关于wsl2配置后,怎么在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、文件添加以下内容
ps
function zsh {wsl -d Ubuntu-22.04 zsh}
4、打开管理员powershell,允许执行未签名的脚本
powershell
set-executionpolicy remotesigned
5、重新打开一个 Powershell, 别名即可使用zsh进入WSL2的zsh终端
6、如果不想配置以上脚本,可以直接在Windows Terminal里面加一个新的窗口配置:
6、迁移WSL2安装目录
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
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可配置如下:
Q: 为什么不直接使用windows上的串口工具?
A: 可能是RockPi4 console
1.5m
的波特率太大原因,几乎所有工具都显示乱码,而wsl1下的minicom正常
8、VScode查看uboot和kernel源码
Android内核和其他内核配置差不多,直接参考:
愉快的阅读kernel代码
9、CUDA
没错,这篇文章把CUDA配置也顺便讲了,简单来说,完全不需要再WSL2上配置任何东西,只需要在Windows上装好CUDA驱动,WSL2也能敲nvidia-smi
了
AND
Reference
1、WSL 中的高级设置配置 learn.microsoft.com/zh-cn/windo...