在过去的两年里,我一直在运行 Windows 虚拟机,并通过 USB 设备连接到该虚拟机。在虚拟机运行时连接设备,使用virsh attach-device vm_name config_file.xml
,其中config_file.xml
例如:
<!-- Logitech Internet Navigator -->
<hostdev mode='subsystem' type='usb' managed='yes'>
<source>
<vendor id='0x046d'/>
<product id='0xc308'/>
</source>
</hostdev>
这一切都很顺利,直到昨天我决定是时候将我的 Ubuntu 16.04 升级到 18.04 了。现在,将 USB 设备连接到 VM 不再起作用。
这是我看到的输出:
$ virsh attach-device windows-gaming-uefi config/keyboard-white.xml
error: Failed to attach device from config/keyboard-white.xml
error: internal error: unable to execute QEMU command 'device_add': failed to open host usb device 1:3
该设备肯定存在,这是一些lsusb
输出:
Bus 001 Device 003: ID 046d:c308 Logitech, Inc. Internet Navigator Keyboard
我查看了一下kern.log
AppArmor 是否与此有关,但情况似乎并非如此。为了确保它不会干扰任何事情,我暂时完全禁用了 AppArmor。
有谁知道如何解决这个问题?
编辑:chmod -R go+rw /dev/bus/usb
在尝试连接 USB 设备之前执行 a 也没有帮助。
答案1
我设法通过首先从源代码重新安装 QEMU 来解决我的问题(请参阅https://askubuntu.com/questions/1067722/how-do-i-install-qemu-3-0-on-ubuntu-18-04):
sudo apt-get purge "qemu*"
sudo apt-get autoremove
sudo apt-get build-dep qemu
wget https://download.qemu.org/qemu-3.1.0.tar.xz
tar -xf qemu-3.1.0.tar.xz
rm qemu-3.1.0.tar.xz
cd qemu-3.1.0
./configure
make
sudo apt-get install checkinstall
sudo checkinstall make install
然后通过添加以下内容来确保 QEMU 以 root 身份运行/etc/libvirt/qemu.conf
:
user = "root"
group = "root"
最后重新加载 KVM 模块:
sudo rmmod kvm_intel
sudo rmmod kvm
sudo modprobe kvm
sudo modprobe kvm_intel
sudo systemctl restart libvirtd.service
在我看来,以 root 身份运行 QEMU 并不是绝对必要的,但我只是想让它正常工作。
答案2
感谢 Darhuuk 的回答,我能够自己完成此工作,然后将其修改为不以 root 身份运行 qemu。这就是我所做的:
在 中/etc/libvirt/qemu.conf
,设置:
user = "qemu"
group = "qemu"
创建/lib/udev/rules.d/51-qemu-usb-passthrough.rules
包含
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="XXXX" ATTRS{idProduct}=="YYYY" GROUP="qemu"
其中XXXX
和YYYY
是我要转发的设备的供应商和产品 ID。 (如果您想转发特定的物理 USB 端口,无论插入什么,也可以通过其他 sysfs 属性进行设置,例如总线和端口)
运行udevadm control --reload-rules
并sudo systemctl restart libvirtd.service
.