Verwenden Sie UUID in udev-Regeln und mounten Sie das USB-Laufwerk auf / media / $ UUID


13

Ich möchte das USB-Laufwerk /mediabasierend auf der UUID der Festplatte einbinden. Wie kann ich die UUID eines USB-Laufwerks in einer udev-Regeldatei verwenden und was ist eine udev-Regel, um das USB-Laufwerk mit der UUID-Nummer als Ordnername bereitzustellen?

Der blkidBefehl gibt die UUID einer Festplatte aus, jedoch nur beim Mounten.


1
Vorsichtsmaßnahme 2019: Auf modernen Desktop-Linux-Systemen, die systemd verwenden, mounten udev-Regeln keine Dateisysteme im regulären Benutzernamensraum, dh Sie können ein Dateisystem nicht mit dem Befehl mount in einer udev-Regel mounten. Darüber hinaus ist in diesen Systemen das Sicherungssystem (Benutzerdateisysteme) so konfiguriert, dass USB-Halterungen über ein Desktopsymbol verarbeitet werden, sodass die manuelle Montage mithilfe einer fstab-Regel zu einem gewissen Grad zu Konflikten mit dem Sicherungssystem führt. Wenn Sie USB-Dateisysteme per UUID automatisch auf einem Headless-Server bereitstellen möchten, entfernen Sie am besten die Systemd-Sicherungskonfiguration und verwenden Sie udev-Regeln, um One-Shot-Mount-Dienste auszulösen.
Jonathan Ben-Avraham

Sehen Sie diese Lösung mit fstab, systemd und automount, getestet unter Debian: unix.stackexchange.com/a/347007/31228
Jonathan Ben-Avraham

Antworten:


14

Obwohl udev nicht direkt auf UUIDs zugreifen kann, werden sie zumindest in Fedora und Ubuntu als Umgebungsvariablen festgelegt ( ENV). Sie können alle Umgebungsvariablen eines Geräts durch Aufrufen auslesen udevadm info /dev/sdc. ZB für ein NTFS auf einem externen Laufwerk bekomme ich:

$ udevadm info /dev/sdc2
P: /devices/pci0000:00/0000:00:14.0/usb4/4-2/4-2:1.0/host7/target7:0:0/7:0:0:0/block/sdc/sdc2
N: sdc2
[…]
E: ID_FS_TYPE=ntfs
E: ID_FS_USAGE=filesystem
E: ID_FS_UUID=4A6F2ABC1232FA37
[…]

Alles mit einem E:Vorzeichen wird als Umgebungsvariable festgelegt.

Matching gegen UUIDs

Sie können dagegen mit vergleichen ENV{ID_FS_UUID}=="4A6F2ABC1232FA37". Als ersten Filter stimme ich überein KERNEL=="sd?2", um sicherzustellen, dass ich nur Blockgeräte mit der richtigen Partitionsnummer behandle. Die vollständige Regel würde folgendermaßen aussehen:

KERNEL=="sd?2", ENV{ID_FS_UUID}=="4A6F2ABC1232FA37", RUN+="/usr/bin/logger --tag my-manual-usb-mount Mounting the device with UUID 4A6F2ABC1232FA37", RUN+="/usr/bin/mount [Your mount options here]"

Der Befehl logger ist nützlich, um zu bestätigen, dass die Regel tatsächlich ausgeführt wird. Als nächstes sollten Sie überprüfen, ob die Regel keine Syntaxfehler mit enthält udevadm test /dev/sdc2. Ihre Regeldatei sollte in der Ausgabe aufgeführt sein und keine Fehlermeldung sollte daneben erscheinen. Jetzt können Sie alle Regeln für Ihr Gerät auslösen, um zu überprüfen, ob Ihre Regel wie geplant funktioniert : sudo udevadm trigger /dev/sdc2. Wenn Ihre Regel übereinstimmt, finden Sie die benutzerdefinierte Protokollnachricht im Systemprotokoll ( /var/log/syslogoder über journalctl -b).

Bearbeiten: ali_m hat darauf hingewiesen, dass die Umgebungsvariablen durch vorherige Regeln festgelegt wurden und daher nur zugänglich sind, wenn Ihre .rulesDatei eine ausreichend hohe lexikografische Reihenfolge aufweist . Mit "60" zu beginnen sollte ausreichen. Persönlich beginne ich meine Regeln mit "zz" (wenn möglich), um sie auf einen Blick von vordefinierten Regeln zu unterscheiden.

Verwenden von UUIDs im RUNBefehl und anderswo

Udev hat eine ziemlich leistungsfähige Syntax für die Substitution von Variablen und Attributen . Insbesondere wird jedes Vorkommen von $env{ID_FS_UUID}durch die UUID des Laufwerks ersetzt. Um ein Gerät unter zu mounten, können /media/UUIDSie diese Regel verwenden:

KERNEL=="sd??", RUN+="/usr/bin/mkdir /media/$env{ID_FS_UUID}", RUN+="/usr/bin/mount $devpath /media/$env{ID_FS_UUID}"

Sie möchten wahrscheinlich stattdessen udisks konfigurieren, es ist jedoch auf den zu lösenden Problembereich spezialisiert. Siehe https://wiki.archlinux.org/index.php/udisks#udisks2:_mount_to_.2Fmedia als Ausgangspunkt.

Mein eigentlicher Anwendungsfall für das Mounten von Geräten mit udev anstelle von /etc/fstaboder udisks ist das Mounten von zfs-Dateisystemen, die einige Besonderheiten aufweisen, sodass sie nicht ganz zu den üblichen Tools passen.


1
Ein entscheidender Punkt, für den ich eine Weile gebraucht habe: Um mit Umgebungsvariablen abzugleichen, muss Ihre Regel angewendet werden, nachdem diese Variablen eingerichtet wurden. Um dies zu erreichen, muss Ihr .rulesDateiname mit einer Zahl> 60 beginnen .
Ali_m

@ali_m: Danke, ich habe deine Informationen zur Antwort hinzugefügt.
Perseiden

In Ubuntu 18.04 können einige udevadm-Befehle auf / dev / sdXX (z. B. udevadm-Informationen) verweisen, andere müssen aus irgendeinem Grund auf / sys / block / sdXX verweisen (z. B. udevadm-Test).
Greg Bell

0

Mir fällt eine grobe Lösung ein. Legen Sie den entsprechenden fstab-Eintrag fest, der durch die UUID identifiziert wurde. Und in udev-Regeln mount -ajedes Mal ausführen, wenn ein neues sd * -Gerät hinzugefügt wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.