Kernel personalizado Raspberry Pi 2 com initramfs

Kernel personalizado Raspberry Pi 2 com initramfs

Estou tentando fazer com que um kernel auto-compilado rode junto com um initramfs. Funcionou no velho framboesa, mas de alguma forma não consigo fazê-lo funcionar.

O que estou tentando fazer exatamente: carregar o kernel, "executar" o initramfs que então executa algumas verificações (atualização do sistema etc.), finalmente montando uma imagem squashfs e invocando switch_root no referido sistema.

Mas o kernel de alguma forma se recusa a executar o init do initramfs. Eu tentei várias configurações em cmdline.txt/ config.txtmas nenhuma delas parece funcionar, o kernel sempre espera que alguma raiz esteja disponível (ou falha com VFS: unable to mount root fs on unknown block). Presumo que esteja faltando alguma configuração de cmdline (provavelmente um root=.... correto root=/dev/ram0não funcionou) ou um sinalizador de kernel. Meu cmdline atual: dwc_otg.lpm_enable=0 console=tty1 elevator=deadline rootwait, config.txt:initramfs initramfs.gz followkernel

Quando adiciono root=/dev/mmcblk0p6 roottype=ext4todo o sistema inicializa (em algum test-linux que adicionei para verificar se o próprio kernel funciona).

Eu verifiquei se o kernel é compilado com suporte ao initramfs ( BLK_DEV_INITRD=y), infelizmente compilar o initramfs na imagem do kernel não é uma opção. O kernel (4.1 estável) é compilado usando buildroot. O formato binário do kernel é zImage (parece não funcionar com vmlinux, a tela fica preta).

Responder1

Comecei do zero e depois de horas de tentativa e erro cheguei à(s) origem(s) do meu problema, que basicamente eram apenas alguns erros estúpidos: Meu script de construção gerou o initramfs com caminhos absolutos (ou seja, não, por exemplo, lib/libc.somas em vez disso ~/Work/project/target/lib/libc.so), o que obviamente faz com que o kernel não encontre o init inicial.

Uma lição interessante que aprendi: o initramfs incorporado aparentemente está se comportando de maneira um pouco diferente em comparação com um externo, ou seja, que comandos echo e similares no script de inicialização não são impressos quando um initramfs incorporado está presente. Enquanto mexia em um initramfs externo, esqueci de remover o incorporado, resultando na execução do init externo (e apenas aquele), mas sem imprimir nada. Depois de remover o initramfs incorporado, funcionou.

informação relacionada