« WSL(Windows10)上にxaptでRaspberry Piのクロスコンパイル用ライブラリをダウンロードする | トップページ | WSLでクロスコンパイルするのは結局あきらめた »

WSL上でクロスコンパイルしたLinux(Raspberry Pi 3に近いもの)をQEMUで動かす

今回はRaspberry Pi用Linuxのクロスコンパイルに挑戦してみます。
といっても、そのままでは面白くないので、QEMUで動作するLinuxをビルドしてみます。

まずは、WSLへのQEMUの導入です。足りないライブラリがあったら一緒に導入してください。

$ sudo apt install qemu-system-arm

次にRaspBianのソースコードを作業用ディレクトリに展開します。(ここらあたりを参考に)
クロスコンパイルですが、今回はQEMU用に"vexpress-a9"対応のLinuxをビルドします。

$ export ARCH=arm
$ export CROSS_COMPILE=arm-linux-gnueabihf-
$ make vexpress_defconfig <--- Raspberry用と違います(実機には使えません)
$ make zImage dtbs -j8      <--- -jはWSL-PCのCPUコア数で調整してください
$ cp arch/arm/boot/zImage ~/work/kernel-qemu.img
$ cp arch/arm/boot/dts/vexpress-v2p-dtb ~/work/

完成したzImageとdtbファイルをQEMU用の作業ディレクトリにコピーしておきます。
※ ~/work/に置きましたが、これは好きなところでOK

次にRaspberry PiでRaspBian(Jessie)が動いているSDカードのDDイメージを抜きだしてきます。ここらあたりから入手して使っても良いですが少々面倒です。

クロスコンパイルしたLinux(QEMU用)で起動します。別途、WSLが入ったPC上にVNCクライアント(UltraVNCなど)を用意しておいてください。

$ qemu-system-arm -kernel ~/work/kernel-qemu.img      \
    -drive if=sd,format=raw,file=~/work/Jeassi_8GB.ddi      \
    -dtb ~/work/vexpress-v2p-ca9.dtb                           \
    -append "rw root=/dev/mmcblk0p2 rootfstype=ext4 console=ttyAMA0,115200"   \
    -M vexpress-a9 -smp 4 -m 1024 -vnc :0 -k ja            \
    -serial stdio -net nic -net user,hostfwd=tcp::5022-:22

メモリ1GB、4コアCPUでQEMUが動作します。最後の設定はSSHをポート5022で動作させる為のものです。VNCクライアントで127.0.0.1:0に接続するとブート画面が表示されます
余談ですが、この設定を見つけるのに苦労しましたが、殆どのWeb記事は-dtbオプションの指定が無くてQEMUで動作しないものばかりでした。

これで最初に立ち上げると、ファイルシステムのエラーになってemergency modeに入りますので、QEMU用に以下の作業をしてください。

$ vi /etc/fstab     <--- エディタはnanoでもお好きなもので。

proc        /proc  ...
# /dev/mmcblk0p1    /boot   ...
# /dev/mmcblk0p2    /         ...

$ systemctl reboot

mmcnlkに関するマウント指定2行を削除してリブートすると使えるようになります。ただし、VNC側のkeymapが変になっているので、VNCクライアントを使う為にキーマップの設定を行います。

$ sudo mount /dev/mmcblk0p1 /boot
$ sudo raspi-config

「4. Internationalization Options」に入って、「I3 Change Keyborad Layout」を選び、「Generic 105-key (Intl) PC」で、「Other」-「Japanese」を選択すると「Japanese (OADG 109A)」が選べます。あとはデフォルトのままで構わないでしょう。
raspi-configの設定が終わったら「sudo shutdown -r now」などでリブートします。

これでVNCクライアントから使えるQEMU環境ができあがりました。少々遅いですが、X11なども導入すればGUIも動きます。

今回の方法で動かせるのは、Raspberry Pi固有のハードウエアを使わないアプリケーションだけです。vexpressのカーネルを使ってますからね。でも、メモリ1G、4コアのARMv7で動作するQEMU環境は、何かと役に立つのではないかと思います。

Qemuraspi3_3
※ 今回のカーネルはハードウエア乱数(/dev/hwrng)機能を有効にしていないので、このままだとSSHが動作しません。SSH設定済みドライブのDDイメージを使うか、カーネル設定を変更してビルドする必要があります。

« WSL(Windows10)上にxaptでRaspberry Piのクロスコンパイル用ライブラリをダウンロードする | トップページ | WSLでクロスコンパイルするのは結局あきらめた »

Raspberry Pi」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/601747/64913330

この記事へのトラックバック一覧です: WSL上でクロスコンパイルしたLinux(Raspberry Pi 3に近いもの)をQEMUで動かす:

« WSL(Windows10)上にxaptでRaspberry Piのクロスコンパイル用ライブラリをダウンロードする | トップページ | WSLでクロスコンパイルするのは結局あきらめた »