Klar kennen Sie tar. Wer hat den “Tape Archiver” etwa noch nicht benutzt, um Archive zu ver- oder entpacken. Der typische Einsatz beim Entpacken eines (zumeist Quellcode-) Archives ist (gegebenenfalls mit “z” statt “j”, wenn es sich um ein mit gzip komprimiertes Archiv handelt):
tar xvjf archiv.tar.bz2
Oder wenn stattdessen ein oder mehrere Ordner oder Dateien zu einem Archiv zusammengefasst werden sollen:
tar cvjf archiv.tar.bz2 ordner/
Doch tar kann einiges mehr. Als erster Einsatzbereich sei da das Archivieren auf Bandlaufwerke zu nennen. Statt dem Archivnamen gibt man einfach den Namen der Gerätedatei an, auf dem die Sicherung landen soll. Im Zeitalter der Sicherung auf optische Datenträger oder des Off-Site-Backups auf irgendwelche Remote-Server schwindet der Nutzen dieser Funktion von tar aber immer mehr und Tools wie rsync, auf das ich später eingehen möchte oder mksquashfs (für’s Backup auf optische Medien) gewinnen an Bedeutung. Dennoch gibt es genügend Einstzbereiche für tar:
Kopieren von Verzeichnisstrukturen
tar lässt sich wunderbar als relativ effizientes Kopierwerkzeug einsetzen. Für diesen Einsatzbereich kommt uns entgegen, dass tar wie fast alle Unix-Programme seine Ausgabe auf die Standardausgabe schreiben kann und so die Verwendung in Pipelines zulässt. Wollen Sie beispielsweise den Inhalt einer unter /media/hdc1 gemounteten Platte auf die Platte unter /media/sda1 schreiben, nutzen Sie dafür:
tar -C /media/hdc1 -cf - . | tar -C /media/sda1 -xvf -
In diesem Fall weist das große -C (change directory) an, zunächst das Arbeitsverzeichnis zu wechseln. Dort wird dann der gesamte Inhalt des aktuellen Verzeichnisses (“.”) in ein neues (-c wie create) Archiv verpackt, als Ausgabedatei (-f wie file) dient die Pipe. Auf der Empfängerseite wird gleich wieder entpackt (-x wie extract), nicht unbedingt nötig ist das -v, welches dafür sorgt, dass angezeigt wird, welche Datei gerade an der Reihe ist. Dass bei diesem Verfahren immer zwei Prozesse arbeiten, sollte nicht weiter stören, schließlich ist die Kommunikation via Pipe effizient und beide Prozesse sind weniger Prozessor- als I/O-lastig.
Kopieren übers Netzwerk
Wo eine Pipeline Verwendung findet, kann man auch irgendwie übers Netzwerk tunneln. Ganz einfach klassisch, unkompliziert und unverschlüsselt geht es mit nc oder netcat, einem Tool, das nichts anderes macht, als übers Netz zu “catten”. Zuerst öffnet man auf Empfängerseite ein lauschendes (l wie listen) nc auf einem unbenutzten Port und übergibt den Datenstrom gleich an das entpackende tar:
nc -l -p 12345 | tar -C /tmp/ -xvf -
Jetzt kann auf Senderseite mit der Übertragung unter Angabe der IP-Adresse des Zielsystems begonnen werden:
tar -C /irgend/wo -cvf - . | nc -q 5 123.45.67.89 12345
Insgesamt sind vier Prozesse beteiligt und man muss auf beiden Rechnern Befehle starten. Dafür läuftnc schön flott. Denn Nachteil der fehlenden Verschlüsselung kann man umgehen, indem man zu ssh greift. Da geht es auch in einem einzigen Befehl. Entweder man startet tar auf dem sendenden System:
tar -C /irgend/wo -cf - . | ssh mattias@123.45.67.89 tar -C /tmp/ -xvf -
Genausogut geht es im “Pull-Verfahren”:
ssh mattias@123.45.67.98 tar -C /irgend/wo -cf - . | tar -C /tmp/ -xvf -
Verwendet man tar um Daten von einem System aufs andere zu transferieren, ist es oft sinnvoll, mit --numeric-owner Verwirrungen bei Nutzernamen/UIDs zu vermeiden. Bei Backups aus laufenden Systemen, wo keine Mountpoints überscprungen werden sollen, hilft zudem auf Senderseite --one-file-system.
Notfallbackup auf DVD
Gelegentlich kommt es vor, dass man einen havarierten Rechner retten muss, aber weder über Netzwerk, noch über eine USB-Festplatte verfügt. Dann hilft tar, welches es ermöglicht, einen “Tarball” direkt auf eine DVD zu schreiben. Komprimiert natürlich und ohne Umweg über eine temporäre Datei. Allerdings sollte man vorher abschätzen können, ob die zu schreibende Datenmenge draufpasst und ein Komprimierungsverfahren wählen, das möglichst keine Gefahr birgt, dass der Puffer leer läuft. Ein kleines Hindernis, das leicht zu umschiffen ist, ist die Tatsache, dass growisofs unbedingt von einer Datei lesen möchte. Kann es haben: Wir geben im die Gerätedatei /dev/stdin. So sieht die resultierende Pipeline aus:
tar -C /zu/sichern -cvzf - . | growisofs -dvd-compat -speed=2 -Z/dev/sr0=/dev/stdin
Natürlich lässt sich eine so beschriebene DVD nicht mounten. Behandeln wir das optische Laufwerk wie ein Bandlaufwerk und lesen den Inhalt der DVD sequentiell ein:
tar -tvf /dev/sr0
Entpackt wird natürlich unter Verwendung von -x statt -t und im richtigen Verzeichnis.
Wirklich starker Beitrag – Vielen Dank!
Hallo,
ich versuche auch von und zu tar zu pipen, um dateien aus einem tar file
zu extrahieren, ohne sie zwishcenzuspeichern. Aber ich komme nicht weiter.
so etwas
tar -xf all.tar –wildcards –no-anchored ‘*subset*’ –so-stdout | tar -c –file=subset.tar