Du bist hier:Start»Linux»Automatisierung»USB

USB-Geräte unter Linux automatisieren

USB pendrive

Im Alltag habe ich drei Anwendungsfälle, bei denen mir eine Automatisierung von USB-Geräten hilft:

  • Datensicherung mit USB-Stick oder USB-Festplatte
  • Synchronisierung meiner Daten mit dem Smartphone über USB-Kabel (z.B. Musik vom Laptop aufs Smartphone)
  • DVB-T-Stick zum Fernsehen

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 dieses 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.

# list plugged in USB devices
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:

wget http://torsten-traenkner.de/linux/automation/listUSBMassStorageDevices.sh
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=="add", ENV{ID_VENDOR_ID}=="0781", ENV{ID_MODEL_ID}=="b7b1", RUN+="/home/user/tools/usbBackup1.sh"

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.

mkdir /home/user/tools/

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.

cat > /home/user/tools/backup.sh << EOF
#!/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.

Kommentar schreiben