Raspberry Pi 2 Kernel personalizado com initramfs

2

Estou tentando obter um kernel auto-compilado rodando junto com um initramfs. Funcionou no velho framboesa, mas de alguma forma não consigo executá-lo.

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

Mas o kernel de alguma forma se recusa a executar o init initfs. Eu tentei várias configurações em cmdline.txt / config.txt , mas nenhuma delas parece funcionar, o kernel sempre espera que algum root 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 eu adiciono root=/dev/mmcblk0p6 roottype=ext4 o sistema inteiro inicializa (em algum test-linux que eu adicionei para verificar se o próprio kernel funciona).

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

    
por incaseoftrouble 18.02.2016 / 20:50

1 resposta

1

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

Uma lição interessante que aprendi: O initramfs embarcado aparentemente está se comportando de maneira ligeiramente diferente em comparação a um externo, ou seja, que comandos de eco e semelhantes no script de inicialização não são impressos quando um initramfs incorporado está presente. Enquanto mexer com um initramfs externo eu esqueci de remover o incorporado, resultando no init externo sendo executado (e apenas aquele), mas não imprimindo nada. Depois que eu removi o initramfs incorporado, funcionou.

    
por 21.02.2016 / 16:28