Backups mit Rsync – Part 3: Vereinfachung per Script

Das Script:


#!/bin/sh

# Diese Verzeichnisse nicht sichern
EXCLUDE="/proc/**:/dev/**:/mnt/**:/sys/**"

# Diese Datei hier einfügen, hierüber kann z.B
# EXCLUDE verändert werden, oder DIR und
# DEST fest eingetragen werden
if [ -f /etc/rbackup ]; then
source /etc/rbackup
fi

# einige optionen setzen:
# -z Kompression verwenden
# -v Verbose
# -H Hardlinks beibehalten
# -S Sparse Files als Sparse Files Kopieren
# -h Human readable
# -i Mehr infos pro datei Anzeigen
# --numeric-ids Berechtigungen anhand von uid/gid
# nummern setzen, nicht anhand des Namens
# --progress Fortschritt anzeigen
# --stats Zusammenfassung am Schluss anzeigen
# --link-dest Siehe Part2
OPTS="$OPTS --link-dest=../latest -azvHShi \
--numeric-ids --progress --stats"

# Wenn Verzeichnisse per Komandozeile übergeben
# werden, dann bitte Source und Destination
# angeben
if [ -n "$*" ]; then
if [ -z "$2" ]; then
echo "Missing destination"
exit
fi
DIR="$1"
DEST="$2"
fi

# Wenn DIR/DEST nicht aus /etc/rbackup hervorgeht
# und nicht über die Komandozeile mitgegeben wurde
# Mekern und Beenden
[ -z "$DIR" ] && echo "Missing source dir" && exit
[ -z "$DEST" ] && echo "Missing destination dir" \
&& exit

# Datum Feststellen (2006-12-27_20-43)
DATE=`date +%Y-%m-%d_%H-%M`

# unser Zielverzeichnis zusammensetzen
DATEDEST="$DEST/$DATE"

## Da wir oben die Excludes so faul angegeben
## haben, müssen wie das hier etwas entfalten
# Altes Trennzeichen sichern
IFSBACK=$IFS
# Trennzeichen auf : setzen
IFS=":"
# Excludes zu den Optionen hinzufügen
OPTS="$OPTS `for dir in $EXCLUDE; \
do echo -n \"--exclude=$dir \" ; done`"
# Alte Trennzeichen wieder herstellen
IFS=$IFSBACK

# Source zu Optionen hinzufügen
OPTS="$OPTS $DIR"

# Destination zu Optionen hinzufügen
OPTS="$OPTS $DATEDEST"

echo "Starting rbackup"

# Anzeigen welches komando wir uns erspart haben
echo rsync $OPTS

# rsync aufrufen
rsync $OPTS

# Exit Status sichern
rok=$?

if [ "$rok" == "0" ]; then

echo "Backup complete, creating softlink"

# Wir erzeugen einen softlink, der immer auf das
# letzte backup zeigt, benötigt, damit wir mit
# --link-dest=../latest arbeiten können. Wir
# erzeugen den link lokal, und kopieren ihn zum ziehlverzeichnis
ln -s $DATE latest
rsync -a latest $DEST/
rm latest
echo "done"

else
echo "Something went wrong"
fi

Die Datei /etc/rbackup sieht bei mir so aus:


# Eigene Excludes setzen
EXCLUDE="proc/:sys/:tmp/"
EXCLUDE="$EXCLUDE:/mnt/network/:mnt/cdrom/:lost+found/"
EXCLUDE="$EXCLUDE:'*~'"

# Ziel setzen
DEST="micha-server:/freigaben/backup/laptop"

# Quelle Setzen
DIR="/"

Festplatte kapput -> Wlan geht nicht mehr

Nachdem mein Laptop heute auf einmal keine Wlan Keys mehr annehmen wollte, stellte sich heraus das meine Festplatte ausgerechnet an der Stelle einen Lesefehler hat, an dem ein für Wep benötigtes Crypto Kernel Modul liegt.

Hier der Auszug aus dmesg

