Quello che sta succedendo è che stai provando ad avviare Linux nel modo "Obsoleto". Ecco dove initrd
è un ramdisk al contrario di un archivio compresso di cpio decompresso dal kernel in un ramfs e con il vecchio modo di passare al dispositivo finale.
In quella modalità, il kernel monta disk.img come ramdisk come file system radice e quindi viene eseguito /linuxrc
al suo interno. Molto probabilmente nel tuo caso, non esiste tale file. Quando /linuxrc
(che dovrebbe fare tutto il necessario per far apparire il dispositivo a blocchi per il vero filesystem di root) esce, allora il kernel monta il vero filesystem di root.
I messaggi sopra mostrano che monta correttamente il disco ram (1,0: 1 è per ram
, quindi /dev/ram0
) ma non il vero file system radice / dev / sda1 (8,1: 8 è sd
, 1 è a1
). Presumibilmente poiché non hai specificato una riga di comando del kernel ( -append
), che /dev/sda1
proviene da una CONFIG_CMDLINE passata al momento della compilazione del kernel o usando rdev
.
Se il tuo disk.img è pensato per contenere un file system root, ad esempio una piccola distribuzione Linux con /sbin/init
..., probabilmente vorrai invece scriverlo:
kvm -kernel kernel.img -initrd disk.img -append 'root=/dev/ram0`
Quindi, il kernel tratterà il disco ram come il vero file system root (anche se potresti ancora pivot_root
farlo con un altro).
Per poter vedere più facilmente i messaggi del kernel, ti consiglio di usare l'output seriale:
kvm -kernel kernel.img -initrd disk.img -nographic -append "root=/dev/ram0 console=ttyS0"
In alternativa puoi usare un init ramfs invece di un init ramdisk:
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
(a condizione che busybox
sia la versione collegata staticamente) e otterrai una shell e altre utility di busybox in quel kernel).
Si noti che il kernel ora funziona /init
al contrario /linuxrc
o /sbin/init
in quella modalità.