Extraction d'archives cpio concaténées

Les archives initramfs sous Linux peuvent consister en une série de files cpio concaténés et gzippés.

Compte tenu de ces archives, comment extraire toutes les archives embeddedes, par opposition à la première?

Voici un exemple d'un model qui, bien qu'il semble pouvoir fonctionner, n'extrait que la première archive:

while gunzip -c | cpio -i; do :; done <input.cgz 

J'ai également essayé l' assistant skipcpio de dracut pour déplacer le pointeur de file après la première image cpio, mais les résultats suivants dans un stream corrompu (pas au bon point dans l'input) envoyé à cpio:

 # this isn't ideal -- presumably would need to rerun with an extra skipcpio in the pipeline # ...until all files in the archive have been reached. gunzip -c <input.cgz | skipcpio /dev/stdin | cpio -i 

gunzip ne doit être exécuté qu'une seule fois (consommant toutes les inputs), alors que cpio doit être exécuté une fois par archive incorporée, comme suit:

 gunzip -c <input.cgz | while cpio -i; do :; done 
 /usr/lib/dracut/skipcpio $your-initrd-img | zcat | cpio -id --no-absolute-file-names 

ou sinon

 /usr/lib/dracut/skipcpio $your-img | gunzip -c | cpio -id 

(dans FreeBSD, il n'y a pas d'option –no-absolute-file-names à cpio)

Ce petit programme skipcpio si une partie du package dracut. Mais vous pouvez download le code (skipcpio.c) et le comstackr même sous FreeBSD.

Vous en avez besoin lors de l'extraction d'images initrd créées par dracut, au less sous les dissortingbutions RedHat, comme Fedora. Il place un file appelé "early_cpio" dans l'image, donc l'extraction de votre initramfs d'une manière normale connue auparavant ne fonctionnera pas.