Androidには、A / B(シームレス)アップデートと非A / Bアップデートの2つのアップデートメカニズムがあります。コードの複雑さを軽減し、更新可能性を高めるために、Android11は2つのメカニズムを統合しています。新しい更新メカニズムである仮想A / Bは、ストレージのコストを最小限に抑えながら、すべてのデバイスにシームレスな更新をもたらすことで、両方の前任者の利点を組み合わせています。
- 仮想A / B更新は、A / B更新のようにシームレスです。仮想A / Bの更新により、デバイスがオフラインで使用できなくなる時間を最小限に抑えることができます。
- 仮想A / Bの更新はロールバックできます。新しいOSの起動に失敗した場合、デバイスは自動的に前のバージョンにロールバックします。
- 仮想A / B更新は、ブートローダーによって使用されるパーティションのみを複製することにより、最小限の余分なスペースを使用します。他の更新可能なパーティションはスナップショットが作成されます。
バックグラウンド
このセクションでは、仮想A / Bをサポートするいくつかの用語とテクノロジーについて説明します。
デバイスマッパー
デバイスマッパーは、Androidでよく使用されるLinux仮想ブロックレイヤーです。動的パーティションでは、 /system
ようなパーティションは階層化されたデバイスのスタックです。
- スタックの一番下には、物理スーパーパーティションがあります(たとえば、
/dev/block/by-name/super
)。 - 真ん中には
dm-linear
デバイスがあり、スーパーパーティション内のどのブロックが特定のパーティションを形成するかを指定します。これは、A / Bデバイスでは/dev/block/mapper/system_[a|b]
として、非A / Bデバイスでは/dev/block/mapper/system
として表示されます。 - 最後に、検証済みパーティション用に
dm-verity
デバイスが作成されます。このデバイスは、dm-linear
デバイスのブロックが正しく署名されていることを確認します。これは/dev/block/mapper/system-verity
として表示され、/system
マウントポイントのソースです。
これは、 /system
マウントポイントの下のスタックの図です。
図1./systemマウントポイントの下のスタック
dm-スナップショットの概要
仮想A / Bは、ストレージデバイスの状態をスナップショットするためのデバイスマッパーモジュールであるdm-snapshot
依存しています。 dm-snaphot
を使用する場合、次の4つのデバイスが使用されます。
- ベースデバイスは、スナップショットが作成されるデバイスです。このページでは、ベースデバイスは常にシステムやベンダーなどの動的パーティションです。
- コピーオンライト(COW)デバイスは、ベースデバイスへの変更をログに記録するために使用されます。サイズは任意ですが、ベースデバイスへのすべての変更に対応できる十分な大きさである必要があります。
- スナップショットデバイスは、
snapshot
ターゲットを使用して作成されます。スナップショットデバイスへの書き込みは、COWデバイスに書き込まれます。スナップショットデバイスからの読み取りアクセスされているデータがスナップショットによって変更されているかどうかに応じて、ベースデバイスまたはCOWデバイスのいずれかから読み取られます。 - オリジンデバイスは、
snapshot-origin
ターゲットを使用して作成されます。ベースデバイスから直接読み取ったオリジンデバイスに読み取ります。オリジンデバイスへの書き込みはベースデバイスへの直接書き込みですが、元のデータはCOWデバイスへの書き込みによってバックアップされます。
図2.dm-snapshotのデバイスマッピング