1. 问题背景与现象描述
最近我将WSL发行版从C盘迁移到了D盘,使用export和import的方式进行迁移。迁移完成后,发现通过usbipd映射的USB设备在WSL中出现了异常现象:
- Windows端使用
usbipd attach --wsl --busid <BUSID>命令显示成功 - WSL中执行
lsusb可以看到USB设备 - 但执行
ls /dev -l时,找不到预期的/dev/ttyACM0设备节点 - 同一个设备在迁移前可以正常识别为串口设备
设备信息如下:
- 设备型号:
xxx lsusb输出:xxxx:xxxx xxx- Windows端曾显示为
COM8
2. 初步分析与假设验证
2.1 第一反应:磁盘性能问题
我首先怀疑是否因为D盘是机械硬盘导致的问题。机械硬盘相比SSD确实存在性能差异,但经过分析发现:
机械盘主要影响:
- WSL启动速度
- 项目读写速度
- 编译速度
- 包安装速度
而/dev/ttyACM0是否出现,核心取决于:
usbipd是否成功转发USB设备- Linux内核是否完成USB枚举
- 对应驱动是否成功绑定设备
这属于USB枚举和驱动层的问题,与磁盘性能无关。
2.2 问题拆解
这个问题应该分为两个阶段来看:
阶段一:设备是否进入WSL
通过lsusb命令能看到设备,说明设备已经成功进入WSL环境。
阶段二:设备是否被串口驱动接管
即使lsusb能看到设备,也不代表会自动生成:
/dev/ttyACM0/dev/ttyUSB0
只有当Linux内核将USB设备识别为串口类设备并绑定对应驱动后,才会生成tty节点。
3. 详细排查过程
3.1 检查设备attach状态
在Windows PowerShell中执行:
bash复制usbipd list
确认设备状态类似:
code复制3-4 3163:004c USB/IP STUB (COM8) Attached
这表明设备已被usbipd接管并附加到WSL。
3.2 确认WSL中的设备可见性
在WSL中执行:
bash复制lsusb
lsusb -t
如果lsusb能看到设备但/dev下没有ttyACM0,说明问题出在驱动绑定阶段。
3.3 检查内核日志
执行:
bash复制dmesg | tail -n 80
前期日志显示:
code复制usb 1-1: new full-speed USB device number 2 using vhci_hcd
usb 1-1: SetAddress Request (2) to port 0
但缺少关键日志:
code复制cdc_acm 1-1:1.0: ttyACM0: USB ACM device
这表明设备尝试进入WSL但未完成串口驱动绑定。
3.4 检查内核模块
执行以下命令检查内核模块:
bash复制uname -r
ls /lib/modules/$(uname -r)
modinfo cdc_acm
modinfo usbserial
modinfo ch341
modinfo cp210x
结果显示:
- WSL内核版本正常
/lib/modules/$(uname -r)存在cdc_acm、usbserial等模块都存在
排除了"迁移后模块丢失"的可能性。
3.5 手动加载驱动
尝试手动加载驱动:
bash复制sudo modprobe cdc_acm
sudo modprobe usbserial
再次查看日志:
bash复制dmesg | tail -n 80
此时出现关键输出:
code复制cdc_acm 1-1:1.0: ttyACM0: USB ACM device
检查设备节点:
bash复制ls /dev/ttyACM* /dev/ttyUSB* 2>/dev/null
输出:
code复制/dev/ttyACM0
