GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Eine Einführung in Udev:Das Linux-Subsystem zum Verwalten von Geräteereignissen

Udev ist das Linux-Subsystem, das Ihren Computer mit Geräteereignissen versorgt. Im Klartext bedeutet das, dass es der Code ist, der erkennt, wenn Sie Dinge an Ihren Computer angeschlossen haben, wie eine Netzwerkkarte, externe Festplatten (einschließlich USB-Sticks), Mäuse, Tastaturen, Joysticks und Gamepads, DVD-ROM-Laufwerke und so weiter An. Das macht es zu einem potenziell nützlichen Dienstprogramm, und es ist gut genug bekannt, dass ein Standardbenutzer es manuell skripten kann, um Dinge wie das Ausführen bestimmter Aufgaben zu erledigen, wenn eine bestimmte Festplatte angeschlossen ist.

In diesem Artikel erfahren Sie, wie Sie ein udev-Skript erstellen, das durch ein udev-Ereignis ausgelöst wird, z. B. das Anschließen eines bestimmten USB-Sticks. Sobald Sie den Prozess zum Arbeiten mit udev verstanden haben, können Sie damit alle möglichen Dinge tun, wie das Laden eines bestimmten Treibers, wenn ein Gamepad angeschlossen ist, oder das Ausführen einer automatischen Sicherung, wenn Sie Ihr Sicherungslaufwerk anschließen.

Ein einfaches Skript

Am besten arbeitet man mit udev in kleinen Stücken. Schreiben Sie nicht das gesamte Skript im Voraus, sondern beginnen Sie stattdessen mit etwas, das lediglich bestätigt, dass udev ein benutzerdefiniertes Ereignis auslöst.

Abhängig von Ihrem Ziel für Ihr Skript können Sie nicht garantieren, dass Sie die Ergebnisse eines Skripts jemals mit eigenen Augen sehen werden. Stellen Sie also sicher, dass Ihr Skript protokolliert, dass es erfolgreich ausgelöst wurde. Der übliche Ort für Protokolldateien ist /var Verzeichnis, aber das ist meistens die Domäne des Root-Benutzers. Verwenden Sie zum Testen /tmp , auf die normale Benutzer zugreifen können und die normalerweise bei einem Neustart gelöscht wird.

Öffnen Sie Ihren bevorzugten Texteditor und geben Sie dieses einfache Skript ein:

#!/usr/bin/bash

/usr/bin/date>> /tmp/udev.log

Legen Sie dies in /usr/local/bin ab oder an einer solchen Stelle im standardmäßigen ausführbaren Pfad. Nennen Sie es trigger.sh und natürlich mit chmod +x ausführbar machen .

$ sudo mv trigger.sh /usr/local/bin
$ sudo chmod +x /usr/local/bin/trigger.sh

Dieses Skript hat nichts mit udev zu tun. Bei der Ausführung platziert das Skript einen Zeitstempel in der Datei /tmp/udev.log . Testen Sie das Skript selbst:

$ /usr/local/bin/trigger.sh
$ cat /tmp/udev.log
Di 31. Okt 01:05:28 NZDT 2035

Der nächste Schritt besteht darin, udev dazu zu bringen, das Skript auszulösen.

Eindeutige Geräteidentifikation

Damit Ihr Skript durch ein Geräteereignis ausgelöst wird, muss udev wissen, unter welchen Bedingungen es das Skript aufrufen soll. Im wirklichen Leben können Sie einen USB-Stick anhand seiner Farbe, des Herstellers und der Tatsache, dass Sie ihn gerade an Ihren Computer angeschlossen haben, identifizieren. Ihr Computer benötigt jedoch andere Kriterien.

Udev identifiziert Geräte anhand von Seriennummern, Herstellern und sogar Anbieter-IDs und Produkt-IDs. Da dies am Anfang der Lebensdauer Ihres udev-Skripts steht, sollten Sie so umfassend, unspezifisch und allumfassend wie möglich sein. Mit anderen Worten, Sie möchten zuerst fast jedes gültige udev-Ereignis abfangen, um Ihr Skript auszulösen.

