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.
| Modus | Option | Eingabe | Ausgabe | Typischer Zweck |
|---|---|---|---|---|
| Copy-out | -o | Dateinamen über die Standardeingabe | Archivdaten über die Standardausgabe | Dateien in ein Archiv schreiben |
| Copy-in | -i | Archivdaten über die Standardeingabe | Dateien im Dateisystem | Archiv lesen und extrahieren |
| Copy-pass | -p | Dateinamen über die Standardeingabe | Dateien in ein Zielverzeichnis | Verzeichnisbaum 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
-oaktiviert den Copy-out-Modus.-vsteht 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
-paktiviert Copy-pass.-vzeigt die kopierten Einträge an.-dlegt benötigte Zielverzeichnisse an./home/bob/new_directoryist 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
| Option | Bedeutung | Verwendeter Modus | Hinweis |
|---|---|---|---|
-o | Copy-out | Archiv erstellen | Archivstrom wird typischerweise auf stdout geschrieben |
-i | Copy-in | Archiv lesen und extrahieren | Archivstrom kommt typischerweise von stdin |
-p | Copy-pass | Direkt kopieren | Zielverzeichnis folgt als Argument |
-v | Ausführliche Ausgabe | Alle Modi | Hilfreich zur Kontrolle |
-t | Archivinhalt auflisten | Copy-in | Prüft den Inhalt ohne reguläre Extraktion |
-d | Verzeichnisse anlegen | Vor allem Copy-in und Copy-pass | Wichtig für verschachtelte Zielpfade |
-m | Zeitstempel erhalten | Je nach Variante | Rechte 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
| Aufgabe | Befehlsbausteine | Ergebnis | Wichtiger Sicherheitshinweis |
|---|---|---|---|
| Archivieren | find ... | cpio -o | Unkomprimierter cpio-Datenstrom | Dateiliste und Pfade vorher prüfen |
| Komprimieren | | gzip > archiv.cpio.gz | Gzip-komprimierte Archivdatei | Komprimierung ersetzt keine Inhaltsprüfung |
| Wiederherstellen | gzip -dc ... | cpio -i | Dateien im aktuellen Zielverzeichnis | In 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
- Erstellen Sie die Dateiliste bewusst und verwenden Sie für rekursive Auswahl bevorzugt
find. - Nutzen Sie relative Pfade, wenn das Archiv portabel und kontrolliert wiederherstellbar sein soll.
- Listen Sie das Archiv mit
cpio -itvauf, bevor Sie es extrahieren. - Verwenden Sie zunächst ein leeres Testverzeichnis.
- Prüfen Sie nach der Extraktion Dateien, Verzeichnisstruktur, Berechtigungen und Zeitstempel.
- 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 -oschreibt ausgewählte Dateinamen als Archiv.cpio -iliest ein Archiv und extrahiert es in das aktuelle Zielverzeichnis.cpio -pkopiert direkt in ein Zielverzeichnis und erzeugt keine Archivdatei.findist für rekursive und zuverlässige Dateiauswahl geeigneter alsls.- cpio komprimiert nicht automatisch;
gzipwird 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.