Разрешения /dev/video в Arch Linux (Remmina с использованием FreeRDP)

Вопрос или проблема

Я пытаюсь перенаправить USB через Remmina в RDP-сессию (FreeRDP на Linux).

Доступ к USB-камере работает отлично, когда я запускаю Remmina как root, что не идеально по очевидным причинам.

Мне нужно предоставить моему обычному пользователю доступ к этому устройству при запуске Remmina как обычный пользователь. Поэтому я попробовал следующее:

  • Добавил моего пользователя в группу video, затем вышел и вошел в систему заново
  • Изменил права доступа /dev/video0 на 777, чтобы проверить, и потом всё вернуть обратно.

Вот исходные права доступа /dev/video0:

$ ls -a -l /dev/video0
crw-rw----+ 1 root video 81, 0 Jul 25 08:36 /dev/video0

Затем я выполнил:

$ sudo chmod 777 /dev/video0

Права доступа снова после выполнения команды:

$ ls -a -l /dev/video0
crwxrwxrwx+ 1 root video 81, 0 Jul 25 08:36 /dev/video0

Перед тем, как выполнить изменения прав доступа, я просто добавил своего пользователя в группу video и вышел/вошел снова.

Вывод lsusb, относящийся к моему устройству:

Bus 003 Device 003: ID 046d:0892 Logitech, Inc. C920 HD Pro Webcam

Опции, использованные в Remmina:

USB device Redirection: id:046d:0892,addr:003:003

Вывод ошибок Remmina:

[08:57:34:285] [1821:1848] [INFO][com.freerdp.channels.urbdrc.client] - VID: 0x046D, PID: 0x0892
[08:57:34:285] [1821:1848] [ERROR][com.freerdp.channels.urbdrc.client] - libusb_open: error LIBUSB_ERROR_ACCESS[-3]
[08:57:34:285] [1821:1848] [ERROR][com.freerdp.channels.urbdrc.client] - libusb_open [b=0x03,p=0x06,a=0x03,VID=0x046D,PID=0x0892]: error LIBUSB_ERROR_ACCESS[-3]
[08:57:34:285] [1821:1848] [ERROR][com.freerdp.channels.urbdrc.client] - libusb_open: error LIBUSB_ERROR_ACCESS[-3]
[08:57:34:285] [1821:1848] [ERROR][com.freerdp.channels.urbdrc.client] - libusb_open [b=0x03,p=0x06,a=0x03,VID=0x046D,PID=0x0892]: error LIBUSB_ERROR_ACCESS[-3]

ИЗМЕНЕНИЕ:

