QEMU下为搭载EHCI控制器的Windows XP虚拟机直通全速USB设备的可行方案咨询
QEMU下为搭载EHCI控制器的Windows XP虚拟机直通全速USB设备的可行方案咨询
我之前折腾过Windows XP在QEMU下的USB直通问题,正好碰到过和你一样的速度不匹配情况,给你几个可行的解决思路:
方案一:添加USB 1.1控制器(UHCI/OHCI)分流全速设备
EHCI是USB2.0高速控制器,本身只负责高速设备,全速/低速设备需要搭配USB1.1的UHCI或OHCI控制器来支持。Windows XP原生支持这两种控制器,所以我们可以在VM里同时启用EHCI和USB1.1控制器,把全速设备挂到USB1.1总线上,就能消除速度不匹配警告。
操作步骤:
- 在你的QEMU命令中添加一个USB 1.1控制器(这里推荐UHCI,兼容性更好):
-device usb-uhci,id=usb1_bus - 修改你的USB直通设备参数,指定它们连接到这个新的USB1.1总线:
把原来的:
改成:-device usb-host,vendorid=0x1e7d,productid=0xafca -device usb-host,vendorid=0x046d,productid=0xc53d-device usb-host,vendorid=0x1e7d,productid=0xafca,bus=usb1_bus.0 -device usb-host,vendorid=0x046d,productid=0xc53d,bus=usb1_bus.0 - 保留原来的
-device usb-ehci,这样VM里同时拥有USB2.0和USB1.1控制器,XP会自动识别并加载驱动。
修改后的完整QEMU命令示例:
qemu-system-x86_64 \ -nodefaults \ -machine pc-i440fx-5.2,accel=kvm,usb=off,vmport=off,dump-guest-core=off \ -name "Windows XP",debug-threads=on \ -cpu Skylake-Client-IBRS,ss=on,vmx=on,pdcm=on,hypervisor=on,tsc-adjust=on,clflushopt=on,umip=on,stibp=on,arch-capabilities=on,xsaves=on,pdpe1gb=on,ibpb=on,amd-stibp=on,skip-l1dfl-vmentry=on,pschange-mc-no=on,hv-time,hv-relaxed,hv-vapic,hv-spinlocks=0x1fff \ -smp sockets=1,cores=4,threads=2 \ -m 4G \ -vga none \ -drive file=/dev/disk/by-id/ata-C300-MTFDBAK128MAG_0000000011250313A6FD,format=raw,cache=none \ -device vfio-pci,host=05:00.0,multifunction=on,x-vga=on \ -device vfio-pci,host=05:00.1,multifunction=on \ -device usb-ehci \ -device usb-uhci,id=usb1_bus \ -device usb-host,vendorid=0x1e7d,productid=0xafca,bus=usb1_bus.0 \ -device usb-host,vendorid=0x046d,productid=0xc53d,bus=usb1_bus.0 \ -net nic,model=rtl8139 \ -net user
方案二:给Windows XP安装XHCI驱动,改用QEMU XHCI控制器
XHCI是USB3.0控制器,向下兼容所有USB速度等级(高速/全速/低速),但Windows XP原生没有它的驱动。不过可以通过安装第三方适配的驱动来解决这个问题:
操作步骤:
- 先保持现有EHCI控制器的配置启动VM,用虚拟PS/2键鼠操作(或者暂时不直通USB设备)
- 下载适配XP的XHCI驱动(可以找社区修改的USB3.0驱动包,或者Intel早期发布的XP版XHCI驱动,QEMU的qemu-xhci控制器兼容性很好,大部分这类驱动都能识别)
- 在XP里安装驱动,重启系统确保驱动生效
- 关闭VM,修改QEMU命令,把
-device usb-ehci替换成:-device qemu-xhci - 重新启动VM,XP会识别XHCI控制器,此时再直通USB设备就不会有速度不匹配问题了。
方案三:强制指定USB设备速度(备选方案)
你可以尝试在USB直通参数里强制指定设备为全速模式,看看能否消除警告:
-device usb-host,vendorid=0x1e7d,productid=0xafca,speed=full -device usb-host,vendorid=0x046d,productid=0xc53d,speed=full
不过这个方法不一定能彻底解决总线速度不匹配的底层问题,所以优先推荐前两个方案。
备注:内容来源于stack exchange,提问作者ArrayON_56




