
ゲストシステムが私のラップトップカメラにアクセスできるようにしたいです。
ゲストシステムが実行されていない状態でそれを開き、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
ません。カメラへのゲストアクセスを許可するには、どのように権限を安全に管理する必要がありますか?qemu
root
私が最初に試したもう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/
グループにデバイスを追加することがわかりました。kvm
virt-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
この修正は、デバイスをホストに再接続した後、またはホストを再起動した後も持続しません。
答え2
以前のDebian マシン、spice-client-glib-usb-acl-helper
SPICE GTKは、必要に応じて、または構成ごとにUSBデバイスをVMに転送するために使用されます。 PolicyKitファミリを介してLinuxアクセス制御リスト(ACL)を確認します。
ヘルパーはユーザー権限で実行されますが、特権リソースへのアクセスを決定するプログラムによって呼び出されるため、高い権限で実行するには setuid を設定する必要があります。 Debian システムでは、インストール中に setuid が設定されます。
$ LC_ALL=C ls -l /usr/libexec/spice-client-glib-usb-acl-helper
-rwsr-xr-x 1 root root 18512 Mar 1 2023 /usr/libexec/spice-client-glib-usb-acl-helper
s
権限のsetuidビットに注意してください。
ただし、Guixシステムでは、権限のないユーザーがインストールしたと見なされます。したがって、インストール後に追加の構成が必要です。また、Guix リポジトリには setuid プログラムを含めることはできません。セキュリティ上の理由から。したがって、setuidプログラムはシステム構成ファイルで宣言する必要があります。
以下は、GuixシステムでSPICE USBパススルーが機能するようにこれらの項目を追加する方法のクールな例です。
(use-modules …
(gnu system setuid)
(gnu packages spice))
(use-service-modules …
virtualization dbus)
(operating-system …
(services
(append (list …
(service libvirt-service-type)
(service virtlog-service-type)
(simple-service 'spice-polkit polkit-service-type (list spice-gtk)))))
(setuid-programs
(append (list (setuid-program
(program (file-append spice-gtk "/libexec/spice-client-glib-usb-acl-helper"))))
%setuid-programs)))
ポリシーを拡張する行と、基本的なsetuidプログラムのリストを拡張するコードスニペットを確認してください。
この構成により、GNOME Box インターフェイスのスイッチを使用して USB デバイスをクライアントに転送できます。