Результат команды: $ udevadm info -a /dev/video0


  looking at device '/devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6:1.0/video4linux/video0':
    KERNEL=="video0"
    SUBSYSTEM=="video4linux"
    DRIVER==""
    ATTR{dev_debug}=="0"
    ATTR{index}=="0"
    ATTR{name}=="HD Pro Webcam C920"
    ATTR{power/control}=="auto"
    ATTR{power/runtime_active_time}=="0"
    ATTR{power/runtime_status}=="unsupported"
    ATTR{power/runtime_suspended_time}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6:1.0':
    KERNELS=="3-6:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="uvcvideo"
    ATTRS{authorized}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceClass}=="0e"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bInterfaceProtocol}=="00"
    ATTRS{bInterfaceSubClass}=="01"
    ATTRS{bNumEndpoints}=="01"
    ATTRS{iad_bFirstInterface}=="00"
    ATTRS{iad_bFunctionClass}=="0e"
    ATTRS{iad_bFunctionProtocol}=="00"
    ATTRS{iad_bFunctionSubClass}=="03"
    ATTRS{iad_bInterfaceCount}=="02"
    ATTRS{supports_autosuspend}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb3/3-6':
    KERNELS=="3-6"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="ef"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{bDeviceSubClass}=="02"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{bMaxPower}=="500mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 4"
    ATTRS{bcdDevice}=="0019"
    ATTRS{bmAttributes}=="80"
    ATTRS{busnum}=="3"
    ATTRS{configuration}==""
    ATTRS{devnum}=="3"
    ATTRS{devpath}=="6"
    ATTRS{idProduct}=="0892"
    ATTRS{idVendor}=="046d"
    ATTRS{ltm_capable}=="no"
    ATTRS{maxchild}=="0"
    ATTRS{power/active_duration}=="1610000"
    ATTRS{power/autosuspend}=="2"
    ATTRS{power/autosuspend_delay_ms}=="2000"
    ATTRS{power/connected_duration}=="2594730"
    ATTRS{power/control}=="auto"
    ATTRS{power/level}=="auto"
    ATTRS{power/persist}=="1"
    ATTRS{power/runtime_active_time}=="1610678"
    ATTRS{power/runtime_status}=="suspended"
    ATTRS{power/runtime_suspended_time}=="983716"
    ATTRS{product}=="HD Pro Webcam C920"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="unknown"
    ATTRS{rx_lanes}=="1"
    ATTRS{serial}=="66BA81DF"
    ATTRS{speed}=="480"
    ATTRS{tx_lanes}=="1"
    ATTRS{urbnum}=="1561744"
    ATTRS{version}==" 2.00"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb3':
    KERNELS=="usb3"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{authorized_default}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{bMaxPower}=="0mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bcdDevice}=="0510"
    ATTRS{bmAttributes}=="e0"
    ATTRS{busnum}=="3"
    ATTRS{configuration}==""
    ATTRS{devnum}=="1"
    ATTRS{devpath}=="0"
    ATTRS{idProduct}=="0002"
    ATTRS{idVendor}=="1d6b"
    ATTRS{interface_authorized_default}=="1"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="Linux 5.10.52-1-lts xhci-hcd"
    ATTRS{maxchild}=="15"
    ATTRS{power/active_duration}=="2595210"
    ATTRS{power/autosuspend}=="0"
    ATTRS{power/autosuspend_delay_ms}=="0"
    ATTRS{power/connected_duration}=="2595210"
    ATTRS{power/control}=="auto"
    ATTRS{power/level}=="auto"
    ATTRS{power/runtime_active_time}=="2595211"
    ATTRS{power/runtime_status}=="active"
    ATTRS{power/runtime_suspended_time}=="0"
    ATTRS{power/wakeup}=="disabled"
    ATTRS{power/wakeup_abort_count}==""
    ATTRS{power/wakeup_active}==""
    ATTRS{power/wakeup_active_count}==""
    ATTRS{power/wakeup_count}==""
    ATTRS{power/wakeup_expire_count}==""
    ATTRS{power/wakeup_last_time_ms}==""
    ATTRS{power/wakeup_max_time_ms}==""
    ATTRS{power/wakeup_total_time_ms}==""
    ATTRS{product}=="xHCI Host Controller"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="unknown"
    ATTRS{rx_lanes}=="1"
    ATTRS{serial}=="0000:00:14.0"
    ATTRS{speed}=="480"
    ATTRS{tx_lanes}=="1"
    ATTRS{urbnum}=="147"
    ATTRS{version}==" 2.00"

  looking at parent device '/devices/pci0000:00/0000:00:14.0':
    KERNELS=="0000:00:14.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="xhci_hcd"
    ATTRS{ari_enabled}=="0"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x0c0330"
    ATTRS{consistent_dma_mask_bits}=="64"
    ATTRS{d3cold_allowed}=="1"
    ATTRS{device}=="0x8c31"
    ATTRS{dma_mask_bits}=="64"
    ATTRS{driver_override}=="(null)"
    ATTRS{enable}=="1"
    ATTRS{irq}=="27"
    ATTRS{local_cpulist}=="0-3"
    ATTRS{local_cpus}=="f"
    ATTRS{msi_bus}=="1"
    ATTRS{msi_irqs/27}=="msi"
    ATTRS{numa_node}=="-1"
    ATTRS{power/control}=="on"
    ATTRS{power/runtime_active_time}=="2596888"
    ATTRS{power/runtime_status}=="active"
    ATTRS{power/runtime_suspended_time}=="0"
    ATTRS{power/wakeup}=="enabled"
    ATTRS{power/wakeup_abort_count}=="0"
    ATTRS{power/wakeup_active}=="0"
    ATTRS{power/wakeup_active_count}=="0"
    ATTRS{power/wakeup_count}=="0"
    ATTRS{power/wakeup_expire_count}=="0"
    ATTRS{power/wakeup_last_time_ms}=="0"
    ATTRS{power/wakeup_max_time_ms}=="0"
    ATTRS{power/wakeup_total_time_ms}=="0"
    ATTRS{revision}=="0x05"
    ATTRS{subsystem_device}=="0x220e"
    ATTRS{subsystem_vendor}=="0x17aa"
    ATTRS{vendor}=="0x8086"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""
    ATTRS{power/control}=="auto"
    ATTRS{power/runtime_active_time}=="0"
    ATTRS{power/runtime_status}=="unsupported"
    ATTRS{power/runtime_suspended_time}=="0"


