tar (Tape ARchiver) ist ein Linux-Befehl mit dem man seine Daten und Verzeichnisse sichern kann. Er komprimiert auf Wunsch mit Hilfe von gzip oder bzip2.
Inhalt
Inhaltsverzeichnis
1. Verwendung
Tar-Datei erstellen: tar cvzf zieldatei.tar.gz Quellverzeichnis/
- c create - erstellen
- v verbose - sei gesprächig
z komprimieren mit gzip
- j komprimieren mit bzip2
- f file - in die nachfolgend genannte Datei (ohne f war früher das Bandlaufwerk default, neuerdings ist es die Standardausgabe - wenn man sicher gehen will, verwendet man lieber f)
Wer bzip2 zum Komprimieren verwendet, sollte seine Dateien sinnvollerweise *.tar.bz2 nennen. Für tar-gzip Archive ist auch *.tgz häufig in Verwendung.
Tar-Datei Inhalt anzeigen: tar tvzf Dateiname.tar.gz
- t list
Praktisch ist auch die Anzeige mit less:
less Dateiname.tar.gz less Dateiname.tar.bz2
Tar-Datei entpacken: tar xvzf Dateiname.tar.gz [zuentpackendeDatei] (bei gzip) oder tar xvjf Dateiname.tar.bz2 (bei bzip2)
- x extract
2. Tipps
Wichtig!: Wer mit tar arbeitet, sollte immer daran denken, seine Dateien vorher in ein Verzeichnis zu packen. tar merkt sich Verzeichnisstrukturen - wenn sich jemand das Archiv dann auspackt, hat er die Dateien alle schön aufgeräumt im richtigen Verzeichnis.
Hilfe zum tar-Befehl bekommt man mit man tar bzw. info tar.
Es gibt für tar auch ktar, eine grafische Oberfläche für KDE, die einem die Eingabe der Parameter erleichtert.
3. Praktische Beispielanwendungen
3.1. Verzeichnis mit allen Unterverzeichnissen auf Disketten sichern
tar cMvf /dev/fd0 /pfad
- M multi volume
- Mit folgendendem Befehl können Sie nachsehen, was Sie im Diskettensatz gespeichert haben:
tar tMvf /dev/fd0
- Wieder auspacken können Sie die Verzeichnisse vom Diskettensatz mit:
tar xMvf /dev/fd0
- Wenn Sie nur eine bestimmte Art von Dateien wieder einlesen möchten, können Sie z.B. so vorgehen:
find \( -name "*.xml" -and ! -name "*test*" -and -cmin 60 \) -print | tar --files-from=- -cf /dev/fd0
- --files-from=- liest aus stdin
find erlaubt komplexe Suchausdrücke: hier "alle xml-Dateien, aber keine Test-Dateien, geändert seit höchstens 60 Minuten
3.2. Komplettes System auf andere Partition/Festplatte umkopieren oder sichern
Ähnlich wie Partition Image aber auf Datei-Ebene.
- Computer von Rescue CD/Floppy/ starten. (Damit die Dateisysteme nicht in Verwendung sind)
- Quell Root-Partition auf /mnt/alt mounten (ggf. auch weitere einzubeziehende separate Partitionen wie /usr etc. darunter einhängen) und formatierte Zielpartition auf /mnt/neu.
In Quell Verzeichnis gehen: cd /mnt/alt
- Folgender Befehl erzeugt nun in /mnt/neu genau die gleichen Daten wie unterhalb des aktuellen Verzeichnisses:
tar -cSp --numeric-owner --atime-preserve -f - . | ( cd /mnt/neu && tar -xSpv --atime-preserve -f - )
- Dabei gelten folgene Bedeutungen
- -c create archive
- S beachtung von sparse files.
- p preserve permissions
- --numeric-owner Verwendung der UIDs des Dateisystems und nicht der gerade gültigen Benutzernamen.
- --atime-preserve Zeit des letzen Zugriffs beim Kopieren nicht ändern.
- "-f -" Option -f gibt die Ziel/Quelldatei an, "-" bedeutet Standard Ein/Ausgabe (je nach dem ob gerade c oder x angegeben ist).
- "." Aktuelles Verzeichnis wird eingepackt.
- | Die Standardausgabe des letzten Befehls wird an die Standardeingabe des nächsten Befehls geleitet (gepiped)
- In den Klammern wird das Verzeichnis gewechselt und die reingepipeten Daten wieder ausgepackt (tar -xSp)
- v sorgt zusätzlich für die Anzeige des Dateinamens, der gerade ausgepackt wird.
- /mnt/neu/etc/fstab auf die zukünftigen Verhältnisse anpassen.
- Bootloader Konfiguration anpassen (/mnt/neu/etc/lilo.conf oder grub) und neu schreiben.
Zum Sichern nur den ersten tar Befehl verwenden und einen Dateinamen anstatt - für die Standardausgabe angeben.
3.3. Homeverzeichnisse sichern und (in anderes System) einspielen
Sichern:
root werden: su
In das zu sichernde Verzeichnis gehen: cd /home
tar -cSpv --atime-preserve -f /Sicherungverzeichnis/home.tar .
- Hier werden im Archiv die Benutzernamen verwendet (Standard), so das die Daten auch in einem anderem System eingespielt werden können, vorausgesetzt die verwendeten Benutzernamen sind dort vorher angelegt worden.
Zum Wiederherstellen (nach Neuinstallation und anlegen der Benutzer):
Neu angelegte (und bis auf Vorkonfigurationen leere) Homeverzeichnisse verschieben. (z.B. mv /home/* /home/neu.angelegte/ )
In Zielverzeichnis wechseln: cd /home
tar -xSpv --atime-preserve -f /Sicherungsverzeichnis/home.tar
- Vorkonfigurierte Konfigurationsdateien unter /home/neu.angelegte auf wichtige zu übernehmende Neuerungen überprüfen.
3.4. Einzelne Unterverzeichnisse ( Datei-Typen ) ausschließen
dazu gibt es den Parameter -X
tar cvfz /data/archiv/Sicherungsdatei.tgz /home/MyLogin -X exclude_my.lst
nun eine Datei erstellen, die untereinander alle Unterordner und/oder Dateien anzeigt, welche nicht mit gesichert werden sollen.
- Beispiel einer Exclude.liste
download /home/nemo/.netscape/cache /home/nemo/Desktop/Trash *scs /home/nemo/mozilla/default/idxyyxxyyx.slt/Cashe /home/nemo/mozilla/default/idxyyxxyyx.slt/Mail /home/nemo/OOo/backup
Außerdem lassen sich einzelne Dateien oder Dateiarten mittels des Parameters "--exclude=" ausschließen. Dabei darf der Platzhalter "*" beliebig eingesetzt werden.
- Folgender Aufruf schließt alle Dateien mit der Endung .log aus:
tar cvfz /data/archiv/Sicherungsdatei.tgz /home/MyLogin --exclude=*.log
4. Inkrementelle Backups
Hintergrund: Je öfter ein Rechner gesichert wird, desto besser! Wenn jedes Mal eine Vollsicherung gefahren würde, würden sehr schnell ungeheure Datenmengen zusammen kommen. Aber wozu? Reicht es nicht, einmal eine Vollsicherung zu machen und dann jeweils nur die Unterschiede zu dieser Sicherung zu sichern? Ja es reicht! So was nennt sich ein differenzielles Backup. Hier wird jede Änderung im Dateisystem gesichert. Ändert sich also eine Datei, so wird sie neu gesichert, wird sie gelöscht, so wird auch dies in einem differenziellen Backup vermerkt. Jetzt die schlechte Nachricht: So was können nur umfangreiche Backup-Umgebungen - tar leider nicht! Was tar aber sehr wohl kann, sind inkrementelle Backups. Diese funktionieren ähnlich wie differenzielle Backups, es werden auch alle geänderte sowie neue Dateien gesichert, wird eine Datei gelöscht, so hat dies jedoch keine Auswirkungen im Backup. Für inkrementelle Backups ist nur ein Bruchteil des Platzes von kompletten Backups nötig. Fiktives Beispiel: komplettes Backup: 5000 MB, inkrementelles Backup nach einem Tag: 10 MB - und dann muss sich schon sehr viel geändert haben! Es ist zu beachten, dass ein inkrementelles Backup ohne das zugehörige Vollbackup natürlich wertlos ist!
So, wie geht das nun: tar kennt den Schalter '-g', mit dem ein Log aller Verzeichnisse mit Prüfsummen angelegt wird. Anhand dieser Prüfsummen entscheidet tar dann später, welche Dateien bei einem inkrementellen Backup zu sichern sind. Ausgangspunkt ist das /home Verzeichnis, das gesichert werden soll. Die Archive und die Logs landen in /backup:
#Zuerst eine Vollsicherung: tar -c -f /backup/vollbackup.tar -g /backup/backup.log .
So, jetzt ist das Backup von /home und die zugehörige Logdatei /backup/backup.log komplett. Jetzt kann ein inkrementelles Backup erstellt werden:
#jetzt eine inkrementelle Sicherung cp /backup/backup.log /backup/backup.log.level1 tar -c -f /backup/inkrementell.tar -g /backup/backup.log.level1 .
Da nun die Datei backup.log.level1 existiert, sichert tar nur noch die Änderungen, in dem es die Prüfsummen des Logs mit den Prüfsummen aller zu sichernden Verzeichnisse vergleicht.
Generell ist bei inkrementellen Sicherungen darauf zu achten, dass diese nie aufeinander aufbauen, sondern sich immer auf das letzte Vollbackup beziehen sollten. Bauen sie aufeinander auf und eine inkrementelle Sicherung ist durch einen Fehler nicht mehr zu gebrauchen, sind auch alle folgenden Sicherungen wertlos. Da das inkrementelle Backup die Datei backup.log verändert und so eine weitere inkrementelle Sicherung auf der letzten inkrementellen aufbauen würde, wurde die Datei zuvor kopiert. Möchte man eine weitere inkrementelle Sicherung anlegen, so ist lediglich das Log wieder entsprechend zu kopieren.
Soll eine neue Vollsicherung angelegt werden, ist lediglich dafür zu sorgen, dass die Datei backup.log zuvor gelöscht wird. Sie wird dann von tar mit aktuellen Werten neu angelegt. Wurde ein neues Vollbackup gemacht, sind natürlich alle vorhergehenden inkrementellen Backups überflüssig und auch wertlos und können gelöscht werden.
Gleiches funktioniert natürlich auch wie gewohnt mit Bandlaufwerken oder komprimierten Archiven!
5. Tuning
Vor allem bei DLT- und anderen schnellen SCSI-Bandlaufwerken gibt es oft das Problem, dass das Laufwerk das Wienern anfängt (engl.: "shoe-shining", also Band läuft, stoppt, zurück, läuft, stoppt, zurück, ...), was die Transferrate ziemlich runter drückt und auch für das Laufwerk etwas stressig ist.
- st-"Modul" direkt im Kernel:
- append="st=128" - sagt dem st-Treiber, dass er 128KByte Puffer pro Bandlaufwerk verwenden soll (kann auch in st_options.h vor dem Kernelcompile angegeben werden, siehe ST_BUFFER_BLOCKS)
st als separates KernelModul:
modprobe st buffer_kbs=128
tar -cv -b 128 -f /dev/st0 - explizite Angabe von 64KByte (=128*512Byte) Recordgröße bei (GNU-)tar
star ... -fifo fs=30m bs=64k ... - Aufruf für (Schily-)star
Praxis-Resultat: Sicherung läuft in ca. 3 statt in ca. 9 Stunden durch.
Wenn man viele kleine Dateien sichert, sollte man die Recordgröße nicht zu groß machen, da jede Datei mindestens einen Record belegt.
In LinuxKernel 2.4.22 ist ein Fix für st.c enthalten, der die Bandende-Behandlung verbessert - vorher konnte es üble Crashs geben.
6. Problembehebung
7. Pitfall
- Möchte man bestimmte Verzeichnisse ausschließen, kann man --exclude oder --exclude-from benutzen. Man kann damit aber keine absoluten Pfade angeben, wie vielleicht erwartet. Ein Beispiel soll das verdeutlichen:
#eigentlich sollte nur home/wm nicht gesichert werden, jetzt wird aber auch #z.B. home/pm/some/home/wm oder auch home/sonstwie/home/wm nicht gesichert #also alles, wo irgendwo im Pfad home/wm vorkommt. #Mir ist keine Möglichkeit bekannt, wirklich nur /home/wm aus dem #Backup rauszuhalten cd / tar --exclude home/wm -cvzf /tmp/backup.tgz home
-- WinfriedMueller --exclude ist auch nicht dazu da, ganze Verzeichnisbäume auszuschließen, sondern Dateien (mit wiederkehrenden ähnlichen Dateinamen) Es gibt aber trotzdem eine Lösung:
cd /home tar --exclude ./wm -cvzf /tmp/backup.tgz .
mit --absolute-names gehts entsprechend -- RonnyBuchmann 2003-09-24 12:30:48 Besser ist es aber IMHO, eine Dateiliste zu benutzen:
find /home -path /home/wm -prune -o -print | tar -T- -cvzf /tmp/backup.tgz
8. Einsatzhinweise
Immer wieder in Diskussion ist der Schwachpunkt, dass bei gezippten Archiven die Gefahr eines totalen Datenverlustes gegeben ist, sobald das Archiv geringste Fehler aufweist. Dies kann z.B. bei Bandlaufwerken recht schnell passieren, wenn Daten nicht mehr korrekt eingelesen werden können. Das Problem liegt darin begründet, dass das komplette Archiv gepackt wird. Ein einzelner Bitfehler kann unter Umständen dazu führen, dass das ganze Archiv nicht mehr entpackt und damit keine einzige Datei wieder hergestellt werden kann.
Oft wird deshalb für Backups dazu geraten, afio einzusetzen. Hier wird jede Datei einzeln gepackt, sodass ein Bitfehler sich immer nur auf eine Datei auswirkt. Die Chancen, bei Bitfehlern, Dateien wieder herzustellen, ist bei Verwendung von afio also wesentlich größer. Andererseits ist tar ein so weit verbreitetes Werkzeug und auf so vielen Plattformen verfügbar, das ich es als das Archivformat schlechthin bezeichnen würde. Schlechthin vielleicht auch im wortwörtlichen Sinne: Nicht optimal aber einfach unglaublich weit verbreitet. Die weite Verbreitung zeigt, dass das Problem nicht so ernst sein kann, dass alle umstellen würden. Kommt noch hinzu: Wenn man Archive verschlüsselt, geht eh wieder der Vorteil von afio verloren. Es sei denn, man würde jede Datei einzeln verschlüsseln. Das ist aber oft nicht sinnvoll, weil man ja auch die Dateinamen und Verzeichniss-Struktur verschlüsselt ablegen möchte. -- WinfriedMueller
Neue Erkenntnisse (21.03.2005): Auch bei einem mit gzip-gepackten tar-Archiv ist ein Restore gut möglich, auch wenn einzelne Bytes oder Sektoren defekt sind. Gzip packt Daten in 64KB lange Blöcke. Man kann also immer beim nächsten intakten Block wieder neu aufsetzen. Es fehlen dann lediglich 64KB lange Stücke. Alle Blöcke, die intakt sind, können auch wiederhergestellt werden. Man muss nur herausfinden, wo genau ein neuer Block beginnt. Danach muss man im tar-Archiv schauen, wo dort das nächste File beginnt, um dort aufzusetzen. Damit kann man also sagen, sind tgz-Archive für Backups recht sicher, auch wenn mal Sektoren defekt sind.
Bei bzip sieht es etwas problematischer aus, hier ist die Blockgröße 900KB, es würden dort also wesentlich größere Lücken entstehen, die sich nicht wieder herstellen lassen. Jedoch kann man mit dem Parameter -1 diese auf 100KB runtersetzen.
Auch verschlüsselte Archive sind gut wieder herstellbar, wenn Sektoren defekt sind. Zumindest wenn man aespipe zum Verschlüsseln einsetzt. Der Algorithmus ist hier so, dass bei jedem Sektor wieder neu aufgesetzt werden kann. Defekte Sektoren können also einfach ausgespart werden. Jeder 512-Byte Sektor wird sozusagen getrennt verschlüsselt. Wenn man also Archive verschlüsseln will, sollte man Verschlüsselungswerkzeuge einsetzen, die nicht versagen, wenn mal ein paar Sektoren defekt sind. -- WinfriedMueller
Übrigens: tar schreibt keine Checksumme über die Daten. Das bedeutet, dass Fehler in Archiven, solange sie nicht den jeweiligen File-Header betreffen, nicht erkannt werden. Gzip dagegen legt eine CRC-Checksum über jeden Block an, somit bekommt man immer mit, wenn Bitfehler auftreten. Gezippte tar-Archive haben hier also einen Vorteil. (siehe auch: http://en.wikipedia.org/wiki/Tar_file_format) -- WinfriedMueller
9. Vor- und Nachteile gegenüber vergleichbaren Programmen
- Vorteile
- tar ist sehr weit verbreitet. Man kann also relativ sicher sein, dass Tar-Archive auch in 20 Jahren noch halbwegs lesbar sind.
- tar ist (im Gegensatz z.B. zu dar) flexibler, was die Komprimierung angeht. Man ist nicht auf gzip und bzip2 beschränkt.
- Nachteile
Komprimierung erfolgt üblicherweise NACH dem Zusammenfassen aller Dateien in einen Tarball. Da dar das anders macht ist es flexibler. Man kann z.B. Archive oder komprimierte Dateiformate (jpg, mpg, etc.) von einer erneuten Kompression ausschliessen, was bei Backups deutlich Zeit sparen kann.
- Leider gibt es eine Vielzahl von unterschiedlichen tar Formaten, die nicht vollständig zueinander kompatibel sind.
10. Fragen
Frage: Kann es passieren, dass durch tar Umlaute in Dateinamen verloren gehen können oder verstümmelt werden? Oder kann ich mich drauf verlassen, dass umlautmäßig immer alles ok geht, wenn ich eine Platte mit tar sichere und dann wiederherstelle?
tar speichert alles, wie es auf der Platte steht. Umlaute gehen also nicht verloren. Aber http://www.google.com/search?q=tar+Umlaute zeigt, das manche Leute beim Zurückspielen von Dateien Probleme hatten die "richtige" herauszupicken (insbesondere, wenn es eigentlich Windows-Dateien sind). Nach einem tar tzvf tararchiv.tgz'' > inhalt kann man jedoch aus inhalt den "richtigen" Namen mit Copy&Paste herauskopieren. Das liegt meist an unterschiedlichen Zeichensätzen, siehe auch UniCode, sowie ggf. Samba.
Frage: Wie kann ich Archive auf z.B. 4.4 GB Größe beschränken?
mit -L n, n in KBytes
Frage: Wie greife ich auf ein nicht komprimiertes Archiv z.B. des Verzeichnisses /etc auf dem Bandlaufwerk /dev/nst0 bzw. stelle eine Datei wieder her?
- Beispiel: /etc/passwd soll wiederhergestellt werden (die Datei landet dann im aktuellen Verzeichnis):
tar xf /dev/nst0 etc/passwd
Frage: Was bedeutet die Fehlermeldung: "tar: /dev/nst0: Cannot read: Cannot allocate memory" / "tar: At beginning of tape, quitting now" / "tar: Error is not recoverable: exiting now" ??? Wie kann ich sehen, ob überhaupt auf dem Band was gespeichert ist? Mit "tar t /dev/nst0" bekomme ich gar keine Meldung!?!?
es muss natürlich tar tf /dev/nst0 heissen. Und wenn Du nicht aus gutem Grund das norewind device benutzt, dann sogar tar tf /dev/st0.