QEMUゲストがUSBデバイスを使用できるようにするにはどうすればよいですか?

QEMUゲストがUSBデバイスを使用できるようにするにはどうすればよいですか?

ゲストシステムが私のラップトップカメラにアクセスできるようにしたいです。

ゲストシステムが実行されていない状態でそれを開き、virt-manager「仮想ハードウェアの詳細の表示」→「ハードウェアの追加」→「USBホストデバイス」に移動しました。ここでマイカメラ(001:002 Chicony Electronics Co.、Ltd HD User Facing)を選択して[完了]をクリックします。このプロセスは以下に関連しているようです。KVM ドキュメントに記載されている

これにより、次のスタンザがゲストシステムのXML構成に追加されます。

<hostdev mode="subsystem" type="usb" managed="yes">
  <source>
    <vendor id="0x04f2"/>
    <product id="0xb6dd"/>
  </source>
  <address type="usb" bus="0" port="6"/>
</hostdev>

によると、これは正確に見えます。デバイスの接続とアップデートのためのRed Hatマニュアルvirsh

ただし、権限が拒否されてゲストの実行には使用できませんqemu

Error starting domain: internal error: qemu unexpectedly closed the monitor: 2022-03-13T05:27:57.240470Z qemu-system-x86_64: -device {"driver":"usb-host","hostdevice":"/dev/bus/usb/001/002","id":"hostdev0","bus":"usb.0","port":"6"}: failed to open /dev/bus/usb/001/002: Permission denied

Traceback (most recent call last):
  File "/gnu/store/r9jxh3pv020qa05pza3jiky2vppn68mx-virt-manager-3.2.0/share/virt-manager/virtManager/asyncjob.py", line 65, in cb_wrapper
    callback(asyncjob, *args, **kwargs)
  File "/gnu/store/r9jxh3pv020qa05pza3jiky2vppn68mx-virt-manager-3.2.0/share/virt-manager/virtManager/asyncjob.py", line 101, in tmpcb
    callback(*args, **kwargs)
  File "/gnu/store/r9jxh3pv020qa05pza3jiky2vppn68mx-virt-manager-3.2.0/share/virt-manager/virtManager/object/libvirtobject.py", line 57, in newfn
    ret = fn(self, *args, **kwargs)
  File "/gnu/store/r9jxh3pv020qa05pza3jiky2vppn68mx-virt-manager-3.2.0/share/virt-manager/virtManager/object/domain.py", line 1329, in startup
    self._backend.create()
  File "/gnu/store/7c16ipd35j0fdl6mrjbg3v9zsn8iivi0-python-libvirt-7.9.0/lib/python3.9/site-packages/libvirt.py", line 1353, in create
    raise libvirtError('virDomainCreate() failed')
libvirt.libvirtError: internal error: qemu unexpectedly closed the monitor: 2022-03-13T05:27:57.240470Z qemu-system-x86_64: -device {"driver":"usb-host","hostdevice":"/dev/bus/usb/001/002","id":"hostdev0","bus":"usb.0","port":"6"}: failed to open /dev/bus/usb/001/002: Permission denied

アクセスしようとしているデバイスが正しいデバイスです。

$ lsusb -s 001:002
Bus 001 Device 002: ID 04f2:b6dd Chicony Electronics Co., Ltd HD User Facing

このデバイスはの所有ですroot。読み取りアクセス権が十分ではないようですqemu

$ LC_ALL=C ls -l /dev/bus/usb/001/002
crw-rw-r-- 1 root root 189, 1 Mar 13 06:15 /dev/bus/usb/001/002

私の考えでは、このデバイスの所有者にはrootセキュリティ上の妥当な理由があったようです。もう一度メッセージは表示されvirt-managerません。カメラへのゲストアクセスを許可するには、どのように権限を安全に管理する必要がありますか?qemuroot


私が最初に試したもう1つのアプローチは、GNOMEボックスを使用して、そのゲスト設定でカメラデバイスへのアクセスを有効にすることでした。次のSPICE USBリダイレクトを使用しようとします。SPICE ユーザーズマニュアルに記載されているただし、qemu-xhci代わりにホストアダプタを使用してくださいich9-ehci1。ただし、カメラデバイスのゲスト設定でスイッチを切り替えようとすると、リダイレクトが失敗したという通知のみが表示されます。私のゲスト設定の関連部分は次のとおりです。大丈夫に見えます。

    <controller type="usb" index="0" model="qemu-xhci" ports="15">
      <alias name="usb"/>
      <address type="pci" domain="0x0000" bus="0x02" slot="0x00" function="0x0"/>
    </controller>
    <redirdev bus="usb" type="spicevmc">
      <alias name="redir0"/>
      <address type="usb" bus="0" port="2"/>
    </redirdev>
    <redirdev bus="usb" type="spicevmc">
      <alias name="redir1"/>
      <address type="usb" bus="0" port="3"/>
    </redirdev>
    <redirdev bus="usb" type="spicevmc">
      <alias name="redir2"/>
      <address type="usb" bus="0" port="4"/>
    </redirdev>
    <redirdev bus="usb" type="spicevmc">
      <alias name="redir3"/>
      <address type="usb" bus="0" port="5"/>
    </redirdev>

それでは、ゲストがカメラを使用できるようにするにはどうすればよいですか?

ベストアンサー1

GNOMEボックスのGUIスイッチを使用するか、仮想マシンで使用できるように許可された/dev/bus/usb/グループにデバイスを追加することがわかりました。kvmvirt-manager

バス番号とデバイス番号はで識別できますlsusb。デバイスは、からバス番号と呼ばれるディレクトリにある番号として使用できます/dev/bus/usb/。例えば、

$ lsusb | grep HD
Bus 001 Device 002: ID 04f2:b6dd Chicony Electronics Co., Ltd HD User Facing
$ sudo chgrp kvm /dev/bus/usb/001/002
$ LC_ALL=C ls -l /dev/bus/usb/001/002
crw-rw-r-- 1 root kvm 189, 1 Apr  2 17:26 /dev/bus/usb/001/002

この修正は、デバイスをホストに再接続した後、またはホストを再起動した後も持続しません。

おすすめ記事