Der udev-Daemon

Raspberry Pi

In diesem Artikel zeige ich euch wie ihr den udev-Daemon des Linux Betriebssystems verwenden könnt. Der udev-Daemon ist auf vielen Linuxdistributionen aktiv und kann daher auch z.B. auf einem Desktop PC mit einem Betriebssystem wie Ubuntu benutzt werden.

-> Was ist der udev-Daemon?:

Der udev-Daemon (oder auch udev-Dienst) ist ein Hintergrundprogramm, welches die Gerätedateien im Verzeichnis /dev verwaltet. Dieser Dienst verwendet verschiedene Regeln, die festlegen wie sich der Dienst bei einer bestimmten Aktion verhalten soll.
Ein schönes Beispiel ist ein USB-Stick. Unter Linux muss jeder USB-Stick gemountet werden, bevor dieser verwendet werden kann. Mit Hilfe des udev-Daemons kann man diesen Prozess automatisieren. So kann ein Stick mit einer bestimmten Bezeichnung automatisch an eine bestimmte Stelle gemountet werden.
Die Regeln dieses Dienstes können noch viel mehr. Es ist ebenfalls möglich ein bestimmtes Shellskript beim Einstecken eines USB-Sticks auszuführen um z.B. Dateien automatisch auf den USB-Stick zu kopieren.
Schauen wir uns das ganze mal an….

-> Die erste eigene Regel:

Für den Anfang schreiben wir eine Regel, welche in einer Log-Datei festhält wann ein USB-Stick an das Raspberry Pi angesteckt worden ist.
Für die Umsetzung dieser Idee werden zwei Komponenten benötigt:

  1. Die udev-Regel
  2. Ein Shellskript zum erstellen der Logdatei

Die udev-Regeln werden im Verzeichnis /lib/udev/rules.d gespeichert und bekommen einen Namen nach dem folgenden Schema:

Der Ausdruck xx wird dabei durch eine Zahl ersetzt.
Die udev-Regeln werden der Reihe nach ausgeführt, sprich die Regel 10-Funktion.rules wird vor der Regel 11-Funktion.rules ausgeführt!
Wenn ihr mit dem Befehl

mal einen Blick in das Verzeichnis werft werdet ihr sehen, dass dort schon einige Regeln existieren:

udev(1)

Da bei unserer eigenen Regel der Zeitpunkt des Ausführens des Skriptes nicht so wichtig ist, kann die Regel ruhig eine etwas höhere Nummer bekommen.
Die Regel schreibe ich mit dem Editor nano direkt auf dem Raspberry Pi:

Dadurch das die Regel die Nummer 80 bekommt, wird sie relativ spät ausgeführt. Der Name der Regel verrät zudem etwas über die Funktion, sodass man im Fehlerfall etc. leicht die entsprechende Regel finden kann.
Bevor wir die eigentliche Regel schreiben, machen wir uns die Funktion des udev-Daemons an einem kurzen Beispiel klar.
Dazu fügen wir die Zeile

in die Datei ein. Diese einfache Regel gibt dem udev-Daemon die folgende Anweisung:
„Wenn du ein Gerät namens sda1 findest (was z.B. ein formatierten USB-Stick ist), sollst du es Disk nennen.“

Nachdem ihr diese Anweisung eingegeben habt, könnt ihr die Datei speichern und schließen.
Anschließend müsst ihr den udev-Daemon neu starten:

Wenn alles geklappt hat, erscheinen zwei grüne Ok in der Konsole und die neue Regel ist einsatzbereit.
Jetzt könnt ihr zum Test mal einen USB-Stick an das Raspberry Pi anschließen und schauen ob die Regel angewendet wird:

udev(2)

Den USB-Stick könnt ihr jetzt ganz normal über den Namen Disk mounten

und anschließend weiter verwenden.
Da wir nun wissen wie der udev-Daemon arbeitet, können wir uns wieder unserer Regel zuwenden.
Die Regel für unsere Anwendung ist an sich relativ kurz und besteht nur aus einer Zeile:

