【WSL 2】在 Windows10 上配置 WSL 2 连接 USB 设备 D435i

  • 1 Notes
  • 2 安装 USBIPD-WIN
  • 3 连接 USB 设备
  • 4 编译 WSL 2 内核
  • 5 什么是 .wslconfig 文件
  • 6 使用 D435i 测试
  • 6.1 安装 cheese
  • 6.2 测试


1 Notes

  • WSL 现在通过 Microsoft Store 同时支持 Windows10 和 Windows11,这意味着 Windows10 用户现在可以访问最新的内核版本,而无需从源码编译
  • 如果无法更新到 Microsoft Store 支持的 WSL 版本并自动接收内核更新,则需要自己编译生成已启用 USBIP 的 WSL 2 内核

如果想要可视化的配置教程,可以参考此视频: Video

2 安装 USBIPD-WIN

参考文档:Link

WSL 2 本身并不支持连接 USB 设备,所以需要安装 usbipd-win

安装包下载: Link,下载 .msi 文件,双击安装。

计算机USB接口外接一个摄像头opencv2_Ubuntu

3 连接 USB 设备

参考文档:Link

在连接 USB 设备之前,请确保 Ubuntu Distribution 命令行已打开,以保持 WSL 2 处于活动状态。

  1. 管理员模式打开 PowerShell 并输入以下命令
usbipd list

计算机USB接口外接一个摄像头opencv2_ide_02

  1. 复制要连接到 WSL 2 的设备的 BUSID,例如上图中的 1-14
  2. 共享设备,使其能连接到 WSL 2
usbipd bind --busid <busid>

使用 usbipd list 命令验证设备是否已共享,如下图:

计算机USB接口外接一个摄像头opencv2_windows_03

  1. 连接 USB 设备

请注意,只要 USB 设备连接到 WSL 2,Windows 就无法使用它。

usbipd attach --wsl --busid <busid>

计算机USB接口外接一个摄像头opencv2_ide_04

使用 usbipd list 命令验证设备是否已连接,如下图:

计算机USB接口外接一个摄像头opencv2_Ubuntu_05

  1. 打开 Ubuntu Distribution 命令行,列出所连接的 USB 设备
lsusb

下图是连接 USB 设备的前后对比。

计算机USB接口外接一个摄像头opencv2_windows_06

可能有些应用需要 sudo 才能使用此 USB 设备,后续可以通过配置 udev 规则,以允许非 root 用户访问设备。

  1. 使用完后,可物理断开 USB 设备,或在 PowerShell 中执行 usbipd detach --busid <busid>

下次连接时,只需打开 PowerShell 并输入命令 usbipd attach --wsl --busid <busid>,但要确保 Ubuntu Distribution 命令行已打开,以保持 WSL 2 处于活动状态,否则会有报错,如下图:

计算机USB接口外接一个摄像头opencv2_服务器_07

4 编译 WSL 2 内核

在 WSL 2 中 lsusb 可以看到 USB 设备,但是 /dev 文件夹里却没有,比如: /dev/video0

当出现这种情况时,说明需要编译内核来提供驱动,参考文档: Link

  1. 更新 WSL
wsl --update
  1. 确认使用的是 WSL 2
wsl --list --verbose
  1. 打开 Ubuntu Distribution 命令行,安装依赖
sudo apt update
sudo apt upgrade
sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev autoconf libudev-dev libtool
  1. 查询此 Ubuntu Distribution 内核版本
uname -r

计算机USB接口外接一个摄像头opencv2_windows_08

  1. clone 相应版本的 WSL 2 Kernel 源码,我的是 5.15.146.1
git clone https://github.com/microsoft/WSL2-Linux-Kernel.git
cd WSL2-Linux-Kernel
git checkout linux-msft-wsl-5.15.146.1

计算机USB接口外接一个摄像头opencv2_windows_09

  1. 复制当前的配置文件
