Der Name tar
ist in den meisten Fällen die Abkürzung für Tape archive. Die fraglichen „Bänder“ wären all jene magnetischen Speicherlaufwerke, die den ganzen Weg zurück in den 1950er Jahren populär waren.
Das deutet darauf hin, dass das tar
Werkzeug ein bisschen alt sein könnte und seine Blütezeit hinter sich hat. Aber die Wahrheit ist, dass tar
in all den Jahren und durch all die seismischen Veränderungen in der IT-Welt nichts von seiner Kraft und seinem Wert verloren hat.
In diesem Artikel, der auf Inhalten aus meinem Linux in Action-Buch basiert, zeige ich Ihnen die Grundlagen der Erstellung, Komprimierung und Wiederherstellung von TAR-Archiven. Fangen wir am Anfang an.
Dieses Beispiel nimmt alle Dateien und Verzeichnisse innerhalb und unterhalb des aktuellen Arbeitsverzeichnisses und erstellt eine Archivdatei, die ich geschickt archivename.tar
benannt habe.
Hier verwende ich drei Argumente nach dem Befehl tar:
- Das
c
weist tar an, ein neues Archiv zu erstellen, -
v
setzt die Bildschirmausgabe auf ausführlich, damit ich Updates erhalte, und -
f
zeigt auf den Dateinamen, den ich dem Archiv geben möchte.
Das *
weist tar
an, alle Dateien und lokalen Verzeichnisse rekursiv einzuschließen.
$ tar cvf archivename.tar *file1file2file3directory1directory1/morestuffdirectory1/morestuff/file100directory1/morestuff/file101
Der Befehl tar verschiebt oder löscht niemals die ursprünglichen Verzeichnisse und Dateien, die Sie ihm zuführen – er erstellt nur archivierte Kopien.
Sie sollten auch beachten, dass mit einem Punkt (.) anstelle eines Sternchens (*) im vorherigen Befehl würden sogar versteckte Dateien (deren Dateinamen mit einem Punkt beginnen) in das Archiv aufgenommen.
Wenn Sie auf Ihrem eigenen Computer folgen (wie Sie es auf jeden Fall tun sollten), sehen Sie eine neue Datei namens archivename.Teer. Der .die Dateinamenerweiterung tar ist nicht erforderlich, aber es ist immer eine gute Idee, den Zweck einer Datei auf so viele Arten wie möglich klar zu kommunizieren.
Das Extrahieren Ihres Archivs, um die Dateien wiederherzustellen, ist einfach: Verwenden Sie einfach xvf
anstelle von cvf
. Dadurch werden im Beispiel neue Kopien der ursprünglichen Dateien und Verzeichnisse am aktuellen Speicherort gespeichert.
$ tar xvf archivename.tarfile1file2file3directory1directory1/morestuffdirectory1/morestuff/file100directory1/morestuff/file101
Natürlich können Sie Ihre extrahierten Dateien auch mit dem Argument -C
an einen anderen Ort senden lassen, gefolgt vom Zielort:
$ tar xvf archivename.tar -C /home/mydata/oldfiles/
Sie möchten nicht immer alle Dateien in einen Verzeichnisbaum in Ihrem Archiv aufnehmen.
Angenommen, Sie haben einige Videos produziert, aber sie werden derzeit zusammen mit allen Arten von Grafik-, Audio- und Textdateien (die Ihre Notizen enthalten) in Verzeichnissen gespeichert. Die einzigen Dateien, die Sie sichern müssen, sind die endgültigen Videoclips mit der Dateinamenerweiterung .mp4.
Hier ist, wie das geht:
$ tar cvf archivename.tar *.mp4
Das ist großartig. Aber diese Videodateien sind enorm. Wäre es nicht schön, das Archiv durch Komprimierung etwas kleiner zu machen?
Sag nicht mehr! Führen Sie einfach den vorherigen Befehl mit dem Argument z
(zip) aus. Dadurch wird das gzip-Programm angewiesen, das Archiv zu komprimieren.
Wenn Sie der Konvention folgen möchten, können Sie zusätzlich zu der bereits vorhandenen .tar
eine .gz
-Erweiterung hinzufügen. Denken Sie daran: Klarheit.
So würde sich das abspielen:
$ tar czvf archivename.tar.gz *.mp4
Wenn Sie dies mit Ihren eigenen .mp4-Dateien ausprobieren und dann ls -l in dem Verzeichnis ausführen, das die neuen Archive enthält, werden Sie möglicherweise feststellen, dass die .tar.gz
-Datei nicht viel kleiner ist als die .tar
-Datei vielleicht 10% oder so. Was soll das?
Nun, das .mp4
Dateiformat ist selbst komprimiert, so dass es viel weniger Platz für gzip gibt, um seine Sachen zu machen.
Da tar sich seiner Linux-Umgebung voll bewusst ist, können Sie damit Dateien und Verzeichnisse auswählen, die sich außerhalb Ihres aktuellen Arbeitsverzeichnisses befinden. In diesem Beispiel werden alle .mp4
-Dateien im /home/myuser/Videos/
-Verzeichnis hinzugefügt:
$ tar czvf archivename.tar.gz /home/myuser/Videos/*.mp4
Da Archivdateien groß werden können, kann es manchmal sinnvoll sein, sie in mehrere kleinere Dateien aufzuteilen, sie in ihr neues Zuhause zu übertragen und dann die Originaldatei am anderen Ende neu zu erstellen. Das Split-Tool ist für diesen Zweck gemacht.
In diesem Beispiel weist -b
Linux an, den Archivnamen aufzuteilen.Teer.gz-Datei in 1 GB große Teile. Die Operation benennt dann jedes der Teile -Archivname.Teer.gz.partaa, Archivname.Teer.gz.partab, Archivname.Teer.gz.partac, und so weiter:
$ split -b 1G archivename.tar.gz "archivename.tar.gz.part"
Auf der anderen Seite erstellen Sie das Archiv neu, indem Sie die einzelnen Teile nacheinander lesen (cat archivename.Teer.gz.teil*), dann leiten Sie die Ausgabe in eine neue Datei namens archivename .Teer.gz:
$ cat archivename.tar.gz.part* > archivename.tar.gz
Streaming-Dateisystemarchive
Hier beginnt das gute Zeug. Ich zeige Ihnen, wie Sie ein Archiv-Image einer funktionierenden Linux-Installation erstellen und an einen Remote—Speicherort streamen – alles mit einem einzigen Befehl. Hier ist der Befehl:
# tar czvf - --one-file-system / /usr /var \ --exclude=/home/andy/ | ssh [email protected] \ "cat > /home/username/workstation-backup-Apr-10.tar.gz"
Anstatt zu versuchen, all das sofort zu erklären, werde ich kleinere Beispiele verwenden, um es Stück für Stück zu erkunden.
Erstellen wir ein Archiv des Inhalts eines Verzeichnisses namens importantstuff, das mit wirklich wichtigen Dingen gefüllt ist:
$ tar czvf - importantstuff/ | ssh [email protected] "cat > /home/username/myfiles.tar.gz"importantstuff/filename1importantstuff/[email protected]'s password:
Lassen Sie mich dieses Beispiel erklären. Anstatt den Archivnamen direkt nach den Befehlsargumenten einzugeben (wie Sie es bisher getan haben), habe ich einen Bindestrich (czvf -) verwendet.
Die dash ausgänge daten zu standard ausgang. Sie können die Details des Archivdateinamens an das Ende des Befehls zurückschieben und tar anweisen, stattdessen den Quellinhalt für das Archiv zu erwarten.
Ich habe dann das unbenannte, komprimierte Archiv an ein SSH-Login auf einem Remote-Server weitergeleitet, auf dem ich nach meinem Passwort gefragt wurde.
Der in Anführungszeichen eingeschlossene Befehl führte dann cat gegen den Archivdatenstrom aus, der den Streaminhalt in eine Datei namens myfiles schrieb.Teer.gz in meinem Home-Verzeichnis auf dem Remote-Host.
Ein Vorteil der Generierung von Archiven auf diese Weise ist, dass Sie den Overhead eines mittleren Schritts vermeiden. Sie müssen nicht einmal vorübergehend eine Kopie des Archivs auf dem lokalen Computer speichern. Stellen Sie sich vor, Sie sichern eine Installation, die 110 GB des verfügbaren Speicherplatzes von 128 GB ausfüllt. Wohin soll das Archiv gehen?
Das war nur ein Verzeichnis von Dateien. Angenommen, Sie müssen ein aktives Linux-Betriebssystem auf einem USB-Laufwerk sichern, damit Sie es auf einen separaten Computer verschieben und auf dem Hauptlaufwerk dieses Computers ablegen können.
Angenommen, es gibt bereits eine Neuinstallation derselben Linux-Version auf dem zweiten Computer, generiert der nächste Kopier- / Einfügevorgang eine exakte Kopie des ersten.
HINWEIS: Dies funktioniert nicht auf einem Ziellaufwerk, auf dem noch kein Linux-Dateisystem installiert ist. Um diese Situation zu bewältigen, müssen Sie
dd
Das nächste Beispiel erstellt ein komprimiertes Archiv auf dem USB-Laufwerk, bekannt als /dev/sdc1
.
Das --one-file-system
Argument schließt alle Daten aus jedem Dateisystem außer dem aktuellen aus. Dies bedeutet, dass Pseudo-Partitionen wie /sys/
und /dev/
dem Archiv nicht hinzugefügt werden. Wenn es andere Partitionen gibt, die Sie einschließen möchten (wie in diesem Beispiel für /usr/
und /var/
), sollten sie explizit hinzugefügt werden.
Schließlich können Sie Daten aus dem aktuellen Dateisystem ausschließen, indem Sie das --exclude
Argument verwenden:
# tar czvf /dev/sdc1/workstation-backup-Apr-10.tar.gz \ --one-file-system \ / /usr /var \ --exclude=/home/andy/
Kehren wir nun zu diesem Full-Service-Befehlsbeispiel zurück. Archivieren Sie mit dem, was Sie bereits gelernt haben, alle wichtigen Verzeichnisse eines Dateisystems und kopieren Sie die Archivdatei auf ein USB-Laufwerk. Es sollte jetzt für Sie Sinn machen:
# tar czvf - --one-file-system / /usr /var \ --exclude=/home/andy/ | ssh [email protected] \ "cat > /home/username/workstation-backup-Apr-10.tar.gz"
Es gibt viel mehr Verwaltungsgüte in Form von Büchern, Kursen und Artikeln, die auf meinem bootstrap-it.com .