Невозможно эмулировать Raspberry Pi с помощью Qemu: Kernel Panic

15

Я пытаюсь следовать различным инструкциям в Интернете, чтобы подражать Raspberry Pi на моей машине Fedora 22. Я нашел этот вопрос: эмулируя raspbian с QEMU и использовал его, чтобы найти kernel-qemu для захвата ядра. Я скачал 2015-09-24-raspbian-jessie.imgот хороших людей в Raspberry Pi.

Когда я пытаюсь бежать, у qemu-system-armменя возникает паника ядра. Я что-то пропустил?

Вот qemu-system-armкомандная строка, которую я набрал:

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

Далее следуют сообщения ядра:

sd 0:0:0:0: [sda] Attached SCSI disk
smc91x.c: v1.1, sep 22 2004 by Nicolas Pitre <nico@fluxnic.net>
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)
Майк С
источник
2
Вы пытались эмулировать хриплый образ? Если ядро ​​работает с ним, это должна быть Джесси.
dhruvvyas90
Ой! Да, когда ядро ​​не совпадает с IMG, вещи ломаются! Хриплый образ работает ... Спасибо.
Майк С
универсальная версия
инструкции

Ответы:

4

Как сказал @dastaan, версия ядра должна соответствовать файлу img. Я пытался использовать файл образа версии ядра 4.1 с ядром 3.18.

Теперь, когда я использую правильное изображение, оно работает.

Благодарность!

Редактировать: заставить это работать довольно просто: возьмите изображение с https://github.com/dhruvvyas90/qemu-rpi-kernel/ , а затем загрузите соответствующее изображение Raspian по адресу https://www.raspberrypi.org/ Загрузки / raspbian / . В настоящее время Джесси и Уизи работают в обоих местах, но в будущем нет никакой гарантии, что соответствующее ядро ​​будет доступно на этом сайте Github. В любом случае, меня не очень впечатлила скорость, поэтому я смотрю на то, как подключить настоящий Pi к проводному сетевому порту моего ноутбука и подключить его к вспомогательному аккумулятору мобильного телефона емкостью 5200 мАч, а также использовать VNC на ноутбуке в качестве дисплей.

Я не заставлял Джесси работать; это была проблема - у меня было ядро ​​Уизи и образ Джесси, но у меня не было ядра Джесси.

Майк С
источник
1
Можете ли вы добавить подробный ответ, как вы решили это с помощью новейшего ядра? Это поможет другим пользователям, пытающимся подражать Джесси. Благодарю.
dhruvvyas90
3
Я пробовал ядро ​​jessie и образ jessie, и они терпят неудачу с той же ошибкой. Ядро 4.1 ( github.com/dhruvvyas90/qemu-rpi-kernel/blob/master/… ) и обычное сообщение Джесси Май 2015 года от Raspbian.
Майкл МакГарра
Без обид, но нет такого понятия, как ядро ​​Джесси. С помощью raspbian netinstaller вы можете установить wheezy или jessie, и в обоих случаях будет установлено одно и то же ядро.
Дидерик де Хаас
Хотя это правда, что ядра названы по версии, моя проблема была не в том, как загрузить распбиенский сетевой установщик. Моя проблема заключалась в сопоставлении файлов изображений от хороших людей из Raspberry Pi с правильной версией ядра. В будущем я надеюсь, что люди, которые сталкиваются с этим вопросом, посмотрят на мои сообщения об ошибках и поймут, в чем их проблема.
Майк С
@MichaelMcGarrah заставил его работать после прочтения вики этого репо: raspberrypi.stackexchange.com/a/53993/33424 Вам нужно немного подправить изображение Распбиана.
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件
1

Не стесняйтесь взглянуть на мое ядро ​​с поддержкой qemu: https://github.com/diederikdehaas/raspbian-kernel
В сообщениях коммитов вы можете найти подробные описания того, что и как изменилось.
Большая часть этого была основана на этой статье: https://web.archive.org/web/20131210001638/http://xecdesign.com/compiling-a-kernel/

Дидерик де Хаас
источник
1

Ubuntu 16.04, QEMU 2.9.0 -M raspi2, Raspbian 2016-05-27, ядро ​​ванили

введите описание изображения здесь

шаги:

  1. Скомпилируйте QEMU 2.9.0 из исходного кода:

    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. Скачайте образ и извлеките ядро ​​и dts из него:

    1. Загрузите изображение и распакуйте его:

      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. Смонтируйте второй образ раздела. Самый простой способ это:

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

      Это работает только с последними losetupна Ubuntu 16.04, другие методы по адресу: /ubuntu/69363/mount-single-partition-from-image-of-entire-disk-device/496576#496576

      Это печатает устройство петли, например:

      /dev/loop0
      

      Итак, мы делаем:

      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. Бегать:

    ./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 \
    ;
    

Затем вы можете войти на терминал, который отображается на вашем хост-терминале.

