知识库/参考文档/WSL USB 设备消失问题

WSL USB 设备消失问题

感谢 Xiaoyu Wang 的分享

现象:WSL2 下,使用 usbipd wsl attach 之后,WSL2 里面可以看到 USB 设备,但拔插一次后,连 Windows 设备管理器里也看不到该设备了。


一、问题原因

1. usbipd 的持久化绑定机制

usbipd 为了让某个 USB 设备能长期共享,会在系统里保存一个 Persisted 记录。一旦设备被标记成共享状态,Windows 本地驱动就不再接管该设备。

2. 异常的残留绑定

当设备更换插口、VID/PID 同类、或者 usbipd 服务异常退出时,持久记录没有同步清理。系统认定该设备仍由 usbipd 接管,于是从设备管理器里"消失",串口号不再出现。

3. 注册表已不是唯一存储位置

新版本 usbipd(5.x 起)不再使用注册表,而是用磁盘文件保存持久化信息。因此,删除旧版注册表路径不会生效,看起来"删不掉 Persisted"。


二、解决方案

方法 1:解绑指定设备

powershell
# 以管理员身份打开 PowerShell,查看所有绑定
usbipd list

# 找到问题设备的 BUSID(如 2-3),解绑
usbipd unbind --busid 2-3

解绑后设备会重新出现在设备管理器中。

方法 2:清理所有持久化记录

powershell
# 停止 usbipd 服务
usbipd server stop

# 删除持久化数据库(路径因版本而异)
# usbipd 5.x 默认存储在:
del "%LOCALAPPDATA%\usbipd\usbipd.db"

# 重新启动服务
usbipd server start

方法 3:彻底重置

如果以上方法无效,完全卸载并重装 usbipd:

powershell
# 卸载
winget uninstall usbipd

# 清理残留
rmdir /s /q "%LOCALAPPDATA%\usbipd"

# 重新安装
winget install usbipd

三、预防建议

  1. 使用完毕后执行 usbipd wsl detach --busid <BUSID> 而非直接拔插
  2. 避免频繁更换 USB 端口
  3. 使用固定 USB 端口并记录对应的 BUSID