
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.txt
mas 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/ram0
nã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=ext4
todo 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.so
mas 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.