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

QEMUとは、コンピュータの挙動をソフトウェア的に再現するエミュレータ型の仮想化ソフトの一つ。コンピュータ内で別のコンピュータを起動し、ソフトウェアを実行することができる。(IT用語辞典より引用)
とのこと、アーキテクチャ違いのものでも動くのは気になります。
そこで今回は、以下2つの情報をもとに挑戦してみようと思います。参考情報元の方々ありがとうございます。
【参考】
準備
必要となるファイルの準備
まずは必要となるファイルをダウンロードします。ファイルの保存場所をC:\RaspberryPi3にしようと思いますので、まだ作成していない場合には作成します。Cドライブの直下にしているのはパス名が長くならないようにする工夫です。
RaspberryPi OSのイメージは以下のサイトなどからダウンロードします。
お気づきかもしれませんが、今回使用しているOSイメージは少し古めです。自分も試してみたのですが、最新のイメージであるraspios_armhf-2021-05-28で動作させようとするとエラーが発生するようです。(参考情報でも似たような現象があるとの話でした)そのため、今回はraspios_armhf-2020-08-24を使用しています。
また、起動に際してはOSイメージ以外にもカーネルとデバイスツリーのファイル(Device Treeが記述されたバイナリ(dtb: Device Tree Blob)も必要になります。RaspberryPiへインストールするSDカードイメージからこれらを取り出すことも可能なのですが、以下のGitHubのリポジトリを使うことで、かなり容易に準備することができます。
以下のリポジトリからZipファイルをダウンロードします。
リポジトリにアクセスして、以下の操作を行ってZipファイルをダウンロードします。

ダウンロードしたZipファイルの中にある
qemu-rpi-kernel-master.zip\qemu-rpi-kernel-master\native-emulation\5.4.51 kernelsにある、kernel8.imgをC:\RaspberryPi3にコピーします。

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

これで、必要なファイルの準備は完了です。
WSL2の環境にQEMUをインストールする
続いての準備はWSL2上のUbuntu環境にQEMUをインストールしていきます。
WSL2の設定などに関しては過去のエントリを確認して設定を行ってください。(Dockerのことも記載していますが、今回は不要です)
設定できたら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

これで準備は完了です。
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のロゴが出てくれるので動作していることはわかりやすいと思います。
起動直後

ログインプロンプトが表示

起動完了(Windows画面上に表示されています)

初回起動時のダイアログも表示されます

chromiumを起動してみました

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

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

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

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


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