WSL 2连接USB设备完全指南:使用usbipd-win实现设备共享
前言
对于使用Windows Subsystem for Linux 2(WSL 2)的开发者来说,直接访问USB设备一直是个痛点。WSL 2的虚拟化架构虽然带来了更好的Linux兼容性,但也隔离了对物理设备的直接访问。本文将详细介绍如何通过usbipd-win项目实现WSL 2对USB设备的完美支持。
技术背景
usbipd-win是一个开源项目,它基于USB/IP协议实现。该协议最初由日本开发者开发,允许通过网络共享USB设备。usbipd-win将其适配到Windows平台,使WSL 2能够通过本地网络接口访问Windows主机上的USB设备。
准备工作
在开始配置前,请确保满足以下条件:
-
操作系统要求:
- Windows 11(版本22000或更高)
- 或Windows 10(需额外配置)
-
硬件要求:
- x64架构处理器(目前不支持x86和Arm64)
-
WSL环境:
- 已安装最新版WSL
- 已设置Linux发行版使用WSL 2模式
-
内核要求:
- Linux内核版本5.10.60.1或更高
小技巧:可通过
wsl --update命令确保内核是最新版本。
安装usbipd-win
方法一:使用安装程序
- 下载最新版usbipd-win的.msi安装包
- 运行安装程序,这将自动完成以下配置:
- 安装usbipd服务
- 添加命令行工具到系统PATH
- 配置防火墙规则允许本地连接
方法二:使用winget(推荐)
在PowerShell中执行:
winget install --exact dorssel.usbipd-win
安装完成后,可通过以下命令验证服务状态:
Get-Service usbipd
配置USB设备共享
第一步:列出可用设备
在管理员权限的PowerShell中执行:
usbipd list
这将显示所有已连接的USB设备及其总线ID(BUSID)。
示例输出:
BUSID VID:PID DEVICE
1-1 1234:5678 USB Flash Drive
2-3 2345:6789 Arduino Uno
第二步:绑定设备
选择要共享的设备总线ID,执行绑定命令:
usbipd bind --busid <busid>
例如:
usbipd bind --busid 2-3
注意:绑定后该设备将无法被Windows直接使用。
第三步:在WSL中附加设备
在普通PowerShell中执行:
usbipd attach --wsl --busid <busid>
在WSL终端中验证设备是否可见:
lsusb
如果看到目标设备,说明附加成功。
使用USB设备
根据设备类型,可能需要进行额外配置:
-
串口设备:
sudo chmod 666 /dev/ttyUSB0 -
存储设备:
sudo mkdir /mnt/usb sudo mount /dev/sdb1 /mnt/usb -
开发板(如Arduino): 确保安装了相关工具链后即可正常使用。
断开设备连接
当不再需要使用时:
-
从WSL中分离:
usbipd detach --busid <busid> -
解除绑定(可选):
usbipd unbind --busid <busid>
常见问题解决
-
设备未显示在lsusb中:
- 检查WSL是否为WSL 2模式
- 确认内核版本符合要求
- 重启usbipd服务
-
权限问题: 在WSL中创建udev规则或直接修改权限:
sudo chmod 666 /dev/bus/usb/XXX/YYY -
Windows 10特殊配置: 可能需要手动编译支持USB/IP的内核模块。
高级用法
-
自动挂载脚本: 可编写脚本实现设备插入时自动挂载。
-
多设备管理: 使用
usbipd list命令管理多个设备连接状态。 -
网络共享: usbipd-win理论上支持通过网络共享USB设备给其他机器。
安全注意事项
- 仅在内网环境中使用网络共享功能
- 及时更新usbipd-win以获取安全修复
- 不使用时建议解除设备绑定
结语
通过usbipd-win项目,WSL 2用户现在可以无缝使用各类USB设备,从简单的存储设备到复杂的开发板都能完美支持。这种解决方案既保留了WSL 2的轻量级优势,又扩展了其硬件兼容性,为开发者提供了更完整的工作环境。
提示:对于频繁使用的设备,可以考虑编写自动化脚本简化连接流程。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



