Pax vobiscum
Während tar sich großer Beliebtheit erfreut, führen andere Archivierungswerkzeuge ein Schattendasein. iX stellt zwei Kandidaten vor, die den Platzhirschen durchaus ebenbürtig sind.
- Michael Riepe
Von Unix System V stammt das Programm cpio. Es schreibt wie tar vor jede archivierte Datei einen Header mit den wichtigsten Attributen und dem Namen der Datei [1]. Das Format ist nicht kompatibel zu Tar. Es hat den Vorteil, etwas kompaktere Archive zu erzeugen: Während tar grundsätzlich 512 Byte lange Header schreibt und Dateien auf ein Vielfaches von 512 Byte ‘verlängert’, benutzt cpio Header variabler Länge und fügt die Daten ohne Füllmaterial direkt dahinter.
Ist das Archiv auf Magnetband gespeichert, gereicht der scheinbar verschwenderische Umgang mit Füllbytes tar jedoch zum Vorteil: Nach einem Lesefehler ist es leichter, den Anfang der nächsten intakten Datei zu finden. Mit etwas Glück lassen sich große Teile des Archivs trotz des defekten Bandes retten.
Verborgenes cpio
Unix-Benutzer verwenden cpio selten direkt. Viele sind jedoch schon mit solchen Archiven in Berührung gekommen, ohne es zu wissen: Die Paketmanager pkgadd (System V, Solaris) und rpm (Linux) etwa verwenden Dateiformate, die ein oder mehrere mit cpio generierte Archive enthalten. Aus RPM-Paketen lässt sich das versteckte Archiv mit rpm2cpio extrahieren.
Im Gegensatz zu tar liest cpio Archive von der Standardeingabe und schreibt sie auf die Standardausgabe. Die Optionen -i und -o bestimmen die Betriebsart des Programms: cpio -i liest Archive, cpio -o schreibt sie. Mit cpio -p kann der Benutzer in den so genannten ‘Copy-Pass’-Modus schalten, der Dateien von einem Verzeichnis in ein anderes kopiert. Den Namen des Zielverzeichnisses muss der Anwender als Argument übergeben.
Will der Anwender ein Archiv auspacken, muss er die Standardeingabe umleiten: Das Kommando cpio -i < archiv.cpio kopiert alle Dateien aus dem Archiv auf die Platte. Komprimierte Archive lassen sich mit einer Pipeline wie gzip -cd archiv.cpio.gz | cpio -i auspacken. Das Inhaltsverzeichnis des Archivs kann sich der Benutzer mit dem Befehl cpio -i -t ausgeben lassen.
Soll cpio nur bestimmte Dateien extrahieren, muss man dem Programm auf der Kommandozeile ein oder mehrere Muster übergeben: cpio -i ‘*.c’ etwa packt nur Dateien mit der Endung ‘.c’ aus. Die Anführungszeichen verhindern, dass die Shell das Muster selbst interpretiert. Die Option -f kehrt die Bedeutung der Muster um: cpio -i -f ‘*.c’ extrahiert alle Dateien, deren Namen nicht mit ‘.c’ enden.
Der kleine Unterschied
Für Anwender, die mit der Arbeitsweise von tar vertraut sind, hält cpio Überraschungen bereit. Das Programm überschreibt existierende Dateien nur, wenn die Version im Dateisystem älter ist als die im Archiv; den Ausschlag gibt der Zeitstempel der Datei. Die Option -u weist cpio an, sich wie tar zu verhalten und alle existierenden Files zu überschreiben. Ruft der Benutzer das Programm hingegen mit -r auf, kann er die Dateinamen interaktiv ändern, um Kollisionen zu vermeiden.
Fehlende Unterverzeichnisse legt cpio nicht automatisch an. Enthält ein Archiv etwa die Datei dir/subdir/datei, geht das Programm davon aus, dass das Verzeichnis dir/subdir bereits existiert. Ist die Annahme falsch, gibt cpio eine Fehlermeldung aus und überspringt die Datei. Ruft der Anwender das Programm mit der zusätzlichen Option -d auf, erzeugt es stillschweigend die fehlenden Verzeichnisse.
Beim Schreiben eines Archivs erwartet tar die Namen der zu archivierenden Dateien und Verzeichnisse auf der Kommandozeile; cpio -o und cpio -p hingegen lesen sie von der Standardeingabe. Da cpio Verzeichnisse nicht rekursiv durchsucht, empfiehlt es sich, die Dateiliste mit find zu erzeugen: find /etc -print | cpio -o etwa archiviert den gesamten Verzeichnisbaum unterhalb von /etc und schreibt das Ergebnis auf die Standardausgabe. Mit den Optionen von find kann der Anwender detailliert festlegen, welche Dateien cpio sichern soll [2].
Passt das Archiv nicht auf das Ausgabemedium - etwa Band oder Diskette -, hält cpio -o an und bittet den Benutzer, ein neues Medium einzulegen. Anschließend muss er den Namen des Geräts eingeben, auf dem cpio den Schreibvorgang fortsetzen soll.
Archivbau zu Babel
In einem Punkt ist cpio seinem Konkurrenten tar überlegen: Es kennt mehr Archivformate. Zu dem ursprünglichen, binären gesellte sich bald das maschinenunabhängige ‘alte’ ASCII-Format. Da das von Posix zur Standardisierung ausgewählte einige Schwachstellen hat, entstand ein weiteres, ‘neues’ ASCII-Format sowie eine um eine Prüfsumme ergänzte Variante desselben (CRC-Format). Neuere Versionen des Programms unterstützen außerdem das klassische und das Posix-Tar-Format.
Normalerweise erzeugt cpio Archive im binären Format. Die Option -c schaltet um auf ein portableres ASCII-Format - allerdings nicht immer auf dasselbe: Je nach Programm kann es sich um das alte ASCII-Format oder eine der mit System V Release 4 eingeführten neueren Varianten handeln. Ältere Versionen von cpio benutzen gewöhnlich das Posix-Format, ebenso Gnus cpio.
Bei letzterem und den SVR4-Versionen lässt sich das Format mit -H formatname exakt einstellen. Dabei steht ‘odc’ für das Posix-, ‘crc’ für das Prüfsummen-, ‘tar’ für das historische und ‘ustar’ für das Posix-Tar-Format. Gnus cpio unterstützt außerdem ‘bin’ (binäres Format), ‘newc’ (neues ASCII-Format ohne Prüfsumme) sowie spezielle Formate, die nur unter HP-UX eine Bedeutung haben. Außerdem kann es nicht nur Posix-, sondern auch Gnu-Tar-Archive lesen.
Wegen seiner hohen Portabilität ist das Posix-Format ‘odc’ wahrscheinlich die beste Wahl. Beim Lesen erkennen die meisten Programmversionen das verwendete Format automatisch. Wer dennoch Schwierigkeiten hat, fremde mit cpio erzeugte Archive auszupacken, sollte darüber nachdenken, Gnus cpio zu installieren - es erkennt fast alle Formate.
Gnu-Spezialitäten
Außerdem zeichnet sich die Gnu-Version des Programms durch zahlreiche Erweiterungen aus. Zum Beispiel ist dies cpio wie das tar aus gleicher Quelle in der Lage, Archive auf anderen Rechnern zu lesen und zu schreiben: cpio -i -I nebenan:archiv.cpio holt das Archiv vom Rechner ‘nebenan’ und packt es aus, cpio -o -O bandwurm:/dev/tape archiviert Dateien auf dem Streamer des Rechners ‘bandwurm’.
Verwendet der Benutzer -O archivname zusammen mit -A oder - -append, hängt cpio Dateien an ein bestehendes Archiv an. Der Archivname muss allerdings zu einer regulären Datei auf dem lokalen Rechner gehören.
Absolute Dateinamen in Archiven nimmt cpio wörtlich. Vor allem der Superuser muss beim Auspacken aufpassen: In ein Archiv eingeschmuggelte Dateien könnten wichtige Systemdateien ersetzen, etwa /etc/passwd oder /bin/sh. Gnus cpio wandelt absolute Namen in relative um, wenn der Anwender die Option - -no-absolute-filenames benutzt.
Mehr Informationen sind in der Manpage und auf den Info-Seiten (Aufruf: info -f cpio) zu finden. Ein man cpio lohnt sich jedoch auch bei anderen Versionen des Programms.
Friedensbringer pax
Angesichts der Unterschiede zwischen den bereits existierenden Versionen von tar und cpio konnte sich die Posix-Arbeitsgruppe nicht dazu durchringen, eins der beiden Programme zu standardisieren. Stattdessen erfand sie ein neues Programm, genannt pax. Der Name steht offiziell für ‘portable archive interchange’; ob das lateinische Wort für ‘Frieden’ bei der Namensgebung eine Rolle spielte, ist leider nicht überliefert.
Während die Funktionsweise von pax an tar angelehnt ist, ähnelt die Aufrufsyntax eher cpio: pax -r liest Archive von der Standardeingabe, pax -w schreibt sie auf die Standardausgabe. Mit -f dateiname kann der Anwender die Ein- beziehungsweise Ausgabe mit einer Datei verbinden. Ohne -r und -w gibt pax das Inhaltsverzeichnis des Archivs aus. Übergibt der Benutzer beide Optionen, schaltet das Programm ähnlich wie cpio -p in den ‘Copy-Pass’-Modus.
Zu archivierende Dateien kann der Anwender auf der Kommandozeile angeben. Unterlässt er das, liest pax -w wie cpio -o Dateinamen von der Standardeingabe. Es ist jedoch nicht notwendig, find zu verwenden, da pax Verzeichnisse rekursiv durchsucht und alle Dateien samt der Unterverzeichnisse archiviert, die es findet.
Laut Standard versteht pax die Formate der Posix-Varianten von cpio und tar. Es gibt jedoch Implementierungen, die weitere Varianten erkennen oder sogar erzeugen können. Die BSD-Version des Programms etwa kann alle mit cpio und tar erzeugte Formate verarbeiten, bis auf die von Gnus Tar.
Beim Lesen erkennt pax automatisch das vorliegende Format. Welches das Programm standardmäßig ausgibt, überlässt Posix der jeweiligen Implementierung. Die Option -x formatname übergibt dem Anwender die Kontrolle. Posix definiert die Formatnamen ‘cpio’ und ‘ustar’, Erweiterungen sind gewöhnlich in der Manpage des Programms aufgeführt.
Prophet im eigenen Land
Obwohl pax die Fähigkeiten von tar und cpio in sich vereint und langfristig beide ersetzen soll, hat sich es bisher nicht durchsetzen können. Das beliebteste Archivierungswerkzeug ist nach wie vor tar, meist in seiner Gnu-Inkarnation. Die ungewohnte Aufrufsyntax ist bereits bei cpio ein Hindernis für den Anwender, und pax unterscheidet sich in der Handhabung erheblich von beiden. Offenbar haben die Erfinder den Lernwillen der Benutzer überschätzt.
Es gab Bestrebungen, zumindest die Entwicklung der Programme wieder zusammenzuführen: Das Paxutils-Projekt hatte sich zum Ziel gesetzt, tar, cpio und pax auf einer gemeinsamen Codebasis neu zu implementieren und weiter zu entwickeln. Leider scheint das Projekt verwaist zu sein: Die letzte veröffentlichte Version des Paxutils-Pakets ist über drei Jahre alt. Ob und wie die Entwicklung weitergeht, bleibt abzuwarten.
Michael Riepe
studiert Elektrotechnik an der Universität Hannover.
Literatur
[1] Michael Riepe; Praxis; Gnu-Tips; Packesel; Dateien archivieren mit tar; iX 12/2002, S. 134
[2] Michael Riepe; Praxis; GNU-Tips; Fundbüro; Gewusst wo - Suchmöglichkeiten mit find; iX 7/2001, S. 164; (rh)