Nie można emulować Raspberry Pi przy użyciu Qemu: Kernel Panic

15

Próbuję śledzić różne przewodniki w Internecie, aby emulować Raspberry Pi na moim komputerze Fedora 22. Znalazłem to pytanie: Emulowanie raspbian za pomocą QEMU i użyłem go do znalezienia kernel-qemu, aby złapać jądro. Pobrałem 2015-09-24-raspbian-jessie.imgod dobrych ludzi z Raspberry Pi.

Kiedy próbuję uruchomić qemu-system-arm, wpadam w panikę jądra. Czy czegoś brakuje?

Oto qemu-system-armwiersz poleceń, który wpisałem:

qemu-system-arm -cpu arm1176 -m 256 -M versatilepb -no-reboot -nographic -kernel kernel-qemu -appc=2 console=ttyAMA0 rw" -hda 2015-09-24-raspbian-jessie.img -net nic -net user,hostfwd=tcp::9999-:22

Następnie komunikaty jądra:

sd 0:0:0:0: [sda] Attached SCSI disk
smc91x.c: v1.1, sep 22 2004 by Nicolas Pitre <[email protected]>
eth0: SMC91C11xFD (rev 1) at d089a000 IRQ 25 [nowait]
eth0: Ethernet addr: 52:54:00:12:34:56
mousedev: PS/2 mouse device common for all mice
TCP cubic registered
NET: Registered protocol family 17
input: AT Raw Set 2 keyboard as /devices/fpga:06/serio0/input/input0
input: ImExPS/2 Generic Explorer Mouse as /devices/fpga:07/serio1/input/input1
EXT2-fs (sda2): error: couldn't mount because of unsupported optional features (244)
EXT4-fs (sda2): couldn't mount as ext3 due to feature incompatibilities
EXT4-fs (sda2): recovery complete
EXT4-fs (sda2): mounted filesystem with ordered data mode. Opts: (null)
VFS: Mounted root (ext4 filesystem) on device 8:2.
devtmpfs: mounted
Freeing init memory: 120K
Kernel panic - not syncing: Attempted to kill init!
[<c0032bec>] (unwind_backtrace+0x0/0xf0) from [<c03064dc>] (panic+0x58/0x170)
[<c03064dc>] (panic+0x58/0x170) from [<c0044054>] (do_exit+0x5d0/0x68c)
[<c0044054>] (do_exit+0x5d0/0x68c) from [<c004435c>] (do_group_exit+0x40/0xb0)
[<c004435c>] (do_group_exit+0x40/0xb0) from [<c004ed48>] (get_signal_to_deliver+0x1a8/0x378)
[<c004ed48>] (get_signal_to_deliver+0x1a8/0x378) from [<c002f124>] (do_signal+0x90/0x518)
[<c002f124>] (do_signal+0x90/0x518) from [<c002fa64>] (do_notify_resume+0x48/0x54)
[<c002fa64>] (do_notify_resume+0x48/0x54) from [<c002cc38>] (work_pending+0x24/0x28)
Mike S.
źródło
2
Próbowałeś emulować świszczący obraz? Jeśli jądro z nim współpracuje, musi to być jessie.
dhruvvyas90,
O rany! Tak, gdy jądro nie pasuje do obrazu, wszystko się psuje! Obraz świszczący działa ... Dzięki.
Mike S
ogólna wersja howto: raspberrypi.stackexchange.com/questions/165/…
Ciro Santilli 22 改造 中心 法轮功 六四 事件

Odpowiedzi:

4

Jak powiedział @dastaan, wersja jądra musi pasować do pliku img. Próbowałem użyć pliku obrazu wersji jądra 4.1 z jądrem 3.18.

Teraz, gdy używam właściwego obrazu, działa.

Dzięki!

Edycja: Uruchomienie tego jest dość proste: Chwyć obraz z https://github.com/dhruvvyas90/qemu-rpi-kernel/ , a następnie pobierz odpowiedni obraz Raspian, który chcesz na https://www.raspberrypi.org/ pliki do pobrania / raspbian / . Obecnie Jessie i Wheezy działają w obu miejscach, ale w przyszłości nie ma gwarancji, że odpowiednie jądro będzie dostępne na tej stronie Github. W każdym razie nie byłem pod takim wrażeniem szybkości, więc patrzę na umieszczenie prawdziwego Pi na przewodowym porcie sieciowym mojego laptopa i zasilenie go przez baterię pomocniczą 5200 mAh i używanie VNC na laptopie jako wyświetlacz.

Nie zmusiłem Jessie do pracy; to był problem - miałem jądro Wheezy i obraz Jessie, ale nie miałem jądra Jessie.