Mit dem udevadm-Monitor Befehl können Sie udev in Echtzeit anzapfen und sehen, was es sieht, wenn Sie verschiedene Geräte anschließen. Werden Sie root und probieren Sie es aus.

$ su
# udevadm-Monitor

Die Monitorfunktion gibt empfangene Ereignisse aus für:

  • UDEV:Das Ereignis, das udev nach der Regelverarbeitung sendet
  • KERNEL:das Kernel-Ereignis

Mit udevadm monitor während Sie laufen, schließen Sie einen USB-Stick an und beobachten Sie, wie alle möglichen Informationen auf Ihren Bildschirm gespuckt werden. Beachten Sie, dass der Ereignistyp ein ADD ist Veranstaltung. Das ist eine gute Methode, um festzustellen, welche Art von Ereignis Sie möchten.

Der udevadm-Monitor Der Befehl liefert viele gute Informationen, aber Sie können sie mit hübscherer Formatierung mit dem Befehl udevadm info sehen , vorausgesetzt, Sie wissen, wo sich Ihr USB-Stick derzeit in Ihrem /dev befindet Baum. Wenn nicht, trennen Sie Ihren USB-Stick und stecken Sie ihn wieder ein, und geben Sie dann sofort diesen Befehl ein:

$ su -c 'dmesg | tail | fgrep -i sd*' 

Wenn dieser Befehl sdb:sdb1 zurückgibt , wissen Sie beispielsweise, dass der Kernel Ihrem USB-Stick die sdb zugewiesen hat Bezeichnung.

Alternativ können Sie lsblk verwenden Befehl, um alle an Ihr System angeschlossenen Laufwerke anzuzeigen, einschließlich ihrer Größen und Partitionen.

Nachdem Sie nun festgestellt haben, wo sich Ihr Laufwerk in Ihrem Dateisystem befindet, können Sie mit diesem Befehl udev-Informationen zu diesem Gerät anzeigen:

# udevadm info -a -n /dev/sdb | less 

Dies gibt viele Informationen zurück. Konzentrieren Sie sich vorerst auf den ersten Informationsblock.

Ihre Aufgabe ist es, Teile des udev-Berichts über ein Gerät herauszusuchen, die für dieses Gerät am einzigartigsten sind, und dann udev anzuweisen, Ihr Skript auszulösen, wenn diese einzigartigen Attribute erkannt werden.

Die udevadm-Info verarbeitet Berichte auf einem Gerät (angegeben durch den Gerätepfad) und "wandert" dann die Kette der übergeordneten Geräte nach oben. Für jedes gefundene Gerät werden alle möglichen Attribute unter Verwendung eines Schlüsselwertformats gedruckt. Sie können eine Regel zusammenstellen, die den Attributen eines Geräts und den Attributen eines einzelnen übergeordneten Geräts entspricht.

Gerät '/devices/000:000/blah/blah//block/sdb' betrachten:
  KERNEL=="sdb"
  SUBSYSTEM=="block"
  DRIVER==""
  ATTR{ro}=="0"
  ATTR{size}=="125722368"
  ATTR{stat}==" 2765 1537 5393"
  ATTR{ range}=="16"
  ATTR{discard\_alignment}=="0"
  ATTR{removable}=="1"
  ATTR{blah}=="blah"

Eine udev-Regel muss ein Attribut von einem einzigen übergeordneten Gerät enthalten.

Übergeordnete Attribute sind Dinge, die ein Gerät auf der grundlegendsten Ebene beschreiben, z. B. es ist etwas, das an einen physischen Port angeschlossen wurde oder es ist etwas mit einer Größe oder Dies ist ein Wechseldatenträger .

Da das KERNEL-Label von sdb kann sich ändern, je nachdem, wie viele andere Laufwerke angeschlossen waren, bevor Sie diesen USB-Stick angeschlossen haben, das ist nicht das optimale übergeordnete Attribut für eine udev-Regel. Es funktioniert jedoch für einen Proof of Concept, sodass Sie es verwenden könnten. Ein noch besserer Kandidat ist das SUBSYSTEM-Attribut, das identifiziert, dass es sich um ein "Block"-Systemgerät handelt (weshalb das lsblk listet das Gerät auf).

