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

Android 10은 OTA(over-the-air) 업데이트 도중 파티션을 생성하고 크기를 변경하고 삭제할 수 있는 사용자 공간 파티션 시스템인 동적 파티션을 지원합니다. 이 문서에서는 동적 파티션이 지원되는 상태로 출시된 A/B 기기의 업데이트가 진행되는 동안 OTA 클라이언트에서 동적 파티션의 크기를 어떻게 변경하는지에 대해 설명합니다.

배경

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

업데이트 전과 후에는 다음 시스템 속성에 각각의 값이 있어야 합니다.

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

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

동적 파티션을 포함하는 A/B 기기 또는 동적 파티션에 지원을 추가하는 A/B 기기에 OTA 업데이트를 수행하는 경우 업데이트 매니페스트에 그룹과 파티션을 추가해야 합니다. 아래 스니펫은 동적 파티션 지원을 위한 업데이트 매니페스트에 관한 추가 정보를 보여줍니다. 각 필드에 관한 상세 문서는 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;
    }