仮想A / Bの実装-パッチ

次の既知の問題に対処するには、次のパッチを選択してください。

サイドローディング時に割り当て可能なスペースを正しく確認してください

* 2 * sum(更新グループのサイズ)*よりも小さいサイズのスーパーパーティションを持つ仮想A / Bデバイスでの完全なOTAパッケージのサイドローディングは、リカバリログ/tmp/recovery.logで次のように失敗する可能性があります。

The maximum size of all groups with suffix _b (...) has exceeded half of allocatable space for dynamic partitions ...

ログの例を次に示します。

[INFO:dynamic_partition_control_android.cc(1020)] Will overwrite existing partitions. Slot A may be unbootable until update finishes!
[...]
[ERROR:dynamic_partition_control_android.cc(803)] The maximum size of all groups with suffix _b (2147483648) has exceeded half of allocatable space for dynamic partitions 1073741824.

この問題が発生した場合は、 CL 1399393を選択し、再構築して、デバイスがブートとしてリカバリを使用しない場合は、ブートパーティションまたはリカバリパーティションをフラッシュします。

マージ中のセグメンテーション違反を修正

OTA更新を適用した後、VABマージプロセス中に、 update_engine_client --cancelを呼び出すと、 CleanupPreviousUpdateActionがクラッシュします。 markSlotSuccessfulが遅れると、潜在的なワイルドポインタエラーも存在します。

これは、 StopActionInternal関数を追加することで解決されました。 CleanupPreviousUpdateActionは、破棄時に保留中のタスクをキャンセルします。メッセージループ内の保留中のタスクのタスクIDを追跡する変数を維持します。破棄すると、セグメンテーション違反を回避するために保留中のタスクがキャンセルされます。

マージ中のupdate_engineでのSIGSEGVのクラッシュを修正するために、Android11ソースツリーに次の変更が含まれていることを確認してください。

  • CL 1439792 (CL 1439372の前提条件)
  • CL 1439372CleanupPreviousUpdateAction :破棄時に保留中のタスクをキャンセルします)
  • CL 1663460markSlotSuccessfulが遅れた場合の潜在的なワイルドポインタエラーを修正)

VABの誤ったスロット切り替えを修正し、OTAアップデートを投稿

Android 11以降では、OTAアップデート後にデバイスのスロットスイッチを同期できないと、デバイスが使用できなくなる可能性があります。 IBootControl HALのスロットスイッチング実装が書き込みを実行する場合は、それらの書き込みをすぐにフラッシュする必要があります。書き込みがフラッシュされず、マージの開始後、ハードウェアがスロットスイッチの書き込みをフラッシュする前にデバイスがリブートした場合、デバイスは前のスロットに戻って起動に失敗する可能性があります。

コードソリューションの例については、次のCLを参照してください:CL1535570

update_engineの早期マージを防止します

デバイスが起動し(Android 11以降)、起動が完了すると、 update_engineScheduleWaitMarkBootSuccessful()WaitForMergeOrSchedule()を呼び出します。これにより、マージプロセスが開始されます。ただし、デバイスは古いスロットで再起動します。マージはすでに開始されているため、デバイスは起動に失敗し、動作不能になります。

ソースツリーに次の変更を追加します。 CL1664859はオプションであることに注意してください。

  • CL 1439792 (CL 1439372の前提条件)。
  • CL 1439372CleanupPreviousUpdateAction :破棄時に保留中のタスクをキャンセルします)
  • CL 1663460markSlotSuccessfulが遅れた場合の潜在的なワイルドポインタエラーを修正)
  • CL 1664859 (オプションunittestのユニットCleanupPreviousUpdateActionを追加)

メタデータのスキップによるデータの損失や破損を防ぐ

Android 11以降では、ストレージデバイスに揮発性のライトバックキャッシュがある場合、特定の条件下で、完了したマージのメタデータがスキップされ、データの損失または破損が発生します。

条件:

  1. 1セットの例外のマージ操作が終了した後、 merge_callback()が呼び出されました。
  2. メタデータは、マージの完了を追跡するCOWデバイスで更新されました。 (このCOWデバイスの更新はきれいにフラッシュされます。)

結果:最近のマージのストレージデバイスのキャッシュがフラッシュされなかったため、システムがクラッシュしました。

解決策を実装するには、以下を参照してください。

正しいdm-verity構成を確認してください

Android 11以降では、デバイスが次のdm-verityオプションで誤って構成されている可能性があります。

  • カーネルのCONFIG_DM_VERITY_AVB=y
  • AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIOを使用せずに、任意のVerityモード( AVB_HASHTREE_ERROR_MODE_RESTART_AND_INVALIDATEなど)を使用するように構成されたブートローダー。

このデバイス構成では、verityエラーが発生すると、vbmetaパーティションが破損し、A / B以外のデバイスが動作しなくなります。同様に、マージが開始された場合、A / Bデバイスも動作不能になる可能性があります。 AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIOティーモードのみを使用してください。

  1. カーネルでCONFIG_DM_VERITY_AVB=nを設定します
  2. 代わりにAVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIOモードを使用するようにデバイスを構成します。

詳細については、実際には、verityのドキュメント「 dm-verityエラーの処理」を参照してください。

緊急システムシャットダウン中のI / Oエラーに応答してverity作業をスキップする

Android 11以降では、緊急システムシャットダウンが呼び出された場合(サーマルシャットダウンの場合のように)、ブロックデバイスがI / O要求を処理できなくなっている間、dmデバイスは動作している可能性があります。この状態では、新しいdm I / O要求またはすでに実行中の要求によって処理されるI / Oエラーは、誤判断である真正性の破損状態につながる可能性があります。

システムのシャットダウン時にI / Oエラーに応答してverity作業をスキップするには、以下を使用します。

CL 1847875 (シャットダウン中のI / Oエラーに応答してverity作業をスキップします)

DM_ANDROID_VERITY_AT_MOST_ONCE_DEFAULT_ENABLEDがオフになっていることを確認します

4.19カーネル以前を実行しているAndroidGoデバイスでは、カーネル構成にDM_ANDROID_VERITY_AT_MOST_ONCE_DEFAULT_ENABLED=yが含まれている場合があります。この設定は仮想A / Bと互換性がなく、両方を同時に有効にすると、まれなページ破損の問題が発生することが知られています。

カーネル4.19以前の場合は、カーネル構成でCONFIG_DM_ANDROID_VERITY_AT_MOST_ONCE_DEFAULT_ENABLED=nを設定して無効にします。

カーネル5.4以降では、コードが削除され、構成オプションは使用できません。