過去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が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
私の考えでは、QEMUをrootとして実行することは必ずしも必要ではありませんが、単にそれがうまくいくことを願っています。
答え2
Darhuukの回答のおかげで、私はこれを直接実行し、qemuをrootとして実行しないように変更できました。これが私がしたことです:
で/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
。