Eu compilei um kernel do linux e queria depurá-lo no QEMU. Criei um arquivo para inicializar executando os comandos
$ qemu-img create -f raw disk.img 200M
$ mkfs.ext2 -F disk.img
# mkdir /mnt/rootfs
# mount -o loop disk.img /mnt/rootfs
Então eu fiz qemu -kernel bzImage -initrd disk.img
e peguei a tela abaixo que diz:
Kernel panic - not syncing: VFS: unable to mount root fs on unknown block
O que fiz de errado e o que posso fazer para corrigi-lo?
linux-kernel
qemu
initrd
Coder404
fonte
fonte
Respostas:
O kernel está lhe dizendo que não sabe qual dispositivo contém o sistema de arquivos raiz. Sua montagem em loop não é necessária. (Desmonte antes de continuar).
Tente um comando como
qemu -kernel bzImage -hda disk.img -append root=/dev/sda
O
-hda disk.img
parâmetro diz ao qemu para simular um dispositivo de disco com base no seudisk.img
.O
-append root=/dev/sda
switch é usado pelo qemu para informar o kernel sobre seu dispositivo raiz. Isso é feito anexando aroot=/dev/sda
linha de comando ao kernel. Você pode comparar isso com a linha de comando do kernel do seu próprio kernel fazendocat /proc/cmdline
(Isso é seguro). Você deve ver também umroot
parâmetro.fonte
umount /mnt/rootfs
init
oinitrd
. Aqui você está passando osdisk.img
dois como um disco rígido e uminitrd
que não faz sentido.-initrd
isso não deveria estar lá.O que está acontecendo é que você está tentando inicializar o Linux da maneira "Obsoleta". É aí que
initrd
existe um ramdisk em oposição a um arquivo cpio compactado descompactado pelo kernel em um ramfs e com a maneira antiga de mudar para o dispositivo final.Nesse modo, o kernel monta o disk.img como um ramdisk como o sistema de arquivos raiz e depois é executado
/linuxrc
nele. Provavelmente no seu caso, não existe esse arquivo. Quando/linuxrc
(que é suposto fazer o que for necessário para abrir o dispositivo de bloco para o sistema de arquivos raiz real) sai, o kernel monta o sistema de arquivos raiz real.As mensagens acima mostram que ele monta o disco ram com êxito (1,0: 1 é para
ram
, portanto/dev/ram0
), mas não o sistema de arquivos raiz real / dev / sda1 (8,1: 8 ésd
, 1 éa1
). Presumivelmente, como você não especificou uma linha de comando do kernel (-append
), que/dev/sda1
vem de um CONFIG_CMDLINE transmitido no momento da compilação ou uso do kernelrdev
.Se o seu disk.img deve conter um sistema de arquivos raiz, como por exemplo uma pequena distribuição Linux com
/sbin/init
..., provavelmente você deseja escrevê-lo:Então, o kernel trataria o disco ram como o sistema de arquivos raiz real (embora você ainda possa usar
pivot_root
outro).Para poder ver as mensagens do kernel mais facilmente, eu recomendo usar a saída serial:
Como alternativa, você pode usar um init ramfs em vez de um init ramdisk:
(fornecida
busybox
é a versão vinculada estaticamente) e você obterá um shell e outros utilitários do busybox nesse kernel).Observe que o kernel agora roda
/init
em oposição a/linuxrc
ou/sbin/init
nesse modo.fonte
CONFIG_BLK_DEV_INITRD=y
Esta opção de configuração do kernel também é necessária. Ativa o suporte ao initrd no kernel do Linux.
Felizmente o Buildroot o define por padrão para nós quando
BR2_TARGET_ROOTFS_CPIO=y
é dado.Em seguida, você passa o CPIO para QEMU com a
qemu -initrd
opção Meu comando QEMU completo é:Aqui está um exemplo minimalista e totalmente automatizado do Buildroot + QEMU: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/b3868a3b009f2ab44fa6d3db3d174930b3cf7b69#initrd
fonte