USB-Geräte unter Linux automatisieren

Im Alltag habe ich drei Anwendungsfälle, bei denen mir eine Automatisierung von USB-Geräten hilft:
Sicherlich gibt es noch unzählige weiter Anwendungen. In diesem Artikel gehe ich nur auf das Beispiel der Datensicherung ein. Bei der Datensicherung möchte ich nicht erst ein Programm von Hand starten und klicken. Das Backup sollte möglichst einfach und problemlos ablaufen, damit ich regelmäßig meine Daten ohne Frust sichern kann. Wie sieht eine einfache Datensicherung aus ? Im Idealfall: USB-Stick anstecken und schon geht die Datensicherung automatisch los.
Unter Linux kann diese Aufgabe durch den Userspace Device Daemon (udevd) erledigt werden.
Beispiel zur USB-Automatisierung
In diesem Beispiel benutze ich einen USB-Stick als Speichermedium für eine Datensicherung. Um dem USB-Stick ein Programm zuzuordnen, das beim Anstecken des Sticks gestartet wird, benötige ich zwei Information. Erstens: den eindeutigen Bezeichner des USB-Sticks (USB ID) und zweitens den Programm-Namen.
1. USB-ID herausfinden
Unter Linux listet das Programm lsusb die erkannten USB-Geräte auf.
lsusb
# verbose output
lsusb -v
Mit "lsusb -v" werden ausführliche Informationen über die USB-Geräte angezeigt. Um die USB-ID des Sticks zum Speichern herauszufinden habe ich ein kleines Shell-Skript geschrieben, das die angesteckten "Mass Storage"-Geräte auflistet:
chmod 755 listUSBMassStorageDevices.sh
./listUSBMassStorageDevices.sh
# example output:
Found USB mass storage device with the following USB identifier:
0781:b7b1 SanDisk Corp.
In diesem Beispiel ist die Hersteller-ID (Vendor ID) 0781 und die Modell-ID (Model ID) b7b1. Die Hersteller-ID kodiert den Hersteller des USB-Sticks. Im Internet kann recherchiert werden, um welche Firma es sich handelt - in diesem Fall ist es SanDisk.
2. USB-ID beim Userspace Device Daemon eintragen
Das Programm udevd (Userspace Device Daemon) liest die Regeln der USB-Geräte aus dem Verzeichnis /etc/udev/rules.d/. In dieses Verzeichnis darf nur ein Benutzer mit Root-Rechten schreiben. Im Beispiel muss die Hersteller-ID 0781 und die Modell-ID b7b1 in die Datei /etc/udev/rules.d/99-backup1.rules wie folgt eingetragen werden:
SUBSYSTEM=="usb", ACTION=="remove", ENV{ID_VENDOR_ID}=="0781", ENV{ID_MODEL_ID}=="b7b1", RUN+="/home/user/tools/usbBackup1_remove.sh"
Für andere USB-Sticks muss natürlich eine andere Hersteller-ID und Modell-ID eingetragen werden. In meinem Beispiel ist der Benutzername "user". Für eine individuelle Anpassung der Skripts sollte der eigene Benutzername unter Linux gewählt werden. Die neuen USB-Regeln aus dem oberen Beispiel werden sofort ohne Neustart des udevd wirksam. Wenn der USB-Stick angesteckt wird, wird das Programm /home/user/tools/usbBackup1.sh aufgerufen. Diese Datei muss angelegt werden.
3. Skript zum Entkoppeln von udevd
Das Programm udevd läuft mit Root-Rechten. Damit ein Programm mit grafischer Oberfläche und Benutzerrechten gestartet werden kann, muss die DISPLAY-Variable gesetzt und switch user (su) zum Wechseln des Benutzers aufgerufen werden.
cat > /home/user/tools/usbBackup1.sh << EOF
#!/bin/bash
# set the DISPLAY variable for graphical applications
export DISPLAY=:0
# call backup script of the user
su user -c "/home/user/tools/backup.sh 1 &"
EOF
# make the script executable
chmod 755 /home/user/tools/usbBackup1.sh
4. Skript zum Starten der Datensicherung
Das obere Shell-Skript ruft das folgende Shell-Skript mit normalen Benutzer-Rechten auf. Im folgenden Shell-Skript wird 5 Sekunden lang auf den Automounter von Linux gewartet, der den USB-Stick in dem Beispiel automatisch unter dem Verzeichnis /media/backup1 verfügbar macht. Sollte das nicht funktionieren erscheint die Meldung "USB disk not found". Wenn der USB-Stick gemountet wurde, dann erscheint eine Sicherheitsabfrage, ob die Datensicherung wirklich gestartet werden soll. Der Benutzerdialog wird in diesem Beispiel durch das Programm "zenity" erzeugt. Sollte zenity nicht für deine Linux-Distribution verfügbar sein, dann kann auch das Programm "xmessage" benutzt werden.
#!/bin/bash
# wait 5 seconds to let Linux auto mount the USB disk
index=0
while [ ! -d /media/backup1 ]; do
let index=index+1
if [ \$index -gt 10 ];then
zenity --error --text "USB disk not found"
exit 1
fi
sleep 0.5
done
zenity --question --text="Start backup ?"
if [ \$? -eq 0 ];then
zenity --info --text="Add your backup script here."
fi
EOF
# make the script executable
chmod 755 /home/user/tools/backup.sh
# install zenity if you do not have it yet
sudo apt-get install zenity
An die Stelle "Add your backup script here" können jetzt die Kommandos zur Datensicherung eingetragen werden (z.B. rsync). Nach der Datensicherung sollte für den USB-Stick der Befehl umount aufgerufen werden, damit die Daten sicher auf den Stick geschrieben werden.
Das Skript zum Entfernen des USB-Sticks kann in der gleichen Art mit zwei Shell-Skripten erstellt werden. Das macht aber in diesem Beispiel keinen Sinn, da beim Entfernen des USB-Sticks keine weiteren Aktionen erforderlich sind.
Mit der oben beschriebenen Vorgehensweise lassen sich auch andere Anwendungsfälle automatisieren. Falls noch etwas unklar sein sollte, dann kannst du die Kommentar-Funktion benutzen, um eine Frage zu stellen. Viel Spaß beim Ausprobieren und Experimentieren.