WSL2環境でQEMU実行環境を構築しRaspberryPi OS(GUI環境)を起動する

タイトルがクソ長い…

以前からWindows上でもRaspberryPi OSの動作ができるというQEMUの存在は知っていたのですが、もっと手軽に使えないかなと思っていました。そんな中、最近ネットを検索しているとWSL2環境で構築したQEMU上でもRaspberryPi OSが動作し、X Window Systemも起動できるということを知りました。

f:id:ueponx:20211006134854p:plain

ja.wikipedia.org

e-words.jp

QEMUとは、コンピュータの挙動をソフトウェア的に再現するエミュレータ型の仮想化ソフトの一つ。コンピュータ内で別のコンピュータを起動し、ソフトウェアを実行することができる。(IT用語辞典より引用)

とのこと、アーキテクチャ違いのものでも動くのは気になります。

そこで今回は、以下2つの情報をもとに挑戦してみようと思います。参考情報元の方々ありがとうございます。

【参考】

qiita.com

qiita.com

qiita.com

準備

必要となるファイルの準備

まずは必要となるファイルをダウンロードします。ファイルの保存場所をC:\RaspberryPi3にしようと思いますので、まだ作成していない場合には作成します。Cドライブの直下にしているのはパス名が長くならないようにする工夫です。

github.com

RaspberryPi OSのイメージは以下のサイトなどからダウンロードします。 お気づきかもしれませんが、今回使用しているOSイメージは少し古めです。自分も試してみたのですが、最新のイメージであるraspios_armhf-2021-05-28で動作させようとするとエラーが発生するようです。(参考情報でも似たような現象があるとの話でした)そのため、今回はraspios_armhf-2020-08-24を使用しています。

ftp.jaist.ac.jp