Öffnen Sie eine Datei namens 80-local.rules in /etc/udev/rules.d und geben Sie diesen Code ein:

SUBSYSTEM=="block", ACTION=="add", RUN+="/usr/local/bin/trigger.sh" 

Speichern Sie die Datei, trennen Sie Ihren Test-Stick und starten Sie neu.

Warten, neu starten auf einem Linux-Rechner?

Theoretisch können Sie einfach udevadm control --reload ausführen , das alle Regeln laden sollte, aber in diesem Stadium des Spiels ist es am besten, alle Variablen zu eliminieren. Udev ist komplex genug, und Sie möchten nicht die ganze Nacht im Bett liegen und sich fragen, ob diese Regel wegen eines Syntaxfehlers nicht funktioniert hat oder ob Sie einfach neu starten sollten. Starten Sie also neu, unabhängig davon, was Ihr POSIX-Stolz Ihnen sagt.

Wenn Ihr System wieder online ist, wechseln Sie zu einer Textkonsole (mit Strg+Alt+F3 oder ähnlich) und schließen Sie Ihren USB-Stick an. Wenn Sie einen neueren Kernel ausführen, werden Sie wahrscheinlich eine Reihe von Ausgaben in Ihrer Konsole sehen, wenn Sie das Laufwerk anschließen. Wenn Sie eine Fehlermeldung wie Konnte nicht ausführen / sehen usr /local/bin/trigger.sh , haben Sie wahrscheinlich vergessen, das Skript ausführbar zu machen. Andernfalls sehen Sie hoffentlich nur, dass ein Gerät angeschlossen wurde, es eine Art Kernel-Gerätezuweisung erhalten hat und so weiter.

Jetzt der Moment der Wahrheit:

$ cat /tmp/udev.log
Di 31. Okt 01:35:28 NZDT 2035

Wenn Sie ein sehr aktuelles Datum und eine Uhrzeit sehen, die von /tmp/udev.log zurückgegeben werden , udev hat Ihr Skript erfolgreich ausgelöst.

Verfeinern der Regel in etwas Nützliches

Das Problem mit dieser Regel ist, dass sie sehr allgemein gehalten ist. Das Anschließen einer Maus, eines USB-Sticks oder des USB-Sticks einer anderen Person löst Ihr Skript wahllos aus. Jetzt ist es an der Zeit, sich auf den genauen USB-Stick zu konzentrieren, mit dem Sie Ihr Skript auslösen möchten.

Eine Möglichkeit, dies zu tun, ist die Vendor-ID und die Produkt-ID. Um diese Nummern zu erhalten, können Sie lsusb verwenden Befehl.

$ lsusb
Bus 001 Gerät 002:ID 8087:0024 Slacker Corp. Hub
Bus 002 Gerät 002:ID 8087:0024 Slacker Corp. Hub
Bus 003 Gerät 005:ID 03f0 :3307 TyCoon Corp.
Bus 003 Gerät 001:ID 1d6b:0002 Linux Foundation 2.0 Hub
Bus 001 Gerät 003:ID 13d3:5165 SBo-Netzwerke

In diesem Beispiel die 03f0:3307 vor TyCoon Corp. bezeichnet die Attribute idVendor und idProduct. Sie können diese Zahlen auch in der Ausgabe von udevadm info -a -n /dev/sdb | sehen grep-Anbieter , aber ich finde die Ausgabe von lsusb etwas angenehmer für die Augen.

Sie können diese Attribute jetzt in Ihre Regel aufnehmen.

SUBSYSTEM=="block", ATTRS{idVendor}=="03f0", ACTION=="add", RUN+="/usr/local/bin/thumb.sh" 

Testen Sie dies (ja, Sie sollten immer noch neu starten, nur um sicherzustellen, dass Sie frische Reaktionen von udev erhalten), und es sollte genauso funktionieren wie zuvor, nur jetzt, wenn Sie beispielsweise einen USB-Stick anschließen, der von einer anderen Firma hergestellt wurde (daher mit einem anderen idVendor) oder einer Maus oder einem Drucker, wird das Skript nicht ausgelöst.

