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
これにより、次の出力が表示されます。 そして、カーネルは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
新しいkernel-qemu 4.4.16での新しい試行:
Build-kernel-qemuを https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/master/tools からコピーし、次の行を追加してカーネル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
開始前に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
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へのネットワークアクセスも提供します。
Ubuntu 16.04ホスト、QEMU 2.9.0 -M raspi2、Raspbian 2016-05-27、バニラカーネル
利点:
-M raspi2
を使用すると、Vanillaカーネルを使用できるため、システムがより代表的です制限事項:
-M raspi2
はQEMU 2.6.0で追加され、Ubuntu 16.04にはQEMU 2.5.0しか含まれていないため、ソースからQEMUをコンパイルする必要があります。しかし、これは難しくありません。手順:
ソースから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
パーティションの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
実行:
./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"