====== Backup unter Linux mit udev ======
===== Sinn und Zweck =====
Backup ist eine schwierige Sache und es gibt sicher viele Strategien.\\
Ich möchte im Folgenden meine bevorzugte Möglichkeit beschreiben:
* Externe HD (nicht im Gehäuse sondern so: [[http://www.sharkoon.com/?q=de/node/1276|SATA QuickPort USB3.0]]
* Daten wegen des einfacheren Zugriffs aufs Backup NICHT komprimieren sondern nur kopieren.
* Backup wird durch das Anschließen der HD automatisch gestartet.
===== Umsetzung =====
Udev bietet unter anderem, die Möglichkeit bash-scripte auszuführen, wenn Geräte angeschlossen werden. Dazu legt man unter /etc/udev/rules.d/ eine Datei an und schreibt seine Regeln rein. Zum Beispiel so: \\
/etc/udev/rules.d/10-local.rules:
SUBSYSTEM=="block", SUBSYSTEMS=="scsi", RUN+="/usr/script/backup/backup-hd-udev.sh"
Die udev-Attribute kann man sich auf einem halbwegs aktuellem System nicht mehr mittels udevinfo anzeigen lassen sonden eher so:
udevadm info --query=all --name= --attribute-walk
Diese Regel ruft das Script "/usr/script/backup/backup-hd-udev.sh" auf, wenn ein SCSI blockdevice angeschlossen wird.
Das Script selber sieht so aus:
#!/bin/bash
BACKUPROOT=""
if [ $ACTION == "add" ] && [ $DEVTYPE == "partition" ]; then
case $ID_SERIAL in
"ST2000VX_002-12345_0000000000000002-0:0" )
mount $DEVNAME &&
rsync -avz --exclude ** $BACKUPROOT
touch $BACKUPROOT/backup_vom_`date -I`.log
umount $DEVNAME
hdparm -S1 `echo $DEVNAME | rev | cut -b 2- | rev`
;;
esac
fi
wobei folgende Platzhalter noch zu ersetzen wären:
* **:** Ort an dem die Partition des Backup-HD eingehängt wird und an dem per rsync die Daten kopiert werden.
* **:** Quellort der zu sichernden Daten.
* **:** Auszuschließendes Verzeichnis im Quellort. Es können auch mehrere angegeben werden, dazu muss eben "--exclude..." mehrmals wiederholt werden.
==== Funktionsweise des Scripts ====
Was macht das Script?
-
if [ $ACTION == "add" ] && [ $DEVTYPE == "partition" ]; then
Nur für den Fall weitermachen, dass ein Gerät des Typs "partition" hinzugefügt wird.
- case $ID_SERIAL in Switch case über die Seriennummer, falls es mal mehr als eine Platte gibt, auf die wir sichern wollen.
- "ST2000VX_002-12345_0000000000000002-0:0" ) Führe für genau diese Seriennummer aus.
- mount $DEVNAME && Gerät einhängen UND nächste Zeile nur ausführen, wenn der Befehl erfolgreich war. Wir wollen nicht, dass irgendeine Partition vollgeschrieben wird, wenn das Einhängen fehlschlägt.
- rsync -avz --exclude ** $BACKUPROOT Kopiere die Daten mittels rsync.
- touch $BACKUPROOT/backup_vom_`date -I`.log Lege eine Datei an, die Auskunft über das Datum des Backups gibt.
- umount $DEVNAME Hänge das Gerät wieder aus.
- hdparm -S1 `echo $DEVNAME | rev | cut -b 2- | rev`Bringe die Backup-HD dazu in den standby-Modus zu gehen. Der Teil echo $DEVNAME | rev | cut -b 2- | rev macht hierbei aus "/dev/sdb1" -> "/dev/sdb" indem der letzte Buchstabe abgeschnitten wird.
==== udev Umgebungsvariablen ====
Udev setzt Umgebungsvariablen, die vom aufgerufenen Script benutzt werden. Unter anderen sind das:
* ACTION: hat den Wert "add", wenn das Gerät angeschlossen wird und "remove", wenn das Gerät entfernt wird.
* DEVTYPE: hat den Wert "disk", wenn das "disk"-Gerät von udev angelegt wird (z.b. /dev/sdb) oder "partition", wenn von udev das Gerät für die Partition angelegt wird (z.b. /dev/sdb1)
* DEVNAME: der Name des eben angelegten Geräts: im Falle von DEVTYPE="disk" ist DEVNAME=/dev/sdb
Alle Umgebungsvariablen mit Wert in meinem Fall:
ID_USB_DRIVER=usb-storage
ID_MODEL=002-12345
ID_MODEL_ENC=002-1AH166\x20\x20\x20\x20\x20\x20
ID_REVISION=CV01
DEVTYPE=partition
ID_BUS=usb
SUBSYSTEM=block
ID_SERIAL=ST2000VX_002-12345_0000000000000002-0:0
ID_FS_UUID=eb354dc1-e6b1-48b1-8c69-c30671c58034
DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.0/host18/target18:0:0/18:0:0:0/block/sde/sde1
ID_MODEL_ID=55aa
ID_VENDOR_ENC=ST2000VX
ID_FS_VERSION=1.0 MINOR=65
ACTION=add PWD=/
UDEV_LOG=3 ID_
FS_TYPE=ext3
MAJOR=8
DEVLINKS=/dev/block/8:65 /dev/disk/by-id/usb-ST2000VX_002-12345_0000000000000002-0:0-part1 /dev/disk/by-path/pci-0000:00:1d.7-usb-0:2:1.0-scsi-0:0:0:0-part1 /dev/disk/by-uuid/eb354dc1-e6b1-48b1-8c69-c30671c58034
ID_VENDOR_ID=174c
DEVNAME=/dev/sde1
SHLVL=1
ID_FS_USAGE=filesystem
ID_TYPE=disk
ID_PART_TABLE_TYPE=dos
ID_FS_SEC_TYPE=ext2
ID_FS_UUID_ENC=eb354dc1-e6b1-48b1-8c69-c30671c58034
ID_INSTANCE=0:0
ID_VENDOR=ST2000VX
ID_USB_INTERFACE_NUM=00
ID_SERIAL_SHORT=0000000000000002
ID_PATH=pci-0000:00:1d.7-usb-0:2:1.0-scsi-0:0:0:0
ID_USB_INTERFACES=:080650:
SEQNUM=1866
====== Links ======
* [[http://reactivated.net/writing_udev_rules.html|Writing udev rules]]
====== Backup unter Linux mit shell ======
#!/bin/bash
backupname=`hostname`_backup_`date -I`.tar.gz
tar -C / -czpf - --exclude="./sys/*" --exclude="./proc/*" . | ssh berni@server "cat >/srv/data/muell/backup/${backupname}"