Extraindo arquivos cpio concatenados

3
Os arquivos

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
    
por Charles Duffy 26.02.2016 / 21:49

2 respostas

4

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
    
por 26.02.2016 / 21:49
1
/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á.

    
por 27.04.2016 / 10:29