Nachdem mir mein eigens geschriebenes Perl-Script (Code am Ende) zum Kopieren meiner wichtigsten Daten etwas langsam erscheint und vor allem den gewaltigen Nachteil hat, dass es nur kopiert, die Daten aber nicht auf Existenz prüft, versuche ich mich an rsync.
Das Script funktioniert nun folgendermaßen:
- es muss mit root-Rechten gestartet werden
- es muss eine Option -t ziel übergeben werden, wo das Backupverzeichnis später liegen soll
- es kann eine Option -f übergeben werden, was durch den Einsatz von rsync allerdings überflüssig geworden ist, da mit dieser Option ein bereits bestehendes Backupverzeichnis gelöscht werden sollte, falls sich das mal zugemüllt haben sollte
- es kann ein eigener Name für das Backup vergeben werden, per Default heißt es backup. Es kann auch das aktuelle Datum ausgewählt werden. Zur Hilfe zeigt das Script die vorhandenen Ordner im ziel an.
- im Script werden zwei Arrays in der Subroutine Kopiere_dateien definiert:
- @config_files
- hier sollen die Konfigurationsdateien eingetragen werden
- @backup_files
- hier können alle anderen Dateien und Ordner, die zu sichern sind, eingetragen werden
- @config_files
- falls im ziel keine Unterordner vorhanden sind, geht das Script davon aus, dass es sich um ein nicht eingehangenes USB-Medium handlest und fragt nach, ob es es mounten soll
- am Ende zeigt es die benötigte Zeit an
rsync
Auf den ersten Blick scheint das Tool alles zu können, was ich für meine Zwecke benötige:
- Kopieren von Unterverzeichnissen
- Beibehalten von Rechten
- Beibehalten des Besitzers
- ausschließliches Backup geänderter Daten
Außerdem bietet das Tool auch ein grafisches Backend, welches ich eigentlich nich nutzen will. Stattdessen will ich versuchen, rsync in das schon bestehende Perl-Script einzubinden.
Wie ich gerade herausfinde, gibts auch ein CPAN-Modul, namens File::Rsync, allerdinsg müsste das erst installiert werden. Somit ist das Programm nicht auf jedem Ubuntu-Rechner mit Defaultinstallation benutzbar.
Ich werde rsync mit folgenden Parametern starten:
- -a; das ist ein Art Metaparameter, der den Archivmodus aktiviert
- -r = rekursiv
- -l = kopiert symbolische Links als symbolische Links
- -p = bewahrt Rechte
- -t = bewahrt Zeiten
- -g = bewahrt Gruppen
- -o = bewahrt den Besitzer, nur wenn rsync mit root-Rechten gestartet wurde
- -D = bewahrt Gerätedateien, nur wenn rsync mit root-Rechten gestartet wurde
- -v = verbose; ich will ja sehen, was gerade passiert
- –delete = löscht die Dateien im Zielverzeichnis, die auch im Quellverzeichnis gelöscht wurden (quasi die Funktion, die Stein des Anstoßes war)
Da rsync nur die Daten kopieren kann, auf die der aufrufende Benutzer zugreifen darf, werde ich das Programm nur mit root-Rechten starten.
Langes Schreiben und Lesen, kurze Änderung im Script:
Den Systemaufruf zum Kopieren ersetze ich durch
- rsync -av –delete
Ich werde später noch Verbesserungen am Programm vornehmen, die mir auch mit Hilfe von Parametern erlauben werden, ein Backup auf entfernte Rechner zu tätigen und auch die Daten aus einem Konfigurationsfile auszulesen. Darüber werde ich dann später berichten.
Jetzt habe ich das Script nach einigen Tests angestoßen und werde es durchlaufen lassen. Das kann bei der Datenmenge noch eine Weile dauern…
…einige Zeit später
Habe gerade festgestellt, dass ich Stunden meines Lebens fast unnütz mit Warten verbracht habe. Da ich in der rsync-Schleife einige “/” am Ende zuviel hatte, hat rsync die neu zu kopierenden Ordner mit den bereits kopierten verglichen und immer wieder gelöscht. Zum Schluss hatte ich dann nur noch den Inhalt des letztens Ordners, der im Sicherungsarray stand.
Versuch macht kluch
Dafür hab ich noch schnell die Abfrage ob root oder nicht eingebaut und einige kleine Fehler ausgemerzt.
Und weiter gehts…
…40 min später
einige Testläufe verliefen hervorragend, so dass ich das Script natürlich in abgeänderter Form als Cronjob einsetze.
Zusammenfassung
rsync ist echt einfach, hätte mich gleich am Anfang damit befassen sollen.