Текущие ограничения:

  • -M raspi2был добавлен в QEMU 2.6.0, а Ubuntu 16.04 имеет только QEMU 2.5.0, поэтому мы должны скомпилировать QEMU из исходного кода. Но это не сложно.
  • GUI показывает, но не реагирует на мышь / клавиатуру, протестированную как на SDL, так и на VNC. Но CLI работает отлично, однако. Таким образом, вы могли бы также использовать образ Lite, который на данный момент имеет графический интерфейс.
  • нет сети

Ubuntu 16.04, QEMU 2.5.0, Raspbian 2016-05-27, модифицированное ядро

Этот метод использует, -M versatilepbкоторый присутствует в QEMU 2.5.0 Ubuntu 16.04.

Недостатком является то, что вам нужно скачать модифицированное ядро ​​(см. Эмуляция с Qemu: почему дополнительное ядро? ) И изменить образ, чтобы он был менее представительным для реальной системы.

  1. Загрузить: https://github.com/dhruvvyas90/qemu-rpi-kernel/blob/36ede073f4ccb64f60200ede36c231afe9502070/kernel-qemu-4.4.12-jessie

    Мы выбираем, 4.4.12так как это версия ядра в образе Распбиана.

    Процесс создания этого большого двоичного объекта ядра описан в репозитории по адресу: https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/36ede073f4ccb64f60200ede36c231afe9502070/tools

    Зачем нужен этот дополнительный образ ядра: Эмуляция с Qemu: зачем дополнительное ядро?

  2. Измените изображение Raspbian, как упомянуто по адресу: https://github.com/dhruvvyas90/qemu-rpi-kernel/wiki/Emulated-Jessie-image-with-4.x.xx-kernel/0068f0c21d942b0f331e18014ff8e22c20cada5c

    Резюме:

    1. Смонтируйте образ так же, как мы это делали для -M raspi2, но используйте второй раздел вместо первого:

      sudo mount /dev/loop0p2 /mnt/rpi
      
    2. Редактировать изображение:

      # 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. Бегать:

    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
    

[не удалось] Ubuntu 17.04, QEMU 2.8.0 -M raspi2, Raspbian 2016-05-27, ядро ​​ванили

В этой более новой Ubuntu QEMU 2.8.0 используется по умолчанию, поэтому нам не нужно компилировать QEMU из исходного кода для -M raspi2. Однако 2.8.0 зависает при загрузке после сообщения:

Console: switching to colour frame buffer device 100x30

Это показывает, насколько нестабильна -M raspi2ситуация.

[не удалось] Ubuntu 16.04, QEMU 2.9.0 -M raspi2, Raspbian 2017-08-16, ядро ​​ванили

На этом новом образе, используя тот же метод для 2016-05-27, ядро ​​паникует при загрузке с:

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 голый металл на QEMU

https://github.com/bztsrc/raspi3-tutorial - это хороший набор примеров, которые работают только с QEMU. Ultraquick начинается с: Как сделать эмуляцию QEMU для изображений Raspberry Pi с голым металлом

Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件
источник
Ваш метод с losetupчрезмерно сложен. Вместо этого вы можете просто использовать fdisk -l your-image.img, а затем использовать смещение для раздела в mountопции -o loop,offset=$((512*YOUR_OFFSET)).
Руслан
-М распи2 не работает
чжаофэн-шу33
0

Большинство руководств устарели и содержат неработающие ссылки. Вы должны использовать исправленное ядро, которое соответствует используемой вами версии raspbian.

Следующее руководство работает с февраля 2017 года. Оно содержит скрипт, который позаботится об изменении образа raspbian для работы в QEMU, а также автоматически поделится вашим сетевым соединением с raspbian.

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

nachoparker
источник
-1

Вы можете скачать мое собственное ядро ​​(4.1.7) для Raspbian Jessie на моем github, polaco1782 . Следуйте инструкциям на документах.

Кассиано Мартин
источник
1
Ваше ядро ​​отправляет меня в аварийный режим каждый раз, когда я пытаюсь подражать. Я сделал так, как написано в файле read me. (См. Последнее сообщение на -> raspberrypi.org/forums/viewtopic.php?t=112259 ). Можете ли вы отредактировать свой ответ, чтобы шаг за шагом показать, что вы изменили в базовом изображении Джесси, чтобы он работал. Это пригодится другим пользователям, так как теперь, когда изображение Джесси живое, все больше и больше пользователей будут подражать Джесси на qemu. Заранее спасибо.
dhruvvyas90
Можете ли вы расширить свой ответ, чтобы объяснить, что является обычным в вашем ядре?
Greenonline
Я смог решить мою проблему, комментируя fstabзаписи mmcblk.
dhruvvyas90
@Greenonline Поскольку qemu не поддерживает платформу Rpi, для эмуляции rpi в Qemu необходима настройка ядра. Вы не можете просто взять ядро ​​Rpi и заставить его работать из коробки.
dhruvvyas90