声明:本文教程来源于微软官网WSL教程,链接地址:Connect USB devices
最近在学OpenCV,发现微软的WSL是个好东西,结合VS Code编辑器,无论是C++还是Python方式学习,简直是绝配,Python最好用Anaconda安装,后续要再学习机器学习、神经网络之类,甚至再搭配给Cuda,完美!可以这么说,对于只有一台安装Win11的电脑的同学而言,WSL2+Anaconda+VS Code+OpenCV+Cuda是最快速、最佳体验环境搭建方案。ps:GUI(图形界面)很容易解决,sudo apt install gedit 安装个有图形界面的应用即可,wsl会自动配置好GUI。
下面进入正题。众所周知,WSL默认不支持USB设备,学习OpenCV怎能没有摄像头!我搜遍全网,发现Google上的教程基本都是教我们从微软的WSL的Github库下载代码,然后在本地自己编译,使能USB功能。这个方法已经被多次验证是可行的,但是太繁琐了,而且要消耗不少校园网流量。最后,我不断改变检索关键词,终于访问到了微软官方的教程。废话不多说,下面介绍具体教程,有英语阅读能力的还是尽量查看官方教程,官方教程比较详细,而且更新。
系统配置要求:
- Win11 (版本号22000及以上,Win10请参考官方教程:Win10连接USB设备官方教程
- 不支持Arm64设备,仅支持x64/x86架构
- 系统已经成功安装好WSL2环境
- wsl2的linux内核版本号5.10.60.1及以上,查看方法:linux命令行界面输入 uname -a
步骤:
安装usbipd-win(Windows环境中)
- 去Github上下载usbipd-win的release文件
- 选择.msi文件下载,如果浏览器报错误,选择相信该文件,双击运行安装即可
- 其它安装方式及解读等,请访问官方教程
安装USBIP工具(Linux环境中)
Windows环境中usbip工具安装完成后,还需要在Linux环境中进行配置。下面介绍Ubuntu系统中的配置,其它系统请参考官方教程。
在Ubuntu的bash(命令行)中,运行以下指令:
sudo apt install linux-tools-5.4.0-77-generic hwdata
sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/5.4.0-77-generic/usbip 20
连接一个USB设备
工具配置好后,USB设备并没有被自动连接到WSL中,我们还需要手动进行连接。
注意:在连接USB设备前,需要确认打开的有一个WSL命令行界面,我们需要WSL2的VM环境是激活状态。
- 首先以管理员身份运行一个PowerShell命令行界面,然后输入以下命令:
usbipd wsl list
-
选择你要连接的USB设备的BUSID值,然后在PowerShell中输入以下指令:
usbipd wsl attach --busid <busid> #注意,<busid>是一个整体,直接输入busid号就行,不要带<>
需要注意的是,输入指令后,Ubuntu的bash命令行可能会提醒需要输入密码,因为此操作需要sudo权限。
-
然后就可以查看USB设备是否成功连接了,Ubuntu的bash中输入以下命令:
未连接USB时:lsusb
连接成功后:
可以看到,Camera已经连接到WSL中了。
PowerShell中也显示Camera已经连接到Ubuntu了。
- 在 WSL 中使用完设备后,可以直接Windows弹出USB 设备或者直接拔掉,即从物理层面断开USB设备连接,也可以管理员模式下从 PowerShell 运行此命令:
usbipd wsl detach --busid <busid> #记得修改<busid>具体号码
注意事项:
- 每次关闭wsl或者与usb设备断开连接后,需要重新连接设备,有两种重新连接USB设备的方法:
- 上文介绍的,运行管理员模式PowerShell,usbipd命令连接;
- Ubuntu的bash界面连接,输入以下指令:
usbip list -r $HOSTNAME.local #查看已连接过的设备信息,如记得busid,该命令非必须执行命令 sudo usbip attach -r $HOSTNAME.local -b <busid> #连接USB设备,注意替换<busid>
- 更新linux-tools-*-generic最新版本方法:
- 创建一个脚本文件:
#!/usr/bin/env bash rel="$(uname -r)" rel="${rel%%-*}" rel=(${rel//./ }) function latest_linux_tools { apt-cache search linux-tools | awk -v cur_ver="${rel[*]}" ' /^linux-tools([-\.][0-9]+)+-generic\>/ { ltg_package=$1 gsub(/[^0-9]+/," ",$1); gsub(/^\s*/,"",$1); split($1,ltg_ver,/\s*/); split(cur_ver,cmp_ver,/\s*/) if (ltg_ver[1]<=cmp_ver[1] && ltg_ver[2]<=cmp_ver[2] && ltg_ver[3]<=cmp_ver[3]) { print ltg_package; } }' | sort -nr | head -n 1 } # optional ... apt-get install "$@" "$(latest_linux_tools)"
- 按照以下命令执行:
sudo nano /usr/local/bin/install_linux_tools_generic # 将上面的脚本内容复制到这个install_linux_tools_generic文件中 # 修改文件权限 sudo chmod u+x /usr/local/bin/install_linux_tools_generic # 先预览一下要最新版本的linux-tools-*-generic版本 sudo install_linux_tools_generic -s # 如果有新版本,可以安装,执行下面指令 sudo install_linux_tools_generic -y
- 参考资料来源:Connecting USB devices to WSL - Windows Command Line (microsoft.com)
- 创建一个脚本文件:
- 一些比较新的USB设备好像识别不了,可能是缺少驱动