编译自定义Linux内核,使WSL支持访问Windows下USB设备
版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/
WSL 本身并不支持连接 USB 设备,因此你需要安装开源 usbipd-win 项目。
usbip 可以让你在网络上共享和使用 USB 设备。它由两个主要组件组成:
usbipd (USB/IP daemon):服务端,负责共享连接到主机的 USB 设备。
usbip (USB/IP client):客户端,允许其他计算机访问共享的 USB 设备。
1. 安装USBIPD-WIN
USBIPD-WIN 是一个在 Windows 上实现 USB/IP 协议的工具。首先,你需要在 Windows 上安装这个工具。
下载并安装 usbipd-win,可以从GitHub页面获取最新版本的安装包。
或者执行下面命令安装
winget install usbipd
2. 列出所有可以共享的USB设备
usbipd list
3. 共享设备
在附加 USB 设备之前,必须使用命令 usbipd bind 来共享设备,从而允许它附加到 WSL( 需要管理员权限)。
usbipd bind --busid 2-6
这里的 2-6 是 USB 设备对应的 BUSID
4. 将USB设备连接到WSL
使用 usbipd attach 命令将指定的USB设备附加到WSL实例中。
usbipd attach --wsl --busid 2-6
打开 Ubuntu(或首选的 WSL 命令行),使用以下命令列出附加的 USB 设备
lsusb
你应会看到刚刚附加的设备,并且能够使用常规 Linux 工具与之交互。
5. 安装USBIP
在 WSL 环境下,usbip 允许你在 Linux 子系统中访问连接到 Windows 主机的 USB 设备。
可通过以下两种方式之一实现:
编译自定义 Linux 内核,以支持特定的 USB 驱动程序
或者单独编译安装 usbip 模块
5.1 编译自定义Linux内核
安装编译内核所需的依赖项
sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev autoconf libudev-dev libtool bc
下载内核源代码,通过 uname -r 命令查看 Linux 内核版本,checkout 对应的版本
git clone https://github.com/microsoft/WSL2-Linux-Kernel.git
cd WSL2-Linux-Kernel
git checkout linux-msft-wsl-5.15.153.1
将当前内核配置复制到新环境中
cp /proc/config.gz config.gz
gunzip config.gz
mv config .config
复制完成后可以通过 ls -al 命令查看当前目录所有文件,检查是否复制成功
使用 menuconfig 菜单选择需要的内核功能(也可以通过修改.config文件实现),特别是 USB 支持相关的选项
sudo make menuconfig
选择以下内核选项:
Device Drivers -> USB Support
Device Drivers -> USB Support -> USB announce new devices
Device Drivers -> USB Support -> USB Modem (CDC ACM) support
Device Drivers -> USB Support -> USB/IP
Device Drivers -> USB Support -> USB/IP -> VHCI HCD
Device Drivers -> USB Support -> USB/IP -> Debug messages for USB/IP
Device Drivers -> USB Serial Converter Support
Device Drivers -> USB Serial Converter Support -> USB FTDI Single port Serial Driver
使用多线程编译内核
sudo make -j 8 && sudo make modules_install -j 8 && sudo make install -j 8
配置 WSL 使用自定义内核 将生成的内核镜像复制到 Windows 中,并在 .wslconfig 文件中指定该内核
cp arch/x86/boot/bzImage /mnt/e/usbip-bzImage
然后编辑 /mnt/c/Users//.wslconfig 文件,添加以下内容
[wsl2]
kernel=E:\\usbip-bzImage
通过以上步骤,WSL 2 将使用你自定义编译的内核来支持额外的驱动程序,特别是 USB 相关的功能。
重启 wsl 使配置生效
wsl --shutdown
5.2 编译 USBIP 工具
安装编译内核所需的依赖项
sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev autoconf libudev-dev libtool bc
编译 USBIP 工具
cd tools/usb/usbip
sudo ./autogen.sh
sudo ./configure
sudo make install -j 12
将 USBIP 工具库复制到 USBIP 可以访问到的位置
sudo cp libsrc/.libs/libusbip.so.0 /lib/libusbip.so.0
7. 卸载USB设备
如果需要卸载设备,可以使用以下命令
# 卸载挂载
usbipd detach --busid 2-6
# 取消设备共享
usbipd unbind --busid 2-6
8. USB挂载快捷方式
编写一个 wsl_usb_attach.bat 脚本,每次需要挂载 USB 到 WSL 中时只需要点击以下脚本就可以了。
@echo off
REM Check if the script is run as an administrator
net session >nul 2>&1
if %errorLevel% == 0 (
echo Running as administrator
) else (
echo Please run this script as an administrator!
pause
exit /B 1
)
REM Run the usbipd commands
usbipd list
usbipd bind --busid 2-6
usbipd attach --wsl --busid 2-6
echo Commands executed successfully!
pause
由于 usbipd bind 命令需要以管理员身份执行,所有可以给脚本创建一个快捷方式,右键【属性】【快捷方式】【高级】【用管理员身份运行】,实现点击快捷方式直接以管理员身份运行。
参考: