Raspberry Pi版MicroPythonの簡易インストール用イメージファイルを作ってみた


しばらく放置状態だったベアメタルRaspberry Pi用MicroPythonの話題です。

時々、ベアメタル版MicroPythonを「試してみたけどうまく動かない」というコメントを(主に海外から)頂きます。
ビルド済みのバイナリはGitHubのリリースにアップロードしてありますが、コメントを頂く方はこれを使って、以前私がYouTubeにアップロードしたビデオのような、起動後にHDMIディスプレイに出力させるのをやろうとして失敗しているようです。

ここまでたどりつくにはビルド済みバイナリをダウンロードしてSDカードにコピーするだけでなく、

・bootcode.binやstart.ELFのダウンロードしてきてコピーする
・main.pyを編集してコメントアウトされている部分を有効にする

などのステップを踏む必要があります。そして、何らかの要因でうまくいかなかったとき、デバッグ手段がない人が大半であろうと思います。

USB-UARTアダプタを持っていて、ちゃんとRaspberry PiのUARTに接続できるならいいのですが、そういう人は(組み込みのコミュニティの外では)少数派なのでしょうね。

というわけで、あらためて考えてみるとちょっとハードルが高い気がしたので、一発で画面にメッセージが出せることを狙ってSDカードのイメージファイルを作ってみました。

最近、Raspberry Pi純正のディスクイメージ書き込みツール「Raspberry Pi Imager」がリリースされています。

Raspberry Pi Downloads - Software for the Raspberry Pi
Download free software for Raspberry Pi, including Raspberry Pi Imager, Raspbian, and third-party OS images. Beginners should start with Raspberry Pi Imager

ですので、これでSDカードに焼ければ楽です。

ファイル形式は普通にディスクをダンプしたファイル、またはそれをzipしたものでOKです。

このファイルを作るのは簡単なのですが、そのままだとSDカードと同じサイズのイメージファイルができてしまいます。実際に使用するのは3MB強(そのほとんどはstart.ELFですが、、、)なので、数GBのイメージを作る必要はありません。

小さなイメージファイルを作るには、対象のファイルシステムのパーティションサイズを縮めて、未使用領域はイメージファイルから削除してしまえばいいのですが、ちょっと試行錯誤が必要でした。

最初はRaspberry Pi用のオリジナルイメージファイルの作成方法を探したら、以下の記事が見つかったので、これを試してみました。

Medium.com で表示

この方法ではLinux上で
sudo dd if=/dev/sdb of=./sdclone.img
のようにしてSDカード全体のイメージを作り、それをPiShrinkというツールを使ってサイズを縮めています。
しかし、このやり方はどうもうまくいきませんでした。

PiShrinkがイメージファイルをループバックマウントするところで失敗するのですが、これはパーティションの先頭までのオフセット値をうまく取得できていないためのようでした。

そこで、ツールの使用はあきらめ、sudo udisksctl loop-setup -f sdcard.imgでファイルをマウントしてからgpartedでパーティションを縮めようとしたのですが、これだとパーティションを縮める前に、FAT32ファイルシステムをデフラグしてファイルに影響が出ないようにする必要があります。

ここらあたりで面倒になってきて、結局Windows上で以下のように作業して目的を達成しました。

・EaseUS Partition Masterを使ってSDカード上に小さなプライマリパーティションを作り、いったんデータを消去してセクタの中身をクリアする(ZIP圧縮効率を高めるため)。

・データを消去するとパーティションごと消えてしまうので、再度同じサイズのパーティションを作り直し、FAT32でフォーマットする。

・SDカードをWindowsへマウントし、作成したパーティションへMicroPythonの起動に必要なファイルすべてをコピーする。

Win32DiskImagerでディスクイメージを作る。このとき、「Read only allocated partitions」にチェックを入れておけば、未使用領域がイメージ化されるのを回避できる。

ちなみにこのツールは、ちょっと分かりにくいUIですが、ディスクからのイメージファイル作成とイメージファイルのディスクへの書き込みの両用になっています。イメージファイル作成は「Read」ボタンです。「Write」はイメージをSDカードに書き込みます。

・イメージファイルをzipする。使用していないセクタのデータはクリアしてあるので、高い圧縮効率が期待できる。

こうして作成したZIPファイルを「Raspberry Pi Imager」でSDカードに書き込んだところ、無事MicroPythonが動作しました。

なお、このイメージファイルは、GitHubの以下のIssueにアップロードしてあります。

Rainbow Screen on RPi Zero · Issue #32 · boochow/micropython-raspberrypi
I'm trying to make it work but no success... Follow the instructions and just rainbow... help please

コメント