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 es sd
, 1 es a1
). 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 usando rdev
.
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:
kvm -kernel kernel.img -initrd disk.img -append 'root=/dev/ram0`
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:
kvm -kernel kernel.img -initrd disk.img -nographic -append "root=/dev/ram0 console=ttyS0"
Como alternativa, puede usar un ramfs de inicio en lugar de un disco de inicio:
mkdir -p RAMFS/{bin,dev}
cd RAMFS/bin
cp /bin/busybox .
"$PWD/busybox" --install .
cd ..
cp -a /dev/{null,tty,zero,console} dev
printf '%s\n' "#! /bin/sh" "exec /bin/sh" > init
chmod +x init
find . | cpio -oHnewc | gzip > ../initramfs.gz
cd ..
kvm -kernel kernel.img -initrd initramfs.gz
(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.