🍎

Mシリーズ MacOS 上に RaspberryPi OS を動かす

に公開

きっかけ、と前書き

MacOSでLinuxDistributionを動かす記事が探したらいっぱい出て来るのだが、raspi-osを動かす記事は少なすぎる。

筆者はUTMというqemuを扱うGUIソフトでよく違うLinuxDistributionをMacOSで動かして遊んでいたので、最初は同じルートでraspi-osをUTMで動かそうとしたが、失敗した。結果的に言うと、raspi-osを動かそうとすると、結構カスタマイズしたqemuコマンドが必要。UTM上では、そもそもraspi-osが公式的にサポートされていないし、これらの細かな設定もUTMからではできないらしく、無念。

そこでネットを漁てみた結果、ようやく先人たちの足跡を見つけたので、その橋を叩いてようやく動かすことに成功した。
ここでまず先人たちの記事を貼っておく。その私欲なき行動に感謝。
https://hiro20180901.com/2023/04/24/raspberry-pi-os-64-bit-runs-qemu-720-vritual-machine/
https://qiita.com/yaju/items/edf548efd18f0eaab94a

実践

まずパソコン上にqemuがインストールされているのを確認してください。ない方はbrew install qemuで入るはず。具体的なインストール手順は割愛です。

前置き

まずraspi-osは.isoでなく、.img形式の、SDカード中に起動できる状態のOSが入っている状態のものが配布されるので、.iso起動方式ではブートできない。
そしてさらに、.imgのなかは起動できる状態のOSが入っているため、そのまま linux-kernal としてUTMに食わせるのも無理。
そのためまず.imgからlinux-kernelを抜く必要がある。そしてraspiはarmなので固有のハードウェアの情報が記録されているdtbファイル(device tree blob)も必要。

linux-kernal と dtb を抜く

記事のタイトルはMacOSでraspi-osを動かすなので、ここではMacOSでのやり方を載せます。ほかはこの記事をAIに渡して聞くと簡単に教えてくれると思います。

直接抜くのは無理なので、attachして、mountして、そしてcpする形で取ります。
なのでまずダウンロードした.img.xzファイルを解凍して.imgにしたら、以下のcmdを叩きます

hdiutil attach -imagekey diskimage-class=CRawDiskImage -nomount <your_file>.img

これて.imgがOSにattachできたので、以下のようなoutputが見えるかと

/dev/disk4          	FDisk_partition_scheme
/dev/disk4s1        	Windows_FAT_32
/dev/disk4s2        	Linux

1番目partition載っているところで、2番目がboot diskで、3番目がrootfs distです。

これが見えたら、以下を叩いてboot distをmountします

mkdir /tmp/raspi_boot
sudo mount -t msdos /dev/disk4s1 /tmp/raspi_boot

mountできたら自機のdiskのようにアクセスできるので、見てみましょう

ls  /tmp/raspi_boot

中に色んなファイルが入ってて、以下などが見えるはずです

kernel8.img
kernel_2712.img
bcm2710-rpi-3-b.dtb
bcm2711-rpi-4-b.dtb
...

現在qemuがサポートしているraspiハードウェアのバージョンは4bまでなので、bcm2710-rpi-3-b.dtbkernel8.imgを取り出します。(筆者が最初4bでbootを試してみたが、init画面には入れたが、結構なdeviceが見つからないエラーで、コマンド入力できる画面までいけなかった、3bにdowngradeしたら治ったので、おそらくqemuの4bに関するimplが何がおかしいかもしれない)

余談:qemu-system-aarch64 -machine help | grep -i raspでqemu-system-aarch64がサポートしているraspiバージョンが見れます

cpコマンドでbcm2710-rpi-3-b.dtbkernel8.imgを取り出す

cp /tmp/raspi_boot/kernel8.img .
cp /tmp/raspi_boot/bcm2710-rpi-3-b.dtb .

これで linux-kernel ファイルと dtb ファイルを得ることができました。
後始末は忘れずにやろう

sudo umount /tmp/raspi_boot
hdiutil detach /dev/disk4s1

これで終わりだが、ちゃんとumountとdetachされたかもチェックしよう

