Эмуляция малины Pi Raspbian с Qemu

Я пытаюсь подражать малине Pi с помощью Raspian OS с помощью QEMU. Я пробовал несколько подходов, описанных в Интернете, но без каких-либо успехов.

Я понял, что мне нужно исправить ядро ​​Linux, устанавливая нужную ОС. В моем случае я выбрал Rasbian Lite с ядром 4.4:

wget https://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2016-05-31/2016-05-27-raspbian-jessie-lite.zip
unzip 2016-05-27-raspbian-jessie-lite.zip
rm 2016-05-27-raspbian-jessie-lite.zip

Затем я загружаю ядро ​​из https://www.kernel.org/:

wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.16.tar.gz
tar -xzf linux-4.4.16.tar.gz
rm linux-4.4.16.tar.gz

Теперь перекрестная компиляция ядра:

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
cd linux-4.4.16
make vexpress_defconfig
make all
cd ..

Теперь я могу скопировать загрузочный образ, который представляет собой сжатое изображение ядра, которое автоматически извлекается в ОЗУ, в мое рабочее пространство:

cp linux-4.4.16/arch/arm/boot/zImage zImage

и запустите QEMU

qemu-system-arm -kernel zImage -M vexpress-a9 -m 1024 -cpu cortex-a9 -no-reboot -serial stdio -hda 016-05-27-raspbian-jessie-lite.img -append "root=/dev/sda2 rootfstype=ext4"

Но я вижу только черное заполненное окно QEMU.: (

Я думаю, что проблема заключается в том, чтобы получить правильное Ядро. Копирование некоторых ячеек из Интернета никогда не приводило к успеху, потому что они не подходят для ОС.

Как я могу построить/исправить ядро, устанавливающее ОС (без загрузки существующего) и как правильно запустить QEMU?

Спасибо заранее Alex


Второй подход

Загружаю kernel-qemu здесь https://www.dropbox.com/s/g8u93xblz1v1ly0/kernel-qemu?dl=0 и запускаем с ним QEMU:

qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2" -hda 2016-05-27-raspbian-jessie-lite.img

Это приносит мне следующий результат: введите описание изображения здесь И это имеет смысл для меня, потому что ядро ​​3.10.25 и старше, чем Raspbian Jessie с ядром 4.4.16.

С qemu-ядром из https://github.com/dhruvvyas90/qemu-rpi-kernel/blob/master/kernel-qemu-4.4.12-jessie

qemu-system-arm -kernel kernel-qemu-4.4.12-jessie -cpu arm1176 -m 256 -M versatilepb -serial stdio -append "root=/dev/sda2 rootfstype=ext4 rw" -hda 2016-05-27-raspbian-jessie-lite.img

У меня получился такой же результат: введите описание изображения здесь

Новая попытка с новым ядром-qemu 4.4.16:

  • Скопируйте build-kernel-qemu из https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/master/tools и добавьте следующую строку для проверки версии для Kernel 4.4.16

    git checkout b05965f284db3e086022f4e318e46cb5bffb1376
    
  • Запустите build-kernel-qemu для сборки ядра

    sh build-kernel-qemu
    
  • Запустите QEMU

    qemu-system-arm -kernel kernel-qemu -m 256 -M versatilepb -serial stdio -append "root=/dev/sda2 rootfstype=ext4 rw" -hda 2016-05-27-raspbian-jessie-lite.img
    

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

Ответ 1

Перед запуском

вы должны развернуть файл изображения Raspbian.

Подключите файл изображения Raspbian с помощью kpartx (возможно, придется установить kpartx)

$ sudo kpartx -av your-image.img
add map loop0p1 (252:5): 0 117187 linear /dev/loop0 1
add map loop0p2 (252:6): 0 3493888 linear /dev/loop0 118784

$ sudo mount /dev/mapper/loop0p2 /mnt/img1
$ cd /mnt/img1

Измените /etc/fstab и закомментируйте монтировки MMCBLK

$ sudo nano etc/fstab

proc            /proc           proc    defaults          0       0
#/dev/mmcblk0p1  /boot           vfat    defaults          0       2
#/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

Измените /etc/ld.so.preload и закомментируйте строки...

$ sudo nano etc/ld.so.preload

#/usr/lib/arm-linux-gnueabihf/libarmmem.so

Отключить и уничтожить циклы из kpartx

$ sudo umount /mnt/img1
$ sudo kpartx -d your-image.img

Получите ядро ​​Qemu, соответствующее изображению Raspbian здесь...

https://github.com/dhruvvyas90/qemu-rpi-kernel

Я использовал эту команду для успешного эмуляции Raspbian Jessie

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" \
-redir tcp:5022::22 \
-hda 2016-05-27-raspbian-jessie-lite.img

Ответ 2

Для запуска в QEMU требуется модифицированное ядро, поскольку в QEMU не доступно оборудование платы PI для малины. Вот почему ваш первый подход не удался.

В вашем втором подходе используется ядро, правильно исправленное для запуска на универсальной плате (поддерживается QEMU), так что это хорошо, но ядро ​​3.x слишком устарело для современного Raspbian. В принципе, ваш последний подход должен сработать.

Я рекомендую это обновленное руководство (feb 2017), я проверил его с ядром 4.4, и он работает сразу.

qemu-system-arm -kernel $KERNEL -cpu arm1176 -m 256 -M versatilepb -net nic,macaddr=$MAC -net tap -no-reboot -append "root=/dev/sda2 panic=1" -drive format=raw,file=$IMG

Мне пришлось использовать опцию format=raw,file=$IMG, чтобы избежать предупреждения QEMU.

Вам не нужно комментировать /etc/fstab, вы можете добавить в /etc/udev/rules.d/90-qemu.rules

KERNEL=="sda", SYMLINK+="mmcblk0"
KERNEL=="sda?", SYMLINK+="mmcblk0p%n"
KERNEL=="sda2", SYMLINK+="root"

Кроме того, объект ld.so.preload является старым и больше не применяется

script, приведенный в упомянутом руководстве, делает все это для вас, а также обеспечивает сетевой доступ к вашему raspbian путем совместного использования сетевого интерфейса с raspbian.

Ответ 3

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

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

Преимущества:

  • с -M raspi2, мы можем использовать ядро ​​ванили, поэтому система более представительна

Ограничения:

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

Шаги:

  • Скомпилируйте 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`
    
  • Загрузите изображение и извлеките из него ядро ​​и dts:

    • Загрузите изображение и разархивируйте его:

      wget http://downloads.raspberrypi.org/raspbian/images/raspbian-2016-05-31/2016-05-27-raspbian-jessie.zip
      unzip 2016-05-27-raspbian-jessie.zip
      
    • Установите второе изображение раздела. Самый простой способ:

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

      Это работает только с последним losetup на Ubuntu 16.04, другие методы: https://askubuntu.com/questions/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
      
  • Run:

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

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

[не удалось] 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)

Ответ 4

У меня была аналогичная проблема с пользовательским изображением ubuntu. Я также применил модификации, как описано в ответе @Michael Connors, после чего я вижу загрузку системы.

Вы можете добавить следующее в -append="", чтобы узнать, что происходит в вашем случае:

qemu-system-arm ... -serial stdio -append="... console=ttyAMA0,115200 loglevel=8"