![Qemu libusb 总是失败并显示“操作不允许”](https://linux22.com/image/904739/Qemu%20libusb%20%E6%80%BB%E6%98%AF%E5%A4%B1%E8%B4%A5%E5%B9%B6%E6%98%BE%E7%A4%BA%E2%80%9C%E6%93%8D%E4%BD%9C%E4%B8%8D%E5%85%81%E8%AE%B8%E2%80%9D.png)
我尝试通过 qemu KVM 传递 USB 设备并收到以下错误:
libusb:错误 [_get_usbfs_fd] libusb 无法打开 USB 设备 /dev/bus/usb/001/009:操作不允许
我已经做了以下 udev (/etc/udev/rules.d/50-qemuusb.rules) 规则:
子系统=="usb|usb_device", ATTRS{idVendor}=="04f2", 模式="0666"
起初我以为它工作不正常,但当我检查时,它确实是正常工作的。 ls -l在/dev/bus/usb/001报告如下:
lmfaoown@Lmfaoown:/dev/bus/usb/001$ ls -l
total 0
crw-rw-r-- 1 root root 189,0 Sep 17 18:33 001
crw-rw-r-- 1 root root 189,1 Sep 17 18:33 002
crw-rw-r-- 1 root root 189,2 Sep 17 18:33 003
crw-rw-r-- 1 root root 189,3 Sep 17 18:33 004
crw-rw-r-- 1 root root 189,4 Sep 17 18:33 005
crw-rw-r-- 1 root root 189,6 Sep 17 18:33 007
crw-rw-rw- 1 root root 189,8 九月 17 18:42 009
您可以看到009每个人都有 R/W,但仍然会抛出错误。
记录此错误的程序是 libvirt 内部的 QEMU(/vars/log/libvirt/qemu)。
有人知道我的权限是否出了问题吗?我尝试过将 USB 切换为拨号,我的用户是成员,包括 libvirt-qemu 是其成员,我尝试过将 MODE 设置为 777,结果都一样。我确实知道 udev 有一些影响,因为一旦我删除规则 QEMU 就会抛出此问题:
libusb:error [op_open] libusb 无法打开 USB 设备 /dev/bus/usb/001/003:权限被拒绝。libusb
:error [op_open] libusb 需要对 USB 设备节点的写访问权限。
答案1
在 QEMU 中访问 USB 设备时,我们需要确保运行 QEMU 的用户具有访问连接到主机的 USB 设备的必要权限。
我在修复 QEMU 中的 USB 设备访问问题时遇到了多个问题。
我可以看到您已经考虑了 udev 规则。请确保您已识别要授予权限的根集线器和 USB 设备。
用户还需要通过执行以下命令重新加载 udev 规则并触发 udev 服务:
sudo udevadm control --reload-rules && sudo udevadm trigger
尽管解决了 udev 规则 usb 节点权限问题,并且 USB 设备接口已被“某个驱动程序”声明。但 QEMU 仿真器在正确读取 USB 设备描述符时仍然遇到同样的问题。
qemu-system-x86_64: libusb_release_interface: -4 [NO_DEVICE]
qemu-system-x86_64: libusb_release_interface: -4 [NO_DEVICE]
libusb: error [_open_sysfs_attr] open /sys/bus/usb/devices/2-7/bConfigurationValue failed ret=-1 errno=2
libusb: error [_get_usbfs_fd] File doesn't exist, wait 10 ms and try again
libusb: error [_get_usbfs_fd] libusb couldn't open USB device /dev/bus/usb/002/042: No such file or directory
[7.616230] xhci_hcd 0000:00:04.0: WARN Set TR Deq Ptr cmd failed due to incorrect slot or ep state
我在与 libusb 库链接的“qemu-system-x86_64”QEMU 二进制文件中发现了一个错误。因此,我决定使用最新版本的 libusb 库编译 QEMU 源代码。我发现了一些有用的论坛,促使我做出了这个决定。链接1 链接2
请按照此处提到的步骤操作:
构建 libusb 源代码并在你的 ubuntu 系统上正确安装
git clone https://github.com/libusb/libusb.git
git checkout tags/v1.0.22 -b V1.0.22
./configure --enable-udev --disable-static
make
sudo make install
构建 Qemu 源代码
git clone https://github.com/qemu/qemu.git
git checkout -b stable-6.1 origin/stable-6.1
./configure --target-list=x86_64-softmmu --enable-libusb --enable-kvm
make -j16
sudo make install
我知道这篇文章已经很老了,但我仍然相信它可能会对于那些正在努力解决与 USB 设备和 QEMU 相关问题的人有所帮助。
答案2
我见过这样的问题,它们通常是由于 apparmor 拒绝而导致的。您可以在此处报告您的 dmesg,如果其中包含与它们匹配的“Apparmor Denies”。
其他人和我自己对上游的 apparmor 配置文件进行了一些更改,以便默认情况下可以工作,但这仅在后续版本中可用。
下面你将找到关于它的最新部分和上游的提交虚拟器。
2df320609ac # For hostdev access. The actual devices will be added dynamically
2df320609ac /sys/bus/usb/devices/ r,
f88a3d9b0c7 /sys/devices/**/usb[0-9]*/** r,
bf3a4140877 # libusb needs udev data about usb devices (~equal to content of lsusb -v)
bf3a4140877 /run/udev/data/c16[6,7]* r,
bf3a4140877 /run/udev/data/c18[0,8,9]* r,
d4d50bcc799 /run/udev/data/+usb* r,
您可以添加您需要的内容以/etc/apparmor.d/abstractions/libvirt-qemu
将其返回到您的安装。
还有许多其他更改会影响您客户机的动态规则创建。因此,如果上述内容还不够,您可能需要尝试较新版本的 libvirt/qemu,这意味着较新的 Ubuntu 版本(如果这能让您继续使用)。
PS 我把这个当作答案,尽管这可能不是你的情况。但你的症状完全符合,所以至少其他人可能在这里找到他们需要的答案。