가상 A/B 구현 - 패치

다음 패치를 선택하여 다음과 같은 알려진 문제를 해결하세요.

사이드로드 시 할당 가능한 공간 정확히 확인

*2 * 합계(업데이트 그룹 크기)*보다 크기가 작은 super 파티션이 있는 가상 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를 추적하는 변수를 유지합니다. segfault를 방지하기 위해 소멸 시 대기 중인 작업이 취소됩니다.

다음 변경사항이 Android 11 소스 트리에 있는지 확인하여 병합 중에 update_engine에서 발생하는 SIGSEGV 비정상 종료 문제를 해결합니다.

  • CL 1439792( CL 1439372 전제 조건)
  • CL 1439372(CleanupPreviousUpdateAction: 소멸 시 대기 중인 작업 취소)
  • CL 1663460( markSlotSuccessful가 늦게 제공될 경우 잠재적인 와일드 포인터 오류 발생)

update_engine 조기 병합 방지

기기(Android 11 이상)가 부팅되고 부팅이 완료되면 update_engineScheduleWaitMarkBootSuccessful()WaitForMergeOrSchedule()을 호출합니다. 그러면 병합 프로세스가 시작됩니다. 하지만 기기가 이전 슬롯으로 재부팅됩니다. 병합이 이미 시작되었으므로 기기가 부팅되지 않고 작동할 수 없게 됩니다.

소스 트리에 다음 변경사항을 추가합니다. CL 1664859는 선택사항입니다.

  • CL 1439792( CL 1439372 전제 조건)
  • CL 1439372(CleanupPreviousUpdateAction: 소멸 시 대기 중인 작업 취소)
  • CL 1663460(markSlotSuccessful이 늦게 제공될 경우의 잠재적 와일드 포인터 오류 수정)
  • CL 1664859 (선택사항 - CleanupPreviousUpdateActionunittest 추가)

올바른 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 verity 모드만 사용하세요.

  1. 커널에서 CONFIG_DM_VERITY_AVB=n를 설정합니다.
  2. 다음을 사용하도록 기기를 구성합니다. AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO 모드를 대신 사용하세요.

자세한 내용은 verity 문서 dm-verity 처리 오류를 참조하세요.

병합된 파일이 올바르게 구성되었는지 확인

시스템 이미지와 공급업체 이미지를 따로 빌드한 다음 merge_target_files를 사용하여 병합하면 병합 프로세스 중에 가상 A/B 구성이 잘못 삭제될 수 있습니다. 병합된 타겟 파일에서 가상 A/B 구성이 올바른지 확인하려면 CL 2084183 패치(동적 파티션 정보에서 동일한 키/값 쌍 병합)를 적용합니다.

필수 구성요소 업데이트

Android 13부터 snapuserd가 공급업체 램디스크에서 일반으로 이동했습니다. 램디스크. 기기가 Android 13으로 업그레이드되는 경우 공급업체 램디스크와 일반 램디스크에 모두 snapuserd의 사본이 포함될 수 있습니다. 이 경우에 가상 A/B에 snapuserd의 시스템 사본이 필요합니다. 따라서 snapuserd의 올바른 사본이 있으면 CL을 적용합니다. 2031243 (first_stage_ramdisk에 snapuserd 복사)