Había compilado un kernel de Linux y quería depurarlo en QEMU. Creé un archivo para iniciar haciendo los comandos
$ qemu-img create -f raw disk.img 200M
$ mkfs.ext2 -F disk.img
# mkdir /mnt/rootfs
# mount -o loop disk.img /mnt/rootfs
Luego lo hice qemu -kernel bzImage -initrd disk.img
y obtuve la siguiente pantalla que dice:
Kernel panic - not syncing: VFS: unable to mount root fs on unknown block
¿Qué he hecho mal y qué puedo hacer para solucionarlo?
linux-kernel
qemu
initrd
Codificador404
fuente
fuente
Respuestas:
El kernel le dice que no sabe qué dispositivo contiene el sistema de archivos raíz. Su montaje en bucle no es necesario. (Desmontarlo antes de continuar).
Prueba un comando como
qemu -kernel bzImage -hda disk.img -append root=/dev/sda
El
-hda disk.img
parámetro le dice a qemu que simule un dispositivo de disco basado en sudisk.img
.El
-append root=/dev/sda
interruptor es utilizado por qemu para decirle al kernel al respecto del dispositivo raíz. Esto se hace agregando elroot=/dev/sda
a la línea de comandos del núcleo. Puede comparar esto con la línea de comandos del núcleo de su propio núcleo haciendocat /proc/cmdline
(Esto es seguro). Debería ver allí también unroot
parámetro.fuente
umount /mnt/rootfs
init
en elinitrd
. Aquí está pasando losdisk.img
dos como un disco duro y unoinitrd
que no tiene sentido.-initrd
que no debería haber estado allí.Lo que sucede es que estás intentando arrancar Linux de la manera "Obsoleto". Ahí es donde se
initrd
encuentra un ramdisk en lugar de un archivo comprimido de cpio descomprimido por el núcleo en un ramfs, y con la antigua forma de cambiar al dispositivo final.En ese modo, el núcleo monta el disk.img como un disco ram como el sistema de archivos raíz y luego se ejecuta
/linuxrc
allí. Lo más probable en su caso, no existe tal archivo. Cuando/linuxrc
(que se supone que debe hacer lo necesario para abrir el dispositivo de bloque para el sistema de archivos raíz real) sale, el núcleo monta el sistema de archivos raíz real.Los mensajes anteriores muestran que monta el disco RAM con éxito (1,0: 1 es para
ram
, por lo tanto/dev/ram0
) pero no el sistema de archivos raíz real / dev / sda1 (8,1: 8 essd
, 1 esa1
). Presumiblemente, dado que no especificó una línea de comando del núcleo (-append
), que/dev/sda1
proviene de una CONFIG_CMDLINE pasada en el momento de la compilación del núcleo o usandordev
.Si su disk.img está destinado a contener un sistema de archivos raíz de, digamos, una pequeña distribución de Linux con
/sbin/init
..., entonces probablemente desee escribirlo en su lugar:Luego, el núcleo trataría el disco RAM como el sistema de archivos raíz real (aunque aún podría utilizar
pivot_root
otro).Para poder ver los mensajes del núcleo más fácilmente, recomiendo usar la salida en serie:
Como alternativa, puede usar un ramfs de inicio en lugar de un disco de inicio:
(se proporciona
busybox
la versión vinculada estáticamente) y obtendrá un shell y otras utilidades de busybox en ese núcleo).Tenga en cuenta que el kernel ahora se ejecuta
/init
en oposición/linuxrc
o/sbin/init
en ese modo.fuente
CONFIG_BLK_DEV_INITRD=y
Esta opción de configuración del kernel también es necesaria. Habilita el soporte de initrd en el kernel de Linux.
Afortunadamente Buildroot lo establece de forma predeterminada para nosotros cuando
BR2_TARGET_ROOTFS_CPIO=y
se da.Luego pasa el CPIO a QEMU con la
qemu -initrd
opción. Mi comando QEMU completo es:Aquí es un minimalista ejemplo totalmente automatizado Buildroot + QEMU: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/b3868a3b009f2ab44fa6d3db3d174930b3cf7b69#initrd
fuente