Thema : rsync in der Praxis
Zielgruppe: IT-Arbeiter mit fundierten Shell-Kenntnissen
Motivation: Datensicherung im Energiesparmodus
Hinweis : Smartphone auf breite Ansicht drehen
Übersicht
- Bereinigung für Effizienz
- Umfangreiche Kommentierung
- Variablen für Übersicht
- Beispiel-Optionen erklärt in full-wide-Modus
- Absolute Pfade im String
- Relative Pfade in Listen
- Alles ist exclude-from, auch include
- Protokoll mit mehr Infos
- Log-Datei erklärt
- auto-unmount und anschließend power-off mit Bestätigung, hier über Audio
- Optional noch mehr Sicherheit
- Möglichkeiten ohne Ende
Inhaltsverzeichnis
- Übersicht
- Eigenschaften von rsync
- Die Syntax
- Das Script
- Bereinigung
- Befehlskette von rsync
- Liste für exclude
- Log-Datei
- Erweiterte Möglichkeiten
- Bitte
Eigenschaften von rsync
Ökologisch
Ein wesentlicher Grund, mich für rsync
zu entscheiden war, dass es aus meiner Sicht den wenigsten Energiebedarf bei der Datensicherung benötigt. Das wird durch folgende Eigenschaften erreicht.
- Inkrementelle Datensicherung
- Delta-Kodierung
- Auch bei sehr geringer Bandbreite des Netzes, ist es voll funktionstüchtig
- Keine zwingend erforderliche Datenbank
- Paralleles abarbeiten ist möglich
- Wenige weiteren Paketabhängigkeiten, wobei die meisten schon bei einer Linux Standardinstallation vorhanden sind
Einfachheit
- Wenn man
rsync
beherrscht, kann es auf jedem Betriebssystem genutzt werden - Eine Quelle und ein Ziel, gesteuert durch Filter
- Kopieren und synchronisieren von Daten, egal ob Teile einer Datei oder die komplette Datei
- Fehlerfreie Datenübertragung wird durch zwei Prüfsummen garantiert, rollierend und
md5
- Sichere Datenübertragung über das lokale Netz hinaus, wird mit
ssh
realisiert - Mehrere GUI’s sind möglich: BackInTime, DeltaCopy, Grsync, Unison und weitere
Geschwindigkeit
Die hohe Synchronisationsgeschwindigkeit von diesem Script, resultiert aus folgenden Tatsachen.
- Bereinigung vor der Synchronisation
- Inkrementelle Datensicherung
- Delta-Kodierung, kann aber mit
--whole-file
deaktiviert werden - Filterung der Synchronisation
Eine zusätzliche Parallelisierung wäre auch noch möglich. Doch wegen den vielen mechanischen Festplatten, die da noch in den NAS und Servern existieren, zeige ich kein Beispiel, denn diese Optionen könnten Festplatten beschädigen.
Die Syntax
rsync -avz /dev/sda1 /dev/sdc1/
- rsync = Befehl für Datenstrom mit Delta-Encoding
- Option a = Archiv-Modus
- Option v = Ausführliche Informationen
- Option z = Komprimierung der Daten
- /dev/sda1/ = Erster Gerätename ist die Quelle
- /dev/sdc1/ = Zweiter Pfad ist das Ziel
Das Script
Zur Erinnerung, die Shell als Stapelverarbeitung, arbeitet Scripts zeilenweise von oben links nach unten rechts ab.
Das Script, modifiziert, wird in folgender Umgebung von mir eingesetzt.
Betriebssystem___: Arch-Linux mit LTS-Kernel 5.15.* Desktopumgebung__: Xfce 4.16.1 Systemkomponenten: systemd und X11 Hardware_________: Standard-PC mit 16 GB RAM
Test des Scripts
Ein gefahrloser Test, also ein Trockenlauf, ist möglich mit der rsync
Option --dry-run
.
Inhalt des Scripts
#!/bin/sh
# Script Name: e4.sh
# Beschreibung: Inkrementelles Backup auf Gerät e4 = extern mit 4TB
# Aufruf: e4.sh - ohne Parameter
# Autor: Frank Rosenberger - https://ro-kom.de
# Version: 0.2
# Datum: 2022-10-07 - 10:59
# Lizenz: GPL2 - https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# 1. VARIABLEN
# $HOME = Ist Benutzerverzeichnis ABER als sudo|su|root ist es root-home
# $PWD = Derzeitiges Arbeits-Verzeichnis "present working directory"
# $USER = Angemeldeter Benutzer, VORSICHT sudo|su|root ist $USER = root
# $part und $disk müssen nicht identisch sein, bei mehreren Partitionen
label = e4 # Label des Laufwerkes
rl = $HOME/Logs # Verzeichnis für die Log-Dateien
file = rsync-$label # Dateiname der Log-Datei
part = /run/media/$USER/$label # Partition
disk = /dev/disk/by-label/$label # Label des Laufwerkes, hier mal eine ALternative
# 2. BEREINIGUNG
# Optional 1: Vor dem Bereinigen, können jetzt und hier alle unnötigen Prozesse beendet werden, also 'kill', mit einem Zeitpuffer, also 'sleep', von 150 Sekunden, somit werden gebundene temporäre Dateien entlassen zur Bereinigung
# Optional 2: Eine Bleachbit-Log-Datei kann angefordert werden
# Optional 3: Eine Rotation der Bleachbit-Log-Datei wäre ebenfalls möglich
bleachbit --preset --clean # > $rl/e4-bleachbit-log.txt
# 3. LOG-ROTATION
# Rotation der Log-Datei für den rsync-Befehl
# Hier mal eine ausführliche Darstellung für bessere Nachvollziehbarkeit
# count für Anzahl von Log-Dateien -> https://forum.ubuntuusers.de/topic/schreibweisen-fuer-um-eins-erhoehen/
# statt cp ist rm besser für Verzeichnis übergreifend
cp $rl/$file-$USER-6.log $rl/$file-$USER-7.log
cp $rl/$file-$USER-5.log $rl/$file-$USER-6.log
cp $rl/$file-$USER-4.log $rl/$file-$USER-5.log
cp $rl/$file-$USER-3.log $rl/$file-$USER-4.log
cp $rl/$file-$USER-2.log $rl/$file-$USER-3.log
cp $rl/$file-$USER-1.log $rl/$file-$USER-2.log
cp $rl/$file-$USER.txt $rl/$file-$USER-1.log
rm -rf $rl/$file-$USER.txt
# 4. RSYNC-BEFEHLSZEILE
# Die Option --whole-file ist ohne Delta-Kodierung
rsync --archive --delete --force --human-readable --prune-empty-dirs --update --quiet --whole-file --progress --exclude-from="$HOME/rsync-exclude.txt" --info=stats2,symsafe --log-file="$rl/$file-$USER.txt" $HOME/ $part/$USER/rsync --archive --delete --force --human-readable --prune-empty-dirs --update --quiet --whole-file --progress --exclude-from="$HOME/Scripte/bash/rsync-exclude.txt" --info=stats2,symsafe --log-file="$rl/$file-$USER.txt" $HOME/ $part/$USER/
# 5. SHUTDOWN
sleep 5s # Warten auf den Arbeitsspeicher
udisksctl unmount -b $disk # Festplatte aus dem Dateisystem entfernen
sleep 5s # Warten auf Mechanik bei drehenden Festplatten
udisksctl power-off --block-device $(readlink -e $disk| sed 's/[0-9]*$//' ) && ffplay -nodisp -autoexit $HOME/.sound/shutdown.mp3 # Festplatte vom Strom abziehen und nur dann Erfolgsmeldung mit Audiodatei
# 6. OPTIONALE SICHERHEIT
# Optional 4: Prüfsumme der rsync-Log-Datei, mit beispielsweise 'md5'
# Optional 5: Ein Webcam-Foto oder/und eine Bildschirmaufnahme mit 'scrot'
# Optional 6: 'shutdown' des Computers
# 7. EIGENE NOTIZEN
: '
Hier kann nun ein mehrzeiliger Kommentar hinterlassen werden.
Beispielsweise um das Verständnis für dieses Script zu erhöhen.
.
.
So, nun reicht's aber mit der großen optionalen Schokolade :-)
'
Bereinigung
Die Bereinigung des Betriebssystems mit Bleachbit, befördert schon mal alles Unerwünschte aus dem Weg. Bleachbit steht allen Betriebssystem zur Verfügung, zumindest als Quellcode der „nur“ noch kompiliert werden muss. Anderseits kann die Bereinigung auch jeder individuell veranlassen mit seinen Lieblingswerkzeugen.
Befehlskette von rsync
rsync --archive --delete --force --human-readable --prune-empty-dirs --update --quiet --whole-file --progress --exclude-from="$HOME/rsync-exclude.txt" --info=stats2,symsafe --log-file="$HOME/$file-$USER.txt" $HOME/ $part/$USER/
In dieser Zeichenkette habe ich zur besseren Verständlichkeit folgende Dinge getan.
- Optionen in der Langversion
- Umgebungsvariablen in Großbuchstaben, anders auch nicht möglich
- Eigene Variablen in Kleinbuchstaben
- Vorsicht, hier werden die absoluten Pfade genutzt, also ab /
Optionen erklärt
Die Optionen werden vollständig in der man-Page
von rsync
erklärt. Hier der Link zur man rsyc
.
-a, --archive Archivmodus; ist -rlptgoD (kein -H,-A,-X)
--delete Löscht überflüssige Dateien im Ziel
--force Löscht auch nicht leere Verzeichnisse
--human-readable Zahlen in einem menschenlesbaren Format
-m, --prune-empty-dirs Löscht leere Verzeichnisketten
-u, --update Neue Dateien am Ziel überspringen
-v, --verbose Mehr Informationen
-W, --whole-file Dateien ganz kopieren, ohne Delta
--progress Übertragungs-Fortschritt anzeigen
--log-file="LOG-DATEI" LOG-DATEI protokollieren den Vorgang
In Option "-a, --archive" schon enthalten
-r, --rekursive Dies weist rsync an, Verzeichnisse rekursiv zu kopieren
-l, --links kopiert Symlinks als Symlinks
-p, --perms Berechtigungen erhalten
-t, --times behält Änderungszeiten bei
-g, --group Gruppe beibehalten
-o, --owner Eigentümer (erhalten nur Superuser)
-D dasselbe wie --devices --specials
--specials erhält spezielle Dateien
--devices behält Gerätedateien bei (nur Superuser)
Liste für exclude
Meist wird erst durch eine starke Filterung das Wesentliche von den unnötigen Daten getrennt und dadurch die Synchronisationsgeschwindigkeit erhöht.
Der Aufruf einer Liste erfolgt mit der Option --exclude-from
und wenn es einzeln ausgeschlossen werden muss, dann jeweils für ein Verzeichnis und eine Datei jeweils nur --exclude
.
! Eine include-Liste ist nicht notwendig und auch, wenn ich die man-Page richtig verstanden habe, nicht erwünscht. Denn in der Liste der auszuschließenden Verzeichnisse und Dateien, werden auch die zu behaltenden Verzeichnisse und Dateien erfasst.
Beispiel einer exclude-Filterliste. Dateiname hier „rsync-exclude.txt“.
+ /.cache/keepassxc/keepassxc.ini - /.cache - /.local/share/Trash - /Schreibtisch/Test
Wichtig, die Liste darf nur relative Pfade beinhalten!
Das versteckte Verzeichnis .cache wird nicht übertragen, aber die Initialisierungs-Datei von KeePassXC in dem .cache-Verzeichnis wird trotzdem übertragen.
Das Beispiel mit dem Testverzeichnis auf dem Schreibtisch, ist für eine Überprüfung der Funktionalität der Liste. Denn obwohl, wie im .cache-Verzeichnis nur die keepassxc.ini übertragen werden soll, kann es vorkommen, das doch mehr übertragen wird. Zum Beispiel, wenn während der Synchronisation weitergearbeitet wird oder der Webbrowser offen ist. Dann kann in der Zeitdifferenz der Stapelverarbeitung noch das Anlegen von cache-Dateien erfolgen.
Log-Datei
Meiner Meinung nach, reichen 8 Log-Dateien bei einer wöchentliche Datensicherung. Somit werden fast zwei Monate die Log-Dateien vorgehalten. Anders sieht es bei täglicher Datensicherung aus, da sollten mehr Log-Dateien archiviert werden.
Inhalt der Log-Datei
Die Datei ist sinnvoll gekürzt, siehe die einzelnen Punkte am Zeilenanfang.
2022/10/06 22:11:40 [89715] building file list 2022/10/06 22:11:41 [89715] 270537 files to consider 2022/10/06 22:11:42 [89715] >f..t...... .config/bleachbit/bleachbit.ini 2022/10/06 22:11:42 [89715] .d..t...... .config/chromium/Default/ 2022/10/06 22:11:42 [89715] >f..t...... .config/chromium/Default/History 2022/10/06 22:11:42 [89715] >f..t...... .config/chromium/Default/Web Data 2022/10/06 22:11:42 [89715] .d..t...... .config/chromium/Default/databases/ 2022/10/06 22:11:42 [89715] >f..t...... .config/chromium/Default/databases/Databases.db 2022/10/06 22:11:42 [89715] .d..t...... .config/gtk-3.0/ 2022/10/06 22:11:42 [89715] >f..t...... .config/gtk-3.0/bookmarks 2022/10/06 22:11:42 [89715] .d..t...... .config/xfce4/xfconf/xfce-perchannel-xml/ 2022/10/06 22:11:42 [89715] >f.st...... .config/xfce4/xfconf/xfce-perchannel-xml/thunar.xml 2022/10/06 22:11:42 [89715] .d..t...... .local/share/ 2022/10/06 22:11:42 [89715] *deleting .local/share/gvfs-metadata/uuid-xxx.log 2022/10/06 22:11:42 [89715] .d..t...... .local/share/gvfs-metadata/ 2022/10/06 22:11:42 [89715] >f..t...... .local/share/gvfs-metadata/uuid-xxx 2022/10/06 22:11:42 [89715] >f+++++++++ .local/share/gvfs-metadata/uuid-xxx.log 2022/10/06 22:11:42 [89715] .d..t...... .local/state/wireplumber/ 2022/10/06 22:11:42 [89715] >f..t...... .local/state/wireplumber/restore-stream 2022/10/06 22:11:42 [89715] *deleting .mozilla/firefox/xxx . . 2022/10/06 22:11:42 [89715] .d..t...... .thunderbird/xxx . . 2022/10/06 22:11:47 [89715] .d..t...... Logs/ 2022/10/06 22:11:47 [89715] >f.st...... Logs/rsync-e4-user1-1.log 2022/10/06 22:11:47 [89715] >f.st...... Logs/rsync-e4-user1-2.log 2022/10/06 22:11:47 [89715] >f.st...... Logs/rsync-e4-user1-3.log 2022/10/06 22:11:47 [89715] >f.st...... Logs/rsync-e4-user1-4.log 2022/10/06 22:11:47 [89715] >f.st...... Logs/rsync-e4-user1-5.log 2022/10/06 22:11:47 [89715] >f.st...... Logs/rsync-e4-user1-6.log 2022/10/06 22:11:47 [89715] >f.st...... Logs/rsync-e4-user1-7.log 2022/10/06 22:11:47 [89715] >f.st...... Logs/rsync-e4-user1.txt 2022/10/06 22:11:47 [89715] >f..t...... rsync-exclude.txt 2022/10/06 22:11:48 [89715] Number of files: 270.537 (reg: 250.527, dir: 10.811, link: 9.198, special: 1) 2022/10/06 22:11:48 [89715] Number of created files: 2 (reg: 2) 2022/10/06 22:11:48 [89715] Number of deleted files: 2 (reg: 2) 2022/10/06 22:11:48 [89715] Number of regular files transferred: 46 2022/10/06 22:11:48 [89715] Total file size: 605,44G bytes 2022/10/06 22:11:48 [89715] Total transferred file size: 20,15M bytes 2022/10/06 22:11:48 [89715] Literal data: 20,15M bytes 2022/10/06 22:11:48 [89715] Matched data: 0 bytes 2022/10/06 22:11:48 [89715] File list size: 7,93M 2022/10/06 22:11:48 [89715] File list generation time: 0,579 seconds 2022/10/06 22:11:48 [89715] File list transfer time: 0,000 seconds 2022/10/06 22:11:48 [89715] Total bytes sent: 28,12M 2022/10/06 22:11:48 [89715] Total bytes received: 1,27K 2022/10/06 22:11:48 [89715] sent 28,12M bytes received 1,27K bytes 3,31M bytes/sec 2022/10/06 22:11:48 [89715] total size is 605,44G speedup is 21.533,05
Erklärung des Inhaltes
Infos zur Datenübertragung
Hier heißt „unterschiedlich“ zwischen Quelle und Ziel.
> = from source to target, Daten mit Quelle zu Ziel
f = it is a file (d=directory), f ist Datei und d ist Verzeichnis
c = checksum does not match (with -c option), Prüfsumme ist unterschiedlich
s = size is different, Größe ist unterschiedlich
t = timestamp is different, Zeitstempel ist unterschiedlich
p = permissions are different, Berechtigungen sind unterschiedlich
o = owner is different, Benutzer ist unterschiedlich
g = group is different, Gruppe ist unterschiedlich
Protokollierung
Eine Protokoll-Übersicht wird in jedem Fall erstellt. Aber mit der Option --info=stats2,symsafe
wird das Ganze nochmal informativer.
Erweiterte Möglichkeiten
Beispielsweise könnte man eine Aufgabenplanung, in Linux realisiert mit cron
, den Computer veranlassen, das Script ab einen bestimmten Zeitpunkt auszuführen und anschließend herunterzufahren. Eine Alternative zu cron wäre, die Zeitsteuerung mit einem eigenem Script im Autostart oder als Dienst zu übernehmen. Denn cron setzt, in gewisser Weise, eine regelmäßige Computer-Nutzung voraus.
Die Mitarbeiter können also nicht vergessen, ein Backup zu machen und den PC auszuschalten, sie lassen den Computer einfach an. Und am nächsten Werktag, steht beim Start ein gesichertes und bereinigtes System zur Verfügung. Optional kann aber auch ein weiteres Script im Autostart Dinge bereinigen, die am Abend zuvor noch gesperrt waren.
Zusätzlich stehen die Log-Dateien in lesbarer Form jedem Interessiertem zur Verfügung. Natürlich können die Log-Dateien auch mit erhöhten Rechten unzugänglich gemacht werden, um diese nicht zu manipulieren oder gar zu löschen. Sogar eine Prüfsumme der Log-Datei kann zur Sicherheit erstellt werden und das auch noch innerhalb dieses Scripts.
Bitte
Wenn jemand dieses Script nutzt, bitte ich um Rückmeldung bei Fehlern.
Wenn jemand dieses Script modifiziert, bitte ich ebenfalls um Rückmeldung, um es hier für alle anderen Nutzer optimaler anzupassen.
Rückmeldung bitte über Schalter links unten „Ihr Kommentar“, Danke!