Saya telah menyusun kernel linux dan saya ingin men-debug-nya di QEMU. Saya membuat file untuk boot dari dengan melakukan perintah
$ qemu-img create -f raw disk.img 200M
$ mkfs.ext2 -F disk.img
# mkdir /mnt/rootfs
# mount -o loop disk.img /mnt/rootfs
Lalu saya lakukan qemu -kernel bzImage -initrd disk.img
dan mendapatkan layar di bawahnya yang mengatakan:
Kernel panic - not syncing: VFS: unable to mount root fs on unknown block
Apa yang telah saya lakukan salah dan apa yang bisa saya lakukan untuk memperbaikinya?
linux-kernel
qemu
initrd
Coder404
sumber
sumber
Jawaban:
Kernel memberitahu Anda, bahwa ia tidak tahu perangkat mana yang memegang sistem file root. Pemasangan loop Anda tidak perlu. (Lepas pemasangannya sebelum melanjutkan).
Coba perintah seperti
qemu -kernel bzImage -hda disk.img -append root=/dev/sda
The
-hda disk.img
parameter memberitahu qemu untuk mensimulasikan perangkat disk berdasarkan Andadisk.img
.The
-append root=/dev/sda
switch digunakan oleh qemu untuk memberitahu kernel tentang itu perangkat root. Ini dilakukan dengan menambahkan barisroot=/dev/sda
perintah kernel. Anda dapat membandingkan ini dengan commandline kernel dari kernel Anda sendiri dengan melakukancat /proc/cmdline
(Ini aman). Anda harus melihat adaroot
parameter juga.sumber
umount /mnt/rootfs
init
diinitrd
. Di sini Anda melewatidisk.img
keduanya sebagai hard disk daninitrd
yang tidak masuk akal.-initrd
yang seharusnya tidak ada di sana.Apa yang terjadi adalah Anda mencoba mem-boot Linux dengan cara "Usang". Di situlah
initrd
ramdisk bukan arsip cpio terkompresi yang dibongkar oleh kernel dalam ramfs, dan dengan cara lama untuk beralih ke perangkat akhir.Dalam mode itu, kernel memasang disk.img sebagai ramdisk sebagai sistem file root dan kemudian dijalankan
/linuxrc
di sana. Kemungkinan besar dalam kasus Anda, tidak ada file seperti itu. Ketika/linuxrc
(yang seharusnya melakukan apa pun yang diperlukan untuk membuka perangkat blok untuk filesystem root sebenarnya) keluar, maka kernel mount sistem file root nyata.Pesan di atas menunjukkan bahwa ia berhasil memasang ram ram (1,0: 1 untuk
ram
, jadi/dev/ram0
) tetapi bukan sistem file root sebenarnya / dev / sda1 (8,1: 8 adalahsd
, 1 adalaha1
). Mungkin karena Anda tidak menentukan baris perintah kernel (-append
), yang/dev/sda1
berasal dari CONFIG_CMDLINE yang dikirimkan pada waktu kompilasi kernel atau menggunakanrdev
.Jika disk.img Anda dimaksudkan untuk berisi sistem file root dari katakanlah distribusi Linux kecil dengan
/sbin/init
..., maka Anda mungkin ingin menulisnya sebagai gantinya:Kemudian, kernel akan memperlakukan ram disk sebagai sistem file root yang sebenarnya (meskipun Anda masih bisa
pivot_root
ke yang lain).Agar dapat melihat pesan kernel dengan lebih mudah, saya sarankan menggunakan keluaran serial:
Sebagai alternatif, Anda bisa menggunakan init ramfs alih-alih init ramdisk:
(disediakan
busybox
adalah versi yang terhubung secara statis) dan Anda akan mendapatkan shell dan utilitas busybox lainnya di kernel itu).Perhatikan bahwa kernel sekarang berjalan
/init
sebagai lawan/linuxrc
atau/sbin/init
dalam mode itu.sumber
CONFIG_BLK_DEV_INITRD=y
Opsi konfigurasi kernel ini juga diperlukan. Ini memungkinkan dukungan initrd pada kernel Linux.
Luckly Buildroot menyetelnya secara default untuk kami saat
BR2_TARGET_ROOTFS_CPIO=y
diberikan.Anda kemudian meneruskan CPIO ke QEMU dengan
qemu -initrd
opsi tersebut. Perintah lengkap QEMU saya adalah:Berikut ini adalah contoh Buildroot + QEMU otomatis minimalistik yang minimalis: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/b3868a3b009f2ab44fa6d3db3d174930b3cf7b69#initrd
sumber