Linux Deutsch

Dateien mit cpio archivieren und wiederherstellen

Lernen Sie cpio unter Linux kennen: Archive aus Dateilisten erstellen, Inhalte prüfen, sicher extrahieren, Verzeichnisbäume kopieren und mit gzip komprimieren.

cpio ist ein Unix-/Linux-Werkzeug zum Erzeugen, Lesen und Verarbeiten von Dateiarchiven. Ein Archiv fasst mehrere Dateien und Verzeichnisse in einem Datenstrom oder einer Datei zusammen. cpio liest Dateinamen üblicherweise aus der Standardeingabe und verarbeitet Archivdaten über die Standard-Ein- und -Ausgabe. Dadurch lässt es sich besonders gut mit find und Shell-Pipelines kombinieren.

cpio archiviert Daten, komprimiert sie aber standardmäßig nicht. Für eine kleinere Archivdatei wird der cpio-Datenstrom zusätzlich an ein Programm wie gzip weitergeleitet. Eine Einführung in Pipes und Umleitungen finden Sie im Thema Datenströme unter Linux.

Die drei Arbeitsmodi von cpio

Der Arbeitsmodus bestimmt, ob cpio ein Archiv schreibt, ein Archiv liest oder Dateien direkt kopiert. Die Modi werden mit -o, -i und -p ausgewählt.

ModusOptionEingabeAusgabeTypischer Zweck
Copy-out-oDateinamen über die StandardeingabeArchivdaten über die StandardausgabeDateien in ein Archiv schreiben
Copy-in-iArchivdaten über die StandardeingabeDateien im DateisystemArchiv lesen und extrahieren
Copy-pass-pDateinamen über die StandardeingabeDateien in ein ZielverzeichnisVerzeichnisbaum ohne Zwischenarchiv kopieren

Dateilisten mit find erzeugen

find ist für rekursive Dateiauswahl die zuverlässige Standardwahl. Es berücksichtigt Unterverzeichnisse, versteckte Dateien und Dateinamen, die nicht in eine einfache Tabellen- oder Zeilendarstellung passen. ls ist für Menschen nützlich, aber als Quelle für maschinell weiterverarbeitete Dateinamen problematisch: Leerzeichen, Zeilenumbrüche, Tabulatoren und Sonderzeichen können die Liste verfälschen.

Die Ausgabe von find wird mit einer Pipe an cpio übergeben:

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

Das Zeichen | verbindet die Standardausgabe von find mit der Standardeingabe von cpio. Im Copy-out-Modus schreibt cpio seinen Archivstrom auf die Standardausgabe. Die Umleitung > speichert diesen Strom in archiv.cpio.

Archive im Copy-out-Modus erstellen

Das aktuelle Verzeichnis archivieren

Mit diesem Befehl werden das aktuelle Verzeichnis, seine Unterverzeichnisse und die darin enthaltenen Dateien ausgewählt:

find . -print | cpio -ov > archiv.cpio
  • -o aktiviert den Copy-out-Modus.
  • -v steht für „verbose“ und listet verarbeitete Einträge sichtbar auf.
  • find . liefert relative Pfade, die mit . beginnen.

Relative Pfade sind beim späteren Entpacken meist sicherer und leichter kontrollierbar als absolute Pfade. Die Archivstruktur beschreibt dann beispielsweise ./berichte/mai.txt statt eines festen Systempfads.

Ein bestimmtes Verzeichnis archivieren

Ein konkretes Verzeichnis kann direkt an find übergeben werden:

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

Dieser Befehl verwendet absolute Pfade. Je nach cpio-Variante und Extraktionsoptionen können solche Pfade beim Wiederherstellen zu unerwarteten Zielorten führen oder aus Sicherheitsgründen speziell behandelt werden. Für ein kontrollierteres, portables Archiv wechseln Sie häufig zunächst in das übergeordnete Verzeichnis:

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

So enthält das Archiv relative Namen wie example_dir/datei.txt. Ob das Verzeichnis selbst oder nur sein Inhalt archiviert wird, hängt vom Startpunkt der Dateiliste ab: find example_dir liefert den Eintrag example_dir und darunter den gesamten Baum; cd example_dir && find . liefert dagegen den Inhalt unterhalb von ..

Archive prüfen und im Copy-in-Modus wiederherstellen

Inhalt vor dem Entpacken anzeigen

Prüfen Sie ein Archiv vor der Wiederherstellung. Die Optionen -i und -t lesen den Archivstrom und listen seine Einträge auf; -v ergänzt Details wie Dateirechte und Größen:

cpio -itv < archiv.cpio

Die Eingabeumleitung < liefert die Archivdatei an die Standardeingabe von cpio. Achten Sie bei der Prüfung besonders auf absolute Pfade, unerwartete Verzeichnisse und Dateinamen, die außerhalb des vorgesehenen Zielbaums wirken.

