To, co się dzieje, polega na tym, że próbujesz uruchomić system Linux w sposób „przestarzały”. To właśnie tam initrd
jest ramdysk w przeciwieństwie do skompresowanego archiwum CPIO rozpakowanego przez jądro w ramfs i przy starym sposobie przełączania się na urządzenie końcowe.
W tym trybie jądro montuje plik disk.img jako ramdysk jako główny system plików, a następnie wykonuje się /linuxrc
tam. Najprawdopodobniej w twoim przypadku nie ma takiego pliku. Kiedy /linuxrc
(co ma zrobić wszystko, co konieczne, aby uruchomić urządzenie blokujące dla prawdziwego głównego systemu plików) kończy pracę, jądro montuje prawdziwy główny system plików.
Powyższe komunikaty pokazują, że pomyślnie zamontował dysk RAM (1,0: 1 dla ram
, więc /dev/ram0
), ale nie prawdziwy system plików root / dev / sda1 (8,1: 8 oznacza sd
, 1 oznacza a1
). Prawdopodobnie, ponieważ nie określono wiersza polecenia jądra ( -append
), który /dev/sda1
pochodzi z CONFIG_CMDLINE przekazanej podczas kompilacji jądra lub przy użyciu rdev
.
Jeśli twój disk.img ma zawierać główny system plików, powiedzmy małą dystrybucję Linuksa z /sbin/init
..., prawdopodobnie prawdopodobnie chcesz go napisać:
kvm -kernel kernel.img -initrd disk.img -append 'root=/dev/ram0`
Następnie jądro traktowałoby dysk RAM jako prawdziwy główny system plików (choć nadal można by go użyć pivot_root
do innego).
Aby móc łatwiej zobaczyć komunikaty jądra, polecam użycie wyjścia szeregowego:
kvm -kernel kernel.img -initrd disk.img -nographic -append "root=/dev/ram0 console=ttyS0"
Alternatywnie możesz użyć ramfs init zamiast ramdisk init:
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
(pod warunkiem, że busybox
jest to wersja statycznie powiązana), w tym jądrze otrzymasz powłokę i inne narzędzia typu busybox).
Zauważ, że jądro działa teraz /init
w przeciwieństwie do tego trybu /linuxrc
lub /sbin/init
w tym trybie.