Usual Software Engineer

よくあるソフトウェアエンジニアのブログ

Raspberry Pi 用の開発を Mac 上の仮想環境でやる方法

久々に Raspberry Pi 触ろうとしたら手元になかったりセットアップ方法忘れていたりでやる気をなくしたことありませんか? それならハードがなくても仮想環境で開発できるようにしちゃった方が捗りますよね。 ググると結構 HOW TO 書いてる記事があるんですが、それでも色々ハマったので自分のためにもメモ程度にまとめておこうと思います。 今回のサンプルのリポジトリはこちら。

github.com

開発用の仮想環境というと真っ先に思いつくのが Vagrant + VirtualBox ですが、残念ながら Raspberry Pi は ARM プロセッサで動作しているので、良さげな VBox 探してきて Vagrant で起動してはい完了、というわけにはいかなそうです。

そこで必要になるのが QEMU です。 OSS のプロセッサのエミュレータで、 Mac では homebrew でインストールできます。 あとは Raspberry Pi のための QEMU 用の kernel を用意してくれている GitHub リポジトリとかから持ってきて、 Raspbian OS の image を起動するだけです。 こちらのリポジトリがよく使われているようです。感謝です。

GitHub - dhruvvyas90/qemu-rpi-kernel: Qemu kernel for emulating Rpi on QEMU

一通りハマり終わった後見直してわかりましたが、基本的に wiki に書いてあるやり方で動くはずです。バージョンの違う image を使ったり他のサイトのやり方を参考に独自の手順でやったりすると色々ハマります。。

今回のサンプルリポジトリでは、以下のようなことをして Raspberry Pi の仮想環境を扱っています。

  • 手動で QEMURaspberry Pi の仮想環境を起動
  • その仮想環境への SSH 接続を設定
  • あとは Ansible で好き放題

Ansible 使いたくないという人も QEMU で動かして SSH 接続するまでは同じなので参考になるかもしれません。

READMEにもありますが手順を紹介すると、まず必要なものをダウンロードした後以下のコマンドでさっそく仮想マシンを起動します。

$ qemu-system-arm -kernel kernel-qemu-4.9.59-stretch -M versatilepb -cpu arm1176 -m 256 -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -dtb versatile-pb.dtb -hda 2018-04-18-raspbian-stretch-lite.img

image 内で直接設定を変更できます。必要な設定を終えたら、一度抜けて次は image のリサイズを行います。 これはデフォルトだと root ボリュームにほぼ空きがないので開発進めていくと困ることになるので、事前にディスクサイズを変更しておこうって流れです。

$ qemu-img resize 2018-04-18-raspbian-stretch-lite.img +4G

パーティションの変更などは後で Ansible でやるとして、再度 image を起動します。

$ qemu-system-arm -kernel kernel-qemu-4.9.59-stretch -M versatilepb -cpu arm1176 -m 256 -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -dtb versatile-pb.dtb -hda 2018-04-18-raspbian-stretch-lite.img -net nic -net user,hostfwd=tcp::10022-:22

ホストマシンの 10022 番ポートから仮想マシンの 22 番ポートにフォワードするオプションを付けています。 SSH 接続してみましょう。 ssh-copy-id で公開鍵認証のための鍵交換をしておくと今後便利です。

$ ssh-keygen -t rsa -b 4096 -C "pi@yourname.local" -f ./pi_id_rsa
$ ssh-add ./pi_id_rsa
$ ssh-copy-id -i ./pi_id_rsa.pub -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 10022 pi@127.0.0.1
$ ssh -F ssh_config qemu-pi echo ok

あとは自由にホストマシンから Ansible が実行できます。 parted というコマンド/モジュールでパーティションを再設定して増やした分の容量を割り当てています。 playbook を流すだけです。

$ ansible-playbook pi-partition.yml

Ansible はおまけではありますが、 SSH 接続できる状態の image を保持しておいて、なんか失敗して壊しちゃったらその image の状態からやり直して作業すれば良いので Raspberry Pi 用の開発が捗りそうです。 本当は Raspberry Pi で Puppeteer を動かしたかっただけなのでずいぶん遠回りをしてしまいました。

Raspberry Pi Zero W Starter Kit

Raspberry Pi Zero W Starter Kit