Für Android gibt es passend die freie, aber nicht quelloffene App RSyncBackup. In einem sogenannten Profil legen Sie quasi die Kommandozeile fest und führen den Befehl dann mit einem Klick auf das Profil aus – sehr praktisch, wenn Sie immer wieder dieselben Verzeichnisse für den Datentransfer verwenden.
Rsync beherrscht auch Spiegelung – also die Einweg-Synchronisation von einem Rechner auf einen zweiten. Hier müssen Sie die Option --remove-source-files durch die Option --delete ersetzen. Diese löscht auf dem Zielrechner anstatt auf dem Quellrechner auch Verzeichnisse, was die erste Option nicht unterstützt.
Benötigen Sie eine Zweiwege-Synchronisation, sollten Sie auch einen Blick auf Unison [9] werfen. Es nutzt den Rsync-Algorithmus, bietet aber neben dem reinen Kommandozeilenbetrieb auch eine schöne Oberfläche. Unison steht im Raspbian-Repository zur Installation bereit.
Backup mit Rsync
Rsync eignet sich auch hervorragend für Backups. Ein RasPi als Hub eignet sich naturgemäß nur bedingt dafür – je nach angeschlossenem Massenspeicher und zu sichernder Datenmenge laufen Datensicherungen sehr lange oder brauchen schlichtweg zu viel Platz. Für das schnelle Backup wichtiger Konfigurationsdateien in den Verzeichnissen /home und /etc spart ein Hub aber das Hochfahren des großen Fileservers. Die Sicherungen auf dem Hub holt dann der Fileserver ab, sobald er wieder am Netz ist.
Mit dem Tool Rsnapshot [10] legen Sie automatisierte Backups einschließlich hierarchischer Generationen an – etwa täglich, wöchentlich oder monatlich. Die Software steht im Raspbian-Repository zum Abruf bereit. Sie verwendet Rsync als Unterbau und ersetzt dabei mit der Option --link-dest Dateien auf dem Zielverzeichnis durch Hardlinks identischer Dateien der Vorgängergeneration. Dadurch verkleinern sich nicht nur die tatsächlich kopierten Dateimengen, sondern es existieren auch mehrere Generationen von Backups, ohne dass damit der Plattenplatz im gleichen Maße steigt.
Ein Nachteil von Rsnapshot: Es holt zwar Dateien von entfernten Rechnern ab, legt sie aber nur lokal ab. Damit müsste es auf dem Hub laufen und alle angeschlossenen Geräte vor dem Start des Backups anfragen. Zwei kleine Bash-Skripte ersetzen deshalb diese Funktionalität.
Das erste (Listing 5) kopieren Sie auf den Hub, das zweite (Listing 6) lokal auf die Rechner. Listing 6 ruft Listing 5 remote auf (Zeilen 8, 11 und 18) und bereitet so das Backup vor, bevor dann Rsync zum Zug kommt (Zeile 14 und 15 in Listing 5). Der Rsync-Befehl legt dabei im Zielverzeichnis einen Spiegel des Home-Verzeichnisses an.
Listing 5
#!/bin/bash
HUB="rpi" # Hostname des Hubs
rscript="/usr/local/bin/backup-server" # Skript auf dem Hub
turnus="${1:-daily}" # Erstes Argument oder daily
# alte Sicherung rotieren
ssh "${HUB}" "${rscript}" "rotate" "${HOSTNAME}" "${turnus}"
# neues Sicherungsverzeichnis erstellen und in "dir" speichern
dir=$(ssh "${HUB}" "${rscript}" "prepare" "${HOSTNAME}" "${turnus}")
# Home-Verzeichnis auf dem Hub nach "dir" sichern
rsync -avz --delete --numeric-ids --relative --delete-excluded \
--link-dest="${dir/.00/.01}/" "${HOME}" "${HUB}:${dir}"
# Aufräumen (überflüssige Generation(en) löschen)
ssh "${HUB}" "${rscript}" "cleanup" "${HOSTNAME}" "${turnus}" "30"
Listing 6
#!/bin/bash
# remote backup support-script
# rotate: nennt Backups um: name.03->name.04, name.02->name.03 usw.
# prepare: erstellt neues Backup-Verzeichnis name.00
# cleanup: löscht alle Backup-Verzeichnisse mit zu hoher Nummer
# Konfiguration
backupRoot=/data/backups
# --- Backups rotieren --------
rotate() {
remoteHost=$1
backupType=$2
backupDir=${backupRoot}/${remoteHost}
find ${backupDir}/${backupType}.* -type d -maxdepth 0 | sort -r | while read dir; do
nr=${dir##*.}
nr=${nr#0}
let nr1=nr+1
nr1=$(printf %02d $nr1)
mv ${dir} ${backupDir}/${backupType}.${nr1}
done
}
# --- Backup vorbereiten -------
prepare() {
remoteHost=$1
backupType=$2
backupDir=${backupRoot}/${remoteHost}
targetDir=${backupDir}/${backupType}.00
mkdir -p ${targetDir}
echo ${targetDir}
exit 0
}
# --- Lösche altes Backup ------
cleanup() {
remoteHost=$1
backupType=$2
maxGen=$3
backupDir=${backupRoot}/${remoteHost}
while [ ${maxGen} -lt 100 ]; do
nr=$(printf %02d ${maxGen})
if [ ! -d ${backupDir}/${backupType}.${nr} ]; then
exit 0
else
rm -fr ${backupDir}/${backupType}.${nr}
let maxGen=maxGen+1
fi
done
}
# --- Hauptprogramm -------
func=$1
# prüfe erlaubte Funktionen
grep -qw ${func} <<< prepare rotate cleanup || exit 3
shift
eval ${func} $@
Damit Sie nicht jeder Aufruf von SSH und Rsync mit einer Passwortabfrage belästigt, erstellen Sie ein Schlüsselpaar und kopieren vorher Ihren öffentlichen Schlüssel auf den RasPi [11]. Sämtliche in diesem Artikel abgedruckten Listings sowie ein Raspbian-Image, das alle nötigen Komponenten bereits vorinstalliert mitbringt (siehe Kasten “Komfortables Image”), finden Sie auf der Heft-DVD.
Komfortables Image
Auf der Heft-DVD finden Sie im Verzeichnis /RPG/sync/ ein vorkonfiguriertes Raspbian-Image für den vorgestellten Sync-Server. Es nutzt Lighttpd als Webserver und SQLite3 als Datenbank. Der Firefox-Sync Minimal Server FSyncMS, der CalDAV/CardDAV-Synchronisierer Baikal und die Skripts für das Rsnapshot-basierte Backup sind bereits vorinstalliert.
Um das Image auf eine mindestens 2 GByte große SD-Karte aufzuspielen, entpacken Sie das Archiv raspi-sync.img.zip und kopieren das Abbild mittels folgenden Befehls auf die SD-Card:
# dd if=raspi-sync.img of=/dev/xxx
Dabei setzen Sie für xxx den Gerätebezeichner der SD-Karte ein, der in den meisten Fällen sdb lauten dürfte. Windows-Anwender greifen statt zu dd zum Win32DiskImager, den Sie im Verzeichnis \RPG\windows auf dem Heftdatenträger finden.
Das für den Headless-Betrieb ausgelegte Image holt sich seine IP-Adresse per DHCP. Sie melden sich per SSH mit dem Benutzernamen pi und dem Passwort raspberry am System an. Da das Abbild bereits für deutsche Nutzer lokalisiert wurde, müssen Sie bei raspberry tatsächlich ein Y und nicht etwa ein Z tippen. Weitere Infos, wie etwa die in Baikal vordefinierten Benutzer samt deren Passwörtern, stehen in /etc/motd, sodass das System sie Ihnen beim Login automatisch anzeigt.
Nach dem ersten Start müssen Sie noch einige Änderungen in Konfigurationsdateien vornehmen, da sowohl Firefox-Sync als auch CalDavZap die Hostnamen wissen müssen, auf denen der Service läuft. Näheres dazu entnehmen Sie bitte dem Artikel.
Der Autor
Bernhard Bablok arbeitet bei der Allianz Managed&Operations Services SE als SAP-HR-Entwickler. Wenn er nicht Musik hört, mit dem Radl oder zu Fuß unterwegs ist, beschäftigt er sich mit Themen rund um Linux und Objektorientierung. Sie erreichen ihn unter [email protected].
Infos
- Owncloud: https://owncloud.org
- Seafile: http://seafile.com
- Seafile auf dem Raspberry Pi: http://jankarres.de/2013/06/raspberry-pi-owncloud-alternative-seafile-server-installieren/
- FSyncMS: https://www.ohnekontur.de/category/technik/sync/fsyncms/
- Baikal: http://baikal-server.com
- CalDavZAP: http://www.inf-it.com/open-source/clients/caldavzap/
- CardDavMate: http://www.inf-it.com/open-source/clients/carddavmate/
- F-Droid: https://f-droid.org
- Unison: http://www.cis.upenn.edu/~bcpierce/unison/
- Rsnapshot: http://www.rsnapshot.org
- SSH-Schlüssel erzeugen: Ruth Suehle, “Kopflos”, RPG 05/2013, S. 22, http://www.raspberry-pi-geek.de/29883
- Mini-Server mit OpenWRT: Bernhard Bablok, “Der 1-Watt-Server”, LU 05/2013, S. 83, http://linux-community.de/28787






