
Gestern habe ich einige Experimente gemacht anSlitaz. Es verwendet mehrere initrd.imgs zum Speichern von Dateien/Änderungen.
Ich wollte eines seiner initrd.gz-Images (ein CPIO-Archiv) in einen Ordner extrahieren, bearbeiten/entfernen und erneut packen.
Ich habe diesen Code verwendet:
cat rootfs.img | cpio -idvm
Dann werden alle Dateien in mein Root-Dateisystem extrahiert. Mein gesamtes Betriebssystem ist beschädigt. (Was für eine peinliche Situation ...)
Was muss ich tun, um solche Vorgänge sicher, aber dennoch einfach durchzuführen? Chroot? LXC? (VirtualBox ist der letzte Ausweg)
Antwort1
Mit relativen Pfaden archiviert
Ich rate davon ab, diese Art von Befehl auf Ihrer Root-Ebene auszuführen /
. Das führt zu Problemen. Ich führe cpio -idvm
verwandte Befehle immer in ihren eigenen Verzeichnissen aus und verwende dann mv
oder , cp
um die Dateien manuell an den richtigen Ort zu bringen.
Sie können auch die Methode verwenden, die ich in diesem anderen U&L-Q&A mit dem Titel beschrieben habe:Wie installiere ich TazPkg in SliTaz Linux?, das ebenfalls verwendet cpio
.
Mit absoluten Pfaden archiviert
Wenn das Archiv mit absoluten Pfaden erstellt wurde, können Sie cpio
mit dem --no-absolute-filenames
Schalter das Extrahieren in blockieren /
.
$ mkdir /tmp/cpio-root
$ cd /tmp/cpio-root
$ cat rootfs.img | cpio -idvm --no-absolute-filenames
Verweise
Antwort2
unp
Sie können hierfür das Dienstprogramm verwenden .
unp
ist ein Dienstprogramm zum Entpacken mehrerer Formate. Eine seiner Funktionen (das -U
Argument) ist die Möglichkeit, in das Archiv zu schauen und zu prüfen, ob es mehrere Stammelemente enthält. Wenn dies der Fall ist, werden sie in ein Verzeichnis extrahiert.
Zum Beispiel:
$ echo $RANDOM > a
$ echo $RANDOM > b
$ tar -cf archive.tar a b
$ rm a b
$ unp -U archive.tar
$ ls -l a b archive
ls: cannot access a: No such file or directory
ls: cannot access b: No such file or directory
archive:
total 8
-rw-r--r-- 1 root root 5 Jun 15 03:16 a
-rw-r--r-- 1 root root 6 Jun 15 03:16 b
unp
funktioniert mit vielen verschiedenen Formaten (einschließlich cpio
). Es ruft einfach das entsprechende Dienstprogramm zur Handhabung des Archivs auf:
# unp -s
Known archive formats and tools:
7z: p7zip or p7zip-full
ace: unace
ar,deb: binutils
arj: arj
bz2: bzip2
cab: cabextract
chm: libchm-bin or archmage
cpio,afio: cpio or afio
dat: tnef
dms: xdms
exe: maybe orange or unzip or unrar or unarj or lha
gz: gzip
hqx: macutils
lha,lzh: lha
lz: lzip
lzma: xz-utils or lzma
lzo: lzop
lzx: unlzx
mbox: formail and mpack
pmd: ppmd
rar: rar or unrar or unrar-free
rpm: rpm2cpio and cpio
sea,sea.bin: macutils
shar: sharutils
tar: tar
tar.bz2,tbz2: tar with bzip2
tar.lzip: tar with lzip
tar.lzop,tzo: tar with lzop
tar.xz,txz: tar with xz-utils
tar.z: tar with compress
tgz,tar.gz: tar with gzip
uu: sharutils
xz: xz-utils
zip,cbz,cbr,jar,war,ear,xpi,adf: unzip
zoo: zoo
Die --help
Ausgabe zeigt, was es kann:
# unp --help
USAGE:
/usr/bin/unp [ options ] file [ files... ]
file: compressed file(s) to expand/extract
Use -- [ ARGUMENTS ] to pass arguments to external programs, eg. some tar options:
unp fastgl.tgz xmnt.tgz -- -C /tmp
Options:
-f Continue even if program availability checks fail or directory collision occurs
-u Special helper mode.
For most archive types:
- create directory <filename without suffix>/
- extract contents there
For Debian/Ubuntu packages:
- extract data.tar.gz after each operation in local directory
- extract control.tar.gz into control/<package_version_arch>/
-U Smart mode, acts like -u (see above) if archive contains multiple
elements but if there is only one file/directory element then it's stored
in the current directory.
-s Show the list of supported formats
-v More verbosity
-h Show this help