O gunzip precisa ser executado apenas uma vez (consumindo todas as entradas), enquanto o cpio deve ser executado uma vez por arquivo incorporado, assim:
gunzip -c <input.cgz | while cpio -i; do :; done
initramfs no Linux podem consistir em uma série de arquivos cpio gzipados e concatenados.
Dado tal arquivo, como é possível extrair todos os arquivos incorporados, ao invés de apenas o primeiro?
O seguinte é um exemplo de um padrão que, embora pareça ter potencial para funcionar, extrai apenas o primeiro arquivo:
while gunzip -c | cpio -i; do :; done <input.cgz
Eu também tentei o auxiliar skipcpio do dracut para mover o ponteiro do arquivo após a primeira imagem do cpio, mas o seguinte resulta em um fluxo corrompido (não no ponto correto na entrada) sendo enviado para o 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
/usr/lib/dracut/skipcpio $your-initrd-img | zcat | cpio -id --no-absolute-file-names
ou então
/usr/lib/dracut/skipcpio $your-img | gunzip -c | cpio -id
(no FreeBSD não existe a opção --no-absolute-file-names para o cpio)
Este pequeno programa skipcpio
se parte do pacote dracut. Mas você pode baixar o código (skipcpio.c) e compilá-lo mesmo no FreeBSD.
Você precisa disso ao extrair imagens initrd criadas pelo dracut, pelo menos em distros com tecnologia RedHat, como o Fedora. Ele coloca um arquivo chamado "early_cpio" na imagem, portanto, extrair seus initramfs de uma maneira normal conhecida antes não funcionará.