Was passiert ist, dass Sie versuchen, Linux auf "veraltete" Weise zu booten. Hier initrd
handelt es sich um eine Ramdisk im Gegensatz zu einem komprimierten CPIO-Archiv, das vom Kernel in einem Ramfs entpackt wurde, und mit der alten Methode, zum Endgerät zu wechseln.
In diesem Modus stellt der Kernel die Datei disk.img als Ramdisk als Root-Dateisystem bereit und wird /linuxrc
dort ausgeführt. In Ihrem Fall gibt es höchstwahrscheinlich keine solche Datei. Wenn /linuxrc
(was alles tun soll, was erforderlich ist, um das Blockgerät für das echte Root-Dateisystem aufzurufen) beendet wird, stellt der Kernel das echte Root-Dateisystem bereit.
Die obigen Meldungen zeigen, dass die RAM-Festplatte erfolgreich bereitgestellt wird (1,0: 1 ist für ram
, also /dev/ram0
), aber nicht das echte Root-Dateisystem / dev / sda1 (8,1: 8 ist sd
, 1 ist a1
). Vermutlich, da Sie keine Kernel-Befehlszeile ( -append
) angegeben haben, /dev/sda1
stammt diese von einer CONFIG_CMDLINE, die zur Kernel-Kompilierungszeit oder mit übergeben wurde rdev
.
Wenn Ihre disk.img ein Root-Dateisystem enthalten soll, beispielsweise eine kleine Linux-Distribution mit /sbin/init
..., möchten Sie sie wahrscheinlich stattdessen schreiben:
kvm -kernel kernel.img -initrd disk.img -append 'root=/dev/ram0`
Dann würde der Kernel die RAM-Disk als das echte Root-Dateisystem behandeln (obwohl Sie immer noch ein pivot_root
anderes verwenden könnten ).
Um die Kernel-Nachrichten leichter sehen zu können, würde ich die Verwendung der seriellen Ausgabe empfehlen:
kvm -kernel kernel.img -initrd disk.img -nographic -append "root=/dev/ram0 console=ttyS0"
Alternativ können Sie ein Init-Ramfs anstelle eines Init-Ramdisk verwenden:
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
(vorausgesetzt, es busybox
handelt sich um die statisch verknüpfte Version) und Sie erhalten eine Shell und andere Busybox-Dienstprogramme in diesem Kernel.
Beachten Sie, dass der Kernel jetzt /init
im Gegensatz zu /linuxrc
oder /sbin/init
in diesem Modus ausgeführt wird.