Wie würden Sie den Befehl cpio verwenden?


7

Während des Studiums für die lpic-Prüfung bin ich auf den Befehl gestoßen cpio.

Die Beschreibung von cpio lautet:

Cpio wurde ursprünglich entwickelt, um Archive von Sicherungsdateien sequentiell und zusammenhängend auf einem Bandgerät zu speichern. Cpio komprimiert keine Inhalte, aber die resultierenden Archive werden häufig mit gzip oder anderen externen Kompressoren komprimiert.

Wenn ich mir Beispiele für die Verwendung von cpio ansehe, kann ich kein einziges Szenario finden, in dem cpio besser wäre als gängigere Tools wie tar.

Was ist ein Beispiel für die Verwendung cpio(neben Bandsicherungen) oder ist es auf heutigen Systemen nicht mehr relevant?


3
Ich habe mich das immer selbst gefragt. Ich weiß jedoch, dass derzeit häufig Linux-Kernel-Initramfs-Images verwendet werden. Initramfs ist ebenfalls eine relativ neue Erweiterung des Kernels, daher ist es für heutige Systeme immer noch relevant.
Patrick

Sie haben Bandsicherungen ausgeschlossen, jedoch keine Diskettenabbilder. Ich fand es in einem Fall nützlich, in dem nichts anderes funktionierte!

Antworten:


5

Es ist immer noch relevant für das Auspacken von RPMs. Es gibt ein rpm2cpioDienstprogramm, das ein RPM-Paket in ein cpioArchiv konvertiert . Soweit ich weiß, gibt es nichts, was eine RPM in ein tarArchiv konvertieren könnte . Hier ist ein Anwendungsbeispiel:

rpm2cpio myrpmfile.rpm | cpio -idmv

2
Dies ist zwar richtig, deckt aber nicht wirklich den Hauptteil der Frage ab, warum cpio besser ist als Teer. Dies führt nur zu einer anderen Frage: Warum gibt es kein Dienstprogramm rpm2tar? Verwendet RPM cpio intern? Wenn ja, warum haben sie es gegenüber tar ausgewählt?
Patrick

3
RPM basiert teilweise aufcpio . Es wird rpm2cpioalso nur eine Extraktionsfunktion ausgeführt, keine Konvertierung. Deshalb gibt es keine rpm2tar.
Warren Young

2

Wenn Ihr System kein GNU-Tar mit der -TOption und --null hat cpio, können Sie eine bestimmte Teilmenge von Dateien in ein Tar-Archiv aufnehmen:

find . -name CVS -prune -o -print0 | cpio -o -Hustar > all.tar

Ich finde auch den -V/ --dotviel informativer über den Fortschritt als den ausführlichen Modus (in taroder cpio) in Fällen, in denen Sie grob wissen, wie viele Dateien Sie packen müssen (vorausgesetzt, Sie wissen, wie lang Ihr Terminal ist und in meinem Fall gut sind) mit der Multiplikationstabelle von 80).

Es gibt immer mehrere Lösungen für dasselbe Problem. Da cpioSie tarArchive lesen können, können Sie auch auf Teer verzichten und einfach cpioüberall verwenden.


find hat keinen primären Aufruf -print0und cpio kann die Ausgabe von nicht verstehen gfind -print0.
schily

2

cpioFrüher hatte die Verwendung einen Vorteil, aber diese spezielle Funktion ist beispielsweise in gcpio nicht implementiert. Ich spreche von der Tatsache, dass die ursprüngliche Implementierung von AT & T cpio die Dateiextraktion auf eine bestimmte Art installund Weise implementiert hat, die der Funktionsweise ähnelt. Aus diesem Grund hat AT & T die Verwendung von cpio zur Installation von Binärdateien auf einem Live-System bevorzugt.

Wenn Sie starunter dem Namen aufrufen cpio, erhalten Sie diese Funktion, und wenn Sie die Option -installzu den Optionen für das starExtrahieren von Dateien hinzufügen , erhalten Sie dieses Verhalten.

Übrigens: Das CPIO-Archivformat wird von POSIX nicht mehr als nützliches Format angesehen, da es nicht erweiterbar ist. Die vier "Varianten" des CPIO-Formats sind vollständig inkompatibel und jedes Mal, wenn eine Erweiterung benötigt wurde, wurde eine völlig neue / inkompatible Variante des CPIO-Formats erstellt.


1

tar verwendet die ustar- Archivdefinition, die die Pfadnamenlänge auf 100 Byte begrenzt. Tief verschachtelte Hierarchien - heutzutage keine Seltenheit - können nicht mit tar archiviert werden. cpio hat dieses Handicap nicht.

Ich bevorzuge pax (1). Wie cpio nutzt pax die Standardeingabe und -ausgabe besser als tar. pax kann das cpio-Format verwenden. Wenn Sie also das Pfadnamenlimit überschreiten, können Sie dasselbe Dienstprogramm weiterhin verwenden, indem Sie dem Befehl -x cpio hinzufügen . Sie verwenden diese Option nur zum Erstellen von Archiven. Beim Lesen erkennt pax das Format automatisch.


1
GNU Teer hat keine solche Grenze.
Psusi

Das Limit gehört zur Dateiformatdefinition, nicht zum Dienstprogramm. Bitte beachten Sie char name[100]in der GNU-Teerdokumentation .
James K. Lowden

