找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3343

积分

0

好友

457

主题
发表于 2026-2-11 00:16:25 | 查看: 27| 回复: 0

许多开发者选择 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 工具实现。

  1. 安装 usbipd-win:在 Windows PowerShell(管理员身份)中运行以下命令。

    winget install usbipd
  2. 列出并绑定设备:安装完成后,使用 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 连接。

  3. 在WSL2中连接设备:确保至少一个 WSL2 终端处于运行状态。在同一个 PowerShell 中,执行 attach 命令,使用 -w 参数指定 WSL2 发行版,-b 参数指定设备总线ID。

    usbip attach -w -b 3-4

    系统会提示类似 Using WSL distribution “Ubuntu” to attachUsing IP address 172.31.240.1 to reach the host. 的信息。

  4. 在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

    guvcviewluvcview 成功显示来自 USB 摄像头的实时画面时,说明整个 WSL2 UVC 支持配置已大功告成。你已成功构建了一个既能享受 Windows 便利,又能直接操作 Linux 硬件驱动的强大混合开发环境。

    关于内核配置与驱动的更多深入知识,可以访问 yunpan.plus/f/34-1 进行系统性学习。

    参考资料

    [1] WSL2中配置支持UVC, 微信公众号:mp.weixin.qq.com/s/s3uC-SHaVcXWAZK1sK6EZw

    版权声明:本文由 云栈社区 整理发布,版权归原作者所有。




  • 上一篇:OpenAI如何应对海量负载:PostgreSQL一主多从架构的极限挑战与实战优化
    下一篇:聊聊我的博客维权经历:版权机构一年三次索赔,最终收到法院传票
    您需要登录后才可以回帖 登录 | 立即注册

    手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

    GMT+8, 2026-2-23 15:38 , Processed in 0.379902 second(s), 40 queries , Gzip On.

    Powered by Discuz! X3.5

    © 2025-2026 云栈社区.

    快速回复 返回顶部 返回列表