USB 设备直通
USB 直通把物理 USB 设备整个交给某台 guest 使用,宿主侧不再占用它。做法是用 lsusb 拿到设备的厂商与产品编号,写成 usb 类型的 hostdev 段落;高版本 USB 设备还需要对应的控制器型号配合,否则只能降速运行或识别不到。常见需求来自加密狗、采集卡、串口转换器这类必须在真实硬件上工作的外设。
基本信息
| 识别设备 | lsusb 输出中的 idVendor:idProduct 即匹配依据 |
|---|---|
| 控制器 | 域定义里加 USB 控制器段落,USB 3.0 设备需对应型号的控制器 |
| 热插拔 | attach-device / detach-device 配一段 device XML 即可动态挂载 |
| 持久化 | managed 属性决定是否随域启动自动重挂 |
| 匹配方式 | 厂商加产品编号较稳定;端口编号在重插后会变化 |
典型使用场景
- 软件加密狗:授权绑定的业务系统必须在虚机里运行
- 视频采集卡:需要真实设备才能采集与推流
- 串口与调试设备:USB 转串口设备接入虚机做设备调试
- USB 存储与读卡器:向隔离环境导入数据
- 外设测试:验证驱动或应用在真实外设下的行为
hostdev USB 片段与热挂载
hostdev USB 片段与热挂载
lsusb # 确认厂商与产品编号
# 域 XML 片段:
# <hostdev mode='subsystem' type='usb' managed='yes'>
# <source>
# <vendor id='0x1a86'/>
# <product id='0x7523'/>
# </source>
# </hostdev>
virsh attach-device vm1 usb-dongle.xml --live # 动态挂载常见问题
| 现象 | 常见原因 | 处理方向 |
|---|---|---|
| guest 里看不到设备 | 控制器型号不匹配 | 按设备速率加对应 USB 控制器 |
| 重启后设备没挂上 | 未使用自动重挂方式 | 在定义中声明或改用持久挂载 |
| 挂错设备 | 只用厂商与产品编号匹配 | 同型号设备需补充端口信息 |
| 传输速度偏慢 | 控制器能力不足 | 确认控制器型号与设备速率匹配 |
USB 设备重插后端口号可能变化:用厂商与产品编号匹配比用端口稳定,同一型号有多台设备时再额外用地址区分。
直通期间宿主看不到该设备:依赖它做授权校验或运维的服务要一并评估,别把宿主自身的必要外设直通出去。
设备在宿主与虚机之间来回切换需要先卸载再挂载,热插拔频繁的场景建议固定归属,减少现场操作出错的机会。