VMware ESXi and vSphere Cluster Management

Dateien mit cpio archivieren, entpacken und kopieren

Lerne, wie du mit cpio Dateiarchive erstellst, entpackst und Verzeichnisbäume kopierst. Mit find, gzip, relativen Pfaden und sicheren Dateilisten.

cpio ist ein Kommandozeilenprogramm für Unix- und Linux-Systeme. Es kann Dateien aus einer Dateiliste in ein Archiv schreiben, ein Archiv auslesen und Dateien direkt in ein anderes Verzeichnis kopieren. Die Dateinamen erhält cpio normalerweise über die Standardeingabe, häufig aus find und einer Pipe.

Ein Archiv fasst mehrere Dateien und Verzeichnisse in einem Datenstrom oder einer Datei zusammen. Archivierung und Komprimierung sind dabei zwei verschiedene Aufgaben: cpio erstellt das Archiv, komprimiert dessen Inhalt aber üblicherweise nicht. Für die Komprimierung wird häufig gzip nachgeschaltet.

Die drei Betriebsarten von cpio

Die Betriebsart wird durch eine Hauptoption ausgewählt. Die drei wichtigsten Modi sind Copy-out, Copy-in und Copy-pass.

ModusHauptoptionEingabeAusgabeTypischer Einsatzzweck
Copy-out-oDateinamen über die StandardeingabeArchiv über die StandardausgabeEin Archiv erstellen
Copy-in-iArchiv über die StandardeingabeDateien im DateisystemEin Archiv entpacken oder wiederherstellen
Copy-pass-pDateinamen über die StandardeingabeDateien in ein ZielverzeichnisDateien ohne Zwischenarchiv kopieren

Standarddatenströme, Pipe und Umleitung

Die Standardeingabe ist der Datenstrom, aus dem ein Programm liest. Die Standardausgabe ist der Datenstrom, in den es schreibt. Eine Pipe mit | verbindet die Ausgabe eines Befehls mit der Eingabe des nächsten Befehls. Mit > wird Ausgabe in eine Datei geschrieben, mit < wird Eingabe aus einer Datei gelesen.

  • find . -print | cpio -o: Dateinamen gehen über eine Pipe an cpio.
  • cpio -o > archiv.cpio: der Archivdatenstrom wird in eine Datei umgeleitet.
  • cpio -i < archiv.cpio: cpio liest den Archivdatenstrom aus einer Datei.

Copy-out: Archive erstellen

Der Copy-out-Modus wird mit -o aktiviert. cpio erhält eine Liste von Pfadnamen und schreibt daraus ein Archiv auf die Standardausgabe. Die rekursive Auswahl von Dateien übernimmt nicht cpio selbst, sondern typischerweise find.

Das aktuelle Verzeichnis archivieren

find . -print | cpio -ov > archiv.cpio
  • find . -print sucht ab dem aktuellen Verzeichnis rekursiv und gibt die gefundenen Pfade aus.
  • -o aktiviert Copy-out.
  • -v steht für „verbose“ und zeigt die verarbeiteten Pfade an.
  • > archiv.cpio speichert den Archivdatenstrom in der Datei archiv.cpio.

Da die Suche bei . beginnt, werden auch Unterverzeichnisse und normalerweise versteckte Dateien unterhalb des aktuellen Verzeichnisses berücksichtigt. Vor dem eigentlichen Archivieren kannst du die Dateiliste prüfen:

find . -print

Ein bestimmtes Verzeichnis archivieren

find /home/bob/example_dir -print | cpio -ov > example_dir.cpio

Hier enthält die Dateiliste absolute Pfade wie /home/bob/example_dir/datei.txt. Die gespeicherte Pfadstruktur beeinflusst später, wo Dateien beim Entpacken angelegt werden. Für besser übertragbare Archive ist es oft sinnvoll, zuerst in das Quellverzeichnis zu wechseln und relative Pfade zu verwenden:

cd /home/bob/example_dir && find . -print | cpio -ov > example_dir.cpio

Dann beginnen die Archivpfade mit . statt mit dem vollständigen absoluten Quellpfad. Das erleichtert die Wiederherstellung in einem bewusst gewählten Zielordner.

Nur bestimmte Dateien aufnehmen

find kann die Dateiliste filtern. Das folgende Beispiel nimmt nur Dateien mit der Endung .log auf:

find . -type f -name '*.log' -print | cpio -ov > logs.cpio

Die Anführungszeichen um das Suchmuster verhindern, dass die Shell das Muster vor der Ausführung von find selbst erweitert.

Copy-in: Archive wiederherstellen

Der Copy-in-Modus wird mit -i aktiviert. cpio liest die Archivdaten aus der Standardeingabe und legt die enthaltenen Dateien im aktuellen Zielverzeichnis an.

In einen Wiederherstellungsordner entpacken

mkdir -p ~/wiederherstellung
cd ~/wiederherstellung
cpio -iv < archiv.cpio
  • -i aktiviert Copy-in.
  • -v zeigt die entpackten Pfade an.
  • < archiv.cpio liefert die Archivdatei über die Standardeingabe.

