kanotix.com

Scripte - Auto Backup auf Usbstick mit udev

blauweiss - 29.04.2007, 20:17 Uhr
Titel: Auto Backup auf Usbstick mit udev
Da ich mich nach dem Problem hier zwangsweise mit udev, hal und co beschäftigt habe,
kam mir beim Lesen diverser Artikel die Idee, das es doch möglich sein müßte,
beim Einstöpseln eines bestimmten Usbsticks automatisch ein Backup wichtiger
Ordner und Dateien auszulösen und auf dem Stick zu speichern.
Die 4 Schritte, die zum Erfolg geführt haben, hab ich parallel notiert und poste das Ganze mal.
1. Usbstick vorbereiten
2. Usbstick eindeutig benennen
3. Udev Regel schreiben
4. Backup script erstellen

1. Usbstick vorbereiten
Usbstick einstecken, das KDE-Fensterchen was nun aufgeht,
mit 'nichts unternehmen' und 'dauerhaft speichern' beantworten.
Gerätedatei mit 'dmesg' herausfinden, oder einfach mit der Maus über das entsprechende Icon fahren
In meinem Fall ist der Usbstick als '/dev/sdg1' erkannt worden, bitte an die eigenen Gegebenheiten anpassen.
Formatieren mit einem Linuxdateisystem, um die Rechte beim Backup beizubehalten,
hab mich für ext2 entschieden, Dateisystem erstellen:
Code:
mke2fs /dev/sdg1

Usbstick kurz rausziehen und wieder einstecken, auf das Icon klicken, um ihn zu mounten
Mount Ordner ist z.B.: /media/disk
Backup Ordner erstellen und ihm Schreibrechte für alle geben,
letzteres ist vielleicht nicht nötig, aber was solls.
Code:
mkdir /media/disk/backup
chmod 777 /media/disk/backup

Damit ist der Stick bereit Daten aufzunehmen

2. Dem Usbstick einen eindeutigen Namen (z.B.: backup2904) geben,
zur einwandfreien Identifizierung später im script:
Code:
e2label /dev/sdg1 backup2904

3. Udev Regel schreiben
Informationen über den Stick abfragen:
Code:
udevinfo -a -p $(udevinfo -q path -n sdg1)

Ausgabe (stark verkürzt) sieht ungefähr so aus
Code:
    KERNEL=="sdg1"
    SUBSYSTEM=="block"
    ATTRS{serial}=="5B7312001005"

Falls der Stick eine Seriennummer hat, kann man sich die o.g. Namensgebung sparen,
er liesse sich hierüber wahrscheinlich einwandfrei identifizieren, hat aber leider nicht jeder,
also werte ich hier auch nur KERNEL und SUBSYSTEM aus und lass dann das backup script laufen,
die entsprechende udev -Regel schreiben, als root:
Code:
echo 'KERNEL=="sd[g-i]1", SUBSYSTEM=="block", IMPORT{program}="vol_id --export %N", ACTION=="add", ENV{ID_FS_LABEL}=="backup2904", RUN+="/usr/local/bin/backup2904 %k"' > /etc/udev/rules.d/00_backup.rules

Der Dateiname der Regel sollte schon mit '00...' anfangen, damit sie als erstes ausgeführt wird
und natürlich auch die Endung '.rules' haben.
"sd[g-i]1" begrenzt die Devicenamen der Sticks auf sdg1, sdh1 und sdi1
IMPORT{program}="vol_id --export %N" das Programm 'vol_id' wird ausgeführt und gibt einige Variablen zur Auswertung zurück,
dies ist in einer root Konsole leicht nachvollziehbar mit dem Befehl
/lib/udev/vol_id --export /dev/sdg1
ACTION=="add" sorgt dafür das das Skript nur nach Einstecken des Sticks ausgeführt wird
ENV{ID_FS_LABEL}=="backup2904" hier wird nachgefragt, ob es der "richtige" Stick ist
RUN+="/usr/local/bin/backup2904 %k Skript ausführen, %k ist der Devicename, der dem Skript als Parameter mitgegeben wird
Nach Ändern oder Neuerstellen einer udev -Regel, sollte oder muß das System neugestartet werden.

4. ausführbares script /usr/local/bin/backup2904 erstellen:
der user sollte der Gruppe 'staff' angehören, sonst müssen die nächsten Schritte als root gemacht werden:
Code:
echo '#!/bin/sh' > /usr/local/bin/backup2904
chmod 755 /usr/local/bin/backup2904

Datei mit kwrite editieren:
Code:
kwrite /usr/local/bin/backup2904

