Вопрос или проблема
Я пытаюсь перенаправить 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.
Пример
-
Групповая принадлежность: Как правило, устройства видео принадлежат группе
video
. Пользователь добавлен в эту группу, что в теории должно было дать необходимый доступ. Это подтверждается командами, показывающими, что устройство/dev/video0
имеет права чтения и записи для группыvideo
. -
Разрешения у устройств: Несмотря на изменение разрешений на файл
/dev/video0
в777
, доступ все равно ограничен из-за ограничений доступа к USB-шине (ошибкаLIBUSB_ERROR_ACCESS[-3]
). При изменении разрешений на/dev/bus/usb/003/003
проблема перестала возникать.
Применение
Чтобы предоставлять устойчивый доступ для всех сеансов, рекомендуется создать собственное правило udev вместо временных решений, таких как изменение разрешений вручную. Это позволяет автоматизировать процесс при каждом подключении устройства:
-
Создание 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
.
- Создайте файл в директории
-
Проверка результата: Подключите устройство снова и убедитесь, что оно автоматически получает необходимые разрешения.
Таким образом, использование udev обеспечивает не только корректную работу приложения Remmina с перенаправлением USB, но и улучшает безопасность, так как минимизирует необходимость использовать привилегированные учетные записи и ручные изменения разрешений. Эта методология гарантирует, что все необходимые настройки будут применены автоматически при каждом подключении устройства.