IMX6ULL的程序烧录可以通过官方的烧录工具直接烧录到SD卡中, 但是需要在Linux环境下运行烧录脚本,这就需要SD卡可以被WSL2识别到。而WSL2中连接外部usb存储设备存在两个坑
1.WSL2本质是一个虚拟机,无法直接访问宿主机的USB设备。
2.WSL2的内核没有加入USB存储设备的驱动
我们来逐一解决
系统:Win11 23H2
WSL2: Ubuntu24.04
一、WSL连接USB设备
通过查阅资料,发现微软提供了usbipd-win来解决WSL连接usb的问题
usbipd-win:USB/IP项目旨在开发一种通用的通过IP网络共享USB设备的系统。为了让计算机之间能够共享USB设备并完全发挥它们的功能。实现的方式是用TCP将USB封装一下,再通过网络传输。
1.在windows中安装usbipd
打开管理员终端,使用如下命令安装usbipd,安装完成后重启计算机。
winget install --interactive --exact dorssel.usbipd-win
2.在Ubuntu安装usbipd
进入Ubuntu中,键入如下命令,安装所需工具。安装前先更新最新的包信息索引列表。
sudo apt update
sudo apt-get install usbutils hwdata linux-tools-generic
sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*-generic/usbip 20
安装完成后在windows终端中重启wsl
wsl --shutdown
wsl
3.验证
插入usb设备,windows终端中输入usbipd list,列出所有连接到Windows的usb设备
usbipd list
我插入的是SD卡,也就是BUSID为2-3的设备,可以看到状态为Not shared,未分享。下面键入命令usbipd bind -b <busid>来分享此设备。
usbipd bind -b <busid>
状态变为Shared后,键入命令usbipd attach --wsl -b <busid>,将设备添加到WSL中
usbipd attach --wsl -b <busid>
若添加不成功则重新共享,多试几次,直到状态变为Attached。添加成功后在ubuntu中键入lsusb命令,获取USB设备列表,查看是否添加成功。
lsusb
发现ID与windows中的USB大容量存储设备一致,说明WSL中已经可以识别到这个USB。至此我们已经成功了一半。
通过sudo fdisk -l命令,列出所有Ubuntu识别到的磁盘分区表。
sudo fdisk -l
发现分区表中并未如预期出现ssd设备,这是因为WSL的内核中默认并未添加相关的USB驱动,需要我们重新编译一下WSL内核,加入USB驱动。
4.扩展(与本文主要内容无关)
#从WSL中断开指定的usb
usbipd detach --busid <busid>
#停止共享指定的usb设备
usbipd unbind -b <busid>
二、WSL添加USB驱动
1.从WSL2的内核仓库中获取内核源码,并安装必要工具
将内核源码clone到Ubuntu中。
git clone https://github.com/microsoft/WSL2-Linux-Kernel.git
注意,源码包当前分支默认内核版本和最新的Linux内核相同,若使用的不是Ubuntu最新版本(Ubuntu24.04),还需在下载完成后执行如下命令,checkout对应的内核版本。
cd WSL2-Linux-Kernel
git checkout linux-msft-wsl-$(uname -r | cut -d- -f1)
安装必要的编译工具,安装前先更新最新的包信息索引列表。
sudo apt update
sudo apt install libncurses-dev build-essential flex bison libssl-dev libelf-dev dwarves
2.修改内核编译选项,编译WSL内核
在源码Makefile所在目录中执行make menuconfig,编辑内核配置文件
make menuconfig KCONFIG_CONFIG=Microsoft/config-wsl
进入 Device Drivers -> USB support -> Support for Host-side USB ,选中 USB Mass Storage support(* 号是直接编译进内核,M 是编译为内核模块,内核模块需要手动加载)
把下面弹出来的一堆驱动都选上*,保存完之后就可以退出了,注意左上角的内核版本,之后验证时会用到。
键入如下命令,开始编译内核,编译完成的内核是bzImage文件,文件名称在编译命令中可配置,编译出的内核文件在arch/x86/boot/文件夹下。编译完成后将编译好的内核copy到windows目录。
make -j$(nproc) bzImage KCONFIG_CONFIG=Microsoft/config-wsl
3.修改wsl配置文件,加载指定的内核
修改用户目录(C:\Users\{username})下的.wslconfig文件(没有则新建),添加如下内容,其中的<bzImage path>替换为刚刚copy到windows的内核所在文件路径。
[wsl2]
kernel=<bzImage path>
4.验证结果
首先在Windows终端中重启WSL
wsl --shutdown
wsl
进入Ubuntu后输入uname -r命令,查看当前内核版本,是否与编译的内核版本对应(编译的内核版本可在前文中选择USB驱动的图片中找到)。
uname -r
可以看到获取到的内核版本与编译的版本一致。再次将SD卡通过usbipd添加到WSL中,执行sudo fdisk -l命令,列出所有磁盘分区表,此时便发现我们的SD卡被列出来了。
sudo fdisk -l
至此,usb的配置已完成。