동적 파티션을 포함하는 A/B 기기의 OTA

Android 10에서는 무선(OTA) 업데이트 중에 파티션을 만들고 크기를 조절하고 제거할 수 있는 사용자 공간 파티션 나누기 시스템인 동적 파티션을 지원합니다.

이 페이지에서는 Android 9 이하를 실행하는 기기에서 동적 파티션이 지원되는 상태로 A/B 기기의 업데이트가 진행되는 동안 동적 파티션의 크기를 조정하는 방법을 설명합니다.

배경

기기에는 한 개의 super 파티션이 있습니다. 이 파티션은 슬롯 서픽스가 되지 않습니다. 블록 기기는 fstab/misc 항목과 함께 blk_device에 존재해야 합니다. 예를 들어 fstab 파일이 다음을 나열하는 경우:

/dev/block/bootdevice/by-name/misc    /misc    # Other fields

그러면 super의 블록 기기가 /dev/block/bootdevice/by-name/super에 있어야 하지만 super 파티션은 fstab 파일에 나열할 필요가 없습니다.

super 파티션에는 2개의 메타데이터 슬롯이 있습니다. 두 슬롯의 번호는 파티션 A/B 슬롯에 해당하는 0과 1로 지정됩니다. 이 문서에서는 메타데이터 슬롯을 메타데이터 S(소스) 및 메타데이터 T(타겟)라고 부릅니다. 마찬가지로 파티션은 system_s, vendor_t 등으로 지칭됩니다.

업그레이드 전에는 메타데이터 S에 사용 중인 동적 파티션 (일반적으로 system_s, vendor_s, product_s 등)에 대한 정보가 포함되어 있습니다. 시스템은 업데이트 도중 이러한 파티션의 크기를 읽습니다. 따라서 파티션을 삭제할 수 없습니다.

파티션은 업데이트 그룹에 속합니다. 자세한 내용은 동적 파티션 구현을 참조하세요.

기기의 메타데이터에 대한 예는 다음과 같습니다.

  • 메타데이터 0
    • 그룹 foo_a
      • 파티션 system_a
      • 파티션 product_services_a
      • Foo에 의해 업데이트되는 다른 파티션
    • 그룹
        bar_a
      • 파티션 vendor_a
      • 파티션 product_a
      • Bar에 의해 업데이트된 다른 파티션
    • 그룹 foo_b (이전 업그레이드에서 남은 그룹)
    • 그룹 bar_b (이전 업그레이드에서 남은 그룹)
  • 메타데이터 1
    • 그룹 foo_a (이전 업그레이드에서 남은 그룹)
    • 그룹 bar_a (이전 업그레이드에서 남은 그룹)
    • 그룹 foo_b
      • 파티션 system_b
      • 파티션 product_services_b
      • Foo에 의해 업데이트되는 다른 파티션
    • 그룹 bar_b
      • 파티션 vendor_b
      • 파티션 product_b
      • Bar에 의해 업데이트된 다른 파티션

lpdump 도구 (system/extras/partition_tools 아래의 소스 코드)를 사용하여 기기의 메타데이터를 덤프할 수 있습니다. 예:

lpdump --slot 0 /dev/block/bootdevice/by-name/super
lpdump --slot 1 /dev/block/bootdevice/by-name/super

업데이트 흐름

  1. super 파티션 메타데이터를 초기화합니다.
  2. 메타데이터 S에서 소스 동적 파티션의 크기를 로드합니다. M이 로드된 메타데이터가 되도록 합니다.
  3. M에 _s 서픽스가 있는 파티션과 그룹만 포함되도록 M에서 대상 그룹과 파티션 (예: foo_t, bar_t)을 삭제합니다.
  4. 업데이트 매니페스트의 dynamic_partition_metadata 필드에 따라 타겟 그룹과 파티션을 추가합니다.
    각 파티션의 크기는 new_partition_info에서 확인할 수 있습니다.
  5. M을 메타데이터 T에 씁니다.
  6. 추가된 파티션을 기기 매퍼에 작성 가능으로 매핑합니다.
  • 업데이트를 블록 기기에 적용합니다.
  • 필요한 경우 기기 매퍼의 소스 파티션을 읽기-전용으로 매핑합니다. 이는 소스 파티션이 업데이트 전에 매핑되지 않았으므로 사이드로드에 필요합니다.
  • 전체 또는 델타 업데이트를 타겟 슬롯의 모든 블록 기기에 적용합니다.
  • 파티션을 마운트하여 설치 후 스크립트를 실행한 다음 파티션을 마운트 해제합니다.
  • 타겟 파티션을 매핑 해제합니다.
  • 업데이트 전과 후에는 다음 시스템 속성에 각각의 값이 있어야 합니다.

    ro.boot.dynamic_partitions=true
    ro.boot.dynamic_partitions_retrofit=true

    그룹 및 파티션을 업데이트 매니페스트에 추가

    동적 파티션이 있는 A/B 기기에서 OTA 업데이트를 수행할 때 또는 동적 파티션 지원을 추가하는 A/B 기기에서 업데이트 시 그룹과 파티션을 추가해야 합니다. 아래 스니펫은 동적 파티션을 지원하는 업데이트 매니페스트에 대한 추가 정보를 보여줍니다. 각 필드에 관한 상세 문서는 update_metadata.proto를 참조하세요.

    message DeltaArchiveManifest {
        optional DynamicPartitionMetadata dynamic_partition_metadata;
    }
    
    message DynamicPartitionMetadata {
        repeated DynamicPartitionGroup groups;
    }
    
    message DynamicPartitionGroup {
        required string name;
        optional uint64 size; // maximum size of group
        repeated string partition_names;
    }