cpio

Aus Foxwiki


Bezeichnung

cpio - kopiert Dateien in und aus Archiven

cpio nutzt die Ergebnisse des ls oder find Befehls, um eine cpio-Datei zu erzeugen. cpio macht keine Komprimierung, aber Archive werden oftmals mit gzip oder anderen Kompressionsprogrammen komprimiert.

cpio hat drei grundlegende Arbeitsmodus:

  • copy-out mode – die Dateien werden in ein Archiv kopiert. Um Dateinamenslisten zu erzeugen, benutzt man den find oder ls Befehl.
  • copy-in mode – die Daten vom Archiv werden in das Dateisystem kopiert.
  • copy-pass mode – die Dateien werden von einem Verzeichnis in ein anderes kopiert.

Übersicht

cpio {-o|--create} [-0acvABLV] [-C bytes] [-H format] [-M message] [-O [[user@]host:]archive] [-F [[user@]host:]archive] [--file=[[user@]host:]archive] [--format=format] [--message=message][--null] [--reset-access-time] [--verbose] [--dot] [--append] [--block-size=blocks] [--dereference] [--io-size=bytes] [--rsh-command=command] [--help] [--version] < name-list [> archive]

Optionen

Option Beschreibung
-0, --null Im copy-out und copy-pass Modus wird die Liste der Dateinamen durch ein Null-Zeichen statt durch einen Zeilentrenner getrennt. Damit können Dateien mit archiviert werden, die Zeilentrenner im Dateinamen haben. GNU-find ist ein Programm, das eine Liste von Dateinamen erzeugen kann, die durch Null-Zeichen getrennt sind
-a, --reset-access-time Die Zugriffszeitmarke der Dateien wird nach der Archivierung wiederhergestellt, so daß nicht spürbar ist, daß die Dateien gerade gelesen wurden
-A, --append Die Ausgabe wird an ein bestehendes Archiv angehängt. Nur gültig im copy-out Modus. Das Archiv muß eine reguläre Datei sein, die mit der -O oder -F (--file) Option angegeben wurde
-b, --swap Im copy-in Modus wird die Bytereihenfolge umgedreht. Damit können Daten zwischen Maschinen mit 32-Bit big-endian und little-endian Formaten ausgetauscht werden
-B Die IO-Blockgröße wird auf 5120 Bytes eingestellt. Standardmäßig beträgt sie 512 Byte
-block-size=BLOCK-SIZE Setzt die IO-Blockgröße auf BLOCK-SIZE mal 512 Byte
-c Das alte ASCII Format wird benutzt
-C IO-SIZE, --io-size=IO-SIZE Setzt die IO-Blockgröße auf IO-SIZE Byte
-d, --make-directories Führende Verzeichnisse werden erstellt, wenn nötig
-E FILE, --pattern-file=FILE Im copy-in Modus werden zusätzliche Muster für zu extrahierende oder aufzulistende Dateien aus der angegebenen Datei gelesen
-f, --nonmatching Kopiert nur Dateien, die nicht auf das angegebene Muster passen
-F, --file=archive Das Archiv wird nicht auf die Standard-Ausgabe geschrieben sondern in den angegebenen Dateinamen. Um auf ein Bandlaufwerk (oder eine Datei) eines anderen Rechners zuzugreifen, kann dem Dateinamen ein Hostname: vorangestellt werden. Der Hostname seinerseits kann einen Usernamen und ein @ Zeichen am Anfang besitzen um das remote-Drive unter der entsprechenden Userkennung zu benutzen. Typischerweise muß dazu ein Eintrag in der ~/.rhosts-Datei auf dem Fremdrechner vorliegen
-force-local Auch wenn der Archivdateiname (mit -F, -I oder -O angegeben) einen Doppelpunkt enthält wird er als lokaler Dateinamen interpretiert
-H FORMAT, --format=FORMAT Das angegebene Format wird benutzt. Gültige Formate sind:
   bin:Das obsolete Binärformat (Voreinstellung im copy-out Modus). 
   odc:Das alte (POSIX.1) portable Format. 
   newc:Das neue (SVR4) portable Format, das Dateisysteme mit mehr als 65536 Inodes unterstützt. 
   crc:Das neue (SVR4) portable Format mit einer Prüfsumme. 
   tar:Das alte tar-Format. 
   ustar:Das POSIX.1 tar-Format. Erkennt auch GNU-tar, das ähnlich aber nicht identisch ist. 
   hpbin:Das obsolete Binärformat des HPUX-cpio. 
   hpodc:Das portable HPUX cpio-Format. 
