Pobrałem obraz Raspbian na tej stronie . Próbuję skompilować jądro, którego można użyć do uruchomienia obrazu w qemu.
Pobrałem źródło jądra Linux z kernel.org i uruchomiłem:
make versatile_defconfig
make menuconfig
Następnie dodałem następujące funkcje do jądra:
- Obsługa PCI (CONFIG_PCI)
- Obsługa urządzeń SCSI (CONFIG_SCSI)
- Obsługa dysków SCSI (CONFIG_BLK_DEV_SD)
- SYM53C8XX Wersja 2 Obsługa SCSI (CONFIG_SCSI_SYM53C8XX_2)
- System plików Extended 3 (ext3) (CONFIG_EXT3_FS)
- System plików Extended 4 (ext4) (CONFIG_EXT4_FS)
Zapętliłem również obraz dysku i:
- skomentował
/etc/ld.so.preload
- dostosowane
/etc/fstab
do użycia/dev/sda1
i/dev/sda2
Następnie odmontowałem obraz i próbowałem uruchomić maszynę za pomocą:
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"
Jądro było w stanie zamontować system plików, ale natychmiast napotkało pewne problemy:
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
Na początku zastanawiałem się, czy nie było to związane z SELinux. Próbowałem uruchomić jądro za pomocą:
selinux=0 enforcing=0
... ale nie miało to absolutnie żadnej różnicy.
Co ja robię źle? A co oznacza ten błąd?
Aktualizacje
Próbowałem również następujących, bez powodzenia:
- Próbowałem kompilować z
CONFIG_VFP
włączoną funkcją lub bez - Dodałem
CONFIG_DEVTMPFS
iCONFIG_DEVTMPFS_MOUNT
- Stosując tę poprawkę i umożliwienie
CPU_V6
,CONFIG_MMC_BCM2835
, iCONFIG_MMC_BCM2835_DMA
- Korzystanie z
gcc-linaro-arm-linux-gnueabihf-raspbian
zestawu narzędzi Kompilowanie prostego programu C za pomocą zestawu narzędzi, a następnie przekazywanie jego ścieżki do jądra za pomocą
init=
utworów - co prowadzi mnie do przekonania, że istnieje rozbieżność między formatami binarnymifile <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`
Skompilowałem ten prosty program C z łańcuchem narzędzi:
<path>/arm-linux-gnueabihf-gcc --static simple.c -o simple
... i skopiowałem go do /root
obrazu, zmieniając init=
parametr rozruchowy na /root/simple
. To daje mi następujące informacje podczas uruchamiania:
Starting bash...
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004
Wygląda na to, że dusi się podczas execv()
rozmowy.
źródło
cat .config | grep CONFIG_VFP
dajeCONFIG_VFP=y
- wydaje się, że jest włączony.CONFIG_VFP
niego i to nie ma znaczenia.versatilepb
jest procesorem ARM926, który jest starszy niż ARM1176 RPi, więc pliki binarne Raspbian mogą używać innej funkcji, która nie jest emulowana. Od unixmen.com/emulating-raspbian-using-qemu , czy-cpu arm1176
pomoc?Odpowiedzi:
Próbowałem również uruchomić obrazy ARM za pomocą QEMU bez powodzenia. Przykro mi powiedzieć, że będziesz musiał użyć prawdziwego sprzętu do pracy z systemem ARM lub cierpliwie czekać, aż programiści stworzą bardziej niezawodny emulator ARM.
Jest grudzień 2018 i nadal występują problemy
qemu-system-arm
.Byłem w stanie uruchomić Raspbian Jessie na emulatorze QEMU przy użyciu świeżo zainstalowanego Ubuntu 18 Bionic, jednak nie był stabilny w mojej pracy, więc musiałem zostawić go na prawdziwy sprzęt. Często zamarzał.
qemu-system-arm
nie działał na moim systemie operacyjnym, więc użyłem Virtualbox do zainstalowania Ubuntu Bionic, a wewnątrz Bionic zainstalowałem Raspbian z QEMU.Wykonałem ten samouczek: https://azeria-labs.com/emulate-raspberry-pi-with-qemu/
Powodzenia
źródło
Wiem, że to nieco postarzane pytanie, ale ponieważ nadal nie ma dobrych odpowiedzi na testowanie obrazów Raspberry Pi za pomocą QEMU, pozwól mi udzielić częściowej odpowiedzi.
Chciałem użyć obrazu Ubuntu 16.04 raspi3 z QEMU. Pobrałem go, rozpakowałem, zamontowałem partycję rozruchową, dostałem plik vmlinuz i plik initrd i ... qemu-system-arm -M blabla -cpu ... -kernel ... nie działa. Czarny ekran.
Następnie za pomocą kernel-qemu-4.4.34-Jessie z tu z xenial obrazu / głównego systemu plików doprowadziły do tego samego „init zabity” problem masz.
Ale ponieważ używam znanego dobrego jądra, a ponieważ twój prosty statycznie połączony program C działa, prawdopodobnie problem pojawia się tylko wtedy, gdy używasz dynamicznego linkera. (A linker nie jest szczególnie wrażliwy na jądra, ponieważ ld-2.24 z najnowszego raspbian opartego na debian9 (stretch) działa dobrze na jądrze opartym na debian8 (jessie) 4.4).
Nawet po skopiowaniu plików, które działają na / z obrazem „jessie” do obrazu Xenial Ubuntu, mam tylko dziwny błąd „preinit wywołania: KE”.
Aha, i każdy, kto szuka kompilacji jądra dla Raspberry Pi, powinien sprawdzić tę stronę, która bezpośrednio odwołuje się do „ oficjalnych ” dokumentów / howto.
źródło
Jądro linuksa nie uruchamia już init, zamiast tego uruchamia systemd, co przypomina init, ale nieco bardziej zaawansowane funkcje i dodatkowe możliwości wielozadaniowości, chociaż w przeciwieństwie do filozofii unix systemd jest użyteczny.
źródło