web-dev-qa-db-ja.com

QEMUでRaspberry Pi 2をエミュレートするにはどうすればよいですか?

少し前に私は次のRaspberry Piをエミュレートしました この記事 ですが、このアプローチにはいくつかの問題があります:

  1. とても遅いです。
  2. ディスプレイソリューションは800x600に制限されています。
  3. 256MBを超えるRAMをエミュレートすることはできません。

さらに、新しいBroadcom BCM2836または他のarm7ベースのCPUのエミュレーションは Qem にはありません。ただし、Raspberry Piをエミュレートすることが興味深い理由はいくつかあります。 LinuxでQemuまたはその他のエミュレーションソフトウェアを使用してRaspberry Pi 2エミュレーションを動作させるための正しい方向に私をプッシュするヒントに興味があります。

12
Phidelux

Qemuの作成に慣れている場合は、pi2システムエミュレーションのサポートをここで見つけることができます: https://github.com/0xabu/qem 。これは特に高速ではなく、デバイスエミュレーションは不完全ですが、RAMおよびフレームバッファーのサイズを変更できます。

https://github.com/0xabu/qemu/wiki の最後にRaspbianを起動するための簡単な説明があります

5
ab.

Raspberry Pi 2ビルドボットまたは類似のものを実行する場合は、 ユーザー/静的モードのQem の実行を確認する必要があります。私は仮想マシンでLinuxを使用してこれを試しましたが、Qemuシステムエミュレーションに比べてかなり高速です。残念ながら、CPUをエミュレートするだけなので、ゲームやWayland/Westonをテストすることはできません。

この方法を使用すると、Pi 2のカーネルを約1時間で構築できました。

11
Keehl

Ubuntu 16.04、QEMU 2.9.0 -M raspi2、Raspbian 2016-05-27、Vanilla kernel

enter image description here

  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. パーティションの2番目のイメージをマウントします。最も簡単な方法は次のとおりです。

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

      これは、Ubuntu 16.04の最新のlosetupでのみ機能し、他の方法は次の場所にあります 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 .
      cp /mnt/rpi/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は完全に機能します。したがって、今のところGUIを備えたLiteイメージを使用することもできます。
  • ネットワーキングなし

Ubuntu 16.04、QEMU 2.5.0、Raspbian 2016-05-27、変更されたカーネル

このメソッドは、Ubuntu 16.04のQEMU 2.5.0にある-M versatilepbを使用します。

欠点は、変更されたカーネルをダウンロードする必要があることです( https://raspberrypi.stackexchange.com/questions/47124/emulating-with-qemu-why-the-extra-kernel を参照)。画像を変更して、実際のシステムを代表しないようにします。

  1. ダウンロード: https://github.com/dhruvvyas90/qemu-rpi-kernel/blob/36ede073f4ccb64f60200ede36c231afe9502070/kernel-qemu-4.4.12-jessie

    4.4.12は、Raspbianイメージのカーネルバージョンであるため選択します。

    そのカーネルblobを生成するプロセスは、次のリポジトリで説明されています https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/36ede073f4ccb64f60200ede36c231afe9502070/tools

    この追加のカーネルイメージが必要な理由: https://raspberrypi.stackexchange.com/questions/47124/emulating-with-qemu-why-the-extra-kernel

  2. https://github.com/dhruvvyas90/qemu-rpi-kernel/wiki/Emrating-Jessie-image-with-4.x.xx-kernel/0068f0c21d942b0f331e18014ff8e22c20cada5c

    概要:

    1. -M raspi2の場合と同様にイメージをマウントしますが、最初のパーティションではなく2番目のパーティションを使用します。

      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がデフォルトであるため、-M raspi2のソースからQEMUをコンパイルする必要はありません。ただし、次のメッセージの後に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、Vanillaカーネル

この新しいイメージでは、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)

TODO: sschoof言及rootdelay=1がこれを解決するので、試してみる必要があります。

bztsrc/raspi3-tutorial QEMUのRPI3ベアメタル

https://github.com/bztsrc/raspi3-tutorial は、QEMUで動作する優れたサンプルセットであり、次のURLから超迅速に開始できます https://raspberrypi.stackexchange.com/questions/34733/how-to-do-qemu-emulation-for-bare-metal-raspberry-pi-images/85135#85135