Ausführen von bzImage in QEMU: Root-Fs können nicht auf einem unbekannten Block (0.0) bereitgestellt werden.

8

Ich habe den Kernel mit make menuconfigund kompiliert make. Ich habe versucht, das bzImage in qemu auszuführen, qemu -kernel bzImageaber es hat mit der Fehlermeldung nicht geklappt :

Unable to mount root fs on unknown-block(0.0)

Linux-Kernelfehler

Wie kann ich es reparieren? Wie kann ich das bzImage in qemu ausführen?

Coder404
quelle
5
Der Kernel hat gut gebootet, aber das Root-Dateisystem kann nicht gefunden werden. Welche Festplatten haben Sie in der VM gemountet? Welcher Dateisystemtyp ist das Root-Dateisystem, welcher Festplattentyp? Sind alle erforderlichen Treiber im Kernel kompiliert (das Vergessen eines der Treiber ist ein häufiger Fehler)?
Gilles 'SO - hör auf böse zu sein'
@ Gilles Ich habe kein Dateisystem gemountet. Nach dem Kompilieren ging ich direkt in die Datei, in der sich das bzImage befindet (../arch/x86/boot) und führte den Befehl "qemu -kernel bzImage" aus. Dann habe ich den Fehler bekommen.
Coder404

Antworten:

11

Es hat geklappt. Der Kernel bootete gut. Der Fehler ist:

Root-Fs können nicht auf Unbekanntem Block (0.0) gemountet werden.

Der Kernel sucht nach einem Root-Dateisystem. Sie müssen eine bereitstellen. Sie können nicht mit einem Kernel interagieren, ohne Prozesse darauf auszuführen, und der erste Prozess muss von irgendwoher geladen werden: Wenn der Kernel gestartet wird, wird ein Dateisystem (das Root-Dateisystem) im Verzeichnis bereitgestellt /und anschließend das Programm ausgeführt /sbin/init. Das Init-Programm ist normalerweise für das Ausführen von Boot-Skripten und das Starten von Diensten verantwortlich, einschließlich Programmen, mit denen sich Benutzer anmelden können.

Sie müssen sicherstellen, dass der Kernel das Root-Dateisystem bereitstellen kann. Es muss Treiber für den Dateisystemtyp und für alle am Blockgerät beteiligten Ebenen (Festplattencontroller (SCSI / SATA / IDE / USB /… Adapter), Partitionstyp usw.) enthalten.

Linux bietet eine zusätzliche Möglichkeit, nämlich das Laden eines anfänglichen Dateisystems in den Arbeitsspeicher, das während des Startvorgangs verwendet wird, um das Root-Dateisystem zu finden und bereitzustellen. Dieses anfängliche Dateisystem kann Module enthalten, die den Geräte- und Dateisystemtyp des Root-Dateisystems verarbeiten. Es gibt zwei leicht unterschiedliche Mechanismen: initrd und initramfs.

Gilles 'SO - hör auf böse zu sein'
quelle
Danke für die Antwort! Kann ich ein virtuelles Dateisystem zum Booten erstellen? Wenn ja, wie würde ich das machen?
Coder404
@ Coder404 Du meinst ein virtuelles Dateisystem, das als Root-Dateisystem verwendet werden soll? Machen Sie es zu einem RAM-Laufwerk.
Gilles 'SO - hör auf böse zu sein'
Ich möchte ein virtuelles Dateisystem als Root-Dateisystem für den Kernel verwenden, den ich in QEMU erstelle. Wie würde ich das virtuelle Dateisystem erstellen?
Coder404
1

Obwohl die Dateisysteme allein vom Kernel kompiliert werden, muss ein erstes Dateisystem erstellt werden, das im RAM vorhanden ist, um den Kernel auszuführen. Um dieses anfängliche RAM-Dateisystem zu erstellen, wird mkinitrd verwendet. In Ubuntu wird stattdessen mkinitramfs verwendet

cd ~ / linux / linux-2.6.32.59 / arch / i386 / boot

mkinitramfs -o initrd.img-2.6.32.59

Danach führen Sie den Kernel auf Qemu aus

qemu-system-i386 -kernel bzImage -initrd initrd.img-2.6.32.59 -m 512M

-initrd repräsentiert das ursprüngliche RAM-Dateisystem

Sie finden das RAM-Dateisystem unter /boot/initramfs-linux.img

gerrard2461
quelle