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


제가 처음 시도한 또 다른 접근 방식은 그놈 박스를 사용하여 해당 게스트 설정에서 카메라 장치에 대한 액세스를 활성화하는 것이었습니다. 다음과 같은 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

그놈 상자의 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

이 수정 사항은 디바이스를 호스트에 다시 연결하거나 호스트를 다시 시작한 후에는 지속되지 않습니다.

답변2

이전의데비안 머신, spice-client-glib-usb-acl-helperSPICE GTK는 필요에 따라 또는 구성별로 USB 장치를 VM에 전달하는 데 사용됩니다. PolicyKit 제품군을 통해 ACL(Linux 액세스 제어 목록)을 확인합니다.

도우미는 사용자 권한으로 실행되지만 권한 있는 리소스에 대한 액세스를 결정하는 프로그램에 의해 호출되므로 높은 권한으로 실행하려면 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 장치를 클라이언트에 전달할 수 있습니다.

관련 정보