Fügen Sie weiterhin neue Attribute hinzu, um sich auf dieses eine zu konzentrieren einzigartigen USB-Stick, den Sie Ihr Skript auslösen möchten. Verwenden von udevadm info -a -n /dev/sdb , können Sie Dinge wie den Herstellernamen, manchmal eine Seriennummer oder den Produktnamen usw. herausfinden.

Achten Sie zu Ihrer eigenen Gesundheit darauf, immer nur ein neues Attribut auf einmal hinzuzufügen. Die meisten Fehler, die ich gemacht habe (und andere Leute online gesehen habe), sind, eine Reihe von Attributen in ihre udev-Regel zu werfen und mich zu fragen, warum das Ding nicht mehr funktioniert. Attribute einzeln zu testen ist der sicherste Weg, um sicherzustellen, dass udev Ihr Gerät erfolgreich identifizieren kann.

Sicherheit

Dies bringt die Sicherheitsbedenken zum Schreiben von udev-Regeln auf, um automatisch etwas zu tun, wenn ein Laufwerk angeschlossen wird. Auf meinen Computern habe ich nicht einmal die automatische Einbindung aktiviert, und dennoch schlägt dieser Artikel Skripte und Regeln vor, die Befehle einfach nebenbei ausführen etwas angeschlossen ist.

Dabei sind zwei Dinge zu beachten.

  1. Konzentrieren Sie Ihre udev-Regeln, sobald sie funktionieren, damit sie nur Skripte auslösen wenn Sie es wirklich wollen. Das Ausführen eines Skripts, das Daten blind auf oder von Ihrem Computer kopiert, ist eine schlechte Idee, falls jemand, der zufällig einen USB-Stick derselben Marke bei sich trägt, ihn an Ihre Box anschließt.
  2. Schreiben Sie nicht Ihre udev-Regeln und Skripte und vergessen Sie sie. Ich weiß, auf welchen Computern meine udev-Regeln installiert sind, und diese Kisten sind meistens meine persönlichen Computer, nicht die, die ich zu Konferenzen mitnehme oder in meinem Büro bei der Arbeit habe. Je "sozialer" ein Computer ist, desto unwahrscheinlicher ist es, dass er eine udev-Regel erhält, die möglicherweise dazu führen könnte, dass meine Daten auf dem Gerät eines anderen oder die Daten oder Malware eines anderen auf meinem landen Gerät.

Mit anderen Worten, wie bei so viel Macht, die ein GNU-System bietet, ist es Ihre Aufgabe, darauf zu achten, wie Sie diese Macht ausüben. Wenn Sie es missbrauchen oder nicht mit Respekt behandeln, kann es sehr gut schief gehen.

Udev in der realen Welt

Nachdem Sie nun bestätigen können, dass Ihr Skript von udev ausgelöst wird, können Sie sich der Funktion des Skripts zuwenden. Im Moment ist es nutzlos, nichts weiter zu tun, als die Tatsache zu protokollieren, dass es ausgeführt wurde.

Ich verwende udev, um automatische Sicherungen meiner USB-Sticks auszulösen. Die Idee ist, dass sich die Masterkopien meiner aktiven Dokumente auf meinem USB-Stick befinden (da er überall hin mitgenommen wird und jederzeit bearbeitet werden kann) und diese Masterdokumente jedes Mal auf meinem Computer gesichert werden, wenn ich das Laufwerk anschließe diese Maschine. Das heißt, mein Computer ist das Backup-Laufwerk und meine Produktionsdaten sind mobil. Der Quellcode ist verfügbar, also sehen Sie sich den Code von attachmentup an, um weitere Beispiele für die Einschränkung Ihrer udev-Tests zu erhalten.