Mike S.
źródło
1
Czy możesz dodać szczegółową odpowiedź na pytanie, jak to rozwiązałeś, używając najnowszego jądra? Pomoże innym użytkownikom próbującym emulować jessie. Dzięki.
dhruvvyas90
3
Próbowałem jądra Jessie i obrazu Jessie, a one nie działają z tym samym błędem. Jądro 4.1 ( github.com/dhruvvyas90/qemu-rpi-kernel/blob/master/… ) i regularne jessie post z maja 2015 od Raspbian.
Michael McGarrah,
Bez obrazy, ale nie ma czegoś takiego jak jądro Jessie. Z raspbian netinstaller możesz wybrać instalację wheezy lub jessie, aw obu przypadkach instalowane jest dokładnie to samo jądro.
Diederik de Haas,
Chociaż prawdą jest, że jądra mają nazwy według wersji, moim problemem nie było pobranie raspbian netinstaller. Moim problemem było dopasowanie plików graficznych dobrych ludzi z Raspberry Pi do odpowiedniej wersji jądra. Mam nadzieję, że w przyszłości ludzie, którzy wpadną na to pytanie, przejrzą moje komunikaty o błędach i zdadzą sobie sprawę z ich problemów.
Mike S
@MichaelMcGarrah sprawił, że zadziałało po przeczytaniu wiki tego repozytorium: raspberrypi.stackexchange.com/a/53993/33424 Musisz trochę poprawić obraz Raspbian.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
1

Ubuntu 16.04, QEMU 2.9.0 -M raspi2, Raspbian 27.05.2016, jądro wanilii

wprowadź opis zdjęcia tutaj

Kroki:

  1. Skompiluj QEMU 2.9.0 ze źródła:

    sudo apt-get build-dep qemu-system-arm
    git clone --recursive git://git.qemu-project.org/qemu.git
    cd qemu
    git checkout v2.9.0
    ./configure
    make `nproc`
    
  2. Pobierz obraz i wyodrębnij z niego jądro i dts:

    1. Pobierz obraz i rozpakuj go:

      wget http://downloads.raspberrypi.org/raspbian/images/raspbian-2016-05-31/2016-05-27-raspbian-jessie.zip
      unzip 2016-05-27-raspbian-jessie.zip
      
    2. Zamontuj drugi obraz partycji. Najprostszym sposobem jest:

      sudo losetup -f --show -P 2016-05-27-raspbian-jessie.img
      

      Działa to tylko z najnowszymi losetupwersjami Ubuntu 16.04, innymi metodami pod adresem : /ubuntu/69363/mount-single-partition-from-image-of-entire-disk-device/496576#496576

      Wyświetla to urządzenie pętli, np .:

      /dev/loop0
      

      więc robimy:

      sudo mkdir /mnt/rpi
      sudo mount /dev/loop0p1 /mnt/rpi
      cp /mnt/rpi/kernel7.img bcm2709-rpi-2-b.dtb .
      sudo umount /mnt/rpi
      sudo losetup -d /dev/loop0
      
  3. Biegać:

    ./arm-softmmu/qemu-system-arm \
        -M raspi2 \
        -append "rw earlyprintk loglevel=8 console=ttyAMA0,115200 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2" \
        -cpu arm1176 \
        -dtb bcm2709-rpi-2-b.dtb \
        -sd 2016-05-27-raspbian-jessie.img \
        -kernel kernel7.img \
        -m 1G \
        -smp 4 \
        -serial stdio \
    ;
    

Następnie możesz zalogować się do terminala wyświetlanego na terminalu hosta.

Obecne ograniczenia:

  • -M raspi2został dodany w QEMU 2.6.0, a Ubuntu 16.04 ma tylko QEMU 2.5.0, więc musimy skompilować QEMU ze źródła. Ale to nie jest trudne.
  • GUI pokazuje, ale nie reaguje na mysz / klawiaturę, testowane zarówno na SDL, jak i VNC. Jednak CLI działa idealnie. Więc równie dobrze możesz użyć obrazu Lite, który ma teraz GUI.
  • brak sieci

Ubuntu 16.04, QEMU 2.5.0, Raspbian 2016-05-27, zmodyfikowane jądro

W tej metodzie wykorzystuje -M versatilepbsię oprogramowanie QEMU 2.5.0 systemu Ubuntu 16.04.

