WSL2连接miklv-duo板卡

yuanheci 2023年11月29日 241次浏览

最近在用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 是编译为内核模块,内核模块需要手动加载)。

image-1701242632015

此外我们还需要开启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

image-1701243428400

然后关闭WSL2,wsl --shutdown,再打开即可。

管理员魔术的powershell中运行 usbipd wsl list ,即可找到对应设备,
image-1701243558169

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.kousbnet.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
最终获得成功!
image-1701243130269

至此,就可以用ping 192.168.42.1来测试访问duo了,^ _ ^。