Ответ заключался в предоставлении доступа к устройству на шине.

Моё устройство — это Device 003 на Bus 003:

$ lsusb
Bus 003 Device 003: ID 046d:0892 Logitech, Inc. C920 HD Pro Webcam

Таким образом, я установил права на файл /dev/bus/usb/003/003:

$ sudo chmod a+rw /dev/bus/usb/003/*

Теперь доступ предоставлен для обычных пользователей ко всем устройствам на этой шине (если мне нужно было бы только это устройство, я бы указал, например, …/usb/003/003).

ИЗМЕНЕНИЕ: Следует отметить, что это ВРЕМЕННОЕ решение и для устойчивости необходимо написать правило udev (обновлю позже, когда создаю своё устойчивое).

Ответ или решение

Для решения проблемы с доступом к веб-камере Logitech C920 HD в Arch Linux через Remmina с использованием FreeRDP, необходимо обеспечить правильные разрешения для USB-устройств, чтобы избежать использования root-доступа, что не является хорошей практикой с точки зрения безопасности.

Теоретическая часть

Основная проблема заключается в отсутствии прав доступа к устройству /dev/video0 для обычного пользователя, что мешает Remmina перенаправлять USB через RDP-сессию. Каждое USB-устройство обычно представлено в системе в виде файла устройства (например, /dev/bus/usb/003/003), доступ к которому контролируется системой управления устройствами udev.

Пример

  1. Групповая принадлежность: Как правило, устройства видео принадлежат группе video. Пользователь добавлен в эту группу, что в теории должно было дать необходимый доступ. Это подтверждается командами, показывающими, что устройство /dev/video0 имеет права чтения и записи для группы video.

  2. Разрешения у устройств: Несмотря на изменение разрешений на файл /dev/video0 в 777, доступ все равно ограничен из-за ограничений доступа к USB-шине (ошибка LIBUSB_ERROR_ACCESS[-3]). При изменении разрешений на /dev/bus/usb/003/003 проблема перестала возникать.

Применение

Чтобы предоставлять устойчивый доступ для всех сеансов, рекомендуется создать собственное правило udev вместо временных решений, таких как изменение разрешений вручную. Это позволяет автоматизировать процесс при каждом подключении устройства:

  1. Создание udev-правила:

    • Создайте файл в директории /etc/udev/rules.d/, например, 99-usb-camera.rules.
    • Добавьте в него строку, описывающую правило, например:
      SUBSYSTEM=="usb", ATTR{idVendor}=="046d", ATTR{idProduct}=="0892", MODE="0666"
    • Обновите правила: sudo udevadm control --reload-rules && sudo udevadm trigger.
  2. Проверка результата: Подключите устройство снова и убедитесь, что оно автоматически получает необходимые разрешения.

Таким образом, использование udev обеспечивает не только корректную работу приложения Remmina с перенаправлением USB, но и улучшает безопасность, так как минимизирует необходимость использовать привилегированные учетные записи и ручные изменения разрешений. Эта методология гарантирует, что все необходимые настройки будут применены автоматически при каждом подключении устройства.

Оцените материал
Добавить комментарий

Капча загружается...