Правила UDEV, переменная «NAME» не работает

Правила UDEV, переменная «NAME» не работает

Я написал простое правило udev, которое поможет мне понять концепцию.

#SUBSYSTEM=="block", ATTR{size}=="3913727", SYMLINK="AlphaUSB"
SUBSYSTEM=="block", ATTR{size}=="3913727", NAME="HelloUSB"

Часть правила UDEV с символической ссылкой работает (она закомментирована), но часть правила UDEV с именем не работает. Я не уверен, что я сделал не так?

Вторая часть моего вопроса: что должна делать символическая ссылка, когда я ее создал? Я понимаю, что она указывает на файл устройства, но это бесполезно. Я бы хотел, чтобы она указывала на точку монтирования, чтобы я мог использовать ее как ярлык для доступа к USB, есть идеи, как это сделать?

решение1

Вы не можете переименовать узел устройства, назначив его ключу NAMEв правилах udev. По крайней мере, в systemd udev. Можно изменить только имя сетевого устройства. Из руководства udev:

   NAME
       The name to use for a network interface. See
       systemd.link(5) for a higher-level mechanism
       for setting the interface name. The name of a
       device node cannot be changed by udev, only
       additional symlinks can be created.

Любая символическая ссылка udev для устройства сама по себе не является чем-то особенным. Это просто символическая ссылка файловой системы на узел устройства. Однако примером полезного использования правил символических ссылок udev является то, что поскольку имена устройств зависят от порядка, в котором ядро ​​обнаруживает устройства, имя устройства, на котором находится конкретная файловая система, непредсказуемо. В один момент флэш-накопитель может получить имя устройства /dev/sdf, а в другой /dev/sdg. Обычно устанавливаются правила Udev, которые добавляют предсказуемые имена символических ссылок, как это сделано на моем ноутбуке Ubuntu, где /dev/disk/by-uuid/uuid файловых систем на диске являются символическими ссылками, указывающими на имя устройства ядра.

Что касается вашего последнего вопроса, символическая ссылка udev не может указывать ни на что, кроме узла устройства, поэтому она не может указывать на точку монтирования:

   SYMLINK
       The name of a symlink targeting the node. Every
       matching rule adds this value to the list of
       symlinks to be created.

Чтобы добиться желаемого, вы можете присвоить файловой системе метку и указать программе, которую вы используете для монтирования файловых систем (udisks2?), использовать эту метку в имени точки монтирования.

решение2

Как решить проблему незнания имен USB-устройств, когда несколько USB-устройств подключены к одному компьютеру? Самый простой способ — использовать имена устройств из папки /dev. После подключения USB-адаптеров он автоматически сгенерирует для него серийное имя, которое вы можете найти в /dev/serial/by-id, как показано ниже

  /dev/serial/by-id/usb-US_Digital_USB__-__QSB_81658-if00-port0

QSB_81658 в конечном итоге станет уникальным именем для этого USB-устройства.

Я попытался написать правила разработки, что было избыточно, потому что каждое устройство имело свое собственное имя константы, как показано выше. Я также столкнулся с некоторыми проблемами, например, когда я применял правила разработки.

Написание правил разработки для назначения имен отдельным лицам. Как мы знаем, каждый адаптер QSB имеет свой собственный серийный номер, который вы можете найти на передней части черного адаптера. В моем случае у меня есть два адаптера QSB0. Один имеет серийный номер 81830, другой — серийный номер 81658. Я буду использовать этот атрибут (ATTRS{serial}) для назначения имен этим двум адаптерам.

Сначала запустите udevadm, чтобы просмотреть сведения об USB-устройствах.

