版权归作者所有,如有转发,请注明文章出处: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

截图.png

使用多线程编译内核

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 命令需要以管理员身份执行,所有可以给脚本创建一个快捷方式,右键【属性】【快捷方式】【高级】【用管理员身份运行】,实现点击快捷方式直接以管理员身份运行。 image.png

参考: