Datensicherung


© August 2020, Letzte Änd. 03.04.22

Übersicht

Daten-Integrität

Die Daten-Integrität gehört zur Datensicherung,
denn es macht keinen Sinn sich Müll zu sichern.
Nur beschreiben möchte ich es an dieser Stelle nicht,
denn primär   Checksummen   oder Hash-Werte ermöglichen es,
festzustellen, ob Inhalte nicht über die Zeit mutiert sind.

Einfaches kopieren via scp

Um mal eben schnell einen Ordner von einen Fremdrechner zu kopieren,
kann  scp  analog zu  cp  verwendet werden.
Voraussetzung ist, dass   ssh   eingerichtet ist.
Also die Übertragung ist dadurch gesichert und verschlüsselt.
Anbei ein konkretes Beispiel wo der Ordner Steuer
und deren Inhalt  -r  rekursiv kopiert wird:

scp -r a1@ab1.fritz.box:/mnt/sda4/a/VBoxShare/Win7/Steuer  /home/a1/Downloads/

Bei  scp  gibt es die Möglichkeit um von remote zu remote zu kopieren.

Die allgemeine Notation der wichtigsten Optionen:

scp [-BClrvqpP] … [usera@hosta:]filea [userb@hostb:]fileb

Option Beschreibung
-B wie Batch (keine Interaktion möglich)
-C wie Compressed
-l 100 Limit der Bandbreite
z.B. auf 100 Kbits/s
-r wie rekursiv, kopiert Unterverzeichnisse
-v verbose, gesprächiger
-q quit der Fortschrittsanzeige
-p preserve der Zeit und Mode
-P 22 Port 22 ist der Default Port,
kann aber ggf. geändert werden.

Zum Anfang

rsync

Professioneller kann man zum Kopieren
oder Synchronisieren ganzer Ordner über das Netz rsync verwenden.
Die Variante über einen rsync daemon, ist noch einen Tick schneller,
aber betrachte ich hier nicht.

Entweder Start oder Ziel müssen allerding lokal sein.
Von remote zu remote funktioniert laut man-page  man rsync  leider nicht.
Dafür ist  rsync  im Gegensatz zu  scp  effizienter beim Kopieren.
Falls die Dateien bereits vorhanden sind,
werden lediglich die unterschiedlichen Passagen kopiert.
Verschlüsselung und Fortsetzung nach Verbindungsabrüchen
kann  rsync  ebenso.

Der allgemeine Aufruf lautet:

rsync [optionen] source [destination]

Entweder  "source"  oder  "destination"  können extern sein.
z.B. [benutzer]@host:/pfad/   wichtig ist hier der letzte Slash "/"

Die wichtigsten Optionen habe ich hier raus geschrieben.
Meist führen die Anfangs-Buchstaben zur englischen Bezeichnung.

Option Beschreibung -a
-a archvieren,
enthält -rlptgoD
 -r recursiv,
kopiert Unterverzeichnisse mit
 -l symbolische Links werden kopiert
 -p preserve permission,
behält Rechte der Quelldatei bei
 -t preserve mod. times,
behält Zeitstempel der Quelldatei bei
 -g preserve group,
behält Gruppenrechte bei
 -o preserve owner   (nur als root),
Name:Gruppe der Quelldatei beibehalten
 -D preserve device files (root only),
Geräte beibehalten z.B. /dev/sda3