Da ich udev dafür am häufigsten verwende, werde ich es hier als Beispiel verwenden, aber udev kann viele andere Dinge aufnehmen, wie Gamepads (dies ist nützlich auf Systemen, die nicht so eingestellt sind, dass sie das xboxdrv-Modul laden, wenn ein Gamepad geladen wird angeschlossen) und Kameras und Mikrofone (nützlich, um Eingänge festzulegen, wenn ein bestimmtes Mikrofon angeschlossen ist), also machen Sie sich klar, dass es für viel mehr als dieses eine Beispiel gut ist.

Eine einfache Version meines Backup-Systems ist ein Prozess mit zwei Befehlen:

SUBSYSTEM=="blockieren", ATTRS{idVendor}=="03f0", ACTION=="hinzufügen", SYMLINK+="safety%n"
SUBSYSTEM=="blockieren", ATTRS{idVendor}=="03f0", ACTION=="add", RUN+="/usr/local/bin/trigger.sh"

Die erste Zeile erkennt meinen USB-Stick mit den bereits besprochenen Attributen und weist dem USB-Stick dann einen symbolischen Link innerhalb des Gerätebaums zu. Der zugewiesene symbolische Link ist safety%n . Der %n ist ein udev-Makro, das jede Nummer auflöst, die der Kernel dem Gerät gibt , wie sdb1, sdb2, sdb3 usw. Also %n wäre die 1 oder die 2 oder die 3.

Dadurch wird ein symbolischer Link im Entwicklungsbaum erstellt, sodass der normale Vorgang des Anschließens eines Geräts nicht beeinträchtigt wird. Das bedeutet, dass Sie keine Probleme verursachen, wenn Sie eine Desktop-Umgebung verwenden, die gerne Geräte automatisch einbindet.

Die zweite Zeile führt das Skript aus.

Mein Backup-Skript sieht folgendermaßen aus:

#!/usr/bin/bash

mount /dev/safety1 /mnt/hd
sleep 2
rsync -az /mnt/hd/ /home/seth /backups/ &&umount /dev/safety1

Das Skript verwendet den symbolischen Link, der die Möglichkeit vermeidet, dass udev dem Laufwerk einen unerwarteten Namen gibt (zum Beispiel, wenn ich bereits einen USB-Stick mit dem Namen DISK an meinen Computer angeschlossen habe und ich meinen anderen USB-Stick mit dem Namen DISK anschließe, den zweiten wird mit DISK_ bezeichnet, was mein Skript vereiteln würde). Es trägt safety1 (die erste Partition des Laufwerks) an meinem bevorzugten Einhängepunkt /mnt/hd .

Sobald es sicher gemountet ist, verwendet es rsync, um das Laufwerk in meinem Backup-Ordner zu sichern (mein aktuelles Skript verwendet rdiff-backup, und Ihres kann jede beliebige automatisierte Backup-Lösung verwenden, die Sie bevorzugen).

Udev ist dein Entwickler

Udev ist ein sehr flexibles System und ermöglicht es Ihnen, Regeln und Funktionen auf eine Weise zu definieren, wie es nur wenige andere Systeme wagen, Benutzern anzubieten. Lernen Sie es und verwenden Sie es und genießen Sie die Leistungsfähigkeit von POSIX.

Dieser Artikel baut auf Inhalten aus dem Slackermedia-Handbuch auf, das unter GNU Free Documentation License 1.3. lizenziert ist


Linux
  1. 8 Linux-virsh-Unterbefehle zum Verwalten von VMs auf der Befehlszeile

  2. Linux:So finden Sie den für ein Gerät verwendeten Gerätetreiber

  3. Kali auf dem Windows-Subsystem für Linux

  4. Kali Linux für den Gemini-PDA

  5. Wie stelle ich die Größe des X-Mauszeigers im Windows-Subsystem für Linux ein?

Eine Einführung in den Terminalemulator DomTerm für Linux

Einführung in das Linux-Dateisystem

GalliumOS:Die Linux-Distribution für Chromebooks

Einführung in die Verwaltung von Linux-Containern

Eine schnelle Einführung in das Linux-Dateisystem für Windows-Benutzer.

Der ultimative Leitfaden zum Windows-Subsystem für Linux (Windows WSL)