みなさん、こんにちは。
Raspberry Pi 向けのソフトウェア開発って楽しいけれど、いざ実機でコンパイルしたり環境構築したりするのは、意外と時間がかかって面倒ですよね。Windows 上で作業していても、「手軽に ARM64 の環境を再現したい」と思う場面は多いはずです。
そこで今回は、WSL2(Ubuntu 22.04)+ Docker + QEMU + buildx を使って、Raspberry Pi OS(Bullseye)互換の ARM64 開発環境を構築する手順をまとめました。
あえて Bullseye ベースにしているのは、既存プロジェクトの互換性を重視するためです。もし最新の Bookworm 等を使いたい場合は、適宜 Dockerfile を書き換えてみてくださいね。
はじめに – buildx の手動インストールについて
WSL2 (Ubuntu 22.04) の標準リポジトリで Docker を入れると、buildx プラグインが入っていなかったり、バージョンが古かったりすることがあります。 今回は、2025年12月現在の最新版 v0.30.1 を手動で導入し、確実にマルチプラットフォームビルドができる環境を整えます。
前提環境の準備
まずは WSL2 が動いていることを確認しましょう。
PowerShellで以下のコマンドを実行してください。
wsl --version
WSL バージョンで2系が表示されていれば問題ありません。
次に、WSL2 内(Ubuntu 22.04)に Docker と QEMU をインストールします。
Ubuntu 22.04 Terminalに入って以下コマンドを実行してください。
sudo apt update
sudo apt install -y docker.io qemu-user-static
sudo usermod -aG docker $USER
設定を反映させるため、一度 WSL を再起動します。exit でUbuntu 22.04 Terminal を抜けた後、PowerShellで以下のコマンドを実行してください。
wsl --shutdown
QEMU(ARM エミュレーション)の有効化
x86_64(Windows)上で ARM バイナリを動かすために、QEMU のエミュレーターを登録します。Ubuntu 22.04 Terminal に入って以下のコマンドを実行してください。
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
これで準備は OK です。
buildx プラグインの手動インストール(v0.30.1)
Ubuntu 22.04 でインストールした標準の Docker には buildx が入っていないので、手動でセットアップします。
[!NOTE] 2025年12月24日時点の最新版 v0.30.1 を使用します。将来バージョンが変わっている場合はGitHub Releasesを確認してください。
1. プラグインディレクトリを作成
mkdir -p ~/.docker/cli-plugins
2. buildx バイナリをダウンロード
curl -SL \
https://github.com/docker/buildx/releases/download/v0.30.1/buildx-v0.30.1.linux-amd64 \
-o ~/.docker/cli-plugins/docker-buildx
3. 実行権限を付与して動作確認
chmod +x ~/.docker/cli-plugins/docker-buildx
docker buildx version
無事にバージョンが表示されれば成功です!
Raspberry Pi OS 互換 Dockerfile の作成
作業ディレクトリを作成し、Dockerfile を用意します。
mkdir ~/rpi-bullseye
cd ~/rpi-bullseye
内容は以下の通りです。Dockerfileというファイル名で保存してください。
FROM arm64v8/debian:bullseye
ENV container docker
# 必要なパッケージのインストール
RUN apt update && \
apt install -y systemd systemd-sysv sudo python3 python3-pip git curl bluez i2c-tools && \
apt clean
# systemd 向けの停止信号設定
STOPSIGNAL SIGRTMIN+3
# systemd を起動
CMD ["/sbin/init"]
ARM64 イメージのビルド
buildx を使って、明示的に ARM64 アーキテクチャとしてビルドします。ターミナルで以下のコマンドを実行します。
# ビルダーの作成と切り替え
docker buildx create --name mybuilder
docker buildx use mybuilder
docker buildx inspect --bootstrap
# ARM64 イメージとしてビルド
docker buildx build \
--platform linux/arm64 \
-t rpi-bullseye-systemd \
--load \
.
ビルドが終わったら、イメージができているか確認しましょう。
docker images | grep rpi-bullseye-systemd
REPOSITORY 列に rpi-bullseye-systemd と表示されていたら成功です。
systemd が動くコンテナの起動
Raspberry Pi のサービス(systemd)をシミュレートするため、いくつかのオプションを付けて起動します。ターミナルで以下のコマンドを実行してください。
docker run --privileged -d \
--name rpi-bullseye \
--platform linux/arm64 \
--cgroupns=host \
-v /sys/fs/cgroup:/sys/fs/cgroup \
rpi-bullseye-systemd
英数字の羅列が表示され、コンテナが起動するはずです。
コンテナが起動したあと、本当にバックグラウンドで動き続けているかを確認しましょう。
docker ps
このコマンドを叩いて、NAMES 列に rpi-bullseye が表示されていれば成功です!もし表示されない場合は、起動直後にエラーで落ちている可能性があるため、docker ps -a で停止中のコンテナを含めて確認してみてください。
開発時の基本操作
コンテナが起動したら、あとは自由に入って作業するだけです。
- コンテナに入る
docker exec -it rpi-bullseye bash
- 停止・再開
docker stop rpi-bullseye
docker start rpi-bullseye
注意 – WSL2再起動後の「exec format error」対策
WSL2は軽量な仮想マシン(VM)であるため、Windowsの再起動などでWSL2自体も再起動すると、以前登録した binfmt_misc(QEMUの設定)が初期化されてしまう ことがあります。
この状態で docker start しようとすると、“exec format error” というエラーが出てコンテナが起動しません。
毎回コマンドを打ち直すのは面倒なので、QEMUを再登録する簡単なスクリプトを作っておきましょう。
1. スクリプトの作成
vi ~/rpi-bullseye/qemu-register.sh
2. 以下の内容を入力して保存
#!/bin/bash
# QEMU が登録されているか確認
if ! grep -q "qemu-aarch64" /proc/sys/fs/binfmt_misc/qemu-aarch64 2>/dev/null; then
echo "Registering QEMU for ARM64..."
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
else
echo "QEMU for ARM64 is already registered."
fi
3. 実行権限の付与
chmod +x ~/rpi-bullseye/qemu-register.sh
今後、WSL2を立ち上げた直後やエラーが出た際は、docker start の前にこのスクリプトを実行してください。これでスムーズに開発環境へ復帰できるようになります。
コンテナ内での環境整備(Tips)
コンテナに入った後、よく使うツールやタイムゾーンを設定しておくと便利です。
# パッケージ追加
apt update && apt install -y procps iproute2 iputils-ping nano less
# タイムゾーン変更(日本時間にする場合)
dpkg-reconfigure tzdata
# Python ライブラリの追加
pip3 install <package_name>
環境のクリーンアップとリセット
もし Dockerfile を書き換えて環境を作り直したい場合は、以下の手順でリセットできます。
コンテナ停止&削除
docker stop rpi-bullseye && docker rm rpi-bullseye
イメージ削除
docker rmi rpi-bullseye-systemd
未使用リソースの一括削除
docker container prune # 停止中コンテナを削除
docker image prune -a # 未使用イメージを削除
まとめ
これで WSL2 上に Raspberry Pi OS(Bullseye)互換の ARM64 開発環境 が整いました。
今回のポイントは以下の3点です。
- WSL2 で最新の
buildxを手動インストールしてビルド環境を安定させる。 buildx + QEMUを活用して ARM64 イメージを生成する。systemdを動かすために起動オプション(--privileged等)を適切に設定する。
この環境があれば、実機が手元になくてもコードを書いてビルド・テストが完結できます。
ぜひみなさんも活用してみてください。
本日も最後までお読みいただきありがとうございました。
それでは、よい Raspberry Pi ライフを!



