提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
WSL2现在虽然称不上完美,但是绝对秒杀一众虚拟机,再加上WSL-GUI的出现,让我重新燃起了对WSL的信心,美中不足的是不支持USB设备,特别是诸如USB Camera这样的必需品,本文章我就介绍i怎么在WSL2中使用USB设备,Camera后面的文章再探讨。
这里就不赘述了,直接百度搜就行了。原生的WSL2是不支持USB设备的,要想使用需要特别编译一个内核。
不同的内核需要下载不同的分支,查看内核的方法如下:
uname -a
Linux DESKTOP-G21E46A 5.10.102.1-microsoft-standard-WSL2 #1 SMP Mon Sep 5 11:12:40 CST 2022 x86_64 x86_64 x86_64 GNU/Linux
注意看5.10.102.1-microsoft-standard-WSL2
,这个就是我的内核分支,你的也一样,记住这个名字后面会用到。
Running uname -a from within WSL should report a kernel version of 5.10.60.1 or later. You’ll need to be running a WSL 2 distro.
让自己的内核版本大于5.10.60.1,或者干脆和我一样使用5.10.102.1这个版本,我是成功的,按照这个教程你也会成功。
查看自己的分支
打开一个terminal(Windows Terminal和PowerShell都行),输入如下的指令:
wsl --list -v
NAME STATE VERSION
* Ubuntu-20.04 Stopped 2
Ubuntu-18.04 Running 2
具体显示什么主要看你安装了什么版本,这里我们以Ubuntu-18.04为范例,保证可以成功。其它的分发版请自行测试,不保证一定的那个成功。
备份自己的分发版
由于操作有风险,如果不小心出错可能会导致WSL被污染或毁坏的可能,请注意备份重要数据,或 者干脆备份整个分发版,方法如下:
wsl --export <current-distro> <temporary-path>\wsl2-usbip.tar
最好找一个足够大的磁盘空间备份。
还原分发版
前提是已经备份过分发版,从备份的分发版中恢复数据。使用如下命令:
wsl --import wsl2-usbip <install-path> <temporary-path>\wsl2-usbip.tar
如果遇到报错就先取消注册分发版,再重新导入即可。
wsl --unregister <distro>
相关教程
希望大家一把成功,如果出了意外可以参考我的另一篇教程,里面有详细的备份还原操作,前提是你需要先备份,否则出了错就麻烦了。
WSL2备份还原教程
借用上面的查看内核版本的命令,我们需要到github下载适合我们的分支,由于github需要挂代理,我们选择到gitee网站下载,内容一模一样。这里不要去fork,因为项目很大,受gitee的限制,是不能fork成功的,除非你是企业付费客户。
WSL2内核分支
接下来找到我们的那个分支,内核版本一定要对应上。不要clone主分支,直接去tag里面找。
画红框的是我的分支5.10.102.1,直接点后面的下载就可以了,国内的网速度还可以。
先更新下源和系统。
sudo apt update
sudo apt upgrade
安装必要的软件环境
sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev autoconf libudev-dev libtool
切换工作目录到WSL的内核目录里
cd WSL2-Linux-Kernel
cp /proc/config.gz config.gz
gunzip config.gz
mv config .config
这一步是把系统当前的内核配置拷贝进去,只增加相关的配置,不要改变WSL本来的配置。
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
配置完一定要保存(Save),否则不产生效果
接下来开始编译,编译的核心数根据自身机器来定:
sudo make -j 8 && sudo make modules_install -j 8 && sudo make install -j 8
完成之后开始编译USB/IP tools.
cd tools/usb/usbip
sudo ./autogen.sh
sudo ./configure
sudo make install -j 8
拷贝编译出来的动态库,这个动态库是usbip tools需要用到的
sudo cp libsrc/.libs/libusbip.so.0 /lib/libusbip.so.0
安装usb.ids这样的话USB设备都是显示名字的,便于分辨,这个在后面可以看到。
sudo apt-get install hwdata
拷贝编译好的内核到Windows用户目录,这样你在启动WSL的时候会自动加载
cp arch/x86/boot/bzImage /mnt/c/Users/<user>/usbip-bzImage
在Windows的/mnt/c/Users//目录下创建一个文件叫.wslconfig,里面添加以下的内容
[wsl2]
kernel=c:\\users\\<user>\\usbip-bzImage
注意
接下来关闭当前的WSL,并重启新的WSL,这一步用于加载新内核。
wsl --shutdown #关闭所有的分发版
#只有Ubuntu-18.04执行
wsl
#多个分发版,指定执行
wsl -d Ubuntu-18.04
这个时候的分发版就是带USB/IP支持的了,这个时候还不算完,还要绑定,请继续往下看。
这个时候需要Windows端和Linux端协同操作,而且都需要管理员权限:
Windows端:
使用管理员打开一个PowerShell或Windows Terminal
上面就是列出来的所有USB设备,包括摄像头鼠标等,这里我们以摄像头为例BUSID 1-5
usbipd bind --busid=1-1
执行成功了后面的转台会变成shared
Linux端:
回到WSL里面,执行:
cat /etc/resolv.conf
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 192.168.32.1
注意nameserver后面跟着的地址,那是windows主机的地址,后面有用。
sudo usbip list --remote=192.168.32.1
Exportable USB devices
======================
- 192.168.32.1
1-1: NVidia Corp. : unknown product (0955:7c18)
: USB\VID_0955&PID_7C18\00000
: (Defined at Interface level) (00/00/00)
: 0 - Vendor Specific Class / Vendor Specific Subclass / Vendor Specific Protocol (ff/ff/ff)
1-5: Microdia : unknown product (0c45:671f)
: USB\VID_0C45&PID_671F\5&F42D35A&0&5
: Miscellaneous Device / ? / Interface Association (ef/02/01)
: 0 - Video / Video Control / unknown protocol (0e/01/00)
: 1 - Video / Video Streaming / unknown protocol (0e/02/00)
--remote后面跟的地址在/etc/resolve.conf里面看,就是windows主机的地址
这个时候看到的是所有主机已经shared的USB设备,还需要attatch才能使用。
sudo usbip attach --remote=192.168.32.1 --busid=1-5
需要哪一个就attatch哪一个,没有报错一般就是成功了,这个时候需要确认下,执行:
lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 0955:7c18 NVidia Corp.
Bus 001 Device 002: ID 0c45:671f Microdia
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
这个时候usb.ids就发挥作用了,就是我们看到的类似于产品名的东西,NVidia Corp;前面的ID 0955:7c18是设备ID,这个是不变的,哪怕你拿到任何Ubuntu分发版上也是这个ID。
到了这里USB的绑定可以说结束了,但是还有个问题,特别是对于USB Camera来说还没有结束,因为/dev里面没有出现譬如video0这样的描述符,我们是不能直接使用的,这篇文章先留着这个遗憾,等下一篇文章解决。
1、对操作系统和内核没什么经验的人来说还是有一定的难度,但是只要跟着教程一步步来应该没有问题的。
2、如果实在不行的话可以安装和我一样的内核版本,只要操作正确理论上一定成功,除非出现不可抗力,可以在下面留言,我们一起解决。
3、这个阶段我还没有用到USB Camera