-i, --extract Schaltet den copy-in Modus ein
-I archive Gibt den Archiv-Dateinamen an, der statt der Standard-Eingabe benutzt werden soll. Für Zugriffe auf entfernte Rechner gilt das Selbe wie bei der -F Option
-k Ignoriert
-l, --link Dateien werden gelinkt statt kopiert, wo immer das möglich ist
-L, --dereference Symbolische Links werden dereferenziert (Die Dateien, auf die der Link verweist werden kopiert, anstatt den Link zu kopieren)
-m, --preserve-modification-time Die Modification-Time wird erhalten, wenn Dateien erstellt werden
-M MESSAGE, --message=MESSAGE Die angegebene Message wird ausgegeben, wenn das Ende eines Backup-Mediums erreicht ist. Die Meldung kann also die Aufforderung an den User enthalten, das Band (oder die Diskette) zu wechseln. Enthält die Nachricht ein %d, so wird das durch die aktuelle Volume-Nummer (beginnend mit 1) ersetzt
-n, --numeric-uid-gid Bei der "geschwätzigen Ausgabe" eines Inhaltsverzeichnisses werden die User- und GruppenIDs statt der User- und Gruppennamen ausgegeben. Das funktioniert insbesondere auch bei tar-Archiven
--no-absolute-filenames Im copy-in Modus werden alle Dateien relativ zum aktuellen Verzeichnis erstellt, auch wenn sie mit einem absoluten Pfadnamen im Archiv stehen
--no-preserve-owner Im copy-in und copy-pass Modus werden die Eigentümerschaft der Dateien nicht verändert. Sie behalten also die Eigentümer der User, die sie ausgepackt haben. Das ist die Voreinstellung für Normaluser
-o, --create Schaltet den copy-out Modus ein
-O archive Das Archiv wird in die angegebene Datei geschrieben, statt auf die Standard-Ausgabe. Für Zugriffe auf entfernte Rechner gilt das Selbe wie bei der -F Option
--only-verify-crc Wenn ein Archiv im crc-Format im copy-in Modus gelesen wird, so werden nur die Prüfsummen überprüft, anstatt die Dateien tatsächlich auszupacken
-p, --pass-through Schaltet den copy-pass Modus ein
-quiet Keine Ausgabe der Anzahl geschriebener Blöcke
-r, --rename Dateien werden interaktiv umbenannt
-R [user][:.][group], --owner [user][:.][group] Im copy-out und copy-pass Modus werden die Eigentümerschaft und Gruppenmitgliedschaft der zu erzeugenden Dateien auf die angegebenen Werte gesetzt. Wird die Gruppe weggelassen, aber der Doppelpunkt angegeben, so wird die Login-Gruppe des entsprechenden Users verwendet. Diese Option kann nur vom Superuser (root) verwendet werden
--rsh-command=COMMAND Bei der Zusammenarbeit mit mt wird mitgeteilt, welches Kommando mt benutzen soll um mit entfernten Geräten zu arbeiten, anstelle der voreingestellten Kommandos /usr/bin/ssh, /usr/bin/rsh oder dem Inhalt der Umgebungsvariable MT_RSH
--sparse Im copy-in und copy-pass Modus werden Dateien, die große Blöcke mit Nullzeichen enthalten als Sparse-Dateien geschrieben
-s, --swap-bytes Im copy-in Modus werden die Bytes jedes Halbwortes (2 Byte) vertauscht
-S, --swap-halfwords Im copy-in Modus werden die Halbwörter jedes Wortes (4 Byte) vertauscht
-t, --list Ausgabe eines Inhaltsverzeichnisses
-u, --unconditional Alle Dateien, werden ersetzt, ohne zu fragen
-v, --verbose Geschwätzige Ausgabe
-V --dot Ein Punkt (.) wird für jede bearbeitete Datei ausgegeben
-version Gibt die Versionsnummer von cpio aus und beendet dann das Programm

