web-dev-qa-db-ja.com

QEMUでRaspberry Pi Raspbianをエミュレートする方法は?

QEMUを使用して、Raspian OSでRaspberry Piをエミュレートしようとしています。インターネットで説明されているいくつかのアプローチを試しましたが、成功しませんでした。

目的のOSに適合するLinuxカーネルにパッチを適用する必要があることがわかりました。私の場合、カーネル4.4のRasbian Liteを選択しました。

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 ..

これで、ブートイメージ、つまりRAMで自動抽出される圧縮カーネルイメージをワークスペースにコピーできます。

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ウィンドウだけです。 :(

問題は正しいカーネルを取得することだと思います。カーネルの一部をインターネットからコピーしても、OSに適合しないため成功しませんでした。

(既存のカーネルをダウンロードせずに)OSに適合するカーネルをビルド/パッチする方法とQEMUを適切に実行する方法は?

前もって感謝します
アレックス


第二のアプローチ

kernel-qemuここから https://www.dropbox.com/s/g8u93xblz1v1ly0/kernel-qemu?dl= を実行して[〜#〜] 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

これにより、次の出力が表示されます。 enter image description here そして、カーネルは3.10.25であり、カーネル4.4.16を搭載したRaspbian Jessieよりも古いため、私には理にかなっています。

https://github.com/dhruvvyas90/qemu-rpi-kernel/blob/master/kernel-qemu-4.4.12-jessie のqemu-kernelで

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

同様の結果が得られました: enter image description here

新しいkernel-qemu 4.4.16での新しい試行:

  1. Build-kernel-qemuを https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/master/tools からコピーし、次の行を追加してカーネル4.4.16のバージョンをチェックアウトします。

    git checkout b05965f284db3e086022f4e318e46cb5bffb1376
    
  2. 実行build-kernel-qemuカーネルを構築します

    sh build-kernel-qemu
    
  3. 実行[〜#〜] 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
    

    結果: - enter image description here

22
Alex44

開始前にRaspbian Imageファイルを展開する必要があります

Raspbian Imageファイルを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

Unmountおよびkpartxからループを破壊する

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

ここでRaspbianイメージに一致するQemuカーネルを取得します...

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
12
Daddyfix

Raspberry PiボードのハードウェアはQEMUで利用できないため、QEMUで実行するには修正されたカーネルが必要です。それがあなたの最初のアプローチが失敗した理由です。

2番目のアプローチでは、汎用パッチボード(QEMUでサポート)で実行するように適切にパッチを適用したカーネルを使用します。これは良いことですが、カーネル3.xは最新のRaspbianには古すぎます。原則として、最後のアプローチは機能しているはずです。

this 更新ガイド(2017年2月)をお勧めします。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

QEMU警告を回避するために、format=raw,file=$IMGオプションを使用する必要がありました。

/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は古いもので、もう適用されません。

上記のガイドで提供されるスクリプトは、これらすべてを自動的に実行し、ネットワークインターフェイスをraspbianと共有することにより、raspbianへのネットワークアクセスも提供します。

7
nachoparker

Ubuntu 16.04ホスト、QEMU 2.9.0 -M raspi2、Raspbian 2016-05-27、バニラカーネル

enter image description here

利点:

  • -M raspi2を使用すると、Vanillaカーネルを使用できるため、システムがより代表的です

制限事項:

  • -M raspi2はQEMU 2.6.0で追加され、Ubuntu 16.04にはQEMU 2.5.0しか含まれていないため、ソースからQEMUをコンパイルする必要があります。しかし、これは難しくありません。
  • gUIは表示されますが、SDLとVNCの両方でテストされたマウス/キーボードに応答しません。ただし、CLIは完全に機能します。そのため、今のところGUIを使用しているLiteイメージを使用することもできます。
  • ネットワーキングなし

手順:

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

その後、ホスト端末に表示される端末にログインできます。

[失敗] Ubuntu 17.04、QEMU 2.8.0 -M raspi2、Raspbian 2016-05-27、Vanilla kernel

この新しい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 kernel

この新しいイメージでは、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 QEMUのRPI3ベアメタル

https://github.com/bztsrc/raspi3-tutorial は、QEMUで動作する優れたサンプルセットです。非常に簡単に開始できます。 https://raspberrypi.stackexchange.com/questions/34733/how-to-do-qemu-emulation-for-bare-metal-raspberry-pi-images/85135#85135

カスタムUbuntuイメージで同様の問題が発生しました。また、@ Michael Connorsの回答で説明されているように変更を適用すると、システムが起動します。

-append=""に次を追加して、ケースで何が起こるかを確認できます。

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

3
vfdev