지난 2년 동안 저는 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
AppArmor가 이것과 관련이 있는지 확인했지만 kern.log
그렇지 않은 것 같습니다. 방해가 되지 않도록 일시적으로 AppArmor를 완전히 비활성화했습니다.
이 문제를 해결하는 방법을 아는 사람이 있나요?
편집하다: chmod -R go+rw /dev/bus/usb
USB 장치를 연결하기 전에 작업을 수행하는 것도 도움이 되지 않습니다.
답변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가 루트로 실행되고 있는지 확인하십시오 /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
제 생각에는 QEMU를 루트로 실행하는 것이 꼭 필요한 것은 아니지만 단지 그것이 작동하기를 바랍니다.
답변2
Darhuuk의 답변 덕분에 저는 이 작업을 직접 수행한 다음 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"
전달하려는 장치의 공급업체 및 제품 ID는 어디에 있고 XXXX
는 무엇입니까? YYYY
(연결된 항목에 관계없이 특정 물리적 USB 포트를 전달하려는 경우 버스 및 포트와 같은 다른 sysfs 속성을 통해 설정할 수도 있습니다)
실행 udevadm control --reload-rules
하고 sudo systemctl restart libvirtd.service
.