Da ich in den letzte Wochen 2 mal in die Verlegenheit kam, wichtige Daten aus einer Sicherung wiederherstellen zu müssen (
rm -rf .ssh ist idR. einfach keine gute Idee....), hab ich mir gedacht, dass ich mal kurz was zu meiner relativ unprofessionellen, aber für mich ausreichenden Backup-Lösung schreiben könnte. Unprofessionell deshalb, weil es sich prinzipiell nur um
eine reine Kopie wichtiger Daten handelt und es nicht möglich ist mehrere Snapshots verschiedener Zeitpunkte zu verwalten. Wer soetwas will, sollte sich z.B. mal
rsnapshot etwas genauer ansehen.
Meine Lösung besteht aus einem kurzen (für diese Posting noch mehr gekürzten) Bash-Skript, das die Verzeichnisse
/home/haui sowie
/music auf eine externe Platte sichert. Da das Ganze mit rsync erledigt wird, handelt es sich um ein inkrementelles Backup.
Achtung: Das Skript muss vor der Verwendung angepasst werden, falls etwas unklar ist lieber nachfragen als eine böse Überraschung zu erleben!
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
|
#!/bin/bash
#UUID der Backuppartition, muss geändert werden (-> blkid /dev/sdXX)
UUID=ABCDEF
#Einhängepunkt der Backuppartition, muss ggf. geändert werden
MOUNTPOINT=/mnt/extern
#wird unten gesetzt. Falls aktiviert, wird rsync Änderungen
#nur auflisten, diese aber nicht durchführen
DRYRUN=""
[[ $UUID = ABCDEF ]] && { echo "Unmodified script...quitting"; exit; }
if [[ $# -eq 0 ]]
then
echo "Argument required"
echo "valid arguments are: home music all"
echo "valid command switches are: -n (dry-run)"
exit
fi
#Nachschauen ob unsere Partition vorhanden ist
if ! [[ -e /dev/disk/by-uuid/$UUID ]]
then
echo "Device not mounted....quitting"
exit 1
fi
#wenn die Partition noch nicht eingebunden ist
if ! df | grep -q "$MOUNTPOINT"
then
#versuche sie einzubinden
if ! mount "$MOUNTPOINT"
then
echo "Failed to mount $MOUNTPOINT"
exit 1
fi
echo "Mounted $MOUNTPOINT, press Enter to continue"
read l;
fi
#hier wird überprüft, ob die korrekte Partition nach in /mnt/extern eingebunden ist
DEV=$(df "$MOUNTPOINT"/ | tail -1 | awk '{print $1}')
if [[ $(/sbin/blkid $DEV | sed -r 's#^.*UUID="([^"]+)".*#\1#') != $UUID ]]
then
echo "Wrong disk"
echo "$DEV"
exit 1
fi
#selbsterlärend
if [[ $USER != "haui" ]]
then
echo "wrong user..."
exit 1
fi
echo ""
echo "Everything seems to be ok, type Y to proceed"
read line
if [ $line != "y" ] && [ $line != "Y" ]
then
exit
fi
#dry-run aktivieren oder nicht?
for arg; do
[[ $arg = "-n" ]] && DRYRUN="--dry-run" && echo "DRYRUN"
done
#hier findet das eigentlich synchronisieren der Verzeichnisse statt
#--delete heißt, dass Dateien die beispielsweise im Home-Verzeichnis gelöscht werden,
#beim nächsten Durchlauf des Skripts auch im Backup gelöscht werden.
#mit exclude lassen sich einzelnen Dateien/Ordner vom Backup ausschließen
#GENAU anschauen und ggf. anpassen
for arg
do
if [ "$arg" = "home" ] || [ "$arg" = "all" ]
then
rsync $DRYRUN --delete --exclude=.mozilla/firefox/ABC123.default/Cache \
--exclude=.macromedia --exclude=.opera/cache \
-av /home/haui/ "$MOUNTPOINT"/backup/haui
fi
if [ "$arg" = "music" ] || [ "$arg" = "all" ]
then
#/music
rsync $DRYRUN --progress --stats -av /music/ "$MOUNTPOINT"/backup/music
fi
done
|
|