wsl通过usbipd工具访问主机的USB设备

引言

最近在windows上使用wsl和docker for desktop部署乐鑫的esp32开发环境时遇到一个问题:wsl不能访问主机的usb设备
我通过在各大ai博客平台查询许多有关wsl连接usb的案例和解决方法,发现可以通过安装usbipd来解决问题,于是我们在wsl中使用
sudo apt install usbip
image

  • WSL2本质是一个虚拟机,无法直接访问宿主主机的USB设备。
  • WSL2的原生内核没有加入USB存储设备的驱动。

什么是WSL2

WSL2(Windows Subsystem for Linux 2)是一种基于Hyper-V虚拟化技术的轻量级解决方案,它在Windows系统中动态运行完整的Linux内核,与Windows内核隔离但可通过高效通信机制交互。与传统虚拟机不同,WSL2无需预分配资源,专注于提供轻量化的Linux兼容环境,支持用户快速安装Ubuntu、Debian等主流发行版,从而无缝运行Linux应用程序并混合使用Windows工具链。

问题解决

由于默认的wsl内核不具备usb,于是我们需要重新构建wsl内核以重新恢复wsl对usb设备的支持

但是从某个wsl发行版版本开始,wsl2添加了对usb的支持,至少是截至2025年5月25以后,都不再需要重新构建wsl内核了,于是我们只需要在windows端安装usbipd,同时在wsl端安装usbip即可

window安装

winget install --interactive --exact dorssel.usbipd-win

wsl安装

sudo apt install linux-tools-generic hwdata
sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*-generic/usbip 20

在windows中打开管理员powershell输入

usbipd list
这里的2-2总线会显示STATE为Not shared,我这里之前已经设置过
image

绑定设备到 USB/IP 服务

成功的画STATE栏会显示Shared
usbipd bind --busid 2-2

将USB设备附加到wsl2

此时总线2-2设备会被不断轮询,一旦断开物理连接,主机会尝试重连,并且重新挂载到wsl2
usbipd attach --auto-attach --unplugged --busid 2-2 --wsl
image

需要注意的点

将USB设备附加到wsl2执行命令时wsl2必须开启
USB挂载到wsl2后,主机不再响应这个设备
即便是同一个USB设备,主机重启后,有可能改变USB设备挂在的总线名称例如2-2、2-1

posted @ 2025-05-24 23:19  Lord_Susu  阅读(1531)  评论(0)    收藏  举报