许多开发者选择 Windows Subsystem for Linux 2 (WSL2) 作为高效的 Linux 开发环境。然而,有时需要将物理 USB 设备,如遵循 UVC (USB Video Class) 标准的摄像头,接入 WSL2 子系统以供 Linux 应用直接调用。默认的 WSL2 内核通常不包含 UVC 驱动支持,因此需要进行内核的重新编译与配置。本文将详细演示在 Windows 11 + WSL2 (Ubuntu 22.04) 环境下,如何通过 USB/IP 工具挂载设备,并编译支持 UVC 的 WSL2 自定义内核。
前置准备与USB设备挂载
首先,我们需要将 Windows 主机上的 USB 设备安全地“共享”到 WSL2 子系统中。这可以通过 usbipd-win 工具实现。
-
安装 usbipd-win:在 Windows PowerShell(管理员身份)中运行以下命令。
winget install usbipd
-
列出并绑定设备:安装完成后,使用 usbipd list 命令查看当前连接到 Windows 的 USB 设备列表。
PS C:\Users\qinyu> usbipd list
Connected:
BUSID VID:PID DEVICE STATE
1-2 1a81:1021 USB 输入设备 Not shared
2-1 0cf3:e300 Qualcomm Atheros QCA61x4 Bluetooth Not shared
2-2 13d3:56ba Integrated Camera, Integrated IR Camera Not shared
3-4 ... UVC Not shared
从输出中识别你的 UVC 设备对应的 BUSID(例如 3-4)。然后,使用 bind 命令将其绑定到 usbipd 服务。
usbipd bind -b 3-4
再次执行 usbipd list,可以看到目标设备的状态已变为 Shared,表示它已准备好被 WSL2 连接。
-
在WSL2中连接设备:确保至少一个 WSL2 终端处于运行状态。在同一个 PowerShell 中,执行 attach 命令,使用 -w 参数指定 WSL2 发行版,-b 参数指定设备总线ID。
usbip attach -w -b 3-4
系统会提示类似 Using WSL distribution “Ubuntu” to attach 和 Using IP address 172.31.240.1 to reach the host. 的信息。
-
在WSL2中验证:进入 WSL2 的 Ubuntu 终端,运行 lsusb 命令。此时,列表中应该会出现一个新的 USB 设备。
qinyunti@qinyunti:~$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID xxxx:xxxx xxxxxx Technology # 此为你的UVC设备
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
至此,设备物理连接已完成。但此时内核没有 UVC 驱动,应用程序仍无法正常识别和使用该摄像头。接下来,我们需要编译一个包含 UVC 驱动的新内核。
编译支持 UVC 的 WSL2 内核
1. 环境准备与源码获取
首先,更新 WSL2 并安装必要的编译工具链。在 WSL2 终端中执行:
sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential flex bison dwarves libssl-dev libelf-dev libncurses-dev pkg-config
确定当前 WSL2 的内核版本:
uname -r
例如,输出为 5.15.167.4-microsoft-standard-WSL2,则版本号为 5.15.167.4。
获取对应版本的 WSL2 内核源码。你可以从 GitHub Release 页面直接下载对应版本的压缩包(例如 WSL2-Linux-Kernel-linux-msft-wsl-5.15.167.4.tar.gz),或使用 git 克隆。这里以下载到 /usr/src 目录为例:
cd /usr/src
sudo tar -xvzf WSL2-Linux-Kernel-linux-msft-wsl-5.15.167.4.tar.gz
cd WSL2-Linux-Kernel-linux-msft-wsl-5.15.167.4/
2. 配置内核选项
进入源码目录后,首先基于当前运行的内核配置生成基础配置文件:
sudo cp /proc/config.gz config.gz && sudo gunzip config.gz && sudo mv config .config
接着,启动内核配置菜单,需要为内核添加多媒体及 UVC 驱动支持。
sudo make menuconfig
配置菜单为文本交互界面。你需要依次进入以下子菜单,并按 Y 键将对应选项编译进内核(显示为 )。以下是关键配置路径:
- 主菜单 -> Device Drivers
- 进入 Multimedia support 子菜单(原为
<>,按 Y 变为 <*> Multimedia support --->)
- 确保
- 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)
被选中。
- 可以同时选中
- UVC input events device support
。
- 选中
- GSPCA based webcams
以支持更多摄像头型号。
- 配置完成后,一路选择
<Exit> 退回主菜单。
在配置过程中,可以按 / 键搜索 UVC 来快速定位相关选项。所有选项配置完成后,在主菜单选择 <Save>,然后选择 <Exit> 退出。配置文件将保存为当前目录下的 .config。
3. 编译与安装内核
使用配置好的 .config 文件进行编译。$(nproc) 会自动获取你 CPU 的核心数以加速编译。
sudo make -j$(nproc) KCONFIG_CONFIG=.config && sudo make modules_install -j$(nproc) && sudo make install -j$(nproc)
此过程耗时较长,取决于你的硬件性能。编译成功后,会在源码目录生成 vmlinux 文件,这就是我们需要的新内核。
4. 替换 WSL2 内核
将编译好的 vmlinux 内核文件复制到 Windows 文件系统中,例如你的 WSL2 发行版安装目录(D:\WSL\Ubuntu...)。在 WSL2 中可以通过 /mnt/d/ 访问 D 盘。
sudo cp vmlinux /mnt/d/WSL/Ubuntu2204-221101/Ubuntu_2204.1.7.0_x64/
接下来,在 Windows 用户目录(例如 C:\Users\你的用户名\)下创建或编辑一个名为 .wslconfig 的文件。指定 WSL2 使用我们刚刚编译的内核。
[wsl2]
kernel=D:\\WSL\\Ubuntu2204-221101\\Ubuntu_2204.1.7.0_x64\\vmlinux
注意 Windows 路径中的反斜杠需要转义(\\)。
验证与测试
1. 重启并验证新内核
关闭所有 WSL2 实例以应用新配置:
wsl --shutdown
重新打开 WSL2 终端,并重复 前置准备与USB设备挂载 章节的步骤,将 UVC 设备挂载进来。然后,使用以下命令验证新内核是否生效:
uname -r -v
输出应包含内核版本号和你刚刚编译的时间戳,例如 5.15.167.4-microsoft-standard-WSL2 #1 SMP Thu Jan 2 14:39:17 CST 2025。这证实了 WSL2 正在使用你自定义编译的内核。
2. 安装并测试摄像头工具
现在,你可以在 WSL2 中安装工具来测试 UVC 摄像头。这里推荐两款工具:
使用 guvcview:
这是一个功能丰富的图形化摄像头查看和配置工具。
sudo apt install v4l-utils guvcview
sudo guvcview
首次运行时,它通常会自动识别 /dev/video0 设备并显示视频画面。你可以在其 Video Controls 标签页下调整分辨率、帧率等参数。
使用 luvcview:
一个轻量级的命令行 UVC 查看器。
sudo apt-get install libsdl1.2-dev
wget `snapshot.debian.org/archive/debian/20120423T215716Z/pool/main/l/luvcview/luvcview_0.2.6-6_amd64.deb`
sudo dpkg -i luvcview_0.2.6-6_amd64.deb
sudo luvcview
当 guvcview 或 luvcview 成功显示来自 USB 摄像头的实时画面时,说明整个 WSL2 UVC 支持配置已大功告成。你已成功构建了一个既能享受 Windows 便利,又能直接操作 Linux 硬件驱动的强大混合开发环境。
关于内核配置与驱动的更多深入知识,可以访问 yunpan.plus/f/34-1 进行系统性学习。
参考资料
[1] WSL2中配置支持UVC, 微信公众号:mp.weixin.qq.com/s/s3uC-SHaVcXWAZK1sK6EZw
版权声明:本文由 云栈社区 整理发布,版权归原作者所有。