Acrescentar arquivos à imagem do initramfs - confiável?

6

Estou modificando um monte de initramfs archives de diferentes distribuições do Linux nas quais normalmente apenas um arquivo está sendo alterado.

Eu gostaria de automatizar o processo sem alternar para o usuário root para extrair todos os arquivos dentro da imagem initramfs e empacotá-los novamente.

Primeiro, tentei gerar uma lista de arquivos para gen_init_cpio sem extrair todo o conteúdo no initramfs archive, ou seja, analisar a saída de cpio -tvn initrd.img (como ls -l output ) através de um script que muda todas as permissões para octal e organiza a saída para o formato gen_init_cpio want, como:

dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
slink /bin/sh busybox 777 0 0
file /bin/busybox initramfs/busybox 755 0 0

Isso envolve algumas substituições e o script pode ser difícil de escrever para mim, então encontrei uma maneira melhor e estou perguntando sobre o quão seguro e portátil é:

Em algumas distros temos um arquivo initramfs com partes concatenadas, e aparentemente o kernel analisa o arquivo inteiro extraindo todas as partes empacotadas em um limite de 1 byte, então não há necessidade de preencher cada parte para um múltiplo de 512 bytes. Eu pensei que esse 'recurso' pode ser útil para evitar a recriação do arquivo ao modificar arquivos dentro dele. De fato funciona, pelo menos para Debian e CloneZilla .

Por exemplo, se tivermos modificado o arquivo /init em initrd.gz do Debian 8.2.0, podemos anexá-lo a initrd.gz image com:

$ echo ./init | cpio -H newc -o | gzip >> initrd.gz

então initrd.gz tem dois arquivos concatenados, o original e suas modificações. Vamos ver o resultado de binwalk :

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             gzip compressed data, maximum compression, has original file name: "initrd", from Unix, last modified: Tue Sep  1 09:33:08 2015
6299939       0x602123        gzip compressed data, from Unix, last modified: Tue Nov 17 16:06:13 2015

Funciona perfeitamente. Mas é confiável? que restrições temos quando anexamos dados a initfamfs files? é seguro anexar sem preencher o arquivo original em um múltiplo de 512 bytes? de qual versão do kernel este recurso é suportado?

    
por Emilio Lazo 17.11.2015 / 19:05

1 resposta

7

É muito confiável e suportado por todas as versões do kernel que suportam initrd, AFAIK. É um recurso dos cpio archives dos quais initramfs são compostos. cpio apenas continua extraindo sua entrada .... podemos saber que o arquivo é dois arquivos cpio um após o outro, mas o cpio apenas o vê como um único fluxo de entrada.

O Debian aconselha o uso exatamente desse método (anexando outro cpio ao initramfs) para adicionar firmware binary-blob ao seu instalador initramfs. Por exemplo:

DebianInstaller / NetbootFirmware | Wiki do Debian

Initramfs is essentially a concatenation of gzipped cpio archives which are extracted into a ramdisk and used as an early userspace by the Linux kernel. Debian Installer's initrd.gz is in fact a single gzipped cpio archive containing all the files the installer needs at boot time. By simply appending another gzipped cpio archive - containing the firmware files we are missing - we get the show on the road!

    
por 17.11.2015 / 22:55