タイトルがクソ長い…
以前から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版をインストールした方が負荷が少ないので現実的でしょう。
一度やってみたかったんですよね…っていうネタでした。