Was sind das den jetzt alles für Ausdrücke und welche Funktion haben sie?

Den Ausdruck KERNEL kennen wir ja schon. Ich habe ihn nur etwas erweitert. In dem ersten Beispiel hat der udev-Daemon nur reagiert, wenn der angeschlossene USB-Stick den namen sda bekam.
Ein zweiter Stick würde dann automatisch sdb genannt werden und damit würde die Regel nicht mehr weiter beachtet werden. Diese Problematik kann man durch den Klammerausdruck umgehen, indem ein Bereich festgelegt wird wo der Daemon nachschauen soll. Er fängt jetzt also mit sda an und hört bei sdz auf.

Der nachfolgende ACTION Ausdruck legt fest wann eine Aktion in der Regel ausgeführt werden soll. Mögliche Parameter sind add und remove.
In diesem Beispiel wird die Aktion also immer ausgeführt wenn ein Gerät hinzugefügt wurde welches unter /dev mit dem Namen sda – sdz aufgeführt wird.

Der Parameter RUN fügt der Liste an auszuführenden Programmen einen neuen Eintrag hinzu.
In diesem Fall soll ein Shellskript ausgeführt werden, welches unter /Programme abgespeichert ist. Dieses Skript sorgt dafür, dass der Name des angeschlossenen Gerätes in einer Logdatei mit einem Zeitstempel versehen abgespeichert wird.
Der Zusatz %k ist ein Speicher des udev-Daemons und er enthält den Kernelnamen des Gerätes, welches die Regel ausführt. Den Inhalt dieses Speichers übergebe ich als Kommandozeilenparameter an das Skript, welches dann später mit diesem Namen nach genaueren Informationen des Gerätes sucht.

Die Regel wäre damit fertig und kann nun abgespeichert werden. Anschließend wird der Daemon neu gestartet, damit dieser die neue Regel direkt verwendet:

Wenden wir uns dem Skript zu…
Als erstes wird das Skript unter dem vorhin angegebenen Namen erstellt:

In die erste Zeile des Skriptes wird nun

eingefügt, damit der udev-Daemon beim ausführen des Skriptes auch weiß das es sich um ein Shellskript handelt (die sogenannte Shebang).
Danach speichere ich den Pfad der Logdatei und den Gerätenamen, welcher mir ja als Kommandozeilenparameter vom udev-Daemon mitgeteilt wird, in einer Variable:

Übergebene Kommandozeilenparameter lassen sich ganz einfach über $1 – $x aufrufen und verwenden.
Im nächsten Schritt lese ich die Vendor ID des Gerätes aus und speichere sie:

In dem Verzeichnis /sys/block/sda/device sind alle Informationen zu dem Gerät sda abgelegt und können so ganz einfach über den Befehl cat ausgelesen werden.
Mit der selben Methode lese ich anschließend noch die Typenbezeichnung und die Größe des Sticks aus, welche ich ebenfalls speichere:

Das letzte was benötigt wird, ist das aktuelle Datum und die Uhrzeit, welche sich wie folgt einlesen lassen:

Damit sind alle Komponenten für das Logfile beisammen und können jetzt passend in die Logdatei geschrieben werden:

Das Skript ist damit fertig und kann gespeichert werden.
Sobald nun ein USB-Stick in das Raspberry Pi eingesteckt wird, wird ein entsprechender Eintrag in der Logdatei angelegt:

udev(3)
Dieses Beispiel könnt ihr nun z.B. so erweitern, dass auch angezeigt wird ob der Stick eingesteckt oder ausgesteckt wurde. Außerdem könnt ihr euch auch alle Dateien auf dem Stick anzeigen lassen etc. Probiert ruhig mal etwas rum :)

 

Dokumentation:

 

-> Zurück zu den Basteleien mit dem Raspberry Pi

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload CAPTCHA.