Udev dazu bringen, eindeutige USB-Laufwerke aus einem Set zu erkennen – mit derselben UUID und denselben Bezeichnungen? RHEL7

Udev dazu bringen, eindeutige USB-Laufwerke aus einem Set zu erkennen – mit derselben UUID und denselben Bezeichnungen? RHEL7

Ich versuche, udev auf RHEL7 so zu konfigurieren, dass USB-Flash-Laufwerken bestimmte /dev-Namen (z. B. /dev/backup1, /dev/backup2 …) für bestimmte Flash-Laufwerke zugewiesen werden. Mir ist klar, dass ich die /dev/sdx-Zuweisungen nicht steuern kann, aber ich versuche, mithilfe von udev-Regeln automatisierte symbolische Links einzurichten.

blkid gibt mir:

/dev/sdi1: LABEL="Samsung USB" UUID="64A5-F009" TYPE="exfat"
/dev/sdj1: LABEL="Samsung USB" UUID="64A5-F009" TYPE="exfat"
/dev/sdk1: LABEL="Samsung USB" UUID="64A5-F009" TYPE="exfat"

Ich wollte etwas wie Folgendes in meiner Regeldatei tun:

KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/lib/udev/scsi_id --whitelisted --replace-whitespace --device=%N", RESULT=="64A5-F009", SYMLINK+="backupkeya%n"

aber da alle drei USB-Flash-Laufwerke dieselbe UUID haben, wollte ich, dass bestimmte Flash-Laufwerke mit bestimmten virtuellen Gerätenamen verknüpft werden. Wenn ich also das Laufwerk mit der Bezeichnung „drive2“ einstecke, wird es mit /dev/backupkeyb verknüpft. Im Moment haben wir 3 Flash-Laufwerke, wollen aber auf etwa 8 erweitern.

udevadm gibt mir etwas Einzigartiges ...

[root@alpha2 mnt]# udevadm info /dev/sdg | grep "ID_SERIAL_SHORT"
E: ID_SERIAL_SHORT=0305119070014252
[root@alpha2 mnt]# udevadm info /dev/sdi | grep "ID_SERIAL_SHORT"
E: ID_SERIAL_SHORT=0330219070015017
[root@alpha2 mnt]# udevadm info /dev/sdj | grep "ID_SERIAL_SHORT"
E: ID_SERIAL_SHORT=0305119070014208  

Ich habe meine Udev-Regel geändert, sodass sie lautet (/etc/udev/rules.d/99-symlink.rules)

KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/bin/udevadm info --name=%N", RESULT=="0305119070014208", SYMLINK+="backupkeyc%n"

Als ich jedoch den Schlüssel mit der Seriennummer ...4208 einsteckte, wurde kein symbolischer Link /dev/backupkeyc erstellt. Ich vermute, es liegt daran, dass die Ausgabe der udevadm-Anweisung nicht genau mit meinem RESULT== übereinstimmte.

Ich habe ein Skript /usr/local/udevinfo erstellt und PROGRAM=="/usr/local/udevinfo %N" wie unten geändert, um die Udev-Regel nicht zu überladen... nachdem ich das Flash-Laufwerk eingelegt hatte – kein symbolischer Link – aber was noch wichtiger ist: Es gab nichts in /tmp/passeddata, was den Gerätenamen hätte enthalten sollen – es sieht also so aus, als ob die Udev-Regel nie ausgeführt wurde?

echo "$1" >> /tmp/passeddata
udevadm info --name=$1 | grep "ID_SERIAL_SHORT" | awk -F= '{print $2}'

Übersehe ich etwas? Gibt es eine einfachere Möglichkeit, das, was ich versuche, zu erreichen?

Antwort1

Ja, es war keine exakte Übereinstimmung, da „udevadm info“ eine ganze Menge Informationen ausgibt – nicht nur die Seriennummer.

Alles, was Sie in 'udevadm info' sehen, ist jedochgesetzt vonudev regelt sich selbst (oft durch Aufrufen von udev-Built-Ins). Die Seriennummer ist also bereits verwendbar, ENV{ID_SERIAL_SHORT}=="..."ohne dass ein externes Programm aufgerufen werden muss. (Das ist es, was das Präfix „E:“ tatsächlich anzeigt.)

KERNEL=="sd*", SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="0305119070014208", SYMLINK+="backupkeyc"

(Tatsächlich ist es möglich, dass 'udevadm info' nicht funktioniertüberhauptwährend der Regelverarbeitung. Ein häufiger Fehler bei udev-Regeln besteht darin, Tools zu verwenden, die selbst nur Informationen aus den „Regeln abgeschlossen“-Signalen erhalten.)

Antwort2

Ich stimme der Antwort von @grawity voll und ganz zu, für eine solche Lösung kein Skript, sondern direkt die Umgebung zu verwenden. Aber zu den anderen Aspekten:

Die Syntax für das Programm ist so, wie Sie es geschrieben haben, korrekt und funktioniert. Vielleicht meinen Sie, dass nichts in der Datei ist, sodass die Datei nicht erstellt wird? Es fehlt also die Shebang-Zeile (wie in Ihrem Snippet) oder die Ausführungsberechtigungen? Ansonsten sollte es so funktionieren – UND Sie müssen nicht einmal ein Argument übergeben, da alle Informationen, die udev kennt, in der Umgebung als Variablen verfügbar sind. Das Skript kann also darauf zugreifen, wenn es durch die udev-Regel-PROGRAMM-Anweisung aufgerufen wird.

Es sollte jedoch viel bequemer und allgemeiner sein, einen anderen Ansatz zu verfolgen:
Verwenden Sie nicht die Seriennummern des Geräts, sondern weisen Sie ihnen eine UUID oder eine Partitionsbezeichnung zu (oder beides, um die Wahrscheinlichkeit zu verringern, dass etwas anderes eingefügt wird, das dieselbe UUID oder Partitionsbezeichnung hat). Benennen Sie die Partitionen also einfach neu oder formatieren Sie sie neu, um eine neue „UUID“ festzulegen. Es ist auch möglich, die UUID-Informationen innerhalb einer vorhandenen Partition zu patchen, wenn Sie nicht neu formatieren möchten (ich kenne kein Tool, das dies für Sie erledigt, aber es ist ganz einfach, ein eigenes zu schreiben). Auf
diese Weise können Sie die Ziele ersetzen, ohne Ihr System zu ändern. Oder beispielsweise weitere Sticks zu einem Pool hinzufügen.
In diesem Fall könnten Sie sogar ein kleines PROGRAM-Skript verwenden, das eine Partitionsbezeichnung eines bestimmten Formats in einen Symlink-Namen eines bestimmten Formats übersetzt.
Eine andere (wenn möglich die standardkonformste) Möglichkeit könnte darin bestehen, ein GPT auf den Geräten zu verwenden und eine bestimmte Partitionstyp- und UUID-Kombination für Ihren Anwendungsfall zuzuweisen – möglicherweise einen zusätzlichen Partitionsnamen.

verwandte Informationen