In ein Testverzeichnis extrahieren

Legen Sie für einen ersten Test ein leeres Zielverzeichnis an und wechseln Sie hinein:

mkdir -p /tmp/cpio-test
cd /tmp/cpio-test
cpio -iv < /pfad/zu/archiv.cpio

-i aktiviert den Copy-in-Modus. cpio liest die Archivdaten und legt die enthaltenen Einträge relativ zum aktuellen Arbeitsverzeichnis an. Das Ziel muss bewusst gewählt werden; ein blindes Entpacken in ein Produktivverzeichnis kann vorhandene Dateien überschreiben oder unerwünschte Pfade erzeugen.

Je nach cpio-Implementierung und Optionen können vorhandene Dateien ersetzt werden. Sichern Sie wichtige Daten vorher und testen Sie die Extraktion zunächst in einem leeren Verzeichnis. Einzelne Pfade lassen sich bei vielen Implementierungen über Muster als zusätzliche Argumente auswählen; prüfen Sie dafür man cpio der installierten Variante.

Dateien im Copy-pass-Modus kopieren

Der Copy-pass-Modus verbindet Lesen und Schreiben direkt: cpio erzeugt keine Archivdatei auf dem Datenträger. Die Dateinamen kommen wie beim Copy-out-Modus aus der Standardeingabe, das Zielverzeichnis wird als Argument angegeben.

find . -print | cpio -pvd /home/bob/new_directory
  • -p aktiviert Copy-pass.
  • -v zeigt die kopierten Einträge an.
  • -d legt benötigte Zielverzeichnisse an.
  • /home/bob/new_directory ist das Ziel und muss je nach Variante vorher existieren oder vorbereitet werden.

Die Quelldateien bleiben unverändert erhalten. Im Vergleich zu einem einfachen cp-Aufruf können Metadaten wie Zeitstempel, Berechtigungen und Eigentümer mit geeigneten cpio-Optionen besser erhalten werden. Das hängt jedoch von den verwendeten Optionen, den Rechten des ausführenden Benutzers, der Benutzerkennung sowie dem Ziel-Dateisystem ab. Für Eigentümerinformationen sind häufig administrative Rechte erforderlich.

Wichtige Optionen

OptionBedeutungVerwendeter ModusHinweis
-oCopy-outArchiv erstellenArchivstrom wird typischerweise auf stdout geschrieben
-iCopy-inArchiv lesen und extrahierenArchivstrom kommt typischerweise von stdin
-pCopy-passDirekt kopierenZielverzeichnis folgt als Argument
-vAusführliche AusgabeAlle ModiHilfreich zur Kontrolle
-tArchivinhalt auflistenCopy-inPrüft den Inhalt ohne reguläre Extraktion
-dVerzeichnisse anlegenVor allem Copy-in und Copy-passWichtig für verschachtelte Zielpfade
-mZeitstempel erhaltenJe nach VarianteRechte und Eigentümer hängen zusätzlich von Rechten und Systemumgebung ab

Komprimierte cpio-Archive

Archivierung und Komprimierung sind zwei getrennte Schritte. cpio bündelt die Dateieinträge; gzip verkleinert anschließend den erzeugten Datenstrom.

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

Beim Wiederherstellen wird zuerst dekomprimiert. gzip -dc schreibt die dekomprimierten Daten auf die Standardausgabe, die danach an cpio weitergereicht werden:

gzip -dc archiv.cpio.gz | cpio -iv
AufgabeBefehlsbausteineErgebnisWichtiger Sicherheitshinweis
Archivierenfind ... | cpio -oUnkomprimierter cpio-DatenstromDateiliste und Pfade vorher prüfen
Komprimieren| gzip > archiv.cpio.gzGzip-komprimierte ArchivdateiKomprimierung ersetzt keine Inhaltsprüfung
Wiederherstellengzip -dc ... | cpio -iDateien im aktuellen ZielverzeichnisIn ein leeres Testverzeichnis extrahieren

Endungen wie .cpio und .cpio.gz sind Konventionen. Sie erzwingen nicht den tatsächlichen Inhalt. Entscheidend ist, ob die Daten wirklich ein cpio-Archiv beziehungsweise ein gzip-komprimierter cpio-Datenstrom sind.

Problematische Dateinamen sicher verarbeiten

Eine zeilenbasierte Dateiliste kann bei Dateinamen mit Zeilenumbrüchen, Leerzeichen oder bestimmten Sonderzeichen mehrdeutig sein. Verwenden Sie nicht die Ausgabe von ls, wenn die Namen an ein weiteres Programm übergeben werden sollen.

find kann Namen mit -print0 durch ein Nullbyte trennen. Eine passende cpio-Option muss diese Eingabe ebenfalls erwarten:

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