Dec 25 22:59:09 micha-mobile ieee80211_crypt: registered algorithm 'WEP'
Dec 25 22:59:14 micha-mobile hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Dec 25 22:59:14 micha-mobile hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=224604, high=0, low=224604, sector=22
459325 22:59:14 micha-mobile ide: failed opcode was: unknown
Dec 25 22:59:14 micha-mobile end_request: I/O error, dev hda, sector 224593
Dec 25 22:59:19 micha-mobile hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Dec 25 22:59:29 micha-mobile ide: failed opcode was: unknown
Dec 25 22:59:29 micha-mobile end_request: I/O error, dev hda, sector 224601
Dec 25 22:59:34 micha-mobile hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Dec 25 22:59:34 micha-mobile hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=224604, high=0, low=224604, sector=22
4601
Dec 25 22:59:34 micha-mobile ide: failed opcode was: unknown
Dec 25 22:59:34 micha-mobile end_request: I/O error, dev hda, sector 224601
Dec 25 22:59:39 micha-mobile hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Dec 25 22:59:39 micha-mobile hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=224604, high=0, low=224604, sector=22
4601
Dec 25 22:59:39 micha-mobile ide: failed opcode was: unknown
Dec 25 22:59:39 micha-mobile end_request: I/O error, dev hda, sector 224601
Dec 25 22:59:39 micha-mobile Module len 8192 truncated
Dec 25 22:59:39 micha-mobile modprobe: WARNING: Error inserting crypto_algapi (/lib/modules/2.6.19-gentoo-r2/kernel/crypto/c
rypto_algapi.ko): Invalid module format
Dec 25 22:59:39 micha-mobile modprobe: FATAL: Error inserting cryptomgr (/lib/modules/2.6.19-gentoo-r2/kernel/crypto/cryptom
Dec 25 22:59:39 micha-mobile hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=224604, high=0, low=224604, sector=224601
Dec 25 22:59:39 micha-mobile ide: failed opcode was: unknown
Dec 25 22:59:39 micha-mobile end_request: I/O error, dev hda, sector 224601
Dec 25 22:59:39 micha-mobile Module len 8192 truncated
Dec 25 22:59:39 micha-mobile modprobe: WARNING: Error inserting crypto_algapi (/lib/modules/2.6.19-gentoo-r2/kernel/crypto/crypto_algapi.ko): Invalid module format
Dec 25 22:59:39 micha-mobile modprobe: FATAL: Error inserting cryptomgr (/lib/modules/2.6.19-gentoo-r2/kernel/crypto/cryptomgr.ko): Unknown symbol in module, or unknown parameter (see dmesg)
Dec 25 22:59:09 micha-mobile ieee80211_crypt: registered algorithm 'WEP'
Dec 25 22:59:14 micha-mobile hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Dec 25 22:59:14 micha-mobile hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=224604, high=0, low=224604, sector=22
459325 22:59:14 micha-mobile ide: failed opcode was: unknown
Dec 25 22:59:14 micha-mobile end_request: I/O error, dev hda, sector 224593
Dec 25 22:59:19 micha-mobile hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Dec 25 22:59:29 micha-mobile ide: failed opcode was: unknown
Dec 25 22:59:29 micha-mobile end_request: I/O error, dev hda, sector 224601
Dec 25 22:59:34 micha-mobile hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Dec 25 22:59:34 micha-mobile hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=224604, high=0, low=224604, sector=22
4601
Dec 25 22:59:34 micha-mobile ide: failed opcode was: unknown
Dec 25 22:59:34 micha-mobile end_request: I/O error, dev hda, sector 224601
Dec 25 22:59:39 micha-mobile hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Dec 25 22:59:39 micha-mobile hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=224604, high=0, low=224604, sector=22
4601
Dec 25 22:59:39 micha-mobile ide: failed opcode was: unknown
Dec 25 22:59:39 micha-mobile end_request: I/O error, dev hda, sector 224601
Dec 25 22:59:39 micha-mobile Module len 8192 truncated
Dec 25 22:59:39 micha-mobile modprobe: WARNING: Error inserting crypto_algapi (/lib/modules/2.6.19-gentoo-r2/kernel/crypto/c
rypto_algapi.ko): Invalid module format
Dec 25 22:59:39 micha-mobile modprobe: FATAL: Error inserting cryptomgr (/lib/modules/2.6.19-gentoo-r2/kernel/crypto/cryptom
Dec 25 22:59:39 micha-mobile hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=224604, high=0, low=224604, sector=224601
Dec 25 22:59:39 micha-mobile ide: failed opcode was: unknown
Dec 25 22:59:39 micha-mobile end_request: I/O error, dev hda, sector 224601
Dec 25 22:59:39 micha-mobile Module len 8192 truncated
Dec 25 22:59:39 micha-mobile modprobe: WARNING: Error inserting crypto_algapi (/lib/modules/2.6.19-gentoo-r2/kernel/crypto/crypto_algapi.ko): Invalid module format
Dec 25 22:59:39 micha-mobile modprobe: FATAL: Error inserting cryptomgr (/lib/modules/2.6.19-gentoo-r2/kernel/crypto/cryptomgr.ko): Unknown symbol in module, or unknown parameter (see dmesg)
Dec 25 22:59:39 micha-mobile cryptomgr: Unknown symbol crypto_unregister_notifier
Dec 25 22:59:39 micha-mobile cryptomgr: Unknown symbol crypto_larval_error
Dec 25 22:59:39 micha-mobile cryptomgr: Unknown symbol crypto_register_notifier
Dec 25 22:59:39 micha-mobile cryptomgr: Unknown symbol crypto_register_instance
Dec 25 22:59:39 micha-mobile cryptomgr: Unknown symbol crypto_lookup_template
Dec 25 22:59:39 micha-mobile ieee80211_crypt_wep: could not allocate crypto API arc4
Dec 25 22:59:39 micha-mobile eth1: could not initialize WEP: load module ieee80211_crypt_wep
Dec 25 22:59:39 micha-mobile cryptomgr: Unknown symbol crypto_unregister_notifier
Dec 25 22:59:39 micha-mobile cryptomgr: Unknown symbol crypto_larval_error
Dec 25 22:59:39 micha-mobile cryptomgr: Unknown symbol crypto_register_notifier
Dec 25 22:59:39 micha-mobile cryptomgr: Unknown symbol crypto_register_instance
Dec 25 22:59:39 micha-mobile cryptomgr: Unknown symbol crypto_lookup_template
Dec 25 22:59:39 micha-mobile ieee80211_crypt_wep: could not allocate crypto API arc4
Dec 25 22:59:39 micha-mobile eth1: could not initialize WEP: load module ieee80211_crypt_wep

Hab direkt die hier bestellt:
http://www.alternate.de/html/productDetails.html?artno=AAAW09
wenigstens hab ich danach 3x so viel Platz, 40g waren so wie so viel zu wenig.

Backups mit Rsync – Part 2: Snapshots

Im ersten Teil haben wir nur ein Backup erstellt. Wen wir uns nun eine Datei überschrieben haben, und das erst merken, nachdem wir ein weiteres Backup erstellt haben, ist unsere Datei auch im Backup überschrieben worden.
Um das Problem zu lösen, müssen wir mehrere Backups machen, ein weiteres vollständiges Backup braucht sehr viel Platz. Ein inkrementelles Backup spart zwar den Platz, aber gelöschte Dateien werden nicht registriert und eine wiederherstellung ist mit viel suchen, oder Zusammenführen der Backups verbunden.
Rsync löst das Problem mit der Option --link-dest.

# rsync -a \
–-exclude=’/proc/**’ \
–-exclude=’/sys/**’ \
-–exclude=’/mnt/**’ \
-–exclude=’/tmp/**’ \
--link-dest='../laptop' \
/ server:/backups/laptop2

Rsync vergleicht nun vor der übertragung einer Datei, ob diese schon im Verzeichnis ‘../laptop’ vorhanden ist. Wenn die Datei vorhanden ist, wird die Datei nicht erneut kopiert, sondern stattdessen ein Hardlink zu der bereits vorhandenen Datei angelegt.
Der angegebene Pfad muss immer relativ zum Ziel angegeben werden.
Das Backup in laptop2 verhällt sich jetzt wie ein Vollständiges Backup, die Verzeichnisse laptop und laptop2 benötigen zusammen aber nur den Platz eines vollständigen, und eines inkrementellen Backups. Durch die Verwendung von Hardlinks kann das Verzeichnis laptop auch gelöscht werden, und laptop2 ist immer noch vollständig, da tatsächlich nur Daten gelöscht werden die sich im 2. Backup geändert haben.

Backups mit Rsync – Part 1: Grundlagen

Rsync ist ein geniales Werkzeug zum erstellen von Backups.
Nehmen wir einmal an wir haben einen Laptop, den wir auf einen anderen Rechner im Netzwerk sichern wollen.
Der Name des Rechners ist “server” und dort wollen wir, in das Verzeichnis /backups/laptop sichern.
Auf beiden Rechnern muss ein Unix/Linux mit ssh und rsync installiert sein. Auf dem Zielrechner muss der ssh Server gestartet sein.
Rsync kann als normaler Benutzer verwendet werden, ich empfehle aber es als root auszuführen, da wir nur so, in Verbindung mit der Option -a, sicher sein können das alles auch genau so wieder auf dem Zielrechner angelegt wird, wie es auf unserem Quellrechner existiert.

Den Inhalt dieser Verzeichnisse sollten wir nicht versuchen zu sichern:

/proc
/sys
/media
/mnt
/tmp

Um diese Verzeichnisse auszuschließen verwenden wir die --exclude Option.

Auf dem Laptop geben wir ein:

# rsync -a \
--exclude='/proc/**' \
--exclude='/sys/**' \
--exclude='/mnt/**' \
--exclude='/tmp/**' \
/ server:/backups/laptop

Rsync wird dann per ssh eine Verbindung zum Rechner “server” aufbauen, dazu geben wir das root Passwort des Zielrechners an.

Anschließend sichert rsync unser gesamtes System, was einige Zeit dauert.
Da rsync bei nachfolgenden Backups nur noch die Änderungen des vorherigen Backups Kopiert, laufen weitere Backups wesentlich schneller.
Rsync löscht bei folgenden Backups keine Dateien auf dem Zielrechner, selbst wenn diese auf dem Quellrechner nicht mehr vorhanden sind. Mit der Option --del sorgen wir dafür das rsync nicht mehr vorhandene Dateien löscht.

wget + mplayer

Mplayer kann nicht nur lokale Dateien öffnen, sondern auch direkt von http lesen:

mplayer http://www.beispiel.de/videodatei.avi

Leider ist mplayer dabei nicht besonders gut, manche links mag er nicht, und oft will er nicht mit Proxies zusammenarbeiten. Ein programm was das sehr gut macht ist wget.

wget -O - http://www.beispiel.de/videodatei.avi \
| mplayer -

Die wget Option -O – sorgt dafür das die Datei auf die Standardausgabe geschrieben wird.
Beim mplayer sorgt – dafür das die Daten von der Standardeingabe gelesen werden.

Sparse Files erzeugen

Sparse Files, sind Dateien, bei denen null Bytes keinen Platz benötigen. Praktisch um Image Dateien anzulegen, da diese erst dann Platz benötigen, wenn sie gefüllt werden.
So erzeugt man eine 1G große sparse Datei:

$ dd if=/dev/null of=sparsefile.img bs=1 seek=1G
$ ls -lh sparsefile.img
-rw-r--r-- 1 mk users 1,0G 22. Dez 22:58 sparsefile.img
$ du -h sparsefile.img
0 sparsefile.img

Ein dateisystem drauf machen:

# mke2fs sparsefile.img
$ du -h sparsefile.img
17M sparsefile.img

Das dateisystem benötigt also 17M.
Mounten:

# mount -o loop sparsefile.img /mnt

Grösse anzeigen:

$ df /mnt
Dateisystem Größe Benut Verf Ben% Eingehängt auf
/home/mk/sparsefile.img
1008M 1,3M 956M 1% /mnt
$ du -h sparsefile.img
17M sparsefile.img

übrigens sieht man hier das uns die 17MB des Dateisystems geklaut werden
1024 – 17 ~ 1008

Ordner verstecken mit Samba

Bei samba Installationen nerven die von ext3 angelegten lost+found Ordner.
Mit

hide files = /lost+found/

in der smb.conf wird der Ordner als versteckt markiert, in Windows kann man sie dann nur noch sehen, wenn man “Versteckte Dateien anzeigen” auswählt. / ist in diesem Fall ein Trennzeichen, also auch wichtig wenn man nur einzelne Dateien verstecken will.