Minusem jest to, że musisz pobrać zmodyfikowane jądro (patrz Emulowanie za pomocą Qemu: dlaczego dodatkowe jądro? ) I zmodyfikować obraz, aby był mniej reprezentatywny dla prawdziwego systemu.

  1. Pobierz: https://github.com/dhruvvyas90/qemu-rpi-kernel/blob/36ede073f4ccb64f60200ede36c231afe9502070/kernel-qemu-4.4.12-jessie

    Wybieramy, 4.4.12ponieważ jest to wersja jądra na obrazie Raspbian.

    Proces generowania tego obiektu blob jądra opisano w repozytorium pod adresem : https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/36ede073f4ccb64f60200ede36c231afe9502070/tools

    Dlaczego ten dodatkowy obraz jądra jest potrzebny: Emulacja za pomocą Qemu: dlaczego dodatkowe jądro?

  2. Zmodyfikuj obraz Raspbian, jak wspomniano na stronie : https://github.com/dhruvvyas90/qemu-rpi-kernel/wiki/Emulations-Jessie-image-with-4.x.xx-kernel/0068f0c21d942b0f331e18014ff8e22c20cada5c

    Streszczenie:

    1. Zamontuj obraz tak, jak zrobiliśmy to dla -M raspi2, ale użyj drugiej partycji zamiast pierwszej:

      sudo mount /dev/loop0p2 /mnt/rpi
      
    2. Edytuj obraz:

      # Comment out the line present there with #
      sudo vim /mnt/rpi/etc/ld.so.preload
      # Comment out the lines of type: "/dev/mmcblk*"
      sudo vim /mnt/rpi/etc/fstab
      
  3. Biegać:

    sudo apt-get install qemu-system-arm
    qemu-system-arm \
        -kernel kernel-qemu-4.4.12-jessie \
        -cpu arm1176 \
        -m 256 \
        -M versatilepb \
        -no-reboot \
        -serial stdio \
        -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" \
        -hda 2016-05-27-raspbian-jessie.img
    

[błąd] Ubuntu 17.04, QEMU 2.8.0 -M raspi2, Raspbian 27.05.2016, jądro wanilii

W tym nowszym Ubuntu QEMU 2.8.0 jest domyślnym, więc nie musimy kompilować QEMU ze źródła -M raspi2. Jednak 2.8.0 zawiesza się przy starcie po komunikacie:

Console: switching to colour frame buffer device 100x30

To pokazuje, jak niestabilny -M raspi2jest nadal.

[błąd] Ubuntu 16.04, QEMU 2.9.0 -M raspi2, Raspbian 2017-08-16, jądro wanilii

Na tym nowszym obrazie, przy użyciu tej samej metody dla 27.05.2016, jądro wpada w panikę podczas rozruchu z:

Please append a correct "root=" boot option; here are the available partitions:
...
[    4.138114] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

bztsrc/raspi3-tutorial RPI3 bare metal na QEMU

https://github.com/bztsrc/raspi3-tutorial to dobry zestaw przykładów, które działają tylko na QEMU, ultraszybkie rozpoczęcie pracy: Jak wykonać emulację QEMU dla nagich obrazów Raspberry Pi

Ciro Santilli
źródło
Twoja metoda losetupjest zbyt skomplikowana. Zamiast tego możesz po prostu użyć fdisk -l your-image.img, a następnie użyć przesunięcia do partycji w mountopcji -o loop,offset=$((512*YOUR_OFFSET)).
Ruslan
-M raspi2 nie działa
zhaofeng-shu33
0

Większość przewodników jest nieaktualna i zawiera uszkodzone linki. Musisz użyć łatanego jądra, które pasuje do używanej wersji Raspbian.

Poniższy przewodnik działa od lutego 2017 r. Zawiera skrypt, który zajmuje się zmianą obrazu raspbian w celu uruchomienia na QEMU, a także automatycznie dzieli twoje połączenie sieciowe z raspbian.

https://ownyourbits.com/2017/02/06/raspbian-on-qemu-with-network-access/

nachoparker
źródło
-1

Możesz pobrać moje niestandardowe jądro (4.1.7) dla Raspbian Jessie na mój github, polaco1782 . Postępuj zgodnie z instrukcjami dotyczącymi plików doc.

Cassiano Martin
źródło
1
Twoje jądro wysyła mnie do monitu w trybie awaryjnym za każdym razem, gdy próbuję emulować. Zrobiłem tak, jak jest napisane w pliku read me. (Zobacz ostatni post na -> raspberrypi.org/forums/viewtopic.php?t=112259 ) Czy możesz edytować swoją odpowiedź, aby pokazać krok po kroku, co zmieniłeś w podstawowym obrazie jessie, aby działało. Przyda się innym użytkownikom, ponieważ teraz, gdy obraz jessie jest aktywny, coraz więcej użytkowników będzie emulować jessie na qemu. Z góry dziękuję.
dhruvvyas90,
Czy możesz rozszerzyć swoją odpowiedź, aby wyjaśnić, co jest niestandardowe w twoim jądrze?
Greenonline,
Udało mi się rozwiązać problem, komentując fstabwpisy mmcblk.
dhruvvyas90
@Greenonline Ponieważ qemu nie obsługuje platformy Rpi, konieczne jest dostosowanie konfiguracji jądra w celu emulacji rpi na Qemu. Nie możesz po prostu wziąć jądra Rpi i sprawić, by działało po wyjęciu z pudełka.
dhruvvyas90,