web-dev-qa-db-fra.com

Règles UDEV, la variable "NAME" ne fonctionne pas

J'ai écrit une simple règle udev pour m'aider à comprendre le concept

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

La partie lien symbolique de la règle UDEV fonctionne (elle a été commentée), mais la partie Nom de la règle UDEV ne fonctionne pas. Je ne suis pas sûr de ce que j'ai mal fait?

Ma deuxième partie de la question est: qu'est-ce que le lien symbolique est censé faire quand je l'ai créé? Je comprends que cela pointe vers le fichier de périphérique, mais c'est un peu inutile. Je voudrais qu'il pointe vers le point de montage afin que je puisse l'utiliser comme raccourci pour entrer dans la clé USB. Avez-vous des idées sur la façon de procéder?

2
Bad programmer

Vous ne pouvez pas renommer un nœud de périphérique en attribuant à la clé NAME dans les règles udev. Du moins pas dans systemd udev. Seul un nom de périphérique réseau peut être modifié. Du manuel d'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.

Tout lien symbolique udev pour un périphérique n’est pas spécial en lui-même. Il ne s'agit que d'un lien symbolique du système de fichiers vers le nœud de périphérique. Cependant, un exemple d'utilisation utile des règles udev symlink est que, comme les noms de périphériques dépendent de l'ordre dans lequel le noyau détecte les périphériques, le nom de périphérique sur lequel réside un système de fichiers spécifique est imprévisible. À un moment donné, une clé USB peut obtenir le nom de périphérique /dev/sdf, et à un autre /dev/sdg. Les règles Udev sont généralement installées et ajoutent des noms de lien symbolique prévisibles, comme cela se fait sur mon ordinateur portable Ubuntu dans /dev/disk/by-uuid/ où les uuid des systèmes de fichiers sur le disque sont des liens symboliques pointant vers le nom du périphérique du noyau.

En ce qui concerne votre dernière question, vous ne pouvez pas avoir un lien symbolique udev pointant sur autre chose qu’un nœud de périphérique, vous ne pouvez donc pas le faire pointer sur un point de montage:

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

Pour réaliser ce que vous voulez faire, vous pouvez attribuer une étiquette au système de fichiers et faire en sorte que le programme que vous utilisez pour monter vos systèmes de fichiers (udisks2?) Utilise l'étiquette figurant dans le nom du point de montage.

2
Tom Bjerck

Comment résoudre le problème de ne pas connaître le nom des périphériques USB lorsque plusieurs périphériques USB sont branchés sur le même ordinateur? Le moyen le plus simple consiste à utiliser les noms de périphérique du dossier/dev. Après avoir branché les adaptateurs USB, il générera automatiquement un nom de série que vous pourrez trouver sous le répertoire/dev/serial/by-id indiqué ci-dessous.

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

QSB_81658 aura éventuellement un nom unique pour ce périphérique USB.

J'ai essayé d'écrire des règles de développement qui étaient redondantes, car chaque périphérique avait son propre nom constant, comme indiqué ci-dessus. Je suis également tombé sur des problèmes tels que le fait d’appliquer les règles de développement.

Ecrire des règles de dev pour assigner des noms à des individus. Comme nous le savons, chaque adaptateur QSB a son propre numéro de série, que vous pouvez trouver sur la partie avant de l'adaptateur noir. Pour mon cas, j'ai deux adaptateurs QSB0. L'une porte le numéro de série 81830, une autre le numéro de série 81658. J'utiliserai cet attribut (ATTRS {série}) pour attribuer un nom à ces deux adaptateurs.

Tout d’abord, lancez udevadm pour examiner les détails des périphériques 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==""

Ensuite, vous verrez une ligne ci-dessous parmi les résultats imprimés.

            ATTRS{serial}=="81830"

Allez dans le répertoire /etc/udev/rules.d/

Ajoutez 990-usdigital-qsbadapter.rules à l'aide de la commande

  Sudo nano 990-usdigital-qsbadapter.rules

Puis mettez les suivants dans le fichier

  #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"

testez vos règles, vous pouvez courir

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

En raison de problèmes d’autorisation, je n’ai pas pu modifier NAME.Instead, j’utilise SYMLINK.

( Les règles UDEV, la variable "NAME" ne fonctionnant pas ) Vous ne pouvez pas renommer un nœud de périphérique en attribuant à la clé NAME des règles udev. Du moins pas dans systemd udev. Seul un nom de périphérique réseau peut être modifié. Du manuel d'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.

Donc, changez le contenu du fichier de règles en #Ce fichier de règles est utilisé pour attribuer des noms à l'adaptateur qsb de USdigital

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

Veuillez cliquer sur l'image ci-dessous pour voir le résultat. Imprimer les résultats

0
Michael M