Skompilowałem jądro Linuksa i chciałem go debugować w QEMU. Utworzyłem plik do rozruchu, wykonując polecenia
$ qemu-img create -f raw disk.img 200M
$ mkfs.ext2 -F disk.img
# mkdir /mnt/rootfs
# mount -o loop disk.img /mnt/rootfs
Potem zrobiłem qemu -kernel bzImage -initrd disk.img
i pokazałem poniższy ekran:
Kernel panic - not syncing: VFS: unable to mount root fs on unknown block
Co zrobiłem źle i co mogę zrobić, aby to naprawić?
linux-kernel
qemu
initrd
Coder404
źródło
źródło
Odpowiedzi:
Jądro mówi ci, że nie wie, które urządzenie posiada główny system plików. Montaż na pętli nie jest konieczny. (Odłącz to przed kontynuowaniem).
Spróbuj wykonać polecenie takie jak
qemu -kernel bzImage -hda disk.img -append root=/dev/sda
Ten
-hda disk.img
parametr nakazuje qemu symulację urządzenia dyskowego na podstawie twojegodisk.img
.-append root=/dev/sda
Przełącznik jest używany przez qemu powiedzieć jądro o jego urządzeniu głównym. Odbywa się to poprzez dołączenieroot=/dev/sda
do wiersza poleceń jądra. Możesz to porównać do wiersza poleceń jądra własnego jądra, wykonująccat /proc/cmdline
(Jest to bezpieczne). Powinieneś zobaczyć tam równieżroot
parametr.źródło
umount /mnt/rootfs
init
winitrd
. Tutaj podajeszdisk.img
oba jako dysk twardy i taki,initrd
który nie ma sensu.-initrd
że nie powinno tam być.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 oznaczasd
, 1 oznaczaa1
). 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życiurdev
.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ć: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:
Alternatywnie możesz użyć ramfs init zamiast ramdisk init:
(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.źródło
CONFIG_BLK_DEV_INITRD=y
Ta opcja konfiguracji jądra jest również wymagana. Umożliwia obsługę initrd w jądrze Linux.
Na szczęście Buildroot ustawia go domyślnie dla nas, kiedy
BR2_TARGET_ROOTFS_CPIO=y
zostanie podany.Następnie przekazujesz CPIO do QEMU z
qemu -initrd
opcją. Moje pełne polecenie QEMU to:Oto minimalistyczny, w pełni zautomatyzowany przykład Buildroot + QEMU: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/b3868a3b009f2ab44fa6d3db3d174930b3cf7b69#initrd
źródło