Der Extraktionsort ist das Verzeichnis, in dem der Befehl ausgeführt wird. Deshalb solltest du vor dem Entpacken entweder in den gewünschten Zielordner wechseln oder diesen bewusst anlegen. Die im Archiv gespeicherten Pfade werden unterhalb dieses Ortes ausgewertet. Ein Archiv mit relativen Pfaden wie ./docs/bericht.txt erzeugt beispielsweise einen Pfad unterhalb des aktuellen Verzeichnisses. Absolute oder unerwartet strukturierte Pfade können dagegen zu überraschenden Zielorten führen.

Bei Archiven mit verschachtelten Verzeichnissen ist je nach cpio-Implementierung die Option -d nützlich, damit benötigte Zielverzeichnisse automatisch angelegt werden:

mkdir -p ~/wiederherstellung
cd ~/wiederherstellung
cpio -idv < archiv.cpio

Vor einer Wiederherstellung in ein wichtiges Verzeichnis solltest du den Inhalt und die Pfade des Archivs kontrollieren und möglichst in einem Testordner arbeiten.

Copy-pass: Verzeichnisinhalte direkt kopieren

Der Copy-pass-Modus wird mit -p aktiviert. Er liest eine Dateiliste und schreibt die Dateien direkt in ein angegebenes Zielverzeichnis. Es entsteht keine Archivdatei.

cd /home/bob/example_dir && find . -print | cpio -pvd /home/bob/new_directory
  • -p aktiviert Copy-pass.
  • -v zeigt die verarbeiteten Dateien an.
  • -d legt notwendige Zielverzeichnisse an.
  • /home/bob/new_directory ist das Zielargument.

Die Originaldateien bleiben erhalten. Durch den Wechsel in das Quellverzeichnis liefert find relative Namen. Dadurch wird nicht automatisch der gesamte absolute Pfad /home/bob/example_dir unter dem Ziel nachgebildet.

Gegenüber einem einfachen rekursiven cp kann cpio bei geeigneten Optionen und ausreichenden Rechten Dateiattribute wie Zugriffsrechte und Zeitstempel genauer übernehmen. Für eine vollständige Übernahme von Eigentümern sind jedoch normalerweise administrative Rechte erforderlich. Das Ziel-Dateisystem kann außerdem bestimmte Attribute nicht unterstützen.

Dateiattribute und Metadaten

Metadaten sind Eigenschaften einer Datei, nicht ihr eigentlicher Inhalt. Dazu gehören insbesondere:

  • Eigentümer und Gruppe
  • Zugriffsrechte, zum Beispiel Lesen, Schreiben und Ausführen
  • Zeitstempel, etwa die Änderungszeit

Bei einer Wiederherstellung können diese Informationen entscheidend sein. Falsche Berechtigungen können Programme unbrauchbar machen oder vertrauliche Dateien zu weit öffnen. Falsche Eigentümer können bei Systemdateien, Webanwendungen oder Benutzerverzeichnissen zu Zugriffsproblemen führen. Zeitstempel sind beispielsweise für Build-Systeme, Synchronisation und Änderungsprüfungen relevant.

Die Erhaltung ist nicht grenzenlos garantiert: Ein nicht privilegierter Benutzer darf fremde Eigentümer meist nicht setzen, und manche Dateisysteme unterstützen bestimmte Unix-Eigenschaften nicht. Prüfe nach einer wichtigen Wiederherstellung daher Eigentümer, Rechte und Zeitstempel mit Werkzeugen wie ls -l und stat.

Sicherer Umgang mit Pfaden und Dateilisten

Relative und absolute Pfade

Ein absoluter Pfad beginnt mit / und beschreibt einen Ort unabhängig vom aktuellen Verzeichnis, etwa /home/bob/example_dir. Ein relativer Pfad wird vom aktuellen Verzeichnis aus aufgelöst, etwa ./docs/bericht.txt.

Für Archive sind relative Pfade oft portabler. Wechsle dazu in das Quellverzeichnis und starte find mit .. Beim Entpacken kannst du anschließend den Zielordner selbst festlegen.

Warum find besser als ls geeignet ist

ls ist für die Anzeige auf dem Bildschirm gedacht, nicht für zuverlässige maschinenlesbare Dateilisten. Leerzeichen, Zeilenumbrüche, Steuerzeichen und besondere Dateinamen können die Ausgabe mehrdeutig machen. find ist für Such- und Verarbeitungsaufgaben besser geeignet und kann die Liste rekursiv sowie anhand von Typ, Namen oder anderen Kriterien erzeugen.

Dateinamen mit Sonderzeichen

Eine zeilengetrennte Liste kann bei Dateinamen mit Zeilenumbrüchen problematisch sein. Für solche Fälle erzeugt find -print0 eine NUL-getrennte Liste. Eine passende cpio-Option ist in vielen Implementierungen -0:

find . -print0 | cpio -0ov > archiv.cpio

NUL ist ein Zeichen, das in Unix-Dateinamen nicht vorkommen darf, und eignet sich deshalb als eindeutiger Trenner. Prüfe mit man cpio, ob deine konkrete cpio-Implementierung -0 unterstützt und welche genaue Bezeichnung dafür gilt.

