Ubuntu 18.04アップグレード後、QEMU USBパススルーが中断されました。

Ubuntu 18.04アップグレード後、QEMU USBパススルーが中断されました。

過去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/usbUSBデバイスを接続する前に作業を実行しても役に立ちません。

答え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-rulessudo systemctl restart libvirtd.service

関連情報