So erstellen Sie inkrementelle und differenzielle Sicherungen mit tar
Tar (Tape ARchiver) ist eines der nützlichsten Dienstprogramme im Werkzeugkasten eines jeden Linux-Systemadministrators da draußen. Mit tar können wir Archive erstellen, die für verschiedene Zwecke verwendet werden können: zum Beispiel zum Verpacken von Quellcode von Anwendungen oder zum Erstellen und Speichern von Datensicherungen.
In diesem Tutorial konzentrieren wir uns auf das letztere Thema und sehen, wie man vollständige, inkrementelle und differenzielle Backups mit tar und insbesondere mit der GNU-Version von tar erstellt.
In diesem Tutorial lernen Sie:
- Was ist der Unterschied zwischen inkrementellen und differenziellen Sicherungen?
- So erstellen Sie inkrementelle Backups mit tar
- So erstellen Sie differenzielle Backups mit tar
- Wiederherstellen inkrementeller und differenzieller Sicherungen
- So listen Sie den Inhalt eines inkrementellen Archivs auf
Verwendete Softwareanforderungen und Konventionen
Vollständige vs. inkrementelle vs. differenzielle Sicherungen
Bevor wir sehen, wie man tar verwendet, um inkrementelle und differenzielle Sicherungen zu erstellen, ist es wichtig, den Unterschied zwischen diesen Arten von Sicherungen zu verstehen.
Zunächst einmal müssen wir sagen, dass sowohl inkrementelle als auch differentielle Backups letztlich auf Full- oder "Level 0"-Backups basieren: Ein Full-Backup ist ein Backup, das in Form eines anderen den gesamten Inhalt eines bestimmten Dateisystems zu einem bestimmten Zeitpunkt enthält. Das Erstellen vollständiger Backups erfordert möglicherweise viel Zeit und Speicherplatz auf der Festplatte: Dies hängt natürlich von der Größe der Datenquelle ab. Als Lösung für diese Nachteile können inkrementelle und differenzielle Backup-Strategien implementiert werden. Nachdem eine erste vollständige Sicherung erstellt wurde, enthalten die nachfolgenden Sicherungen, inkrementell oder differenziell, nur Änderungen am Dateisystem. Was ist der Unterschied zwischen den beiden?
Inkrementelle und differentielle Backups ähneln sich insofern, als sie, wie bereits erwähnt, letztlich beide auf vollständigen Backups basieren. Was sich zwischen den beiden unterscheidet, ist das, was sie als Grundlage für die Berechnung von Dateisystemunterschieden betrachten. Ein inkrementelles Backup ist immer abhängig und basiert auf dem Backup, das ihm unmittelbar vorausgeht, entweder vollständig oder inkrementell. Bei einer differenziellen Sicherung hingegen wird immer die initiale Vollsicherung als Basis verwendet.
Beispiel für eine inkrementelle Backup-Strategie
Angenommen, wir möchten wöchentliche Sicherungen eines hypothetischen Quellverzeichnisses erstellen, indem wir eine inkrementelle Sicherungsstrategie implementieren. Als erstes würden wir am Montag eine vollständige Sicherung des Quellverzeichnisses erstellen. Am nächsten Tag, Dienstag, erstellten wir eine neue Sicherung, die nur Dateien und Verzeichnisse enthielt, die seit der vollständigen Sicherung im Quellverzeichnis erstellt oder geändert wurden. Das neue Backup verfolgt auch Dateien, die seitdem gelöscht wurden. Es handelt sich um ein sogenanntes "Level 1"-Backup.
Am Mittwoch werden wir ein drittes Backup erstellen, das wiederum alle Unterschiede "im Auge behält", die seit dem Backup, das wir am Dienstag durchgeführt haben, aufgetreten sind. Diese Sicherung hängt daher direkt von der vorherigen und indirekt von der ersten Sicherung ab. Wir würden das Muster für den Rest der Woche wiederholen.
Wenn am Donnerstag eine Katastrophe passieren sollte, z.B. um den Dateisystemstatus wiederherzustellen, den wir am Mittwoch hatten, müssten wir der Reihe nach alle Sicherungen wiederherstellen, die wir seit Montag gemacht haben. Der Verlust eines Backups macht es unmöglich, die nachfolgenden Backups wiederherzustellen.
Beispiel für eine differenzielle Backup-Strategie
Ein erstes, vollständiges Backup ist auch das allererste, was wir tun müssen, wenn wir uns entscheiden, eine Strategie zu implementieren, die auf differenziellen Backups basiert. Die Sicherung der Stufe 0 wird am Montag erstellt, und eine Sicherung, die nur die Unterschiede zwischen ihr und dem aktuellen Status des Quellverzeichnisses enthält, wird am Dienstag erstellt. Bis zu diesem Zeitpunkt gibt es keine Unterschiede zur Strategie der inkrementellen Sicherungen.
Ab dem nächsten Tag ändert sich das. Anstatt am Mittwoch ein Backup zu erstellen, das auf dem vom Vortag basiert, erstellen wir eines, das wiederum auf dem ursprünglichen, vollständigen Backup basiert, das wir am Montag erstellt haben. Wir führen die gleiche Aktion an den folgenden Wochentagen durch.
Wie Sie sehen können, hängt bei einer differenziellen Backup-Strategie jede Sicherung ausschließlich von der anfänglichen vollständigen Sicherung ab, daher benötigen wir zur Wiederherstellung des Status, den das Dateisystem an einem bestimmten Tag hatte, nur die anfängliche vollständige Sicherung und die an diesem Tag durchgeführte Sicherung.
Sobald wir die Unterschiede zwischen den beiden Ansätzen verstanden haben, können wir sehen, wie inkrementelle und differenzielle Backups mit tar durchgeführt werden.
Erstellen inkrementeller Backups
Um inkrementelle Backups mit tar zu erstellen, müssen wir nur zwei Optionen kombinieren: --create und --listed-incremental. Ersteres ist das, was wir verwenden, um anzugeben, ob wir ein Archiv erstellen möchten, letzteres nimmt stattdessen den Pfad einer Snapshot-Datei als Argument: Diese Datei wird von tar verwendet, um Metadaten über den Status des Quelldateisystems zum Zeitpunkt der Sicherung zu speichern. Durch das Lesen kann tar bei nachfolgenden Sicherungen feststellen, welche Dateien geändert, hinzugefügt oder gelöscht wurden, und nur diese speichern. Sehen wir uns ein praktisches Beispiel an.
Angenommen, wir möchten inkrementelle Sicherungen des ~/Document-Verzeichnisses erstellen und es auf einem externen Blockgerät speichern, das auf /mnt/data gemountet ist (hier gehen wir davon aus, dass unser Benutzer Schreibrechte für dieses Verzeichnis hat). In unserem Beispiel enthält das Verzeichnis ~/Document zunächst nur zwei Dateien: one.txt und two.txt. Hier ist der Befehl, den wir ausführen würden, um das Backup zu erstellen:
tar --verbose --create --file=/mnt/data/documents0.tar --listed-incremental=/mnt/data/documents.snar ~/DocumentsSchauen wir uns die Optionen an, die wir oben verwendet haben. Wir haben tar mit der Option --verbose aufgerufen, um die Ausgabe expliziter zu machen, und --create, um anzugeben, was wir tun wollen, ist ein Archiv zu erstellen; Wir haben dann den Pfad, in dem das Archiv erstellt werden soll, als Argument an die Option --file übergeben. Schließlich haben wir mit der Option --listed-incremental tar angewiesen, eine differenzielle Sicherung zu erstellen und die Metadaten des Dateisystems in der Datei /mnt/data/document.snar zu speichern (beachten Sie, dass die Erweiterung .snar willkürlich ist – ist genau das, was für die Konvention verwendet wird). Da dies das erste Mal ist, dass wir den Befehl ausführen, wird eine vollständige Sicherung erstellt. Hier ist die Ausgabe des obigen Befehls:
tar: /home/egdoc/Documents: Directory is new
tar: Removing leading `/' from member names
/home/egdoc/Documents/
/home/egdoc/Documents/one.txt
/home/egdoc/Documents/two.txtDas Archiv und die Snapshot-Datei wurden in /mnt/data erstellt:
ls -l /mnt/data
-rw-r--r--. 1 egdoc egdoc 10240 Apr 16 07:13 documents0.tar
-rw-r--r--. 1 egdoc egdoc 113 Apr 16 07:13 documents.snar
drwx------. 2 root root 16384 Apr 9 23:27 lost+foundNehmen wir nun an, wir hängen eine Zeile an die one.txt Datei im Verzeichnis ~/Documents an:
echo "this is a new line" >> ~/Documents/one.txtZusätzlich erstellen wir eine dritte Datei:
touch ~/Documents/three.txtWir führen tar erneut aus und ändern nur den Namen des Zielarchivs. Es wird ein Backup der Stufe 1 erstellt. Es enthält nur die Datei, die wir geändert haben (one.txt) und die, die wir gerade erstellt haben (three.txt):
tar --create --verbose --file=/mnt/data/documents1.tar --listed-incremental=/mnt/data/documents.snar ~/Documents
tar: Removing leading `/' from member names
/home/egdoc/Documents/
/home/egdoc/Documents/one.txt
/home/egdoc/Documents/three.txtSobald wir den Befehl starten, wird der Inhalt der documents.snar mit Metadaten über den aktuellen Status des Quellverzeichnisses überschrieben.
Um weiterhin inkrementelle Sicherungen durchzuführen, müssen wir nur diesem Muster folgen. Alles, was wir natürlich jedes Mal ändern müssen, ist der Name des Zielarchivs. Jedes neue Archiv enthält nur Änderungen im Quellverzeichnis, die seit der letzten Sicherung vorgenommen wurden.
Erstellen differenzieller Sicherungen
Wie wir gerade gesehen haben, ist das Erstellen inkrementeller Backups mit tar ziemlich einfach. Das Erstellen differenzieller Backups ist genauso einfach: Alles, was wir ändern müssen, ist die Art und Weise, wie wir mit der Snapshot-Datei umgehen. Wie wir bereits erwähnt haben, besteht der Unterschied zwischen differenziellen und inkrementellen Backups darin, dass erstere immer auf vollständigen Backups basieren.
Da jedes Mal, wenn wir tar ausführen, wie im vorherigen Beispiel, der Inhalt der Snapshot-Datei mit Metadateninformationen über den Status des Dateisystems zum Zeitpunkt der Ausgabe des Befehls überschrieben wird, müssen wir eine Kopie der Snapshot-Datei erstellen, die bei der vollständigen Sicherung generiert wurde, und ihren Pfad an --listed-incremental übergeben. so dass das Original unangetastet bleibt.
Beim ersten Mal führen wir den Befehl genau wie oben aus, sodass eine vollständige Sicherung erstellt wird:
tar --verbose --create --file=/mnt/data/documents0.tar --listed-incremental=/mnt/data/documents.snar ~/DocumentsWenn es an der Zeit ist, die erste differenzielle Sicherung zu erstellen, müssen wir eine Kopie der Snapshot-Datei erstellen, die sonst überschrieben würde:
cp /mnt/data/documents.snar /mnt/data/documents.snar-1An dieser Stelle rufen wir tar erneut auf, verweisen aber auf die Kopie des Snapshots:
tar --verbose --create --file /mnt/data/documents0.tar --listed-incremental=/mnt/data/documents.snar-1 ~/DocumentsUm differenzielle Sicherungen zu erstellen, muss dieses Muster jedes Mal wiederholt werden, wenn wir eine neue Sicherung hinzufügen möchten.
Wiederherstellen einer Sicherung
Wie wir vorgehen, wenn wir ein mit tar erstelltes Backup wiederherstellen möchten, hängt davon ab, welche Backup-Strategie wir implementiert haben. In allen Fällen ist das erste, was zu tun ist, die vollständige Sicherung wiederherzustellen, die in diesem Fall /mnt/data/documents0.tar ist. Hier ist der Befehl, den wir ausführen würden:
tar --directory=/ --extract --verbose --file=/mnt/data/documents0.tar --listed-incremental=/dev/nullIn diesem Fall haben wir tar mit der Option --directory aufgerufen, um sicherzustellen, dass tar in das angegebene Verzeichnis verschoben wird, bevor die Extraktion gestartet wird. Wir haben --extract verwendet, um die Extraktion durchzuführen, und --verbose, um im ausführlichen Modus zu laufen, dann haben wir den Pfad des zu extrahierenden Archivs mit --file angegeben. Auch hier haben wir die Option --listed-incremental verwendet und diesmal /dev/null als Argument übergeben. Warum haben wir das getan?
Wenn die Option --listed-incremental zusammen mit --extract verwendet wird, versucht tar eine Wiederherstellung aus dem angegebenen Archiv und löscht alle Dateien im Zielverzeichnis, die nicht im Archiv vorhanden sind. Bei der Wiederherstellung muss der Inhalt der Snapshot-Datei nicht gelesen werden, daher ist es üblich, /dev/null als Argument an die Option zu übergeben.
Hier ist die Ausgabe, die der Befehl in unserem Fall zurückgeben würde:
tar: Deleting ‘home/egdoc/Documents/three.txt’
home/egdoc/Documents/one.txt
home/egdoc/Documents/two.txtIn diesem Fall wurde, wie Sie sehen können, die three.txt Datei, die im Verzeichnis /home/egdoc/Documents vorhanden ist, im Rahmen der Extraktion gelöscht, da die Datei zum Zeitpunkt der Erstellung der Sicherung nicht vorhanden war.
Wenn wir zu diesem Zeitpunkt inkrementelle Sicherungen verwendet haben, um die Situation wiederherzustellen, die an einem bestimmten Tag bestand, müssen wir der Reihe nach alle Sicherungen wiederherstellen, die seit der Erstellung der vollständigen Sicherung erstellt wurden, bis zu der Sicherung, die an diesem bestimmten Tag erstellt wurde. Wenn wir stattdessen differenzielle Sicherungen verwendet haben, müssen wir nur die Sicherung wiederherstellen, die wir an diesem bestimmten Tag erstellt haben, da jede differenzielle Sicherung gegen die ursprüngliche vollständige Sicherung berechnet wird.
Auflisten des Inhalts eines inkrementellen Archivs
Wenn wir nur den Inhalt eines inkrementellen Archivs auflisten möchten, können wir tar zusammen mit der Option --list ausführen und --verbose zweimal wiederholen, zusammen mit --listed-incremental. Hier ist ein Beispiel. Angenommen, wir möchten den Inhalt der ersten Sicherung der Ebene 1 untersuchen, die wir nach der vollständigen Sicherung durchgeführt haben. Hier ist, was wir ausführen würden:
tar --list --verbose --verbose --listed-incremental=/dev/null --file=/mnt/data/documents1.tarIn unserem Fall gibt der Befehl die folgende Ausgabe zurück:
drwxr-xr-x egdoc/egdoc 30 2022-04-16 23:40 home/egdoc/Documents/
Y one.txt
Y three.txt
N two.txt
-rw-r--r-- egdoc/egdoc 19 2022-04-16 23:40 home/egdoc/Documents/one.txt
-rw-r--r-- egdoc/egdoc 0 2022-04-16 23:40 home/egdoc/Documents/three.txtDie Ausgabe zeigt die Liste der Dateien an, die zum Zeitpunkt der Erstellung des Archivs im Quellverzeichnis vorhanden waren. Wenn dem Namen der Datei ein Y vorangestellt ist, bedeutet dies, dass die Datei tatsächlich im Archiv enthalten ist, wenn ihr ein N vorangestellt ist, ist dies nicht der Fall. Wenn dem Namen der Datei ein D vorangestellt ist, bedeutet dies, dass sie im Archiv enthalten ist, es sich aber tatsächlich um ein Verzeichnis handelt.
In diesem Fall waren die one.txt, two.txt und three.txt vorhanden, als das Archiv erstellt wurde, jedoch werden nur one.txt und three.txt mit einem Y versehen und tatsächlich in das Archiv aufgenommen, da sie die einzigen waren, die sich seit der letzten Sicherung geändert haben (im Beispiel haben wir eine Zeile an die erste angehängt und die zweite nach der vollständigen Sicherung erstellt).
Abschließende Gedanken
In diesem Tutorial haben wir gelernt, was der Unterschied zwischen vollständigen, inkrementellen und differenziellen Sicherungen ist und wie diese Sicherungsstrategien mit tar implementiert werden. Wir haben gesehen, wie man die Backups erstellt, wie man sie wiederherstellt und wie man den Inhalt eines inkrementellen Archivs auflistet.