Komprimierte cpio-Archive

gzip komprimiert einen Datenstrom, während cpio die Archivstruktur erzeugt oder liest. Beide Schritte lassen sich mit Pipes verbinden. Die Endung .gz beschreibt die gzip-Komprimierung; sie sagt nicht allein aus, welches Archivformat sich darin befindet. .cpio.gz macht kenntlich, dass ein cpio-Datenstrom mit gzip komprimiert wurde.

Erstellen

find . -print | cpio -ov | gzip > archiv.cpio.gz

Die Daten fließen von find zu cpio und anschließend zu gzip. Erst gzip schreibt den komprimierten Datenstrom in die Datei.

Wiederherstellen

mkdir -p ~/wiederherstellung
cd ~/wiederherstellung
gunzip -c archiv.cpio.gz | cpio -idv

gunzip -c dekomprimiert nach stdout, ohne eine entpackte Zwischen-Datei anzulegen. cpio liest diesen Datenstrom im Copy-in-Modus.

Wichtige Befehlsbausteine und Optionen

BausteinBedeutungVerwendung im Beispiel
findRekursives Suchen und Ausgeben von Pfadnamenfind . -print
cpio -oCopy-out: Archiv schreibencpio -ov > archiv.cpio
cpio -iCopy-in: Archiv lesen und extrahierencpio -iv < archiv.cpio
cpio -pCopy-pass: direkt in ein Ziel kopierencpio -pvd ziel
-vVerarbeitete Pfade anzeigenBei Erstellung, Extraktion und Kopieren
>Standardausgabe in eine Datei umleiten> archiv.cpio
<Standardeingabe aus einer Datei lesen< archiv.cpio
|Ausgabe an den nächsten Befehl weiterleitenfind . -print | cpio -o
gzipDatenstrom komprimierencpio -o | gzip
gunzipgzip-Datenstrom dekomprimierengunzip -c archiv.cpio.gz

Fehlerbehebung

Das Archiv enthält nicht die erwarteten Dateien

Prüfe zuerst die Ausgabe von find ohne Pipe:

find . -print

Häufig wurde die Suche aus dem falschen Arbeitsverzeichnis gestartet oder durch einen Filter zu stark eingeschränkt. Für eine vollständige rekursive Auswahl ab dem aktuellen Verzeichnis ist find . ein geeigneter Ausgangspunkt.

Dateien werden an einem unerwarteten Pfad angelegt

Untersuche, ob das Archiv absolute Pfade oder eine unerwartete Verzeichnisstruktur enthält. Erstelle Archive bevorzugt nach einem Wechsel in das Quellverzeichnis mit relativen Namen. Wechsle beim Entpacken in einen eigens angelegten Zielordner und prüfe die Pfadstruktur dort zuerst.

Sonderzeichen werden fehlerhaft verarbeitet

Verwende nicht ls als Quelle für komplizierte Dateinamen. Nutze stattdessen find -print0 zusammen mit einer passenden NUL-Verarbeitung wie cpio -0. Prüfe die verfügbaren Optionen deiner Implementierung mit man cpio.

Eigentümer, Rechte oder Zeitstempel fehlen

Der ausführende Benutzer hat möglicherweise nicht die nötigen Rechte, oder das Ziel-Dateisystem unterstützt die Attribute nicht. Prüfe Berechtigungen und Dateisystem. Für systemweite Wiederherstellungen können geeignete administrative Rechte erforderlich sein.

Das Archiv ist größer als erwartet

cpio archiviert, komprimiert aber nicht automatisch. Verwende eine Pipeline mit gzip, wenn ein komprimiertes Archiv benötigt wird.

Copy-pass kann das Ziel nicht beschreiben

Lege das Ziel an oder verwende -d zum automatischen Erzeugen fehlender Verzeichnisse. Prüfe außerdem Schreibrechte und freien Speicherplatz:

mkdir -p /home/bob/new_directory
cd /home/bob/example_dir && find . -print | cpio -pvd /home/bob/new_directory

Prüfung und Merksätze

  • Copy-out: -o schreibt eine Dateiliste in ein Archiv.
  • Copy-in: -i liest ein Archiv aus stdin und extrahiert es am aktuellen Ort.
  • Copy-pass: -p kopiert eine Dateiliste direkt in ein Zielverzeichnis.
  • Die Dateiliste kommt häufig von find; cpio wählt Dateien nicht automatisch rekursiv aus.
  • Archivierung ist nicht dasselbe wie Komprimierung. Für Komprimierung kann gzip nachgeschaltet werden.
  • Ein Wechsel in das Quellverzeichnis vor find . erzeugt meist portablere relative Pfade.
  • Bei wichtigen Daten müssen auch Eigentümer, Berechtigungen, Zeitstempel, Benutzerrechte und die Fähigkeiten des Ziel-Dateisystems berücksichtigt werden.

Als weiterführende Übung kannst du ein kleines Verzeichnis mit find archivieren, das Archiv in einem leeren Testordner entpacken und anschließend die Dateiliste, Inhalte und Metadaten vergleichen. Eine thematisch passende Referenz ist Dateien mit cpio archivieren.