最近在用WSL2,得益于今天有个算能科技的讲座,于是又掏出了duo板卡玩一玩,想着在WSL2上配置一下,遇到了不少问题,在此记录一下。
1、环境配置
首先WSL2的ubuntu默认无法访问宿主机的USB设备,也不能识别SD卡等。
这就需要用到usbipd-win
这个项目。
usbipd-win:USB/IP项目旨在开发一种通用的通过IP网络共享USB设备的系统。为了让计算机之间能够共享USB设备并完全发挥它们的功能,USB/IP将“USB I/O消息”封装到TCP/IP数据包中,并在计算机之间传输它们。说白了就是把USB封装在TCP中,通过网络传送。
先在windows中打开powershell使用以下命令来安装usbipd工具:
winget install --interactive --exact dorssel.usbipd-win
再到WSL2中使用使用以下命令来安装usbipd工具:
sudo apt install linux-tools-generic hwdata
sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*-generic/usbip 20
重启下电脑~
然后再来解决第二个问题:重新编译WSL2的内核,加入 USB 存储设备支持。
首先我们需要到WSL2的内核仓库中clone一份内核源码:
git clone https://github.com/microsoft/WSL2-Linux-Kernel.git
默认已经是解压好的
然后就要安装一系列编译源码所需的环境
sudo apt install libncurses-dev
libncurses-dev:libncurses-dev是一个开发库,用于在Linux系统上开发基于终端的用户界面(TUI)应用程序。它是ncurses库的开发版本,提供了编译和链接TUI应用程序所需的头文件和静态库文件。使用libncurses-dev,开发人员可以利用ncurses库的功能创建具有交互性和可视化效果的终端应用程序。
继续装环境
sudo apt install build-essential flex bison libssl-dev libelf-dev dwarves
装各种
sudo apt install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison dwarves
上面的工具编译4.x的内核足够了,但是5.13之后的还需要一些别的工具
sudo apt install zstd
#5.13之后支持zstd压缩
2、编译工作
然后进入目录
cd WSL2-Linux-Kernel
使用以下命令来编辑内核配置文件:
make menuconfig KCONFIG_CONFIG=Microsoft/config-wsl
进入 Device Drivers -> USB support -> Support for Host-side USB ,选中 USB Mass Storage support( * 号是直接编译进内核,M 是编译为内核模块,内核模块需要手动加载)。
此外我们还需要开启RNDIS驱动
https://zhuanlan.zhihu.com/p/540395760
一般的发行版都已经安好了,但是WSL2中的没有
它位于
│ Prompt: Host for RNDIS and ActiveSync devices (EXPERIMENTAL) │
│ Defined at drivers/net/usb/Kconfig:234 │
│ Depends on: NETDEVICES && USB && NET && USB_USBNET && EXPERIMENTAL │
│ Location: │
│ -> Device Drivers │
│ -> Network device support (NETDEVICES [=y]) │
│ -> USB Network Adapters │
│ -> Multi-purpose USB Networking Framework (USB_USBNET [=m]) │
将Multi-purpose USB Networking Framework这一项选为 M(模块)
开始编译kernel (我的机器是12核)
LOCALVERSION= make KCONFIG_CONFIG=Microsoft/config-wsl -j12
将编译得到的镜像文件,文件在arch/x86/boot/文件夹下(好像默认是这个bzImage,如果找不到这个再找找别的)复制出来,放在 Windows 的用户目录(默认是 C:\Users{username})下创建一个名为 .wslconfig 的文件,内容根据 微软官方文档 来:
[wsl2]
kernel=path\\to\\kernel
然后关闭WSL2,wsl --shutdown
,再打开即可。
管理员魔术的powershell中运行 usbipd wsl list
,即可找到对应设备,
usbipd wsl attach --busid <busid>
我这里是usbipd wsl attach --busid 1-1
,即可将该设备挂到WSL2中。
最后到WSL2中使用下面使用下面这2个命令来查看USB设备和SD卡的挂载情况:
lsusb
ls /dev/sd*
断开WSL2中的USB设备:
1、直接物理拔出设备
2、在管理员powershell中运行usbipd wsl detach --busid <busid>
3、RNDIS驱动模块
然后我们要处理RNDIS相关的问题了~~
安装模块(很重要!!)
sudo LOCALVERSION= make KCONFIG_CONFIG=Microsoft/config-wsl modules_install -j12
完成后就会在/lib/modules
下面又一个版本号对应的文件夹
然后挂载一下USB,RNDIS相关模块
sudo depmod
modprobe rndis_host
,它将安装 rndis_host.ko
和usbnet.ko
通过lsmod | grep rndis_host
看到类似以下内容表示成功。
rndis_host 10433 0
cdc_ether 9793 1 rndis_host
usbnet 19913 2 rndis_host,cdc_ether
这样就装好了RNDIS驱动
在命令行中输入 dmesg ,如此出现 rndis_host 1-1:1.0 eth1 这样的打印,则证明已经识别到了。
但是如果是ifconfig
依然看不到和duo的以太网,通过ifconfig -a
发现了名为usb0
的网络,但是没有IP。因此可以通过dhcp获取一下,需要安装dhcpc。
然后获取IP:udhcpc -i usb0
最终获得成功!
至此,就可以用ping 192.168.42.1来测试访问duo了,^ _ ^。