Ich habe das Raspbian-Bild auf dieser Seite heruntergeladen . Ich versuche einen Kernel zu kompilieren, mit dem das Image in qemu gebootet werden kann.
Ich habe die Linux- Kernelquelle von kernel.org heruntergeladen und ausgeführt:
make versatile_defconfig
make menuconfig
Ich habe dann die folgenden Funktionen zum Kernel hinzugefügt:
- PCI-Unterstützung (CONFIG_PCI)
- SCSI-Geräteunterstützung (CONFIG_SCSI)
- SCSI-Festplattenunterstützung (CONFIG_BLK_DEV_SD)
- SYM53C8XX Version 2 SCSI-Unterstützung (CONFIG_SCSI_SYM53C8XX_2)
- Das Extended 3 (ext3) Dateisystem (CONFIG_EXT3_FS)
- Das Extended 4 (ext4) Dateisystem (CONFIG_EXT4_FS)
Ich schleife auch das Disk-Image und:
- auskommentiert
/etc/ld.so.preload
- angepasst
/etc/fstab
zu verwenden/dev/sda1
und/dev/sda2
Ich habe dann das Image abgehängt und versucht, die Maschine zu starten mit:
qemu-system-arm \
-M versatilepb \
-m 256 \
-kernel linux-4.3/arch/arm/boot/zImage \
-hda 2015-09-24-raspbian-jessie.img \
-serial stdio \
-append "root=/dev/sda2 rootfstype=ext4 rw console=ttyAMA0"
Der Kernel konnte das Dateisystem mounten, es gab jedoch sofort einige Probleme:
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004
CPU: 0 PID: 1 Comm: init Not tainted 4.3.0 #1
Hardware name: ARM-Versatile PB
[<c001b5c0>] (unwind_backtrace) from [<c0017e18>] (show_stack+0x10/0x14)
[<c0017e18>] (show_stack) from [<c0069860>] (panic+0x84/0x1ec)
[<c0069860>] (panic) from [<c0025b98>] (do_exit+0x81c/0x850)
[<c0025b98>] (do_exit) from [<c0025c5c>] (do_group_exit+0x3c/0xb8)
[<c0025c5c>] (do_group_exit) from [<c002dfcc>] (get_signal+0x14c/0x59c)
[<c002dfcc>] (get_signal) from [<c001bf28>] (do_signal+0x84/0x3a0)
[<c001bf28>] (do_signal) from [<c0017a94>] (do_work_pending+0xb8/0xc8)
[<c0017a94>] (do_work_pending) from [<c0014f30>] (slow_work_pending+0xc/0x20)
---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004
Zuerst habe ich mich gefragt, ob das nicht mit SELinux zu tun hat. Ich habe versucht den Kernel zu booten mit:
selinux=0 enforcing=0
... aber es machte absolut keinen Unterschied.
Was mache ich falsch? Und was bedeutet dieser Fehler?
Aktualisierung
Ich habe auch Folgendes ohne Glück versucht:
- Ich habe versucht, mit und ohne
CONFIG_VFP
aktiviert zu kompilieren - Ich fügte hinzu
CONFIG_DEVTMPFS
undCONFIG_DEVTMPFS_MOUNT
- Die Anwendung dieses Patches und ermöglicht
CPU_V6
,CONFIG_MMC_BCM2835
&CONFIG_MMC_BCM2835_DMA
- Mit Hilfe der
gcc-linaro-arm-linux-gnueabihf-raspbian
Toolchain Kompilieren Sie ein einfaches C-Programm mit der Toolchain und übergeben Sie den Pfad über
init=
works an den Kernel. Dies lässt mich vermuten, dass es eine Diskrepanz zwischen den Binärformaten gibtfile <sample program>
:ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.6.26, BuildID[sha1]=e5ec8884499c51b248df60aedddfc9acf72cdbd4, not stripped
file <file from the image>
:ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=3e92423821f3325f8cb0ec5d918a7a1c76bbd72c, stripped`
Ich habe dieses einfache C-Programm mit der Toolchain kompiliert :
<path>/arm-linux-gnueabihf-gcc --static simple.c -o simple
... und kopierte es /root
in das Image und änderte den init=
Boot-Parameter in /root/simple
. Dadurch erhalte ich beim Booten Folgendes:
Starting bash...
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004
Es scheint beim execv()
Anruf zu ersticken .
quelle
cat .config | grep CONFIG_VFP
ergibtCONFIG_VFP=y
- scheint aktiviert zu sein.CONFIG_VFP
und es macht keinen Unterschied.versatilepb
Da es sich um eine ARM926-CPU handelt, die älter als die ARM1176 des RPi ist, verwenden Raspbian-Binärdateien möglicherweise eine andere Funktion, die nicht emuliert wird. Von unixmen.com/emulating-raspbian-using-qemu , tut-cpu arm1176
Hilfe?Antworten:
Ich habe auch versucht, ARM-Images mit QEMU ohne zuverlässigen Erfolg zu booten. Es tut mir leid zu sagen, dass Sie echte Hardware benötigen, um mit einem ARM-Betriebssystem zu arbeiten, oder geduldig darauf warten müssen, dass Entwickler einen zuverlässigeren Emulator für ARM erstellen.
Es ist Dezember 2018 und es gibt immer noch Probleme mit
qemu-system-arm
.Ich konnte Raspbian Jessie auf einem QEMU-Emulator mit einem frisch installierten Ubuntu 18 Bionic booten, aber es war für meine Arbeit nicht stabil, so dass ich es für echte Hardware belassen musste. Es würde häufig einfrieren.
qemu-system-arm
funktionierte auf meinem Betriebssystem nicht, daher habe ich Ubuntu Bionic mit Virtualbox und Raspbian mit QEMU in Bionic installiert.Ich habe dieses Tutorial befolgt: https://azeria-labs.com/emulate-raspberry-pi-with-qemu/
Viel Glück
quelle
Ich weiß, es ist eine etwas veraltete Frage, aber da es immer noch keine guten Antworten zum Testen von Raspberry Pi-Bildern mit QEMU gibt, lassen Sie mich eine Teilantwort beisteuern.
Ich wollte das Ubuntu 16.04 raspi3-Image mit QEMU verwenden. Es wurde heruntergeladen, extrahiert, die Boot-Partition gemountet, die vmlinuz-Datei und die initrd-Datei abgerufen und ... qemu-system-arm -M blabla -cpu ... -kernel ... funktioniert nicht. Schwarzer Bildschirm.
Die Verwendung eines Kernel-Qemu-4.4.34-Jessie von hier mit dem Xenial-Image / Rootfs führte zu demselben "Init-Killed" -Problem, das Sie hatten.
Aber da ich einen bekannten guten Kernel verwende und Ihr einfaches statisch verknüpftes C-Programm funktioniert, ist es wahrscheinlich, dass das Problem nur auftritt, wenn man den dynamischen Linker verwendet. (Und der Linker reagiert nicht besonders empfindlich auf Kernel, da die ld-2.24 aus dem neuesten auf debian9 (stretch) basierenden Raspbian auf einem auf 4.4 debian8 (jessie) basierenden Kernel einwandfrei funktioniert.)
Selbst nach dem Kopieren der Dateien, die mit / auf dem "jessie" -Image funktionieren, in das Ubuntu-Xenial-Image kam es nur zu einem seltsamen "Aufruf preinit: KE" -Fehler.
Oh, und jeder, der einen Kernel für einen Raspberry Pi kompilieren möchte, sollte diese Seite besuchen , die direkt auf die " offiziellen " Dokumente / Anleitungen verweist.
quelle
Der Linux-Kernel läuft nicht mehr mit init, sondern mit systemd, das wie init ist, aber ein bisschen fortgeschrittenere Funktionen und zusätzliche Multitasking-Fähigkeiten bietet, obwohl dies gegen die Unix-Philosophie systemd nützlich ist.
quelle