Zunächst nachfragen ob das Backup durchgeführt werden soll,
dann wird der Stick gemountet, der Mountordner erfragt und der Zielordner festgelegt, zuletzt gibt es eine Vollzugsmeldung.
Es folgen einige Beispiele (natürlich selber anpassen) zum Sichern mit 'rsync'.
Code:
#!/bin/sh

export XAUTHORITY=/home/blauweiss/.Xauthority
export DISPLAY=:0.0
Xdialog --yesno "Backup auf /dev/$1 durchführen?" 5 40
if [ $? -gt 0 ]; then
   exit 0
fi

pmount /dev/$1
MOUNTORDNER="$(grep "/dev/$1 " /etc/mtab | awk '{print $2}')/backup"
rsync -a /home/blauweiss/.bashrc "$MOUNTORDNER/home/" 2>/dev/null
rsync -a /home/blauweiss/.gimp-2.2/{plug-ins,scripts,brushes} "$MOUNTORDNER/home/.gimp-2.2/" 2>/dev/null
rsync -a --delete /home/blauweiss/.mozilla "$MOUNTORDNER/home/" 2>/dev/null
rsync -a --delete /home/blauweiss/.mozilla-thunderbird "$MOUNTORDNER/home/" 2>/dev/null
   # Hab mir angewöhnt unwichtige Dateien und Ordner in /home/blauweiss/tmp
   # mit einem Unterstrich als erstes Zeichen zu benennen,
   # diese werden im nächsten Befehl von der Sicherung ausgenommen:
rsync -a --delete --exclude "_*" /home/blauweiss/tmp "$MOUNTORDNER/home/" 2>/dev/null
rsync -a /etc/fstab "$MOUNTORDNER/etc/" 2>/dev/null
rsync -a /etc/apt/sources.list "$MOUNTPUNKT/etc/apt/" 2>/dev/null
sync
pumount /dev/$1
Xdialog --msgbox "Backup durchgeführt! \nStick kann abgezogen werden" 7 40

Da rsync wohl nicht mehr als einen Ordner zugleich im Zielverzeichnis erstellen kann,
es sind keine zusätzlichen Unterordner gleichzeitig möglich?,
ist auch hierbei eine gewisse Reihenfolge einzuhalten,
oder man behilft sich so, wenn man z.B. das Backup-script selbst sichern möchte:
Code:
mkdir -p $MOUNTPUNKT/usr/local/bin
rsync -a /usr/local/bin/backup2904 "$MOUNTPUNKT/usr/local/bin/" 2>/dev/null

Das wars, zur Sicherheit das System nochmal neustarten (Änderungen am Script erfordern keinen Neustart)
Beim nächsten Einstöpseln dieses "Backup-Sticks", sollte auf Nachfrage ein Backup eingeleitet werden.
Vor dem Abziehen warten bis das Lämpchen am Stick aus bleibt.
Quellen:
http://www.tu-chemnitz.de/urz/kurse/unt ... vices.html
http://www.reactivated.net/writing_udev_rules.html
http://forums.gentoo.org/viewtopic-t-350769.html
http://wiki.ubuntuusers.de/udev?highlight=%28udev%29
horo - 30.04.2007, 09:13 Uhr
Titel: Auto Backup auf Usbstick mit udev
Zitat:

Vor dem Abziehen warten bis das Lämpchen am Stick aus bleibt.

Besser vorher "sync" ausführen oder Rechtsklick->Sicher entfernen
Der Befehl "sync" könnte z.B. auch im Skript stehen.

Ciao Martin
blauweiss - 30.04.2007, 10:04 Uhr
Titel:
Danke für den Hinweis, denk mir mal der 'sync' Befehl sollte als letztes
ausgeführt werden, ändere das mal und auch die 'if' Abfrage war in der
Syntax falsch.
blauweiss - 30.04.2007, 12:49 Uhr
Titel:
Nochn paar kleine Änderungen:
ACTION=="add" der udev Regel hinzugefügt und
und eine Sicherheitsabfrage, ob das Backup ausgeführt werden soll.
blauweiss - 05.06.2007, 18:25 Uhr
Titel:
Man lernt ja nie aus...
Hab den ersten Post nochmals geändert:
Die 'if then' Abfrage im Skript, ob es sich um den backup2904 USB-Stick handelt,
kann man sich sparen, auch dies läßt sich mit einer udev-Regel erfassen
IMPORT{program}="vol_id --export %N"
und anschl.
ENV{ID_FS_LABEL}=="backup2904"
und noch eine Vollzugsmeldung hinzugefügt.
Alle Zeiten sind GMT + 1 Stunde
PNphpBB2 © 2003-2007