J'avais compilé un noyau Linux et je voulais le déboguer dans QEMU. J'ai créé un fichier pour démarrer à partir des commandes
$ qemu-img create -f raw disk.img 200M
$ mkfs.ext2 -F disk.img
# mkdir /mnt/rootfs
# mount -o loop disk.img /mnt/rootfs
Ensuite, je l'ai fait qemu -kernel bzImage -initrd disk.img
et j'ai obtenu l'écran ci-dessous qui dit:
Kernel panic - not syncing: VFS: unable to mount root fs on unknown block
Qu'est-ce que j'ai fait de mal et que puis-je faire pour y remédier?
linux-kernel
qemu
initrd
Coder404
la source
la source
Réponses:
Le noyau vous dit qu'il ne sait pas quel périphérique contient le système de fichiers racine. Votre support de boucle n'est pas nécessaire. (Démontez-le avant de continuer).
Essayez une commande comme
qemu -kernel bzImage -hda disk.img -append root=/dev/sda
Le
-hda disk.img
paramètre indique à qemu de simuler un périphérique de disque basé sur votredisk.img
.Le
-append root=/dev/sda
commutateur est utilisé par qemu pour informer le noyau de son périphérique racine. Cela se fait en ajoutant leroot=/dev/sda
à la ligne de commande du noyau. Vous pouvez comparer cela à la ligne de commande du noyau de votre propre noyau en faisantcat /proc/cmdline
(c'est sûr). Vous devriez également y voir unroot
paramètre.la source
umount /mnt/rootfs
init
dans leinitrd
. Ici, vous passez lesdisk.img
deux en tant que disque dur et ceinitrd
qui n'a pas de sens.-initrd
ce sujet qui n'aurait pas dû être là.Ce qui se passe, c'est que vous essayez de démarrer Linux de manière "obsolète". C'est là que se
initrd
trouve un ramdisk par opposition à une archive cpio compressée décompressée par le noyau dans un ramfs, et avec l'ancienne façon de basculer vers le périphérique final.Dans ce mode, le noyau monte le disk.img en tant que disque virtuel en tant que système de fichiers racine, puis s'exécute
/linuxrc
dedans. Très probablement dans votre cas, il n'y a pas un tel fichier. Lorsque/linuxrc
(qui est censé faire tout ce qui est nécessaire pour afficher le périphérique de blocage pour le système de fichiers racine réel) se ferme, le noyau monte le véritable système de fichiers racine.Les messages ci-dessus montrent qu'il monte correctement le disque RAM (1,0: 1 est pour
ram
, donc/dev/ram0
) mais pas le vrai système de fichiers racine / dev / sda1 (8,1: 8 estsd
, 1 esta1
). Vraisemblablement, puisque vous n'avez pas spécifié de ligne de commande du noyau (-append
), cela/dev/sda1
provient d'une CONFIG_CMDLINE passée au moment de la compilation du noyau ou de l'utilisationrdev
.Si votre disk.img est censé contenir un système de fichiers racine, disons une petite distribution Linux avec
/sbin/init
..., alors vous voudrez probablement l'écrire à la place:Ensuite, le noyau traiterait le disque RAM comme le véritable système de fichiers racine (bien que vous puissiez toujours
pivot_root
en utiliser un autre).Pour pouvoir voir les messages du noyau plus facilement, je recommande d'utiliser la sortie série:
Comme alternative, vous pouvez utiliser un ramfs init au lieu d'un disque ram init:
(fourni
busybox
est la version liée statiquement) et vous obtiendrez un shell et d'autres utilitaires busybox dans ce noyau).Notez que le noyau fonctionne désormais
/init
par opposition à/linuxrc
ou/sbin/init
dans ce mode.la source
CONFIG_BLK_DEV_INITRD=y
Cette option de configuration du noyau est également requise. Il active la prise en charge initrd sur le noyau Linux.
Luckly Buildroot le définit par défaut pour nous quand
BR2_TARGET_ROOTFS_CPIO=y
est donné.Vous passez ensuite le CPIO à QEMU avec l'
qemu -initrd
option. Ma commande QEMU complète est:Voici un exemple minimaliste Buildroot + QEMU entièrement automatisé: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/b3868a3b009f2ab44fa6d3db3d174930b3cf7b69#initrd
la source