また、起動に際してはOSイメージ以外にもカーネルとデバイスツリーのファイル(Device Treeが記述されたバイナリ(dtb: Device Tree Blob)も必要になります。RaspberryPiへインストールするSDカードイメージからこれらを取り出すことも可能なのですが、以下のGitHubリポジトリを使うことで、かなり容易に準備することができます。

以下のリポジトリからZipファイルをダウンロードします。

qiita.com

リポジトリにアクセスして、以下の操作を行ってZipファイルをダウンロードします。

f:id:ueponx:20211005233519p:plain

ダウンロードしたZipファイルの中にある

qemu-rpi-kernel-master.zip\qemu-rpi-kernel-master\native-emulation\5.4.51 kernelsにある、kernel8.imgをC:\RaspberryPi3にコピーします。

f:id:ueponx:20211005234245p:plain

加えてqemu-rpi-kernel-master.zip\qemu-rpi-kernel-master\native-emulation\dtbsにある、bcm2710-rpi-3-b.dtbをC:\RaspberryPi3にコピーします。

f:id:ueponx:20211005234251p:plain

これで、必要なファイルの準備は完了です。

WSL2の環境にQEMUをインストールする

続いての準備はWSL2上のUbuntu環境にQEMUをインストールしていきます。

WSL2の設定などに関しては過去のエントリを確認して設定を行ってください。(Dockerのことも記載していますが、今回は不要です)

uepon.hatenadiary.com

設定できたらUbuntuのターミナルに接続し、QEMUのインストールしていきます。

Ubuntu 20.04 LTSでQEMEをインストールするときにsudo apt install -y qemu-systemと行うと、QEMU 4.2系がインストールされます。 インストールされるバージョンを確認するには以下のコマンドを実行すればOKです。

$ apt list -a | grep qemu-system

今回はネットワーク機能も使用するため、USBコントローラをサポートしたQEMU 5.1以降のバージョンが必要になります。 そこでUbuntuのサーバーバックポートのPPA(Personal Package Archive)から、QEMU 5.2をインストールしていきます。

【参考】

WSL2(WSLg)上にRaspberry Pi OS(RaspbianBuster)をQEMUエミュレーターで動かす(Raspi3マシン) - Qiita

PPA(Personal Package Archive)を使用して、QEMU 5.2をインストールする

PPAを使用するにはaptコマンド側にインストールパッケージの含まれたリポジトリを追加する必要があります。以下のコマンドを実行することでリポジトリの追加、更新が行われます。最後のコマンドで実際にインストール可能なバージョンに5.2系が含まれるかを確認しています。

$ sudo add-apt-repository ppa:canonical-server/server-backports
$ sudo apt update
$ apt list -a | grep qemu-system

無事にQEMUの5.2系がインストールパッケージに含まれる様になったら、先程述べたインストールコマンドを実行していきます。

$ sudo apt install -y qemu-system

完了したら、念の為バージョンを確認しておきましょう。

$ qemu-system-aarch64 --version

f:id:ueponx:20211006123956p:plain

これで準備は完了です。

QEMUの起動スクリプトを使用してRaspberryPi OSを起動する

QEMUの起動スクリプトは以下のようになります。このスクリプトX Window System環境(以下GUI環境)を起動できます。このスクリプトはCドライブの直下にRaspberryPi3というフォルダを作成し、その中にあるカーネルイメージ、デバイステーブル、OSイメージを配置して、使用するようにしています。WSL2ではWindows上のファイルも/mnt/c/というパスでマウントされているため、WSL環境下のOSのボリューム容量が小さい状態であってもマウントしてあるWindows側のパスを使うことができるというメリットがあります。

今回は以下で設定してあります。これらのファイルはC:\RaspberryPi3というフォルダに保存済です。

  • カーネル … kernel8.img
  • バイスツリーのファイル(dtb: Device Tree Blob) … bcm2710-rpi-3-b.dtb
  • OSイメージ … 2020-08-20-raspios-buster-arm64.img

run.sh

#!/bin/sh
cd `dirname $0`

qemu-system-aarch64 \
-m 1024 \
-M raspi3 \
-kernel /mnt/c/RaspberryPi3/kernel8.img \
-dtb /mnt/c/RaspberryPi3/bcm2710-rpi-3-b.dtb \
-drive format=raw,file=/mnt/c/RaspberryPi3/2020-08-20-raspios-buster-arm64.img \
-append "console=ttyAMA0 root=/dev/mmcblk0p2 rw rootwait rootfstype=ext4 dwc_otg.fiq_fsm_enable=0 bcm2708_fb.fbwidth=1920 bcm2708_fb.fbheight=1080" \
-serial stdio \
-no-reboot \
-device usb-kbd \
-device usb-tablet \
-device usb-net,netdev=net0 \
-netdev user,id=net0,hostfwd=tcp::2222-:22

作成した実行スクリプトは実行権限を与えます。

その後、実行を行うとQEMU上でRaspberryPi OSが起動し以下のように表示されます。私のPCは第6世代のCore-i7ですがXの環境が表示されるまでに8分ほどかかりました。 ログインプロンプトが表示されるまでは4分程度となっています。起動後すぐにGUI側の表示にRaspberryPiのロゴが出てくれるので動作していることはわかりやすいと思います。

起動直後 f:id:ueponx:20211006125941p:plain

ログインプロンプトが表示 f:id:ueponx:20211006130043p:plain

起動完了(Windows画面上に表示されています) f:id:ueponx:20211005231349p:plain

初回起動時のダイアログも表示されます f:id:ueponx:20211005231357p:plain

chromiumを起動してみました f:id:ueponx:20211005231411p:plain

aptで新しいパッケージを入れてみました

f:id:ueponx:20211006132401p:plain

CPUの負荷はかなりあるようです

f:id:ueponx:20211006132442p:plain

ちなみにshutdownするとKernel panicが発生しますw

f:id:ueponx:20211006133803p:plain

CLI環境での起動

GUI環境は負荷が大きいので実用的とは言い難い状況です。そこでCLI環境でも試してみました。 起動スクリプトは以下のようになります。-nographicオプションをつけているところがポイントになります。

runCLI.sh

#!/bin/sh
cd `dirname $0`

qemu-system-aarch64 \
-m 1024 \
-M raspi3 \
-kernel /mnt/c/RaspberryPi3/kernel8.img \
-dtb /mnt/c/RaspberryPi3/bcm2710-rpi-3-b.dtb \
-drive format=raw,file=/mnt/c/RaspberryPi3/2020-08-20-raspios-buster-arm64.img \
-append "console=ttyAMA0 root=/dev/mmcblk0p2 rw rootwait rootfstype=ext4 dwc_otg.fiq_fsm_enable=0 bcm2708_fb.fbwidth=1920 bcm2708_fb.fbheight=1080" \
-nographic \
-device usb-net,netdev=net0 \
-netdev user,id=net0,hostfwd=tcp::2222-:22

f:id:ueponx:20211006133806p:plain

f:id:ueponx:20211006133810p:plain

X環境ほどの負荷はありませんが、起動には2分ほどかかりますね。

おわりに

今回はQEMUを使ってWindows上でもRaspberryPi OSの起動を試してみました。実際に使うのであればQEMUWindows版をインストールした方が負荷が少ないので現実的でしょう。 一度やってみたかったんですよね…っていうネタでした。

/* -----codeの行番号----- */