mount | grep raspi
diskutil list | grep disk4

なにもoutputがなければおkです。

raspi-os、macOSに立つ

qemuでは2の冪乗の.imgファイルサイズでしか動かないので、まず.imgファイルをresizeします。

qemu-img resize ./2025-05-13-raspios-bookworm-arm64-lite.img 16G

筆者は2025-05-13-raspios-bookworm-arm64-lite.imgをオフィシャルサイトからダウンロードしたので、読者の皆さんは各自書き換えてください。

ここまできたら簡単です。以下のコマンドを叩けばqemuからraspi-osを起動できるはずです(筆者のコマンドは少々先人の記事のコマンドは違いますが、その解説は省きます。AIに聞いた方が詳細で早いよこの時代は)

qemu-system-aarch64 \
  -m 1024 \
  -M raspi3b \
  -kernel kernel8.img \
  -dtb bcm2710-rpi-3-b.dtb \
  -drive format=raw,file=2025-05-13-raspios-bookworm-arm64-lite.img \
  -append "console=tty1 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

ここではhostfwdという形で本機のport 2222をqemu上のraspi-osのport 22を繋いている(後ほどssh-serverを開いたら本機からssh -p 2222 <username>@localhostでraspi-osに繋がります)。
他の形でネットワークを組みたい方は自分で調べるかAIに聞きましょう。すでに記事が長いから省きます。
あと注意が必要なのは、他のLinuxDistributionを動かすときのようにメモリサイズを変えることはできません。raspiボードのハードは確定しているからです。
ここから各バージョンのボードがどれぐらいのメモリーがサポートされているかが分かります。

raspi-os初期設定

userとpasswordを設定して、shellにログインできたら、忘れるうちに必要なだけの初期設定をしましょう。
これから実行するコマンドはすべてraspi-osの中で実行する

1. 今raspi-osはまだresizeした容量を認識できてないので、その設定

sudo raspi-config

入ったら6 Advanced Options => A1 Expand Filesystemを選択すると、自動的に再認識してくれる。この操作は再起動が必要なので、従って再起動しましょう。(OSバージョンなどによってオプションの順番が違うかもしれないが、名前が合っていれば良い)

再びraspi-osに入れたら、下のコマンドで容量が先resizeした容量に変わったのが確認できると思います

df -h

2. さらに、今はssh-serverが開いてないので、その設定。同じくraspi-configを使います

sudo raspi-config

入ったら3 Interface Options => I2 SSHを選択。提示に従ってyesを選択すれば自動的にssh-serverを立ち上げてくれます

3. 今のswapメモリーが少ないので、負荷がかかると遅くなります。なのでswapメモリーを増加させる
raspi-os最初はnanoとviしか入ってないので、nanoでconfigを編集します

sudo nano /etc/dphys-swapfile

CONF_SWAPSIZE=xxxの行を編集して、適切なサイズに変更しましょう。筆者は1024にしました。
保存したらサービスを再起動します。

sudo service dphys-swapfile restart

これでfreeコマンドで変更後のサイズが見えるはずです。

以上使うための設定ができましたが、apt update && apt upgradeを実行した場合、linux-kernalとdtbファイルが更新される可能性があるので、不具合に合ったら前述の手順で再びlinux-kernalとdtbファイルを抜いて、起動コマンドに置き換えれば解消できます。(例えばapt upgradeしたらネットワーク接続ができなくなったとか)

他色々な設定

筆者だけかもしれませんが、起動したraspi-osはネットスピードは非常に悪状態で、色々試したが改善案が見つからず。改善できたらここに追記します。

あとがき、もしくはツッコミ

AIに慣れすぎていた最近の園児ニア(俺)は、最初AIに聞いてみて、「ああ、それUTMでできますよ」って言われて、結構ハマってしまた。この記事の「実践-前置き」の中に書いてたような前置きの知識も教えてくれてない。最終的に二、三年前の人の記事を見つかってそれみて出来たので、やはりAIはまだまだ人を取り替えることはできないね。自分で知識を検証して、その知識がどれぐらい正確かを実証できるようになったら、AIは一層強くなれるかもしれない。

Discussion