なぜA/Bパーティショニング?
組み込みシステムでは、アップデートに失敗するとデバイスがブリックしてしまいます。A/Bレイアウトは、2つのルートファイルシステムを維持することでこれを解決します:
- スロット A - アクティブ rootfs
- スロットB - 次の更新のためのスタンバイrootfs
アップデートが成功すると、ブートローダは新しいスロットに切り替わります。ブートが失敗すると、最後の既知の良いバージョンにロールバックします。
このアプローチは、スロットAとスロットBが同じパーティションサイズであることを前提としています。
もう一つのアプローチは、小さなレスキューシステム用にパーティションを作成し、通常の実行システム用に大きなパーティションを作成することです。
パーティションレイアウト例
| パーティション | タイプ | 目的 |
|---|---|---|
| p1 | FAT32 | /boot_A (カーネル、コマンドライン、ブートローダー) |
| p2 | ext4 | ルートファイルA |
| p3 | FAT32 | /boot_B (カーネル、cmdline、レスキューシステム用ブートローダ) |
| p4 | ext4 | rootfs_B |
| p5 | ext4 | データ/構成 |
実例
この設定は rpi-image-genつのプロジェクト例で示します:
- https://github.com/interelectronix/rpi-image-gen-projects/blob/main/deb12-cm5-rescue/README.md
- https://github.com/interelectronix/rpi-image-gen-projects/blob/main/deb12-cm5-ix-base/README.md
最初のものはレスキューシステムを作成し、2番目のものはレスキューシステムを別の実行中のシステムと結合します。 cmdline.txtそして fstab.
更新の管理
非アクティブなシステムパーティションを手動でマウントして、設定、アプリケーション、またはシステムコンポーネントを更新できます。
本番システムでは、アップデートは通常 SWUpdateで管理されます。
との統合 SWUpdate
SWUpdateは、デュアルルート (A/B) 更新ストラテジーをネイティブにサポートします。
パーティションと更新ロジックは sw-descriptionファイルで直接定義されます。
このアプローチにより、ビルトインのロールバックセーフティを備えたアトミックなシステムアップデートが保証されます。
情報源
- rpi-image-gen:https://github.com/raspberrypi/rpi-image-gen
- rpi-sb-provisioner:https://github.com/raspberrypi/rpi-sb-provisioner
- SWUpdate:https://github.com/sbabic/swupdate
- swugenerator:https://github.com/sbabic/swugenerator