Windows Subsystem for Linux——使用宿主机器上的摄像头
大纲
- 安装系统
- 定制内核
- 修改Multimedia support
- Media device types
- Video4Linux options
- Media drivers
- GSPCA based webcams
- USB support
- Support for Host-side USB
- USB/IP support
- 保存设置
- 编译
- 安装
- 保存Kernel
- 启用Kernel
- Windows端共享Camera
- 安装usbipd
- 查找摄像头BUSID
- 共享状态
- 附加到WSL
- Ubuntu端查看摄像头
- 测试
- Install the latest stable version of Mesa driver in Ubuntu
- 安装视频软件
- 参考资料
即使我们使用《Windows Subsystem for Linux——安装桌面版Ubuntu》中的方法,在远程连接时共享所有视频捕获设备
也不会让我们在Ubuntu子系统中看到任何摄像头(如/dev/video0之类)
这就需要我们定制WSL Kernel Linux。
安装系统
我们将《Windows Subsystem for Linux——定制WSL2-Linux-Kernel》中的环境按照《Windows Subsystem for Linux——安装多个相同的操作系统》中介绍的方法打包成了Ubuntu-24.04-New-WSL-Kernel-Base基础环境,这样我们后面可以基于此做很多实验。
wsl --export Ubuntu-24.04-New-WSL-Kernel Ubuntu-24.04-New-WSL-Kernel-Base
然后以此为基础,构建Ubuntu-24.04-New-WSL-Kernel-Camera实例。
wsl --import Ubuntu-24.04-New-WSL-Kernel-Camera .\Ubuntu-24.04-New-WSL-Kernel-Camera Ubuntu-24.04-New-WSL-Kernel-Base
然后登陆系统
wsl -d Ubuntu-24.04-New-WSL-Kernel-Camera -u fangliang
定制内核
cd ~/WSL2-Linux-Kernel-linux-msft-wsl-6.6.y/
sudo make menuconfig KCONFIG_CONFIG=Microsoft/config-wsl
通过上面的命令,我们进入定制的对话框。
在这个界面中,在有—>行,使用回车键会进入子项目;按“空格键”,会出现M或者“*”。“M"表示Module,”*“表示built-in。我们需要后续的模块尽量都是built-in的,所以相应选项处按两次“空格键”,让其变成”*"状态。
修改Multimedia support
按“回车键”进入Device Drivers—>,找到Multimedia support—>,按两次“空格键”使其变成"*“状态。
然后按回车键进入其子项目。
找到“Filter media drivers”和“Autoselect ancillary drivers (tuners, sensors, i2c, spi, frontends)”,将它们设置为”*"状态。
Media device types
进入Media device types —>
找到“Cameras and video grabbers (NEW)”,将它设置为"*"状态。
按两次ESC键,退到上一层目录。
Video4Linux options
进入Video4Linux options —>
按两次ESC键,退到上一层目录。
Media drivers
进入Media drivers —>
找到“Media USB Adapters”,将它设置为"*"状态。
按回车键进入Media USB Adapters子项。
找“GSPCA based webcams”和“USB Video Class (UVC)”,将它们设置为"M"状态。
GSPCA based webcams
然后进入“GSPCA based webcams —> ”,勾选摄像头驱动。由于我也不知道我是哪款摄像头,就全勾选了。
USB support
退到Device Drivers子项目下,找到“USB support”,进入其子项。
Support for Host-side USB
USB/IP support
将“USB/IP support”下相关的选项设置为"*"状态。
保存设置
退到最外一层,按Tab键切换到“Save”高亮,然后按“回车键”。
保存设置。
再按Tab键,切换到Exit,退出设置页面。
编译
make -j$(nproc) KCONFIG_CONFIG=Microsoft/config-wsl
安装
sudo make modules_install headers_install
保存Kernel
mkdir /mnt/c/vmlinux/
sudo cp vmlinux /mnt/c/vmlinux/
启用Kernel
到Windows系统中,用户目录下创建一个叫.wslconfig的文件(%USERPROFILE%.wslconfig)
填入以下内容,kernel所指向的就是上一步编译结果在Windows上的副本
[wsl2]
kernel=C:\\vmlinux\\vmlinux
然后在Powershell中关闭WSL
wsl --shutdown
登录系统,要保持登录状态,这样后续指令才能找到这台实例。
wsl -d Ubuntu-24.04-New-WSL-Kernel-Camera -u fangliang
安装后续要用的工具
sudo apt install linux-tools-generic hwdata
Windows端共享Camera
安装usbipd
在Powershell中安装usbipd
winget install usbipd
查找摄像头BUSID
然后查看当前usb设备
usbipd list
可以看到,我们笔记本电脑集成的摄像头是1-7。这个编号后面会用到。
共享状态
在附加 USB 设备之前,必须使用命令 usbipd bind 来共享设备,从而允许它附加到 WSL。
usbipd bind --busid 1-7
附加到WSL
usbipd attach --wsl --busid 1-7
Ubuntu端查看摄像头
进入Ubuntu终端中执行
sudo apt install usbutils
lsusb
可以看到摄像头已经存在了。
ls /dev/video*
设备也存在了。
测试
Install the latest stable version of Mesa driver in Ubuntu
sudo add-apt-repository ppa:kisak/kisak-mesa
sudo apt update
sudo apt upgrade
安装视频软件
sudo chmod 777 /dev/video0
sudo apt install v4l-utils guvcview mesa-utils
运行
sudo guvcview -d /dev/video0
参考资料
- https://www.youtube.com/watch?v=t_YnACEPmrM
- https://learn.microsoft.com/en-us/windows/wsl/connect-usb
- https://learn.microsoft.com/zh-cn/windows/wsl/connect-usb#attach-a-usb-device
- https://itsfoss.com/install-mesa-ubuntu/