Nun, sie haben es irgendwie umgangen, weil ich gerade eine 108-stellige Datei namens file erstellt habe und tar damit gut zurechtkommt.
Psusi

Nicht korrekt, das einzige standardisierte CPIO-Format unterstützt eine maximale Dateinamenlänge von 255 Zeichen, während das standardisierte TAR-Archivformat eine unbegrenzte Dateinamenlänge aufweist.
schily

1

Ich kann kein einziges Szenario finden, in dem cpio besser wäre als gängigere Tools wie tar.

Hier ist eine, die ich zuvor gelernt habe rsyncund cp -rexistierte:

$ find /foo -print | cpio -pud /bar

Dies kopiert alle Dateien in /fooin der /barKonservierung alle Dateiberechtigungen und Verzeichnisstruktur.

Dazu müssen tarSie eine temporäre Archivdatei erstellen und diese dann erneut entpacken, da tardieser Durchgangsfiltermodus nicht vorhanden ist.


Nicht korrekt, Sie sind korrekt für die historische UNIX-Tar-Implementierung, aber nicht, starda star eine -copy-Option unterstützt und in der Lage ist, Kopien effizienter als cpio zu erstellen.
schily

@schily: Bei dieser Frage geht es nicht um Stern, sondern um Teer. Das OP hat die Tür zur Installation von Tools von Drittanbietern nicht geöffnet.
Warren Young

Soweit ich weiß, ist auf jedem Systemadministrator, der häufig Teer verwendet, ohnehin ein Stern installiert. Wenn Sie glauben, dass das OP Linux verwendet, müssen wir die Benutzer nachdrücklich dazu ermutigen, "cpio" auf dieser Plattform nicht zu verwenden, da es normalerweise gcpioals cpio unter Linux installiert ist und gcpio leider eine Implementierung mit vielen Problemen ist.
schily

@schily: Einer von uns lebt in einer Blase und ich bin mir ziemlich sicher, dass ich es nicht bin. Ich habe in einem Vierteljahrhundert unter Unix noch nie Sterne verwendet. Es ist nicht standardmäßig unter RHEL / CentOS, Solaris, Ubuntu Server, FreeBSD oder OS X installiert. Für die meisten von ihnen ist es nicht einmal auf dem Standardpaket-Repo. Das deckt einen großen Teil der heutigen sysadmin-zentrierten Unix-Welt ab. In der Zwischenzeit haben Sie das Ding geschrieben, also ist es natürlich auf allen Ihren Boxen installiert.
Warren Young

Star wurde lange Zeit auf den meisten Linux-Distributionen installiert und ist die älteste kostenlose Tar-Implementierung. Wenn Sie star nicht kennen, haben Sie in den letzten 20 Jahren anscheinend nicht nach installierten Alternativen gesucht. Aufgrund verschiedener Probleme mit gtar vermeide ich gtar wo immer möglich und viele Leute, die star kennen, tun dasselbe. Es ist also Sache des Lesers, zu entscheiden, wer eine Blase ist.
schily

0

Ich benutze cpio seit vielen Jahren und tue es immer noch. Es hat mich viele Male bei der Wiederherstellung ohne umfassende Linux / Unix-Kenntnisse gerettet.

Beispiel Ich habe einen Ubuntu 17.04LTS-Server installiert und aktualisiere meine Dateien regelmäßig, um sie mit ca. cpio zu sichern. jeden Monat mit einem externen USB 500Gb-Laufwerk.

Ich mounte das Backup-Laufwerk als solches:

mount /dev/sdb1 /BACKUP 

Stellen Sie sicher, dass Sie in Ihrem Stammverzeichnis einen Ordner mit dem Namen BACKUP als Einhängepunkt erstellt haben, und verwenden Sie den folgenden Befehl.

mount /dev/sdb1 /BACKUP    

Stellen Sie dfsicher, dass es montiert ist. Dann , cd /BACKUPund erstellen Sie einen Ordner namens Ubuntu_Backup_17.04LTS.

cd /Überprüfen Sie dann , ob Sie sich in / befinden, bevor Sie den cpio-Prozess mit pwd starten, und führen Sie dann den folgenden Befehl aus:

find . -mount -print | cpio -pdumv /BACKUP/Ubuntu_Backup_17.04LTS

Dadurch werden alle Dateien und Ordner aus dem ROOT-Verzeichnis kopiert, mit Ausnahme des Mountpunkt-Backups.

Wenn Sie nach Abschluss des Vorgangs zu /BACKUP/Ubuntu_Backup_17.04LTS gehen und die Dateien und Ordner auflisten, sehen Sie, dass diese genau mit Ihrer ROOT-Laufwerksliste übereinstimmen.

Die Wiederherstellung ist genau das gleiche. Es kann sich um eine vollständige Wiederherstellung eines Ordners wie / etc handeln.

Beispiel:

cd /BACKUP/Ubuntu_Backup_17.04LTS

und das Gegenteil ausführen;

find . -mount -print | cpio -pdumv /  

oder für einen Ordner / etc) wäre der Befehl

find /etc -mount -print | cpio -pdumv /  

Dadurch wird der Ordner / etc aus dem Backup nach / zur Wiederherstellung kopiert.

Dadurch werden alle Dateien und Ordner zurück nach / partition kopiert und anschließend neu gestartet. Es ist sehr praktisch, wenn ein Update schrecklich schief geht.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.