Backup mit cpio

cpio erzeugt und verwaltet Dateiarchive verschiedener Formate

cpio {-o|-create} [-0acvABLV] [-C Anzahl] [-H Format] [-M Nachricht] [-O [[User@]Host:]Datei] [-F [[User@]Host:]Datei] [-file=[[User@]Host:]Datei] [-format=Format] [-message=Nachricht] [-null] [-reset-access-time] [-verbose] [-dot] [-append] [-block-size=Größe] [-dereference] [-io-size=Größe] [-force-local] [-help] [-version] < Liste [> Datei] cpio {-i|-extract} [-bcdfmnrtsuvBSV] [-C Anzahl] [-E Datei] [-H Format] [-M Nachricht] [-R [User][:.][Gruppe]] [-I [[User@]Host:]Datei] [-F [[User@]Host:]Datei] [-file=[[User@]Host:]Datei] [-make-directories] [-nonmatching] [-preserve-modification-time] [-numeric-uid-gid] [-rename] [-list] [-swap-bytes] [-swap] [-dot] [-unconditional] [-verbose] [-block-size=Anzahl] [-swap-halfwords] [-io-size=Anzahl] [-pattern-file=Datei] [-format=Format] [-owner=[user][:.][Gruppe]] [-no-preserve-owner] [-message=Nachricht] [-force-local] [-help] [-version] [Muster...] [< Datei] cpio {-p|-pass-through} [-0adlmuvLV] [-R [user][:.][group]] [-null] [-reset-access-time] [-make-directories] [-link] [-preserve-modification-time] [-unconditional] [-verbose] [-dereference] [-owner=[User][:.][Gruppe]] [-dot] [-no-preserve-owner] [-help] [-version] Zielverzeichnis < Liste

cpio ist ein Tool zur Erzeugung und Verwaltung von Dateiarchiven. In einem Dateiarchiv werden mehrere Dateien mit ihren Verzeichnissen und allen Verwaltungsinformationen, wie Eigentümer, Zugriffsrechte Erzeugungszeit etc., zu einer einzigen Datei oder zu einem Datenstrom zusammengefaßt. cpio erzeugt und verarbeitet eine ganze Reihe verschiedener Archivformate. Deshalb ist es besonders gut für den Austausch von Datenbeständen zwischen unterschiedlichen Rechnern geeignet.

cpio kann in drei verschiedenen Modi arbeiten.

