macOSでQEMUを使ってRaspbianを起動する
Box86というエミュレータを使うと、ARMのCPUでもWineが使えるらしいという情報をキャッチしたので、Raspberry Piで試そうと思ったものの、SDカードが壊れてたので使おうと思ったのが、QEMU。
x86なOSなどで、他のCPUアーキテクチャのエミュレーションを行ってくれる便利な汎用エミュレータで、Linux, Windows, macOS用にリリースされています。今回はこれでRaspberry PiのOSであるRaspbianをエミュレーションしてみようと思います。
目次
今回使用するアプリ等
macOS BigSurですが、CPUはx86です。QEMUを使ってARMのCPUをエミュレーションして、Raspbianを動作させるのが目的です。Qemu自体はARM, PowerPC, SPARCなど多彩なCPUへエミュレーションしてくれます。
図:見事にRaspbianが動いてます
インストール
Qemu自体のインストール
Qemu自体はコンソールアプリケーションなので、GUIを持ち合わせていません。macOSの場合は、ターミナルからHomebrewを利用してインストールを行います。事前に、Homebrewをインストールしておきましょう。
インストールは簡単で、ターミナルを起動して、以下のコマンドを実行するだけです。
1 |
brew install qemu |
但し素のqemuはmacOSのHypervisor.frameworkに対応していない為、-accel hvfオプションを指定してハイパーバイザ支援が使えません。このqemuにパッチを当てたものをリリースされています。そちらを利用する場合には、以下のコマンドでインストールします(raspi3の場合使えないですが)。
1 2 |
brew tap knazarov/qemu-virgl brew install qemu-virgl |
様々なコマンド類がインストールされるため、完了するには結構時間が掛かります。バージョンの確認は
1 |
qemu-system-aarch64 --version |
といった感じでバージョンを確認できます。
図:v6.0が入ってるのを確認
Raspbianの用意
Raspbianはインストールではなく、通常はImagerを使ってMicroSDカードに焼き付けるのでインストール作業は無いのですが、イメージファイルから色々と取り出したり、イメージファイル自体をMicroSDの代わりに読み書き出来るようにする必要があるため、作業が必要です。
今回はRaspberry Pi3用のイメージを使用します(今現在、まだQemuではRaspberry Pi4の再現はできないようで。ただ、CPUとしてはcortex-a72には対応しているようなので、パラメータの指定次第では動くのかもしれません。
- raspi3というフォルダを作っておきます。
- Raspberry Pi3 のRaspbianイメージは、こちらにあり、2020-08-20-raspios-buster-arm64.zipというファイルをダウンロード
- 2.のファイルを解凍して、2020-08-20-raspios-buster-arm64.imgというファイルを1.に格納しておく
- 3.のファイルをダブルクリックしてマウントする(ちなみに、imgファイルはWindowsでは7zipで開けます)
- 4.の中から、「kernel8.img」および「bcm2710-rpi-3-b.dtb」というファイルを1.にコピーしておく
- ターミナルより、1.の中に入り、qemu-img resize 2020-08-20-raspios-buster-arm64.img 8Gと入力し、imgファイルのリサイズを行う。2のべき乗サイズでなければならないので、4GBや8GBの指定でなければなりません。
図:ファイルの準備はこれでOK
起動用のコマンドを組み立てる
WindowsやLinuxでは、QEMUのフロントエンドプログラムがあったりするのですが、macOSはQ Emulatorというフロントエンドがあったのですが、現在はUTMというのがあるくらいで、基本はコマンドラインからの起動になります(UTMでの起動方法がよくわからなかった・・・)。
テキストエディタで、以下のようなコマンドのシェルスクリプトファイルを作成し、保存しておきます。毎回起動する時に、このコマンドを入れるのはキツイので、shファイルにしておいてターミナルから実行するようにします。
※audioデバイスは未対応のようです。
1 2 3 4 5 6 7 8 9 10 11 |
qemu-system-aarch64 -m 1024 -M raspi3 \ -kernel kernel8.img \ -dtb bcm2710-rpi-3-b.dtb \ -drive format=raw,file=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=1280 bcm2708_fb.fbheight=720" \ -serial stdio \ -no-reboot \ -device usb-kbd \ -device usb-tablet \ -device usb-net,netdev=net0 \ -netdev user,id=net0,hostfwd=tcp::2222-:22 |
- -M raspi3で、Raspberry Pi3のボードを指定しています。
- -m 1024でメモリを1GB指定。実機以上のメモリは割当られないので注意。
- -kernelにて取り出したkernel8.imgを指定しています。
- -dtbにて、取り出したbcm2710-rpi-3-b.dtbを指定しています。
- -driveにて、解凍したraspbianのimgファイルを指定しています。formatはrawを指定
- -appendは起動オプション。fb.fbwidt、fb.fbheightで画面サイズを指定します。
今回はRaspberry Pi3なので、qemu-system-aarch64で起動させていますが、Raspberry Pi2の場合は、qemu-system-armで起動させます。これはCPUのアーキテクチャが異なる為。
起動してみる
ブートさせてみる
作成しておいたシェルスクリプトを叩けば良いのですが、そのままだとpermission deniedになるので、chmod 777 raspi3.shといった感じで、実行権限を加えておきましょう。
起動すぐにRaspbianのあの画面が出てきます。4コアで認識されております。GUIが表示されるまでかなり時間が掛かります。
起動完了すると初回のみセットアップとして
- 国の指定(japaneseを指定する)
- piアカウントのパスワードの指定を行う
- setup screenは特に何もしないで次に進む
- エミュレータを使ってるので、無線LANのAPの指定はありません。そのままネットワークに接続可能。
表向きはこれでセットアップはおしまいですが、実際には事項のセットアップがエミュレータ使用の場合は必要になります。シャットダウンや再起動をすると素のqemuだと何故かkernel panicで死んだりしましたが、qemu-virglの場合は適正にシャットダウンできたので、qemu-virglのほうが良いかもしれません(Hypervisor支援で少し処理が早い?)。
図:起動途中の様子
Raspbianの特別なセットアップ
事前準備で、imgファイルの拡張は行っていますがファイルシステムは元のサイズのまま。また、スワップの指定などがまだ無い状態なので、この2つをセットアップしておく必要があります。
- ターミナルを起動する
- sudo raspi-config --expand-rootfsで、ファイルシステムをimgのサイズまで拡張します。
- sudo nano /etc/dphys-swapfileを実行して、nanoで設定ファイルを開く
- CONF_SWAPSIZEの項目を2048に書き換える。Ctrl+xで終了し、Yで上書き保存します。
- 以下のコマンドを実行して完了する
- 再起動して、その後sudo apt updateを実行して、アプデを行っておく
1 2 3 |
sudo dphys-swapfile install sudo dphys-swapfile swapon swapon -s |
図:swapファイルのサイズを広げておく
関連リンク
- QEMU - ArchWiki
- Run QEMU on macOS 11.0 Big Sur
- virt-managerをMacBookにインストール
- The Apple M1, ARM/x86 Linux Virtualization, and BOINC
- M1 Macのqemuで動くUbuntu ServerをACVMで簡単に起動しよう
- qemu-system-aarch64: -accel hvf: invalid accelerator hvf
- Homebrew で Error: homebrew-core is a shallow clone が出て brew update が実行できない問題
- Apple Silicon MacやiOSデバイス上で仮想マシンを作成できる「UTM」が最新のHypervisorパッチを適用したQEMUを導入し、M1 Macで確認されていた複数の不具合を修正。
- AppleのHypervisorフレームワークとQEMUを利用し、Apple M1チップ搭載のMacで「Windows ARM64 Insider Preview」の仮想化に成功したユーザーが現れる。
- How to run Windows 10 on ARM or Ubuntu for ARM64 in QEMU on Apple Silicon Mac
- 第672回 UTMを使ってM1 Mac上でUbuntuを動かす
- Enable audio in QEMU Virtual Machine
- Windows10上にRaspberry Pi OS(RaspbianBuster)をQEMUエミュレーターで動かす(Raspi2、Raspi3マシン)
- Windowsの QEMUエミュレータでラズパイの Raspbian OSを動かす方法
- QEMU で Raspberry Pi 3 用のバイナリを動かす
- QEMU で RaRaspberry PiをQEMUエミュレータ上で走らせる(1) QEMUのインストールとカーネルの起動spberry Pi 3 用のバイナリを動かす
- 第592回 QEMUでGPUの3Dアクセラレーションを利用する
- MacでQ(QEMU)を試してみました
- MacでQEMUを使ってRaspberry Piの仮想環境を構築する方法
- Chromebook上でWindowsを動かしてみた(QEMU/KVM)
- QEMU front end for M1 and Intel Macs (getutm.app)
- [QEMU][Linux] virt model の構成を見てみる
- dhruvvyas90/qemu-rpi-kernel
- Raspberry PiをQEMUエミュレータ上で走らせる(2) 立ち上げ、X Window、ネットワーク