Option Datei-Optionen
-u do not overwrite new with old
überschreibt im Ziel nur ältere,
aber nicht neuere Dateien.
--ignore-existing überschreibt keine exitierenden Dateien,
auch wenn sie älter als die Quell-Datei sind.
--exclude= z.B. --exclude=Downloads/*
aus der Quelle wird Downloads ausgelassen
--exclude-from= z.B. --exclude-from=excl.txt
In  excl.txt  steht was ausgelassen wird.
--delete löscht im Ziel,
was in der Quelle nicht mehr vorkommt
-b Backup erstellen, von dem,
was mit  --delete  erfasst wird.
Umleitung via Zusatzparameter  --backup-dir=
--link-dest= Sind im äteren Backup bereits aktuelle Quelldateien vorhanden,
wird lediglich ein Hardlink ins Ziel geschrieben.
z.B.  --link-dest=BackupAlt
--remove-source-files wie  mv 
Quelle wird gelöscht
-z zip oder compress,
meist Sinnvoll bei Übertragung übers Netzwerk
--bwlimit reduziert die Bandbreite auf ein definiertes Maß
z.B. 100 kbps   --bwlimit=100
-c verwendet eine Checksumme,
statt statt Dateigrösse & Zeitstempel
Diese Option benötigt wesentlich mehr Zeit.
--iconv local,remote Konvertierung z.B. NFTS → EXT4 wg. Umlaute
z.B. für Windows ISO-8859-1
--ivonv=UTF-8,CP1252
NTFS verwendet Unicode UTF-16,
FAT verwendet Code Page 437
wird normalerweise via mounten erledigt.

Option Anzeige-Optionen & div.
-v verbose,
gesprächiger - zeigt alle Arbeitsschritte an
--stats zeigt einen Report am Ende an
-P enthält Fortschrittsanzeige   --progress
und ermöglicht Fortsetzung bei Abbruch   --partial
--progress eine Fortschrittsanzeige in der Form
… (xfr#185, ir-chk=1617/1803)
Hier: 185 fertige Dateien, 1617 noch offene, von 1803
1617/1803 kann sich im Laufe der Zeit noch vergrößern...
--partial behalte teilweise übertragene Dateien
im Falle eines Verbindungsabruches
-C auto-ignore files in the same way CVS does
-e remote shell auswählen z.B. ssh
verschlüsselte Übertragung

Es gibt noch weitaus mehr Optionen, aber das sind zumindest die wichtigsten.
Zumindest bei Debian ist es standardmäßig nicht installiert, was schnell nachgeholt werden kann.

su                                               rsync sollte sowohl auf dem Host
apt install rsync                                alsauch auf dem Client installiert sein

Zum Anfang

Lokalen Ordner auf eine externe Platte sichern

Da es nicht unbedingt sinnvoll ist sein Backup im gleichen Gebäude zu haben,
sichere ich ab und an (leider zu selten - alle paar Monate),
die wichtigsten selbst erstellten Daten auf eine, via USB angeschlossene, externe Platte.
Da der Vorgang länger dauert, verwende ich  rsync -Pa.
Vor der Kopier-Aktion suche ich mit  fdisk  meine Ziel-Partition.
Dann mounte ich die Ziel-Partition via Thunar oder wie folgt.
Bereits beschrieben habe ich weitere Mount-Möglichkeiten.

su
/usr/sbin/fdisk -l
Disk /dev/sdb: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Device     Boot    Start        End    Sectors  Size Id Type
/dev/sdb1  *        2048   25188351   25186304   12G 83 Linux
/dev/sdb2       25192446 3907022847 3881830402  1.8T  5 Extended
/dev/sdb5       25192448 3907022847 3881830400  1.8T 83 Linux

cd /mnt
mkdir temp
mount -t auto /dev/sdb5 temp

rsync -Pa /home/a1 /mnt/temp/
rsync -Pa /mnt/sda3/a0 /mnt/temp/

cd temp
mv a1 a1_2021-12-25
mv a0 a0_2021-12-25

In diesem Beispiel sind alle Pfade absolut, relative Pfade sind aber ebenso möglich.

Bei der nächsten Sicherung auf eine externe Platte verwende ich eine zweite.
Und beim folgenden Mal überschreibe ich vollständig wieder die erste.
Das entspricht zwar nicht ganz der 3-2-1 Regel, betrachte ich aber als ausreichend.

Zum Anfang

Ordner von einem auf einen anderen Rechner kopieren

Im ersten Fall kopiere ich unter den jeweiligen Benutzern  a1 und b1
die entsprechenden Home-Verzeichnisse in einen temporären Ordner des neuen Rechners.
Dies ist z.B. Voraussetzung für einen Umzug auf einen neuen Rechner.
Also zwei Verzeichnisse   /home/a1 und /home/b1 werden von einem Fremdrecher kopiert.

Auch bei einer Rücksicherung würde ich ähnlich vorgehen.
Also erst einmal in einen temporären Ordner rücksichern und dann
die benögten Ordner verschieben oder kopieren.

su b1
rsync -avze ssh b1@ab1.fritz.box:/home/b1 /home/b1/b1_alt
...
sent 634,872 bytes  received 13,015,667,422 bytes  2,737,104.89 bytes/sec
total size is 27,130,082,588  speedup is 2.08

Da der Slash / am Ende der Quell-Datei vergessen wurde, wird folgendes erzeugt:
 /home/b1/b1_alt/b1/Inhalt_von_b1

su a1
rsync -avze ssh a1@ab1.fritz.box:/home/a1/ /home/a1/a1_alt

Ein Slash am Ende der Quell-Datei erzeugt folgendes   /home/a1/a1_alt/Inhalt_von_a1,
was wohl eher erwünscht ist.

Im zweiten Fall kopiere ich von einer auf dem Remote-Rechner gemounteten Platte.
Mit den folgenden Zeilen werden vom Fremdrecher die vier Verzeichnisse
/mnt/sda4/a, /mnt/sda4/b, /mnt/sda4/ISO und /mnt/sda4/_temp2 kopiert.

Da der folgende Vorgang länger dauert, habe ich bzgl. Verbindungsabbrüchen vorgesorgt.
Des weiteren wird über den Fortschritt informiert.

su b1
rsync --progress -avze ssh b1@ab1.fritz.box:/mnt/sda4/b/ /mnt/sda3/b0/b_alt

su a1
rsync --progress -avze ssh a1@ab1.fritz.box:/mnt/sda4/a/ /mnt/sda3/a0/a_alt
rsync -Pacvze ssh a1@ab1.fritz.box:/mnt/sda4/ISO/       /mnt/sda3/a0/ISO_alt
rsync -Pavze ssh a1@ab1.fritz.box:/mnt/sda4/_temp2/    /mnt/sda3/a0/_temp2

Auch wenn hier nur kopiert wurde, so ist rsync
dem klassischen Kopieren via scp überlegen und sollte daher bevorzugt werden.

Zum Anfang

Ordner von einem auf einen anderen Rechner verschieben

Mit entsprechender Option lassen sich auch Daten verschieben.

rsync -acvze ssh --stats --remove-source-files ~/passwortliste2022-04-01.txt m@gj2.fritz.box:~/.ssh/
Enter passphrase for key '/home/a1/.ssh/id_rsa': 
bash: rsync: command not found
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(235) [sender=3.1.3]

Da ich versäumt habe auf dem remote-System rsync zu installieren, gibt es eine Fehlermeldung.
Entscheidend ist, das bei Nicht-Erfolg, die Daten-Quelle nicht gelöscht wird.
Nachdem ich rsync installiert habe, funktioniert es.

rsync -acvze ssh --stats --remove-source-files ~/passwortliste2022-04-01.txt m@gj2.fritz.box:~/.ssh/ 
Enter passphrase for key '/home/a1/.ssh/id_rsa': 
sending incremental file list
passwortliste2022-04-01.txt

Number of files: 1 (reg: 1)
Number of created files: 0
Number of deleted files: 0
Number of regular files transferred: 1
Total file size: 111 bytes
Total transferred file size: 111 bytes
Literal data: 111 bytes
Matched data: 0 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 202
Total bytes received: 43

sent 202 bytes  received 43 bytes  28.82 bytes/sec
total size is 111  speedup is 0.45

Gefährlich ist rsync in dem Sinne,
dass ohne Warnung die bereits vorhandene Ziel-Datei überschrieben wurde.

Quellen

linuxfocus.org   Rsync: Das beste Backupsystem
shellbefehle.de   rsync — remote (und local) file-copying tool
ubuntuusers.de   rsync
ctaas.de   rsync Backup Script
die.net   rsync(1) - Linux man page
samba.org   rsync
linuxhandbook.com   Practical Examples of rsync Command in Linux

Zum Anfang

incremental Backup mit rsync

Um das Backup zu vereinfachen, habe ich mir ein paar Scripte geschrieben.
Die Scripte befindet sich auf dem Backup Rechner und könnten via  cron  gestartet werden.
Da es möglichst automatisiert laufen sollte, ist ein Zugriff via   ssh & Public-key   sinnvoll.

#!/bin/sh

# backup funktion definieren
backup () 
{  #  rsync -avze ... 25.11.19 v gelöscht
   #  rsync -PSaHAXxze ssh --exclude-from=exclude.txt --log-file=rsync.log --delete --link…
   #  ZIEL_0        ob nun a.0 oder a.0/  	Ergebnis landet in   .../a.0/a/...
   #  ZIEL_1        ob nun a.1 oder a.1/  	ist egal!
   #  QUELLE        ok ist   /home/hd1/a  	nicht ok ist   /home/hd1/a/

   DATUM=`date "+%F %T"`
   echo  "\n $DATUM --- Start $ZIEL_1 "
   echo  "\n $DATUM --- Start $ZIEL_1 " >> "$LOGFILE"   # logfile  anhängen

   rsync -aze ssh --exclude-from="$EXCLUSE" --delete --link-dest="$ZIEL_1" 
     "$QUELLE" "$ZIEL_0" >> "$LOGFILE" 2>&1

   if [ $? = 0 ] 
   then
      rm -rf "$ZIEL_4"
      mv "$ZIEL_3" "$ZIEL_4"
      mv "$ZIEL_2" "$ZIEL_3"
      mv "$ZIEL_1" "$ZIEL_2"
      mv "$ZIEL_0" "$ZIEL_1"

      DATUM=`date "+%F %T"`
      echo "\n $DATUM --- Ende  $ZIEL_1 \n ---------"
      echo "\n $DATUM --- Ende  $ZIEL_1 \n ---------" >> "$LOGFILE"
   else
      DATUM=`date "+%F %T"`
      echo "\n $DATUM --- Fehler  $ZIEL_0 \n ---------"
      echo "\n $DATUM --- Fehler  $ZIEL_0 \n ---------" >> "$LOGFILE"
   fi
}

# -----------------------------------------------------------------

cd /home/m/backup
EXCLUSE=/home/m/backup/exclude.txt  #
touch $EXCLUSE                      # falls fehlt, anlegen

LOGFILE=/home/m/backup/rsync.log    #

# ohne / abschließen
  QUELLE=a1@b41:/mnt/sda3/a0        
# QUELLE=a1@b41:/home/a1     
# QUELLE=b1@b41.fritz.box:/mnt/sda3/b0
# QUELLE=b1@b41.fritz.box:/home/b1
# QUELLE=a1@b41.fritz.box:/mnt/sda3/ISO

Ziel=/home/m/backup/a0.             # 

ZIEL_0=/home/m/backup/a0.0          # a1.0  b0.0  b1.0  is0.0
ZIEL_1=/home/m/backup/a0.1          # a1.1
ZIEL_2=/home/m/backup/a0.2          # a1.2
ZIEL_3=/home/m/backup/a0.3          # a1.3
ZIEL_4=/home/m/backup/a0.4          # a1.4

backup

Vorgehensweise

Zunächst definiere ich ein paar Pfade.
Wobei meine externe  Quelle , ein remote erreichbarer Rechner, ist.
Alle übrigen Ziele, Logfile, exclude.txt etc. liegen lokal auf dem Backup-Rechner.
Wie man am Ziel_0..4 erkennen kann, heißt das aktuellste Backup  ZIEL_0  und das älteste  ZIEL_4 .
In der Datei  exclude.txt  steht zur Zeit nicht viel.
Möglich sind reguläre Ausdrücke.

- .local/share/Trash
- .cache

Nach den Pfad-Definitionen rufe ich innerhalb des Skriptes die Funktion  backup()  auf.
Hier schreibe ich zunächst ins Logfile meine Start-Zeit.

Danach rufe ich den  rsync-Befehl auf, welcher ein inkrementelles Backup erzeugt.
Beim inkrementellen Backup wird in  Ziel_1  zunächst geguckt ob der Inhalt bereits vorhanden ist.
Existiert der Inhalt bereits, wird in  Ziel_0  ein symbolscher Link auf einen sog. Inode gesetzt.
Existiert der Inhalt noch nicht oder wurde geändert oder verschoben, wird eine neue Datei erzeugt.
Die Inhalte aller nicht veränderten Dateien liegen also nur einmal im Backupsystem und verbrauchen nicht unnötig Platz.

Sollte es mit den  sync  Probleme geben, wird das zum Einen in die Logdatei geschrieben
und zum Anderen wird das Script nicht fortgesetzt.
Das bedeutet, ein wiederholter Aufruf des Skriptes, setzt den Vorgang mit  ZIEL_0  fort,
bis erfolgreich alle Daten gespeichert wurden.
Erst danach wird das letzte Backup gelöscht und die Namen der Backups geändert.
ZIEL_0 > ZIEL_1 > ZIEL_2 > ZIEL_3 > ZIEL_4

Anbei ein Auszug der Logdatei.

 ---------

 2022-03-22 08:40:08 --- Start /home/m/backup/a0.1 
Warning: Permanently added the ECDSA host key for IP address '2a01:c13:…' to the list of known hosts.

 2022-03-22 08:46:11 --- Start /home/m/backup/a1.1 

 2022-03-22 08:48:15 --- Ende  /home/m/backup/a1.1 
 ---------

 2022-03-22 08:50:18 --- Start /home/m/backup/b1.1 

 2022-03-22 08:51:20 --- Ende  /home/m/backup/b1.1 
 ---------

 2022-03-22 08:52:06 --- Start /home/m/backup/b0.1 

 2022-03-22 09:13:26 --- Ende  /home/m/backup/b0.1 
 ---------

 2022-03-22 10:37:11 --- Ende  /home/m/backup/a0.1 
 --------- 

Man kann hoffentlich gut erkennen das das erste Skript erst fertig wurde,
nachdem 3 weitere Skripte bereits durchgelaufen waren.

Um die Backup-Scripte nicht immer händisch starten zu müssen,
kann man sie sich via  cron -Befehl regelmäßig automatisch starten.

Zum Anfang

BackupPC

BackupPC könnte interessant sein, wenn auch Windows-Rechner gesichert werden sollen.
Die Installation über z.B. Synaptic erfolgt auf dem Rechner, wohin gesichert werden soll.
Über das CLI ist folgendes einzugeben.

apt-get install backuppc
apt-get install par2                   Datei Überprüfung und Reparatur
apt-get install cifs-utils             SMB/CIFS Protokoll 

Nun wird zunächst alles gestoppt um die Konfiguration richtig zu setzen.

su
/etc/init.d/backuppc stop 
/etc/init.d/backuppc start

BackupPC kann mit seiner Web-Oberfläche verwaltet werden:
Meist funktioniert das bereits über den Namen der unverschlüsselten Seite.

Dafür wurde ein Benutzer namens »backuppc« mit z.B. »JUCJxuPS« als Passwort eingerichtet.
Sie können dieses Passwort durch das Kommando  htpasswd /etc/backuppc/htpasswd backuppc  ändern.

su
htpasswd /etc/backuppc/htpasswd backuppc
New password: 
Re-type new password: 
Updating password for user backuppc

Die Sicherung auf dem Host geschieht auf  /var/lib/backuppc.
Daher ist es sinnvoll den Ordner zu verschieben und eine Verküpfung einzurichten.
Alternativ wird ein LVM empfohlen, was ich allerdings nicht mache.

su
/home/hd2/backuppc
cp -a /var/lib/backuppc/* /home/hd2/backuppc
mv /var/lib/backuppc /var/lib/backuppc_old	oder	rm -rf /var/lib/backuppc

mkdir /var/lib/backuppc
ln -s /home/hd2/backuppc/ /var/lib/packuppc

Die Hauptkonfiguration befindet sich in  /etc/backuppc/config.pl.
Zu guter Letzt, muß der zuvor gestoppte Service wieder gestartet werden.

/etc/init.d/backuppc restart

Quellen

howtoforge.de   Sichern von Linux und Windows Systemen mit BackupPC
pro-linux.de   BackupPC als Backupserver im Heimnetzwerk
digitalocean.com   How To Use BackupPC to Create a Backup Server on an Ubuntu 12.04 VPS
kifarunix.com   Install and Configure BackupPC on Debian 10

Zum Anfang

FreeFileSync, UrBackup, etc.

FreeFileSync wäre eine graphische Alternative, welche auf verschiedenen Plattformen wie
Windows, Linux und MAC läuft.

freefilesync.org   FreeFileSync - Open Source File Synchronization

UrBackup

UrBackup wäre ebenso eine graphische Alternative, welche auf verschiedenen Plattformen Läuft.
UrBackup ist primär für Windows ausgelegt, kann aber auch auf Linux verwendet werden.

urbackup.org   UrBackup is an Open Source client/server backup
krausens-online.de   UrBackup: Sicherung über das Internet

Back In Time

heise.de   Linux-Backup anlegen - so klappt's - Back In Time
  Es ist gedacht es lokal zu benutzen auf Gnome oder KDE, läuft aber auch mit z.B. Xfce zusammen.

Weitere Quellen

cis.upenn.edu   Unison File Synchronizer
linuxandubuntu.com   Best Linux Backup Software For Desktops And Servers [2022]
  Timeshift (For desktops),   Cloudberry (For desktops & enterprise servers) $29.99,
  Bacula (For enterprise),   Rsync (For desktops & servers)
sourceforge.net   luckyBackup
opbyte.it   Grsync
ctaas.de   ntfs_backup
giga.de   Timeshift und Grsync

Zum Anfang