Meine ownCloud läuft inzwischen auf dem Raspberry Pi im Wohnzimmer. Die wichtigen Daten darauf werden verschlüsselt auf einem externen FTP-Server gesichert. Hierfür wird Duplicity verwendet, ein leistungsfähiges Backup-Tool, das allerdings auf der Kommandozeile etwas unhandlich zu bedienen ist.
Für das tägliche automatische Backup verwende ich dieses Backup-Script für Duplicity von Hetzner. Aber was, wenn der Ernstfall eintritt und verlorene Daten wieder hergestellt werden müssen? Dafür habe ich mir das folgende Restore-Script geschrieben. Es müssen dieselben Zugangsdaten eingetragen werden, die in dem oben verlinkten Backup-Script verwendet wurden.
#!/bin/bash # # Simple script for restoring Duplicity backups. # # Usage: restore.sh FNAME TARGET [TIME] # FNAME: fully qualified name of the file or folder to restore # TARGET: fully qualified name of the restored file or folder, # can be the original name and location or another # TIME: Specify the time from which to restore files, e.g. 3D for 3 days # See duplicity manpage chapter "Time Formats" for details # # Example to restore /etc from 2 days ago in /home/user/etc_restored: # restore.sh /etc /home/user/etc_restored 2D # Set protocol (use scp for sftp and ftp for FTP, see manpage for more) BPROTO=scp # set user and hostname of backup account BUSER='u10000' BHOST='u10000.your-backup.de' # Setting the password for the Backup account that the # backup files will be restored from. # for sftp a public key can be used. BPASSWORD='yourpass' # Setting the pass phrase to encrypt the backup files. Will use symmetrical keys in this case. PASSPHRASE='yoursecretgpgpassphrase' export PASSPHRASE ############################## if [ $BPASSWORD ]; then BAC="$BPROTO://$BUSER:$BPASSWORD@$BHOST" else BAC="$BPROTO://$BUSER@$BHOST" fi FNAME=$1 TARGET=$2 TIME=$3 if [ $TIME ]; then TIME="-t $TIME" fi if [ $FNAME != ${FNAME#/*/} ]; then CMD="duplicity $TIME --file-to-restore ${FNAME#/*/} $BAC${FNAME%%/${FNAME#/*/}} $TARGET >> $LOGDIR/system.log" else CMD="duplicity $TIME $BAC${FNAME%%/${FNAME#/*/}} $TARGET >> $LOGDIR/system.log" fi eval $CMD # Check the manpage for all available options for Duplicity. # Unsetting the confidential variables unset CMD unset PASSPHRASE unset FTP_PASSWORD exit 0
Das Script kann man z.B. unter /usr/local/sbin/restore.sh speichern und mit folgendem Befehl ausführbar machen:
sudo chmod 750 /usr/local/sbin/restore.sh
Benutzung:
sudo restore.sh FNAME TARGET [TIME]
FNAME: Name der Datei oder des Verzeichnis, das aus dem Backup wiederhergestellt werden soll.
TARGET: Name, unter dem die Daten wiederhergestellt werden sollen. Das kann auch ein abweichender Name oder Speicherort sein.
TIME: Optional, ohne Angabe wird das letzte Backup wiederhergestellt. Für Details siehe die Duplicity Manpage im Kapitel „Time Formats“.
Jetzt wollen wir z.B. das versehentlich gelöschte Verzeichnis /home/username/Maildir an seiner ursprünglichen Stelle wiederherstellen.
sudo restore.sh /home/username/Maildir /home/username/Maildir
Im folgenden Beispiel wird der Stand von vor fünf Tagen wiederhergestellt, außerdem werden die Daten im abweichenden Verzeichnis /home/username/Maildir_restored gespeichert:
sudo restore.sh /home/username/Maildir /home/username/Maildir_restored 5D
Auch einzelne Dateien können aus dem Backup zurückgeholt werden. Im folgenden Beispiel wollen wir nachsehen, wie die Datei /home/username/Dokumente/Artikel.txt vor zwei Wochen ausgesehen hat, ohne den aktuellen Stand zu verlieren:
sudo restore.sh /home/username/Dokumente/Artikel.txt /home/username/Dokumente/Artikel_alt.txt 2W
Duplicity überschreibt beim Wiederherstellen bestehende Dateien nicht. Auch sonst ist es eine gute Idee, die Daten erst mal an einer anderen Stelle wiederherzustellen. Nach einer Kontrolle, ob man wirklich die gewünschte Version aus dem Backup geholt hat, kann man die Daten dann an die ursprüngliche Stelle verschieben.