UDEV-Regeln, Variable „NAME“ funktioniert nicht

UDEV-Regeln, Variable „NAME“ funktioniert nicht

Ich habe eine einfache udev-Regel geschrieben, um das Konzept zu verstehen

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

Der Symlink-Teil der UDEV-Regel funktioniert (er wurde auskommentiert), aber der Namensteil der UDEV-Regel funktioniert nicht. Ich bin nicht sicher, was ich falsch gemacht habe?

Der zweite Teil meiner Frage lautet: Was soll der symbolische Link tun, wenn ich ihn erstellt habe? Ich verstehe, dass er auf die Gerätedatei verweist, aber das ist ziemlich nutzlos. Ich möchte, dass er auf den Einhängepunkt verweist, damit ich diesen als Abkürzung zum USB-Stick verwenden kann. Irgendwelche Ideen, wie ich das machen kann?

Antwort1

Sie können einen Geräteknoten nicht umbenennen, indem Sie ihn dem NAMESchlüssel in udev-Regeln zuweisen. Zumindest nicht in systemd udev. Nur der Name eines Netzwerkgeräts kann geändert werden. Aus dem udev-Handbuch:

   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.

Jeder Udev-Symlink für ein Gerät ist an sich nichts Besonderes. Es ist nur ein symbolischer Link des Dateisystems zum Geräteknoten. Ein Beispiel für die sinnvolle Verwendung von Udev-Symlink-Regeln ist jedoch, dass der Gerätename, auf dem sich ein bestimmtes Dateisystem befindet, unvorhersehbar ist, da Gerätenamen von der Reihenfolge abhängen, in der der Kernel Geräte erkennt. Zu einem Zeitpunkt kann ein USB-Stick den Gerätenamen erhalten /dev/sdfund zu einem anderen /dev/sdg. Normalerweise werden Udev-Regeln installiert, die vorhersehbare Symlink-Namen hinzufügen, wie dies auf meinem Ubuntu-Laptop der Fall ist, wo /dev/disk/by-uuid/die UUID der Dateisysteme auf der Festplatte symbolische Links sind, die auf den Gerätenamen des Kernels verweisen.

Zu Ihrer letzten Frage: Ein udev-Symlink kann nur auf einen Geräteknoten verweisen, daher kann er auch nicht auf einen Einhängepunkt verweisen:

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

Um Ihr Ziel zu erreichen, können Sie dem Dateisystem eine Bezeichnung geben und das Programm, mit dem Sie Ihre Dateisysteme mounten (udisks2?), diese Bezeichnung im Namen des Mount-Punkts verwenden lassen.

Antwort2

Wie kann man das Problem lösen, die Namen der USB-Geräte nicht zu kennen, wenn mehrere USB-Geräte an denselben Computer angeschlossen sind? Am einfachsten ist es, die Gerätenamen aus dem Ordner /dev zu verwenden. Nach dem Einstecken der USB-Adapter wird automatisch ein Serienname dafür generiert, den Sie unter /dev/serial/by-id finden, wie unten gezeigt

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

QSB_81658 wird letztendlich ein eindeutiger Name für dieses USB-Gerät.

Ich habe versucht, Entwicklungsregeln zu schreiben, was überflüssig war, da jedes Gerät seinen eigenen konstanten Namen hatte, wie oben gezeigt. Ich bin auch auf einige Probleme gestoßen, beispielsweise beim Anwenden von Entwicklungsregeln.

Schreiben von Entwicklerregeln, um einzelnen Adaptern Namen zuzuweisen. Wie wir wissen, hat jeder QSB-Adapter eine eigene Seriennummer, die Sie auf der Vorderseite des schwarzen Adapters finden. In meinem Fall habe ich zwei QSB0-Adapter. Einer hat die Seriennummer 81830, der andere die Seriennummer 81658. Ich werde dieses Attribut (ATTRS{serial}) verwenden, um diesen beiden Adaptern Namen zuzuweisen.

Führen Sie zunächst udevadm aus, um die Details der USB-Geräte anzuzeigen

$ 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==""

Anschließend sehen Sie eine Zeile weiter unten das ausgedruckte Ergebnis.

            ATTRS{serial}=="81830"

Gehen Sie zum Verzeichnis /etc/udev/rules.d/

Fügen Sie 990-usdigital-qsbadapter.rules mit dem Befehl hinzu

  sudo nano 990-usdigital-qsbadapter.rules

Dann fügen Sie Folgendes in die Datei ein

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

Testen Sie Ihre Regeln, Sie können ausführen

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

Aufgrund von Berechtigungsproblemen konnte ich NAME nicht ändern. Stattdessen verwende ich SYMLINK.

(UDEV-Regeln, Variable „NAME“ funktioniert nicht) Sie können einen Geräteknoten nicht umbenennen, indem Sie ihn in den Udev-Regeln dem NAME-Schlüssel zuweisen. Zumindest nicht in systemd udev. Nur der Name eines Netzwerkgeräts kann geändert werden. Aus dem Udev-Handbuch:

  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.

Ändern Sie also den Inhalt der Regeldatei in #Diese Regeldatei wird verwendet, um Namen für den QSB-Adapter von USdigital zuzuweisen

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

Klicken Sie bitte auf das Bild unten, um das Ergebnis anzuzeigen. Ergebnisse drucken

verwandte Informationen