Вопрос или проблема
Ниже устройство, для которого я хочу создать символьную ссылку, чтобы дать ему имя.
Udevadm info начинается с устройства, указанного в devpath, и затем
поднимается по цепи родительских устройств. Он выводит для каждого устройства
все возможные атрибуты в формате ключей правил udev.
Правило для сопоставления может быть составлено из атрибутов устройства
и атрибутов от одного единственного родительского устройства.
рассматривая устройство '/devices/pci0000:00/0000:00:14.0/usb1/1-9/1-9:1.0/ttyUSB0/tty/ttyUSB0':
KERNEL=="ttyUSB0"
SUBSYSTEM=="tty"
DRIVER==""
рассматривая родительское устройство '/devices/pci0000:00/0000:00:14.0/usb1/1-9/1-9:1.0/ttyUSB0':
KERNELS=="ttyUSB0"
SUBSYSTEMS=="usb-serial"
DRIVERS=="cp210x"
ATTRS{port_number}=="0"
рассматривая родительское устройство '/devices/pci0000:00/0000:00:14.0/usb1/1-9/1-9:1.0':
KERNELS=="1-9:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="cp210x"
ATTRS{authorized}=="1"
ATTRS{bInterfaceProtocol}=="00"
ATTRS{bInterfaceSubClass}=="00"
ATTRS{bInterfaceClass}=="ff"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bInterfaceNumber}=="00"
ATTRS{supports_autosuspend}=="1"
ATTRS{bNumEndpoints}=="02"
рассматривая родительское устройство '/devices/pci0000:00/0000:00:14.0/usb1/1-9':
KERNELS=="1-9"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{bmAttributes}=="80"
ATTRS{bConfigurationValue}=="1"
ATTRS{bNumInterfaces}==" 1"
ATTRS{rx_lanes}=="1"
ATTRS{urbnum}=="18"
ATTRS{bDeviceProtocol}=="00"
ATTRS{quirks}=="0x0"
ATTRS{authorized}=="1"
ATTRS{bDeviceSubClass}=="00"
ATTRS{manufacturer}=="Silicon Labs"
ATTRS{idVendor}=="10c4"
ATTRS{tx_lanes}=="1"
ATTRS{product}=="CP2102N USB to UART Bridge Controller"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{configuration}==""
ATTRS{removable}=="removable"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{busnum}=="1"
ATTRS{bDeviceClass}=="00"
ATTRS{devnum}=="4"
ATTRS{serial}=="021f39d67f9aea11aa965eb3b9348ba5"
ATTRS{maxchild}=="0"
ATTRS{devpath}=="9"
ATTRS{version}==" 2.00"
ATTRS{bMaxPower}=="100mA"
ATTRS{ltm_capable}=="no"
ATTRS{bcdDevice}=="0100"
ATTRS{bNumConfigurations}=="1"
ATTRS{idProduct}=="ea60"
ATTRS{speed}=="12"
рассматривая родительское устройство '/devices/pci0000:00/0000:00:14.0/usb1':
KERNELS=="usb1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{version}==" 2.00"
ATTRS{bDeviceProtocol}=="01"
ATTRS{bmAttributes}=="e0"
ATTRS{removable}=="unknown"
ATTRS{maxchild}=="12"
ATTRS{authorized}=="1"
ATTRS{bConfigurationValue}=="1"
ATTRS{ltm_capable}=="no"
ATTRS{quirks}=="0x0"
ATTRS{configuration}==""
ATTRS{bNumConfigurations}=="1"
ATTRS{bcdDevice}=="0504"
ATTRS{tx_lanes}=="1"
ATTRS{product}=="xHCI Host Controller"
ATTRS{speed}=="480"
ATTRS{devpath}=="0"
ATTRS{bMaxPower}=="0mA"
ATTRS{busnum}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{manufacturer}=="Linux 5.4.0-200-generic xhci-hcd"
ATTRS{interface_authorized_default}=="1"
ATTRS{devnum}=="1"
ATTRS{urbnum}=="140"
ATTRS{authorized_default}=="1"
ATTRS{serial}=="0000:00:14.0"
ATTRS{bNumInterfaces}==" 1"
ATTRS{idVendor}=="1d6b"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{bDeviceClass}=="09"
ATTRS{idProduct}=="0002"
ATTRS{rx_lanes}=="1"
ATTRS{bDeviceSubClass}=="00"
рассматривая родительское устройство '/devices/pci0000:00/0000:00:14.0':
KERNELS=="0000:00:14.0"
SUBSYSTEMS=="pci"
DRIVERS=="xhci_hcd"
ATTRS{device}=="0x9ded"
ATTRS{d3cold_allowed}=="1"
ATTRS{index}=="5"
ATTRS{local_cpulist}=="0-7"
ATTRS{subsystem_vendor}=="0x1028"
ATTRS{msi_bus}=="1"
ATTRS{label}=="Onboard - Other"
ATTRS{numa_node}=="-1"
ATTRS{dma_mask_bits}=="64"
ATTRS{dbc}=="disabled"
ATTRS{driver_override}=="(null)"
ATTRS{class}=="0x0c0330"
ATTRS{broken_parity_status}=="0"
ATTRS{local_cpus}=="ff"
ATTRS{consistent_dma_mask_bits}=="64"
ATTRS{irq}=="130"
ATTRS{revision}=="0x30"
ATTRS{subsystem_device}=="0x08af"
ATTRS{enable}=="1"
ATTRS{vendor}=="0x8086"
ATTRS{ari_enabled}=="0"
рассматривая родительское устройство '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""
Я создаю следующее правило udev:
SUBSYSTEM=="tty",KERNEL=="ttyUSB*",ATTRS{idVendor}=="10c4",ATTRS{idProduct}=="ea60",ATTRS{serial}=="021f39d67f9aea11aa965eb3b9348ba5",MODE="0660",OWNER="user",GROUP="dialout",SYMLINK+="PROG1"
И оно создало символьную ссылку, однако я не могу изменить её владельца и группу.
user@user:/etc/udev/rules.d$ ls -la /dev/ttyUSB0
crw-rw----+ 1 user dialout 188, 0 дек 3 10:57 /dev/ttyUSB0
user@user:/etc/udev/rules.d$ ls -la /dev/PROG1
lrwxrwxrwx 1 root root 7 дек 3 10:57 /dev/PROG1 -> ttyUSB0
Ответ или решение
Проблема изменения владельца и группы для udev-правила
При настройке правил udev
для замены имени устройств, таких как ttyUSB0
, вы столкнулись с проблемой, когда созданный симлинк /dev/PROG1
не наследует указанные вами владельца и группу. Вы создали следующее правило:
SUBSYSTEM=="tty",KERNEL=="ttyUSB*",ATTRS{idVendor}=="10c4",ATTRS{idProduct}=="ea60",ATTRS{serial}=="021f39d67f9aea11aa965eb3b9348ba5",MODE="0660",OWNER="user",GROUP="dialout",SYMLINK+="PROG1"
Анализ проблемы
-
Создание симлинка и его права доступа: Правило
SYMLINK+="PROG1"
создает символическую ссылку/dev/PROG1
, указывающую на/dev/ttyUSB0
. Если вы посмотрите на вывод командыls -la /dev/PROG1
, вы увидите, что у нее установлены права доступаlrwxrwxrwx
, а владелец и группа –root
. -
Почему это происходит:
- Включение параметров
OWNER
иGROUP
в правилоudev
влияет на физическое устройство, а не на его символическую ссылку. Символические ссылки создаются с правами, установленными системой, по умолчанию указывая наroot:root
. - Симлинк сами по себе не подлежат изменениям прав доступа в udev, так как они указывают на другое устройство, и для их управления могут требоваться другие подходы.
- Включение параметров
Решение проблемы
Чтобы изменить владельца и группу для символической ссылки, вам нужно комбинировать несколько решений:
-
Использование
RUN
команды: Вы можете добавить команду в правило, которая выполнит изменение владельца и группы после создания симлинка. Пример:SUBSYSTEM=="tty",KERNEL=="ttyUSB*",ATTRS{idVendor}=="10c4",ATTRS{idProduct}=="ea60",ATTRS{serial}=="021f39d67f9aea11aa965eb3b9348ba5",MODE="0660",OWNER="user",GROUP="dialout",SYMLINK+="PROG1", RUN+="/bin/chown user:dialout /dev/PROG1"
Убедитесь, что путь к команде
chown
корректен и что вы используете правильные права доступа. -
Перемещение правила: Иногда
udev
может не перезапускать правила, если они были изменены после инициализации. Попробуйте:sudo udevadm control --reload-rules sudo udevadm trigger
-
Проверка логов: Если команда не выполнилась, проверьте логи системы или
udev
, чтобы выяснить, произошла ли ошибка. Вы можете использовать команду:journalctl -u systemd-udevd
Заключение
Убедитесь, что после выполнения всех вышеуказанных действий, символическая ссылка /dev/PROG1
будет иметь нужные параметры владельца и группы. Одновременно с этим свои дополнительные проверки могут потребоваться в зависимости от вашей конкретной конфигурации системы или окружения. Таким образом, предложенные варианты и рекомендации помогут решить вашу проблему с управлением правами в системе.