Im copy-out Modus werden Daten aus dem Dateisystem in ein Archiv, zum Beispiel auf ein Magnetband, geschrieben. Die Namen der zu archivierenden Dateien liest cpio Zeilenweise von der Standardeingabe. Eine gängige Methode zur Erzeugung einer geeigneten Liste von Dateinamen ist die Verbindung des Ausgabekanals von [../../../ebooks/computer/betriebssysteme/linux/allgemein/unsortiert/linux_anwender_handbuch/linux_anwenderhandbuch_7-0/node54.html#find find] mit dem Eingabekanal von cpio durch eine Pipeline.

Im copy-in Modus werden die Daten vom Archiv in das Dateisystem kopiert. In diesem Modus liest cpio die archivierten Daten von der Standardeingabe. Wenn nicht das gesamte Archiv ausgepackt werden soll, können die gewünschen Dateien durch reguläre Ausdrücke nach den Optionen auf der Kommandozeile angegeben werden.

Im copy-pass Modus werden die Daten wie bei copy-out aus dem Dateisystem gelesen und sofort wieder in ein anderes Verzeichnis geschrieben, ohne daß zwischendurch ein Archiv erzeugt wird. Die Namen der zu kopierenden Dateien werden wie bei copy-out von der Standardeingabe gelesen, der Name des Zielverzeichnisses muß in der Kommandozeile nach den Optionen angegeben werden.

Optionen

-a veranlaßt cpio, nach dem copy-out die letzte Zugriffszeit vor dem Lesen zurückzusetzen
-A die Dateien werden an ein existierendes Archiv angehängt (nur im copy-out Modus auf Blockgeräten möglich)
-b veranlaßt cpio, beim extrahieren von Daten die Bytes von Datenwörtern und Halbwörtern zu tauschen
-B setzt die Blockgröße auf 5120 Bytes anstelle der voreingestellten 512 Bytes
-block-size=Anzahl setzt die Blockgröße auf Anzahlx512 Bytes
-c veranlaßt tar, das alte, portable ASCII Archivformat zu benutzen
-C Größe setzt die Blockgröße (Größe in Bytes)
-d veranlaßt tar, beim Auspacken eines Archivs die notwendigen Verzeichnisse zu erzeugen, wenn sie noch nicht existieren
-E Datei die Liste oder die regulären Ausdrücke zur Bestimmung der zu kopierenden Dateien wird aus der angegebenen Datei und nicht von der Standardeingabe gelesen
-f verkehrt die Wirkung der Listeoder des Musters ins Gegenteil; es werden die Dateien kopiert, die nicht auf das Muster passen
-F [[User@ ]Host:]Datei veranlaßt tar, die angegebene Datei als Archivdatei zu benutzen
-force-local erzwingt die Interpretation eines Archivnamens bei den Optionen -F, -I und -O als lokale Datei, auch wenn in dem Dateinamen ein Doppelpunkt vorkommt
-H Format bestimmt eines der folgenden Archivformate (bei copy-in werden die unterstützten Formate automatisch erkannt):

bin (Voreinstellung bei copy-out) veraltetes Binärformat

odc das alte, portable POSIX-1 Format

newc das neue, portable SVR4 Format; für große Dateisysteme mit mehr als 65536 I-Nodes geeignet

crc wie newc mit zusätzlicher Prüfsumme

tar das alte tar Format

ustar das POSIX-1 tar Format und das GNU-tar Format

hpbin das alte Binärformat des HPUX-cpio

hpodc das portable POSIX-1 Format von HPUX; unterscheidet sich in der Speicherung von Gerätedateien

-i schaltet cpio in den copy-in Modus; die in der Liste angegebenen Dateien werden aus dem Archiv in das System hinein kopiert
-I [[User@ ]Host:]Datei verbindet die Standardeingabe von cpio mit der Datei; gegebenenfalls wird die Verbindung zum Rechner Host hergestellt und die Archivierung mit den Rechten von User ausgeführt
-k ohne Funktion
-l wenn möglich werden Dateien nicht kopiert sondern symbolische Links erzeugt
-L im copy-out oder -pass Modus werden nicht die symbolischen Links kopiert, sondern die referenzierten Dateien
-m das Datum der letzten Änderung bleibt beim Kopieren unverändert
-M Nachricht veranlaßt cpio, die Nachricht auf die Standardfehlerausgabe zu schreiben, wenn das Backup-Medium voll ist; der Platzhalter `%d' kann benutzt werden, um in der Nachricht die laufende Nummer des aktuellen Bandes auszugeben (Start bei 1)
-n die User- und Gruppen-ID der archivierten Dateien wird beim Listing in numerischer Form ausgegeben
-no-preserve-owner (Voreinstellung für User ohne root-Privilegien) beim Extrahieren von Dateien aus dem Archiv oder beim Kopieren wird die archivierte User- und Gruppen-ID nicht auf die extrahierten Dateien übertragen
-o schaltet cpio in den copy-out Modus; die in der Liste angegebenen Dateien werden aus dem System heraus kopiert und ein Archiv angelegt oder erweitert
-O [[User@ ]Host:]Datei verbindet die Standardausgabe von cpio mit der Datei; gegebenenfalls wird die Verbindung zum Rechner Host hergestellt und die Archivierung mit den Rechten von User ausgefüチhrt
-p schaltet cpio in den copy-pass Modus
-r erlaubt dem Anwender die interaktive Umbenennung von Dateien im copy-in Modus
-R [User ][:.][Gruppe ] die entsprechenden Benutzerrechte vorausgesetzt, werden Eigentümer und/oder Gruppe der Dateien beim Extrahieren geändert
-s die Bytes eines Halbwortes werden beim Extrahieren der Daten vertauscht
-S die Halbworte eines Wortes werden beim Extrahieren der Daten vertauscht
-t zeigt den Inhalt des Archives an
-u beim Extrahieren werden Dateien im Dateisystem ohne Nachfrage durch gleichnamige Dateien aus dem Archiv überschrieben, auch wenn diese älter sind
-v zusammen mit -t wird ein ausführliches Listing des Archivinhalts ausgegeben
-V für jede bearbeitete Datei wird ein Punkt in den Standardfehlerkanal geschrieben
-0 die Elemente der Liste können durch Nullbytes anstelle der normalerweise erwarteten NEWLINE übergeben werden

cpio (cpio in/out) besitzt einen ähnlichen Funktionsumfang wie das zuvor beschriebene Kommando tar, so dass wohl eher die Vorliebe des Benutzers das eine oder andere Werkzeug favorisiert. Ein Vorteil wäre dennoch zu nennen: cpio verzweifelt nicht an beschädigten Archiven und vermag zumindest den unversehrten Teil komplett wieder herzustellen.

cpio MODUS [ OPTIONEN ]

cpio kennt drei Betriebsarten: * copy in zum Extrahieren von Dateien aus einem Archiv: Option -i

  • copy out zum Erzeugen eines Archivs: Option -o
  • pass througth als Kombination aus den obigen Modi erlaubt das Kopieren ganzer Verzeichnisbäume: Option -p

Volles und inkrementelles Backup

Um Dateien in einem cpio-Archiv zu speichern, müssen deren Namen dem Kommando mitgeteilt werden. cpio erwartet allerdings, dass jeder Dateiname auf einer neuen Zeile erscheint. Deshalb füttert man das Kommando am einfachsten über eine Pipe:

user@sonne> ls *.txt | cpio -o > /dev/fd0

11 blocks

Das Beispiel sichert alle auf ".txt" endenden Dateien des aktuellen Verzeichnisses auf die Diskette. Die Ausgabeumleitung ist wichtig, da sonst die Dateiinhalte auf dem Bildschirm landen würden.

Hiermit kennen Sie nun das Prinzip des Backups mit cpio ; zur Implementierung eines inkrementellen Backups bietet sich die Nutzung der Möglichkeiten des Kommandos [../../../../index.php/Linuxfibel_-_Nutzerkommandos_-_Datei_%26_Verzeichnis#find_-_Dateien_suchen find ]an, mit dem nach den verschiedensten Kriterien nach Dateien gefahndet werden kann. So archiviert der Aufruf von:

user@sonne> find /etc -maxdepth 2 -depth | cpio -o > /dev/fd0

319 blocks

alle Dateien aus dem Verzeichnis /etc, wobei alle Unterverzeichnisse, nicht aber die darin befindlichen Unterverzeichnisse berücksichtigt werden. Die Option »-depth« von find bewirkt, dass der Name eines Verzeichnisses selbst erst nach den enthaltenden Daten ausgegeben wird. Bei eventuellem Zurückschreiben der Daten, wird nun der häufige Fehler verhindert, dass ein Verzeichnis mit »falschen« Zugriffsrechten erzeugt wurde und anschließend das Übertragen der Daten in dieses scheitert. Durch die hier gewählte Reihenfolge wird mit der ersten Datei aus dem Verzeichnis dieses mit den korrekten Rechten gesetzt (mit Rechten, die das Schreiben der Datei ermöglichen).

Im Sinne eines inkrementellen Backups ist aber sicher die Suche nach Dateien, die innerhalb einer bestimmten Zeitspanne geändert wurden, interessant. Der nächste Aufruf findet alle Dateien des Verzeichnisses /etc, deren Modifikationszeit nicht älter als 5 Tage ist:

# find /etc -mtime -5 -maxdepth 2 -depth | cpio -o > /dev/fd0

112 blocks

Überprüfung des Archives

Um sich eine Liste der Dateien eines Archives zu betrachten, ruft man das Kommando im »copy in«-Modus auf:

user@sonne> cpio -itvI /dev/fd0

-rw-r--r--   1 root     root          270 Aug 15 07:07 /etc/mtab
-rw-r--r--   1 root     root         2510 Aug 10 13:49 /etc/logfiles
-rw-r--r--   1 root     root        37911 Aug 15 07:06 /etc/ld.so.cache
-rw-r--r--   1 root     root          271 Aug 10 15:27 /etc/hosts.allow
-rw-r--r--   1 root     root         5762 Aug 10 15:27 /etc/inetd.conf
-rw-r--r--   1 root     root         3349 Aug 14 12:18 /etc/printcap
-rw-------   1 root     root           60 Aug 15 07:06 /etc/ioctl.save
-rw-r--r--   1 root     root         3799 Aug 15 09:10 /etc/XF86Config
-rw-------   1 root     root          512 Aug 15 07:07 /etc/ssh_random_seed
-rw-r--r--   1 root     root         3309 Aug 14 12:18 /etc/printcap.old
-rw-rw----   1 lp       lp           1244 Aug 14 12:05 /etc/apsfilterrc.ljet4
-rw-rw----   1 lp       lp           1261 Aug 14 12:37 /etc/apsfilterrc.lj4dith
-rw-r--r--   1 root     root           88 Aug 15 09:38 /etc/dumpdates
drwxr-xr-x  30 root     root            0 Aug 15 08:28 /etc
112 blocks

Die Option -t bewirkt die Anzeige des Archivinhalts und verhindert das Entpacken. -v bringt die Rechte der Dateien zum Vorschein und -I Archiv lässt cpio die Daten aus dem Archiv anstatt von der Standardeingabe lesen.

Ein Vergleich der Dateien im Archiv mit den Dateien im Verzeichnisbaum ist nicht direkt möglich. Hier kann nur ein Entpacken der Daten in ein separates Verzeichnis mit anschließendem Dateivergleich (zum Beispiel mit diff) helfen.

Recovery

Schließlich möchte man die Daten auch wieder zurückschreiben können. Hierzu ist cpio im »copy-in«-Modus wie folgt zu starten:

# cpio -id /etc/mtab < /dev/fd0

cpio: /etc/mtab not created: newer or same age version exists
112 blocks

Im Beispiel stellt cpio nur fest, dass die gewünschte Datei nicht älter ist als die im Archiv enthaltene Version. Also tut das Kommando nichts. -d erzwingt das Anlegen von Verzeichnissen, falls diese nicht schon existieren, die nachfolgende Angabe von zu rekonstruierenden Dateien kann entfallen, dann werden alle Dateien aus dem Archiv extrahiert.