Die genaue Schreibweise und Verfügbarkeit von --null unterscheidet sich je nach cpio-Implementierung. Prüfen Sie daher cpio --help oder man cpio. Beide Seiten der Pipeline müssen dieselbe Trennmethode verwenden.

find . berücksichtigt normalerweise auch versteckte Dateien und Unterverzeichnisse. Symbolische Links werden als Einträge ausgewählt; ob ihr Ziel verfolgt wird, hängt von den find-Optionen ab. Ohne bewusst gesetzte Optionen sollte ein Link nicht automatisch als kompletter Zielbaum verstanden werden. Prüfen Sie die Auswahl mit einer Liste, bevor Sie ein Backup erstellen.

Sicher und nachvollziehbar arbeiten

  1. Erstellen Sie die Dateiliste bewusst und verwenden Sie für rekursive Auswahl bevorzugt find.
  2. Nutzen Sie relative Pfade, wenn das Archiv portabel und kontrolliert wiederherstellbar sein soll.
  3. Listen Sie das Archiv mit cpio -itv auf, bevor Sie es extrahieren.
  4. Verwenden Sie zunächst ein leeres Testverzeichnis.
  5. Prüfen Sie nach der Extraktion Dateien, Verzeichnisstruktur, Berechtigungen und Zeitstempel.
  6. Berücksichtigen Sie, dass Eigentümer, spezielle Dateitypen und Metadaten ausreichende Rechte und passende Unterstützung durch das Ziel-Dateisystem benötigen.

Ein nicht vertrauenswürdiges Archiv sollte niemals unkritisch in ein wichtiges Verzeichnis extrahiert werden. Archivpfade können unerwartete Namen oder Strukturen enthalten. Die Inhaltsliste, ein isoliertes Testziel und eine gezielte Auswahl reduzieren das Risiko. Bei Backups empfiehlt sich zusätzlich eine Testextraktion in ein separates Verzeichnis.

Fehlerbehebung

Dateien erscheinen am falschen Ort

Prüfen Sie zunächst die Pfade:

cpio -itv < archiv.cpio

Absolute Pfade oder ein unerwarteter gemeinsamer Präfix können die Ursache sein. Erstellen Sie neue Archive möglichst aus einem passenden übergeordneten Verzeichnis mit relativen Namen und extrahieren Sie zum Test in ein leeres Ziel.

Sonderzeichen und Leerzeichen werden falsch behandelt

Wurde ls oder eine normale zeilenbasierte Liste verwendet, ersetzen Sie sie durch find -print0 und eine unterstützte Nullterminierungsoption wie --null. Kontrollieren Sie die installierte cpio-Variante mit der Hilfe oder der Manpage.

Berechtigungen oder Eigentümer fehlen

Die Wiederherstellung kann durch fehlende Rechte, andere Benutzer- und Gruppenkennungen oder Einschränkungen des Ziel-Dateisystems begrenzt sein. Arbeiten Sie gegebenenfalls mit geeigneten administrativen Rechten und prüfen Sie die verfügbaren Metadatenoptionen der installierten Version.

Unterverzeichnisse fehlen beim Copy-pass-Kopieren

Stellen Sie sicher, dass find auch die Verzeichniseinträge liefert, und verwenden Sie -d:

find . -print | cpio -pvd /home/bob/new_directory

Das Archiv ist unerwartet groß

cpio komprimiert nicht selbst. Leiten Sie den Archivstrom an gzip oder ein anderes Kompressionsprogramm weiter und prüfen Sie danach die tatsächliche Archivstruktur.

Vorhandene Dateien wurden überschrieben

Das Zielverzeichnis enthielt wahrscheinlich gleichnamige Einträge. Extrahieren Sie künftig zuerst in ein leeres Testziel, sichern Sie bestehende Daten und verwenden Sie bei Bedarf gezielte Extraktionsmuster.

Prüfungsrelevante Zusammenfassung

  • cpio -o schreibt ausgewählte Dateinamen als Archiv.
  • cpio -i liest ein Archiv und extrahiert es in das aktuelle Zielverzeichnis.
  • cpio -p kopiert direkt in ein Zielverzeichnis und erzeugt keine Archivdatei.
  • find ist für rekursive und zuverlässige Dateiauswahl geeigneter als ls.
  • cpio komprimiert nicht automatisch; gzip wird separat in einer Pipeline verwendet.
  • Relative Pfade, Inhaltslisten und Testextraktionen machen Archivierung und Wiederherstellung kontrollierbarer.

Für den Vergleich mit einem anderen verbreiteten Archivierungswerkzeug lesen Sie auch Dateien mit tar archivieren. Grundlagen zu Zugriffsrechten finden Sie unter Arten von Zugriffsrechten unter Linux.