$ udevadm info -a -n /dev/ttyUSB0

  Udevadm info starts with the device specified by the devpath and then
  walks up the chain of parent devices. It prints for every device
  found, all possible attributes in the udev rules key format.
  A rule to match, can be composed by the attributes of the device
  and the attributes from one single parent device.

    looking at device '':
      KERNEL=="ttyUSB0"
      SUBSYSTEM=="tty"
      DRIVER==""

    looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/ttyUSB0':
      KERNELS=="ttyUSB0"
      SUBSYSTEMS=="usb-serial"
      DRIVERS=="ftdi_sio"
      ATTRS{latency_timer}=="16"
      ATTRS{port_number}=="0"

    looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0':
      KERNELS=="1-8:1.0"
      SUBSYSTEMS=="usb"
      DRIVERS=="ftdi_sio"
      ATTRS{authorized}=="1"
      ATTRS{bAlternateSetting}==" 0"
      ATTRS{bInterfaceClass}=="ff"
      ATTRS{bInterfaceNumber}=="00"
      ATTRS{bInterfaceProtocol}=="ff"
      ATTRS{bInterfaceSubClass}=="ff"
      ATTRS{bNumEndpoints}=="02"
      ATTRS{interface}=="USB <-> QSB"
      ATTRS{supports_autosuspend}=="1"

    looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8':
      KERNELS=="1-8"
      SUBSYSTEMS=="usb"
      DRIVERS=="usb"
      ATTRS{authorized}=="1"
      ATTRS{avoid_reset_quirk}=="0"
      ATTRS{bConfigurationValue}=="1"
      ATTRS{bDeviceClass}=="00"
      ATTRS{bDeviceProtocol}=="00"
      ATTRS{bDeviceSubClass}=="00"
      ATTRS{bMaxPacketSize0}=="8"
      ATTRS{bMaxPower}=="500mA"
      ATTRS{bNumConfigurations}=="1"
      ATTRS{bNumInterfaces}==" 1"
      ATTRS{bcdDevice}=="0600"
      ATTRS{bmAttributes}=="80"
      ATTRS{busnum}=="1"
      ATTRS{configuration}==""
      ATTRS{devnum}=="5"
      ATTRS{devpath}=="8"
      ATTRS{idProduct}=="6001"
      ATTRS{idVendor}=="0403"
      ATTRS{ltm_capable}=="no"
      ATTRS{manufacturer}=="US Digital"
      ATTRS{maxchild}=="0"
      ATTRS{product}=="USB <-> QSB"
      ATTRS{quirks}=="0x0"
      ATTRS{removable}=="unknown"
      ATTRS{serial}=="81830"
      ATTRS{speed}=="12"
      ATTRS{urbnum}=="72190"
      ATTRS{version}==" 2.00"

    looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1':
      KERNELS=="usb1"
      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}=="0404"
      ATTRS{bmAttributes}=="e0"
      ATTRS{busnum}=="1"
      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 4.4.0-128-generic xhci-hcd"
      ATTRS{maxchild}=="16"
      ATTRS{product}=="xHCI Host Controller"
      ATTRS{quirks}=="0x0"
      ATTRS{removable}=="unknown"
      ATTRS{serial}=="0000:00:14.0"
      ATTRS{speed}=="480"
      ATTRS{urbnum}=="129"
      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{broken_parity_status}=="0"
      ATTRS{class}=="0x0c0330"
      ATTRS{consistent_dma_mask_bits}=="64"
      ATTRS{d3cold_allowed}=="1"
      ATTRS{device}=="0xa12f"
      ATTRS{dma_mask_bits}=="64"
      ATTRS{driver_override}=="(null)"
      ATTRS{enable}=="1"
      ATTRS{irq}=="120"
      ATTRS{local_cpulist}=="0-3"
      ATTRS{local_cpus}=="f"
      ATTRS{msi_bus}=="1"
      ATTRS{numa_node}=="-1"
      ATTRS{subsystem_device}=="0x8694"
      ATTRS{subsystem_vendor}=="0x1043"
      ATTRS{vendor}=="0x8086"

    looking at parent device '/devices/pci0000:00':
      KERNELS=="pci0000:00"
      SUBSYSTEMS==""
      DRIVERS==""

Затем вы увидите одну строку ниже из распечатанных результатов.

            ATTRS{serial}=="81830"

Перейдите в каталог /etc/udev/rules.d/

Добавьте 990-usdigital-qsbadapter.rules с помощью команды

  sudo nano 990-usdigital-qsbadapter.rules

Затем поместите в файл следующее:

  #This rule file is used to assign names for qsb adapter from USdigital 
  KERNELS=="1-8",SUBSYSTEMS=="usb",ATTRS{serial}=="81830",NAME="qsb81830"
  KERNELS=="1-8",SUBSYSTEMS=="usb",ATTRS{serial}=="81658",NAME="qsb81658"

проверьте свои правила, вы можете запустить

  udevadm control --reload-rules
  udevadm test /dev/serial/by-id/usb-US_Digital_USB__-__QSB_81658-if00-port0

Из-за проблем с разрешениями я не смог изменить NAME. Вместо этого я использую SYMLINK.

(Правила UDEV, переменная «NAME» не работает) Вы не можете переименовать узел устройства, назначив его ключу NAME в правилах udev. По крайней мере, в systemd udev. Можно изменить только имя сетевого устройства. Из руководства udev:

  NAME
         The name to use for a network interface. See
         systemd.link(5) for a higher-level mechanism
         for setting the interface name. The name of a
         device node cannot be changed by udev, only
         additional symlinks can be created.

Поэтому измените содержимое файла правил на #Этот файл правил используется для назначения имен для адаптера QSB от USdigital

  ATTRS{serial}=="81830",SYMLINK+="QSB830"
  ATTRS{serial}=="81658",SYMLINK+="QSB658"

Нажмите на картинку ниже, чтобы увидеть результат. Распечатать результаты

Связанный контент