Raspberry Pi 4とBuildrootでRAUCを使ってアップデート環境を作ってみる
BuildrootでカスタムOSイメージを作ったとき、OTAなどでアップデートしたくなるのが世の常だと思います。そこで、オープンソースのアップデートシステムであるRAUCを組み込んでアップデート環境を作ってみます。
RAUCとは
プロジェクトのホームページはこちら(https://rauc.io/) です。これをBuildrootに組み込むためにbr2rauc(https://github.com/cdsteinkuehler/br2rauc) を使用します。本家は古いビルドにしか対応していなかったりSystemdを使うとgettyが正しく設定されないので修正したものを作りました。(https://github.com/kobayutapon/br2rauc )。
今回はこちらの修正したもので試します。
使い方
buildrootの取得
最新の2024.02を取得し、作業ディレクトリで展開します。
mkdir ./work
cd work
wget https://buildroot.org/downloads/buildroot-2024.02.tar.gz
tar xvzf buildroot-2024.02.tar.gz
br2raucの取得
githubからbr2raucを取得します。
git clone https://github.com/kobayutapon/br2rauc.git
証明書の作成
RAUCで使う証明書を以下のコマンドで作成します。
( cd br2rauc/ ; ./openssl-ca.sh )
Buildrootの環境をセットアップ
以下のコマンドを実行し、buildrootの環境をセットアップします。
make -C buildroot/ BR2_EXTERNAL=../br2rauc O=../output raspberrypi4-64-rauc_defconfig
設定とビルド
ビルドディレクトリを変更します。
cd ./output
設定が必要な場合、以下のコマンドで設定します。
make menuconfig
makw linux-menuconfig
必要な設定が終わったらビルドを実行します。
make
ソースのダウンロードなどを行うので初回は少し時間がかかります。
SDイメージの書き込みと起動確認
正常にビルドが完了すると、output/imagesディレクトリ以下にsdcard.img.xzというファイルが作成されます。これをRaspberry Pi Imagerなどを使ってSDカードに書き込みます。
書き込んだSDカードをRaspberry Pi 4に挿し、起動します。最初にu-bootが起動し、その後システムが起動します。ログインし、rauc statusコマンドを実行するとイメージの使用状況が表示されます。
これが正常に表示されていれば組み込みができています。
ちょっとした注意点
パーティションの構造
デフォルトで作成されるパーティションは以下のような構造になっています。
パーティション | サイズ | フォーマット | 用途 |
---|---|---|---|
P1 | 256M | FAT32 | Bootパーティション(u-boot用の起動イメージ、コンフィグなど) |
P2 | 256M | ext4 | レスキュー用イメージ格納パーティション |
P3 | 128M | ext4 | データ用(RAUCの設定などもここに保存される) |
P4 | - | - | 拡張パーティション |
P5 | 900M | ext4 | rootfs(A面) |
P6 | 900M | ext4 | rootfs(B面) |
P7 | 900M | ext4 | Updater用 |
パーティションのサイズ
パッケージを追加していくと容量が足りなくなることがあります。その場合、make menuconfigでrootfsの最大サイズを変更するのに合わせて、br2rauc/board/raspberrypi
/genimage.cfgで定義されるパーティションサイズを調整する必要があります。
Updater用バンドルの作成
RAUCではアップデート用ファイルのことをBundleと称しています。これはイメージやアーカイブ、インストールに必要な各種情報やスクリプトをまとめたもので、SquashFSでパックされます。
br2raucでは、ビルドすると同時にバンドルが作成されます。バンドルはoutput/images以下に2種類作成されます。
- update.raucb bootfs+rootfs
- rootfs.raucb rootfs only
必要に応じて使い分けます。
インストールは以下で行えますが、device mapperが有効でないとエラーが出ますので注意が必要です。
sudo rauc install [Bundleファイル名]
USBメモリなどを使ってアップデートする方法までこれで行えました。
次はHawkbitを組み合わせたOTAを調べたいと思います。
Discussion