cp /proc/config.gz config.gz
gunzip config.gz
mv config .config
  1. 确保 .config 文件中设置了 CONFIG_USB=y
vim .config
# /CONFIG_USB=

计算机USB接口外接一个摄像头opencv2_服务器_10

  1. 运行 menuconfig 选择要添加的内核功能
sudo make menuconfig
  • 进入 Device Drivers

计算机USB接口外接一个摄像头opencv2_linux_11

  • Y 选择 USB support,并进入

计算机USB接口外接一个摄像头opencv2_linux_12


Y 选择以下内容,选中后会显示 [*]:

USB announce new devices
USB Modem (CDC ACM) support
USB/IP support
USB/IP support -> VHCI hcd
USB Serial Converter support -> USB FTDI Single Port Serial Driver
  • 退出 USB support,按 Y 选择 Multimedia support,并进入

计算机USB接口外接一个摄像头opencv2_Ubuntu_13


Y 选择以下的选项,选中后会显示 [*]:

Filter media drivers
Media device types -> Cameras and video grabbers
Video4Linux options -> V4L2 sub-device userspace API
Media drivers -> Media USB Adapters -> USB Video Class (UVC)
Media drivers -> Media USB Adapters -> USB Video Class (UVC) -> UVC input events device support
Media drivers -> Media USB Adapters -> GSPCA based webcams
  • 按两次 ESC,选择 Yes 保存并退出

计算机USB接口外接一个摄像头opencv2_linux_14

  1. 编译并安装

运行 getconf _NPROCESSORS_ONLN 查询内核数量,我的是 8

sudo make -j 8 && sudo make modules_install -j 8 && sudo make install -j 8

编译可能需要等待几分钟,完成后,如下图:

计算机USB接口外接一个摄像头opencv2_windows_15

如果编译过程中出现下面的报错:

BTF: .tmp_vmlinux.btf: pahole (pahole) is not available
Failed to generate BTF for vmlinux
Try to disable CONFIG_DEBUG_INFO_BTF

解决方法:

sudo apt install dwarves
  1. 复制镜像
cp arch/x86/boot/bzImage /mnt/c/Users/<user>/usbip-bzImage
  1. /mnt/c/Users/<user>/ 上创建 .wslconfig 文件,并写入以下内容
[wsl2]
kernel=c:\\users\\<user>\\usbip-bzImage
  1. 关闭 Ubuntu Distribution 命令行,打开 PowerShell 关闭 WSL,并连接 USB 设备
wsl --shutdown 
wsl --list --verbose
usbipd attach --wsl --busid <busid>

计算机USB接口外接一个摄像头opencv2_linux_16

  1. 重新打开 Ubuntu Distribution 命令行
lsusb
ls /dev/video*

计算机USB接口外接一个摄像头opencv2_Ubuntu_17

可以发现,编译内核后,连接的 USB 设备就可以在 /dev 中找到。

5 什么是 .wslconfig 文件

参考文档: Link

  • 默认情况下,.wslconfig 文件不存在,并且它必须创建在 %UserProfile% 目录中才能应用这些设置,例如我的路径是 C:\\Users\\chenh\\.wslconfig
  • 只能用于 WSL 2 运行的发行版
  • 为使用 WSL 2 运行的所有已安装 Linux 发行版全局配置设置
  • 更改内容后,需要运行 wsl --shutdown 来关闭 WSL 2 VM,然后重启 WSL 实例以使更改生效

如果在使用其他 WSL 2 的 Linux 发行版时不需要连接 USB 设备,记得要将 .wslconfig 文件的内容用 # 注释掉,如下图:

计算机USB接口外接一个摄像头opencv2_Ubuntu_18

6 使用 D435i 测试

6.1 安装 cheese

sudo apt install cheese

6.2 测试

可以在 Preferences 里修改 Device 和分辨率。

cheese

显示效果如下图:

计算机USB接口外接一个摄像头opencv2_linux_19