rokom-web-rsync

rsync-script

Thema     : rsync in der Praxis
Zielgruppe: IT-Arbeiter mit fundierten Shell-Kennt­­­nissen
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

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!


Ihr Kom­men­tar [Pos1] Sei­ten­an­fang