일반 부팅 파티션

Android 12에서는 일반 커널 이미지(GKI)라고 하는 일반 boot 이미지에 일반 램디스크와 GKI 커널이 포함되어 있습니다.

Android 13으로 출시되는 기기의 경우 일반 램디스크는 boot 이미지에서 삭제되고 별도의 init_boot 이미지에 배치됩니다. 이에 따라 boot 이미지에 GKI 커널만 남게 됩니다.

Android 12 또는 이전 커널 버전을 계속 사용하는 기기를 업그레이드하는 경우 일반 램디스크는 새 init_boot 이미지 요구사항 없이 원래 위치에 있습니다.

일반 램디스크를 빌드하려면 일반 램디스크에 1단계 init와 타임스탬프 정보가 포함된 속성 파일만 포함되도록 램디스크에서 공급업체별 리소스를 이동합니다.

다음과 같은 기기의 경우

  • 전용 recovery 파티션을 사용하지 않으면 모든 복구 비트가 일반 램디스크에서 vendor_boot 램디스크로 이동합니다.

  • 전용 recovery 파티션을 사용하는 기기에서는 recovery 램디스크를 변경하지 않아도 됩니다. recovery 램디스크가 독립되어 있기 때문입니다.

아키텍처

다음 다이어그램은 Android 12 이상을 실행하는 기기의 아키텍처를 보여줍니다. Android 13으로 출시되는 기기에는 일반 램디스크가 포함된 새로운 init_boot 이미지가 있습니다. Android 12에서 Android 13으로 업그레이드하는 기기는 Android 12와 동일한 아키텍처를 사용합니다.

Android 13으로 출시, 전용 복구 없음

기기 출시/업그레이드, GKI, 전용 복구 없음

그림 1. Android 13으로 출시되거나 Android 13으로 업그레이드되는 기기(GKI 포함, 전용 복구 없음)

Android 13으로 출시, 전용 및 A/B 복구(전용 램디스크)

기기 출시/업그레이드, GKI, 전용 및 A/B 복구

그림 2. Android 13으로 출시되거나 Android 13으로 업그레이드되는 기기(GKI, 전용 및 A/B 복구 포함)

기기에 recovery_arecovery_b 파티션이 있으면 이 그림을 참고하세요.

Android 13으로 출시, 전용 및 비 A/B 복구(전용 램디스크)

기기 출시/업그레이드, GKI, 전용 및 비 A/B 복구

그림 3. Android 13으로 출시되거나 Android 13으로 업그레이드되는 기기(GKI, 전용 및 비 A/B 복구 포함)

기기에 슬롯 접미사가 없는 recovery라는 파티션이 있으면 이 그림을 참고하세요.

Android 12로 출시 또는 업그레이드, 전용 복구 없음

기기 출시/업그레이드, GKI, 전용 복구 없음

그림 4. Android 12로 출시하거나 업그레이드하는 기기(GKI 포함, 전용 복구 없음)

Android 12로 출시 또는 업그레이드, 전용 및 A/B 복구(전용 램디스크)

기기 출시/업그레이드, GKI, 전용 및 A/B 복구

그림 5. Android 12로 출시하거나 업그레이드하는 기기(GKI, 전용 및 A/B 복구 포함)

기기에 recovery_arecovery_b 파티션이 있으면 이 그림을 참고하세요.

Android 12로 출시 또는 업그레이드, 전용 및 비 A/B 복구(전용 램디스크)

기기 출시/업그레이드, GKI, 전용 및 비 A/B 복구

그림 6. Android 12로 출시하거나 업그레이드하는 기기(GKI, 전용 및 비 A/B 복구 포함)

기기에 슬롯 접미사가 없는 recovery라는 파티션이 있으면 이 그림을 참고하세요.

Android 12로 업그레이드, recovery-as-boot(recovery-as-ramdisk)

기기 출시/업그레이드, GKI 없음, recovery-as-boot

그림 7. Android 12로 업그레이드하는 기기, GKI 없음, recovery-as-boot

Android 12로 업그레이드, 전용 복구(전용 램디스크)

기기 출시/업그레이드, GKI 없음, 전용 복구

그림 8. Android 12로 업그레이드하는 기기, GKI 없음, 전용 복구

부팅 이미지 콘텐츠

Android 부팅 이미지에는 다음이 포함됩니다.

  • Android 13이 탑재된 기기에 init_boot 이미지 추가됨

    • 헤더 버전 V4
    • 일반 램디스크 이미지
  • 일반 boot 이미지

    • 헤더 버전 V3 또는 V4
      • GKI boot.img 인증 boot_signature(v4 전용) 인증된 GKI boot.img는 자체 검사 부팅을 위해 서명되지 않습니다. OEM은 계속해서 기기별 AVB 키를 사용하여 사전 빌드된 boot.img에 서명해야 합니다.
      • 일반 cmdline(GENERIC_KERNEL_CMDLINE)
      • GKI 커널
    • 일반 램디스크 이미지
      • Android 12 이하의 boot 이미지에만 포함됨
  • vendor_boot 이미지(자세한 내용은 공급업체 부팅 파티션 참고)

    • vendor_boot 헤더
      • 기기별 cmdline(BOARD_KERNEL_CMDLINE)
    • vendor_boot 램디스크 이미지
      • lib/modules
      • 복구 리소스(전용 복구가 없는 경우)
    • dtb 이미지
  • recovery 이미지

    • 헤더 버전 V2
      • 기기별 복구 cmdline(필요한 경우)
      • 비 A/B 복구 파티션의 경우 헤더 콘텐츠는 독립형이어야 합니다(복구 이미지 참고). 예:
      • cmdlinebootvendor_boot cmdline에 연결되지 않습니다.
      • 헤더는 필요한 경우 복구 DTBO를 지정합니다.
      • A/B 복구 파티션의 경우 콘텐츠는 bootvendor_boot에서 연결되거나 추론될 수 있습니다. 예:
      • cmdlinebootvendor_boot cmdline에 연결됩니다.
      • DTBO는 vendor_boot 헤더에서 추론될 수 있습니다.
    • recovery 램디스크 이미지
      • 복구 리소스
      • 비 A/B 복구 파티션의 경우 램디스크 콘텐츠는 독립형이어야 합니다(복구 이미지 참고). 예:
      • lib/modules에는 복구 모드 부팅에 필요한 커널 모듈이 모두 포함되어야 합니다.
      • 복구 램디스크에는 init가 포함되어야 합니다.
      • A/B 복구 파티션의 경우 복구 램디스크는 일반 및 vendor_boot 램디스크 앞에 추가되므로 독립형일 필요가 없습니다. 예:
      • lib/modules에는 vendor_boot 램디스크의 커널 모듈 외에 복구 모드를 부팅하는 데 필요한 추가 커널 모듈만 포함될 수 있습니다.
      • /init의 심볼릭 링크는 존재할 수 있지만 부팅 이미지의 1단계 /init 바이너리로 가려집니다.

일반 램디스크 이미지 콘텐츠

일반 램디스크에는 다음 구성요소가 포함됩니다.

  • init
  • 추가된 system/etc/ramdisk/build.prop
  • ro.PRODUCT.bootimg.* build 속성
  • 마운트 지점의 빈 디렉터리: debug_ramdisk/, mnt/, dev/, sys/, proc/, metadata/
  • first_stage_ramdisk/
    • 마운트 지점의 중복된 빈 디렉터리: debug_ramdisk/, mnt/, dev/, sys/, proc/, metadata/

부팅 이미지 통합

빌드 플래그는 init_boot, boot, recovery, vendor_boot 이미지가 빌드되는 방식을 제어합니다. 불리언 보드 변수 값은 true 문자열이거나 비어 있어야 합니다(기본값).

  • TARGET_NO_KERNEL. 이 변수는 빌드가 사전 빌드된 부팅 이미지를 사용하는지를 나타냅니다. 이 변수가 true로 설정되면 BOARD_PREBUILT_BOOTIMAGE를 사전 빌드된 부팅 이미지의 위치(BOARD_PREBUILT_BOOTIMAGE:= device/${company}/${board}/boot.img)로 설정합니다.

  • BOARD_USES_RECOVERY_AS_BOOT. 이 변수는 기기가 recovery 이미지를 boot 이미지로 사용하는지를 나타냅니다. GKI를 사용할 때 이 변수는 비어 있고 복구 리소스는 vendor_boot로 이동해야 합니다.

  • BOARD_USES_GENERIC_KERNEL_IMAGE. 이 변수는 보드가 GKI를 사용함을 나타냅니다. 이 변수는 sysprops 또는 PRODUCT_PACKAGES에 영향을 미치지 않습니다.

    보드 수준 GKI 전환입니다. 아래 나열된 변수는 모두 이 변수로 제한됩니다.

  • BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT. 이 변수는 램디스크 복구 리소스가 vendor_boot에 빌드되는지를 제어합니다.

    • true로 설정하면 복구 리소스가 vendor-ramdisk/에만 빌드되고 recovery/root/에는 빌드되지 않습니다.

    • 비어 있으면 복구 리소스가 recovery/root/에만 빌드되고 vendor-ramdisk/에는 빌드되지 않습니다.

  • BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT. 이 변수는 GSI AVB 키가 vendor_boot에 빌드되는지를 제어합니다.

    • true로 설정하면 BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT는 다음과 같습니다.

      • 설정되면 GSI AVB 키가 $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avb에 빌드됩니다.

      • 설정되지 않으면 GSI AVB 키가 $ANDROID_PRODUCT_OUT/vendor-ramdisk/avb에 빌드됩니다.

    • 비어 있으면 BOARD_RECOVERY_AS_ROOT는 다음과 같습니다.

      • 설정되면 GSI AVB 키가 $ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb에 빌드됩니다.

      • 설정되지 않으면 GSI AVB 키가 $ANDROID_PRODUCT_OUT/ramdisk/avb에 빌드됩니다.

  • BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE. 이 변수는 recovery 이미지에 커널이 포함되어 있는지를 제어합니다. Android 12로 출시되고 A/B recovery 파티션을 사용하는 기기는 이 변수를 true로 설정해야 합니다. Android 12로 출시되고 비 A/B를 사용하는 기기는 이 변수를 false로 설정하여 복구 이미지를 독립적으로 유지해야 합니다.

  • BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES. 이 변수는 $OUT/boot*.img가 타겟 파일 아래 IMAGES/에 복사되는지를 제어합니다.

    • aosp_arm64는 이 변수를 true로 설정해야 합니다.

    • 다른 기기에서는 이 변수를 비워 두어야 합니다.

  • BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE. 이 변수는 init_boot.img의 생성 여부를 제어하고 크기를 설정합니다. 설정된 경우 일반 램디스크가 boot.img 대신 init_boot.img에 추가되며 체이닝된 vbmetaBOARD_AVB_INIT_BOOT* 변수를 설정해야 합니다.

허용된 조합

구성요소 또는 변수 recovery 파티션이 없는 기기 업그레이드 recovery 파티션이 있는 기기 업그레이드 recovery 파티션 없이 기기 출시 A/B recovery 파티션으로 기기 출시 비 A/B recovery 파티션으로 기기 출시 aosp_arm64
boot 포함
init_boot 포함(Android 13) 아니요 아니요 아니요
vendor_boot 포함 선택사항 선택사항 아니요
recovery 포함 아니요 아니요 아니요
BOARD_USES_RECOVERY_AS_BOOT true 비어 있음 비어 있음 비어 있음 비어 있음 비어 있음
BOARD_USES_GENERIC_KERNEL_IMAGE 비어 있음 비어 있음 true true true true
PRODUCT_BUILD_RECOVERY_IMAGE 비어 있음 true 또는 비어 있음 비어 있음 true 또는 비어 있음 true 또는 비어 있음 비어 있음
BOARD_RECOVERYIMAGE_PARTITION_SIZE 비어 있음 > 0 비어 있음 > 0 > 0 비어 있음
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT 비어 있음 비어 있음 true 비어 있음 비어 있음 비어 있음
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT 비어 있음 비어 있음 true true true 비어 있음
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE 비어 있음 비어 있음 비어 있음 true 비어 있음 비어 있음
BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES 비어 있음 비어 있음 비어 있음 비어 있음 비어 있음 true

전용 recovery 파티션이 있는 기기는 PRODUCT_BUILD_RECOVERY_IMAGEtrue 또는 비어 있도록 설정할 수 있습니다. 이러한 기기의 경우 BOARD_RECOVERYIMAGE_PARTITION_SIZE가 설정되면 recovery 이미지가 빌드됩니다.

부팅을 위해 체이닝된 vbmeta 사용 설정

체이닝된 vbmeta는 bootinit_boot 이미지에 사용 설정해야 합니다. 다음 사항을 지정합니다.

BOARD_AVB_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa4096.pem
BOARD_AVB_BOOT_ALGORITHM := SHA256_RSA4096
BOARD_AVB_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION := 2

BOARD_AVB_INIT_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
BOARD_AVB_INIT_BOOT_ALGORITHM := SHA256_RSA2048
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX_LOCATION := 3

예는 이 변경사항을 참고하세요.

System-as-root

system-as-root는 GKI를 사용하는 기기에서 지원되지 않습니다. 이러한 기기에서는 BOARD_BUILD_SYSTEM_ROOT_IMAGE가 비어 있어야 합니다. system-as-root는 동적 파티션을 사용하는 기기에서도 지원되지 않습니다.

제품 구성

일반 램디스크를 사용하는 기기는 램디스크에 설치할 수 있는 파일 목록을 설치해야 합니다. 이렇게 하려면 device.mk에서 다음을 지정합니다.

$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)

generic_ramdisk.mk 파일은 다른 makefile이 다른 파일을 실수로 램디스크에 설치하는 것도 방지합니다(대신 이러한 파일을 vendor_ramdisk로 이동).

기기 설정

설정 안내는 Android 13으로 출시되는 기기, Android 12로 업그레이드되는 기기, Android 12로 출시되는 기기에 따라 다릅니다. Android 13은 Android 12와 유사한 방식으로 설정됩니다.

  • Android 12로 업그레이드하는 기기:

    • BOARD_USES_RECOVERY_AS_BOOT 값을 유지할 수 있습니다. 값을 유지하면 기존 구성을 사용하고 있으므로 새 빌드 변수는 비어 있어야 합니다. 이러한 기기의 경우 다음과 같습니다.

      • BOARD_USES_RECOVERY_AS_BOOTtrue로 설정하면 아키텍처는 그림 3과 같습니다.

      • BOARD_USES_RECOVERY_AS_BOOT를 공백으로 설정하면 아키텍처는 그림 4와 같습니다.

    • BOARD_USES_RECOVERY_AS_BOOT를 공백으로 설정할 수 있습니다. 공백으로 설정하면 새 구성을 사용하는 것입니다. 이러한 기기의 경우 다음과 같습니다.

      • 전용 recovery 파티션을 사용하지 않으면 아키텍처는 그림 1과 같고 기기 설정 옵션은 옵션 1입니다.

      • 전용 recovery 파티션을 사용하면 아키텍처는 그림 2a그림 2b와 같고 기기 설정 옵션은 옵션 2a옵션 2b입니다.

  • Android 12로 출시되는 기기는 BOARD_USES_RECOVERY_AS_BOOT를 공백으로 설정하고 새 구성을 사용해야 합니다. 이러한 기기의 경우 다음과 같습니다.

    • 전용 recovery 파티션을 사용하지 않으면 아키텍처는 그림 1과 같고 기기 설정 옵션은 옵션 1입니다.

    • 전용 recovery 파티션을 사용하면 아키텍처는 그림 2a그림 2b와 같고 기기 설정 옵션은 옵션 2a옵션 2b입니다.

aosp_arm64는 GKI만 빌드하고 vendor_boot나 복구는 빌드하지 않으므로 완전한 타겟이 아닙니다. aosp_arm64 빌드 구성은 generic_arm64를 참고하세요.

옵션 1: 전용 복구 파티션 없음

recovery 파티션이 없는 기기에는 boot 파티션에 일반 boot 이미지가 있습니다. vendor_boot 램디스크에는 공급업체 커널 모듈이 있는 lib/modules를 비롯한 복구 리소스가 모두 포함되어 있습니다. 이러한 기기에서 제품 구성은 generic_ramdisk.mk에서 상속받습니다.

보드 값 설정

다음 값을 설정합니다.

BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT := true
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true

vendor_boot 램디스크에는 /init -> /system/bin/init 심볼릭 링크와 /system/bin/initinit_second_stage.recovery가 포함될 수 있습니다. 그러나 일반 램디스크는 vendor_boot 램디스크 다음에 연결되므로 /init 심볼릭 링크를 덮어씁니다. 기기가 복구로 부팅될 때 /system/bin/init 바이너리는 2단계 init를 지원하는 데 필요합니다. vendor_boot + 일반 램디스크의 콘텐츠는 다음과 같습니다.

  • /init(일반 램디스크에서, init_first_stage에서 빌드됨)
  • /system/bin/init(vendor_ramdisk에서, init_second_stage.recovery에서 빌드됨)

fstab 파일 이동

일반 램디스크에 설치된 fstab 파일을 모두 vendor_ramdisk로 이동합니다. 예는 이 변경사항을 참고하세요.

모듈 설치

원하는 경우 기기별 모듈을 vendor_ramdisk에 설치할 수 있습니다. 설치할 기기별 모듈이 없다면 이 단계를 건너뛰세요.

  • 모듈이 /first_stage_ramdisk에 설치될 때 모듈의 vendor_ramdisk 변형을 사용합니다. 이 모듈은 init가 루트를 /first_stage_ramdisk로 전환한 후, 그러나 init가 루트를 /system으로 전환하기 전에 사용할 수 있어야 합니다. 예는 메타데이터 체크섬가상 A/B 압축을 참고하세요.

  • 모듈이 /에 설치될 때 모듈의 recovery 변형을 사용합니다. 이 모듈은 init가 루트를 /first_stage_ramdisk로 전환하기 전에 사용할 수 있어야 합니다. /에 모듈을 설치하는 방법에 관한 자세한 내용은 1단계 콘솔을 참고하세요.

1단계 콘솔

1단계 콘솔은 init가 루트를 /first_stage_ramdisk로 전환하기 전에 시작되므로 모듈의 recovery 변형을 설치해야 합니다. 기본적으로 두 모듈 변형은 모두 build/make/target/product/base_vendor.mk에 설치되므로 기기 makefile이 이 파일에서 상속받는다면 recovery 변형을 명시적으로 설치하지 않아도 됩니다.

복구 모듈을 명시적으로 설치하려면 다음을 사용합니다.

PRODUCT_PACKAGES += \
    linker.recovery \
    shell_and_utilities_recovery \

이렇게 하면 linker, sh, toybox$ANDROID_PRODUCT_OUT/recovery/root/system/bin에 설치된 후 vendor_ramdisk 아래 /system/bin에 설치됩니다.

1단계 콘솔에 필요한 모듈(예: adbd)을 추가하려면 다음을 사용합니다.

PRODUCT_PACKAGES += adbd.recovery

이렇게 하면 지정된 모듈이 $ANDROID_PRODUCT_OUT/recovery/root/system/bin에 설치된 후 vendor_ramdisk 아래 /system/bin에 설치됩니다.

메타데이터 체크섬

1단계 마운트 중 메타데이터 체크섬을 지원하기 위해 GKI를 지원하지 않는 기기는 다음 모듈의 램디스크 변형을 설치합니다. GKI 지원을 추가하려면 모듈을 $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin으로 이동합니다.

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    resize2fs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \

예는 이 변경사항 목록을 참고하세요.

가상 A/B 압축

가상 A/B 압축을 지원하려면 snapuserdvendor_ramdisk에 설치해야 합니다. 기기는 snapuserdvendor_ramdisk 변형을 설치하는 virtual_ab_ota/compression.mk에서 상속받아야 합니다.

부팅 프로세스 변경사항

복구로 부팅 또는 Android로 부팅 프로세스는 변경되지 않지만 다음의 경우는 예외입니다.

  • 램디스크 build.prop/second_stage_resources로 이동하여 2단계 init가 부팅의 빌드 타임스탬프를 읽을 수 있도록 합니다.

리소스가 일반 램디스크에서 vendor_boot 램디스크로 이동하므로 일반 램디스크를 vendor_boot 램디스크에 연결하는 결과가 변경되지 않습니다.

e2fsck 사용 가능하게 만들기

기기 makefile은 다음에서 상속받을 수 있습니다.

  • virtual_ab_ota/launch_with_vendor_ramdisk.mk: 기기에서 가상 A/B를 지원하지만 압축은 지원하지 않는 경우

  • virtual_ab_ota/compression.mk: 기기에서 가상 A/B 압축을 지원하는 경우

제품 makefile은 $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck를 설치합니다. 런타임에 1단계 init는 루트를 /first_stage_ramdisk로 전환하고 /system/bin/e2fsck를 실행합니다.

옵션 2a: 전용 및 A/B 복구 파티션

A/B recovery 파티션이 있는 기기, 즉 recovery_arecovery_b partition이 있는 기기에 이 옵션을 사용합니다. 이러한 기기에는 다음 구성으로 복구 파티션을 업데이트할 수 있는 A/B 및 가상 A/B 기기가 포함됩니다.

AB_OTA_PARTITIONS += recovery

vendor_boot 램디스크에는 다음을 포함하여 램디스크 및 공급업체 커널 모듈의 공급업체 비트가 포함되어 있습니다.

  • 기기별 fstab 파일

  • lib/modules(공급업체 커널 모듈 포함)

recovery 램디스크에는 복구 리소스가 모두 포함되어 있습니다. 이러한 기기에서 제품 구성은 generic_ramdisk.mk에서 상속받습니다.

보드 값 설정

A/B recovery 파티션이 있는 기기에 다음 값을 설정합니다.

BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE := true
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true

recovery 램디스크에는 /init -> /system/bin/init 심볼릭 링크와 /system/bin/initinit_second_stage.recovery가 포함될 수 있습니다. 그러나 부팅 램디스크는 recovery 램디스크 다음에 연결되므로 /init 심볼릭 링크를 덮어씁니다. 기기가 복구 모드로 부팅될 때 /system/bin/init 바이너리는 2단계 init를 지원하는 데 필요합니다.

기기가 recovery로 부팅되면 recovery + vendor_boot + 일반 램디스크의 콘텐츠는 다음과 같습니다.

  • /init(램디스크에서, init_first_stage에서 빌드됨)
  • /system/bin/init(recovery 램디스크에서, init_second_stage.recovery에서 빌드됨, /init에서 실행됨)

기기가 Android로 부팅될 때 vendor_boot + 일반 램디스크의 콘텐츠는 다음과 같습니다.

  • /init(일반 램디스크에서, init_first_stage에서 빌드됨)

fstab 파일 이동

일반 램디스크에 설치된 fstab 파일을 모두 vendor_ramdisk로 이동합니다. 예는 이 변경사항을 참고하세요.

모듈 설치

원하는 경우 기기별 모듈을 vendor_ramdisk에 설치할 수 있습니다. 설치할 기기별 모듈이 없다면 이 단계를 건너뛰세요. Init는 루트를 전환하지 않습니다. 모듈의 vendor_ramdisk 변형은 vendor_ramdisk의 루트에 설치됩니다. vendor_ramdisk에 모듈을 설치하는 방법에 관한 예는 1단계 콘솔, 메타데이터 체크섬, 가상 A/B 압축을 참고하세요.

1단계 콘솔

모듈의 vendor_ramdisk 변형을 설치하려면 다음을 사용합니다.

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \

이렇게 하면 linker, sh, toybox$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin에 설치된 후 vendor_ramdisk 아래 /system/bin에 설치됩니다.

1단계 콘솔에 필요한 모듈(예: adbd)을 추가하려면 AOSP에 관련 패치를 업로드하여 이러한 모듈의 vendor_ramdisk 변형을 사용 설정하고 다음을 사용합니다.

PRODUCT_PACKAGES += adbd.vendor_ramdisk

이렇게 하면 지정된 모듈이 $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin에 설치됩니다. vendor_boot 램디스크가 복구 모드로 로드되면 모듈은 recovery에서도 사용할 수 있습니다. vendor_boot 램디스크가 복구 모드로 로드되지 않으면 기기는 adbd.recovery도 선택적으로 설치할 수 있습니다.

메타데이터 체크섬

1단계 마운트 중 메타데이터 체크섬을 지원하기 위해 GKI를 지원하지 않는 기기는 다음 모듈의 램디스크 변형을 설치합니다. GKI 지원을 추가하려면 모듈을 $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin으로 이동합니다.

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    resize2fs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \

예는 이 변경사항 목록을 참고하세요.

가상 A/B 압축

가상 A/B 압축을 지원하려면 snapuserdvendor_ramdisk에 설치해야 합니다. 기기는 snapuserdvendor_ramdisk 변형을 설치하는 virtual_ab_ota/compression.mk에서 상속받아야 합니다.

부팅 프로세스 변경사항

Android로 부팅할 때 부팅 프로세스는 변경되지 않습니다. vendor_boot + 일반 램디스크는 기존 부팅 프로세스와 비슷하지만 fstabvendor_boot에서 로드된다는 점은 다릅니다. system/bin/recovery가 없으므로 first_stage_init는 일반 부팅으로 처리합니다.

복구 모드로 부팅할 때는 부팅 프로세스가 변경됩니다. 복구 + vendor_boot + 일반 램디스크는 기존 복구 프로세스와 비슷하지만 커널은 recovery 이미지가 아닌 boot 이미지에서 로드됩니다. 복구 모드의 부팅 프로세스는 다음과 같습니다.

  1. 부트로더가 시작된 후 다음을 실행합니다.

    1. 복구 + vendor_boot + 일반 램디스크를 /로 푸시합니다. (OEM이 커널 모듈을 BOARD_RECOVERY_KERNEL_MODULES에 추가하여 복구 램디스크에 복제하는 경우 vendor_boot는 선택사항입니다.)
    2. boot 파티션에서 커널을 실행합니다.
  2. 커널이 램디스크를 /에 마운트하고 일반 램디스크에서 /init를 실행합니다.

  3. 1단계 init가 시작된 후 다음을 실행합니다.

    1. IsRecoveryMode() == trueForceNormalBoot() == false를 설정합니다.
    2. /lib/modules에서 공급업체 커널 모듈을 로드합니다.
    3. DoFirstStageMount()를 호출하지만 IsRecoveryMode() == true이므로 마운트를 건너뜁니다. 기기는 램디스크를 해제하지 않지만(/가 여전히 동일하기 때문) SetInitAvbVersionInRecovery()는 호출합니다.
    4. recovery 램디스크의 /system/bin/init에서 2단계 init를 시작합니다.

e2fsck 사용 가능하게 만들기

기기 makefile은 다음에서 상속받을 수 있습니다.

  • virtual_ab_ota/launch_with_vendor_ramdisk.mk: 기기에서 가상 A/B를 지원하지만 압축은 지원하지 않는 경우

  • virtual_ab_ota/compression.mk: 기기에서 가상 A/B 압축을 지원하는 경우

제품 makefile은 $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck를 설치합니다. 런타임에 1단계 init/system/bin/e2fsck를 실행합니다.

옵션 2b: 전용 및 비 A/B 복구 파티션

비 A/B recovery 파티션이 있는 기기, 즉 슬롯 접미사가 없는 recovery라는 파티션이 있는 기기에 이 옵션을 사용합니다. 이러한 기기는 다음과 같습니다.

  • 비 A/B 기기
  • 복구 파티션을 업데이트할 수 없는 A/B 및 가상 A/B 기기 특이한 경우입니다.

vendor_boot 램디스크에는 다음을 포함하여 램디스크 및 공급업체 커널 모듈의 공급업체 비트가 포함되어 있습니다.

  • 기기별 fstab 파일
  • lib/modules(공급업체 커널 모듈 포함)

recovery 이미지는 독립적이어야 합니다. 여기에는 다음을 비롯하여 복구 모드를 부팅하는 데 필요한 리소스가 모두 포함되어야 합니다.

  • 커널 이미지
  • DTBO 이미지
  • lib/modules의 커널 모듈
  • /init -> /system/bin/init 심볼릭 링크로서의 1단계 init
  • 2단계 init 바이너리 /system/bin/init
  • 기기별 fstab 파일
  • recovery 바이너리 등을 포함한 기타 모든 복구 리소스

이러한 기기에서 제품 구성은 generic_ramdisk.mk에서 상속받습니다.

보드 값 설정

비 A/B 기기에 다음 값을 설정합니다.

BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true

recovery 램디스크에는 /init -> /system/bin/init 심볼릭 링크와 /system/bin/initinit_second_stage.recovery가 포함되어야 합니다. 기기가 복구 모드로 부팅될 때 /system/bin/init 바이너리는 1단계와 2단계 init를 모두 지원하는 데 필요합니다.

기기가 recovery로 부팅되면 recovery 램디스크의 콘텐츠는 다음과 같습니다.

  • /init -> /system/bin/init(recovery 램디스크에서)
  • /system/bin/init(recovery 램디스크에서, init_second_stage.recovery에서 빌드됨, /init에서 실행됨)

기기가 Android로 부팅될 때 vendor_boot + 일반 램디스크의 콘텐츠는 다음과 같습니다.

  • /init(램디스크에서, init_first_stage에서 빌드됨)

fstab 파일 이동

일반 램디스크에 설치된 fstab 파일을 모두 vendor_ramdiskrecovery 램디스크로 이동합니다. 예는 이 변경사항을 참고하세요.

모듈 설치

원하는 경우 기기별 모듈을 vendor_ramdiskrecovery 램디스크에 설치할 수 있습니다. 설치할 기기별 모듈이 없다면 이 단계를 건너뛰세요. init는 루트를 전환하지 않습니다. 모듈의 vendor_ramdisk 변형은 vendor_ramdisk의 루트에 설치됩니다. 모듈의 recovery 변형은 recovery 램디스크의 루트에 설치됩니다. vendor_ramdiskrecovery 램디스크에 모듈을 설치하는 방법에 관한 예는 1단계 콘솔메타데이터 체크섬을 참고하세요.

1단계 콘솔

모듈의 vendor_ramdisk 변형을 설치하려면 다음을 사용합니다.

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \

이렇게 하면 linker, sh, toybox$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin에 설치된 후 vendor_ramdisk 아래 /system/bin에 설치됩니다.

1단계 콘솔에 필요한 모듈(예: adbd)을 추가하려면 AOSP에 관련 패치를 업로드하여 이러한 모듈의 vendor_ramdisk 변형을 사용 설정하고 다음을 사용합니다.

PRODUCT_PACKAGES += adbd.vendor_ramdisk

이렇게 하면 지정된 모듈이 $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin에 설치됩니다.

모듈의 recovery 변형을 설치하려면 vendor_ramdiskrecovery로 바꿉니다.

PRODUCT_PACKAGES += \
    linker.recovery \
    shell_and_utilities_recovery \
    adbd.recovery \

메타데이터 체크섬

1단계 마운트 중 메타데이터 체크섬을 지원하기 위해 GKI를 지원하지 않는 기기는 다음 모듈의 램디스크 변형을 설치합니다. GKI 지원을 추가하려면 모듈을 $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin으로 이동합니다.

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    resize2fs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \

복구의 1단계 마운트 중에 메타데이터 체크섬을 지원하려면 이러한 모듈의 복구 변형을 사용 설정하고 설치합니다.

부팅 프로세스 변경사항

Android로 부팅할 때 부팅 프로세스는 변경되지 않습니다. vendor_boot + 일반 램디스크는 기존 부팅 프로세스와 비슷하지만 fstabvendor_boot에서 로드된다는 점은 다릅니다. system/bin/recovery가 없으므로 first_stage_init는 일반 부팅으로 처리합니다.

복구 모드로 부팅할 때 부팅 프로세스는 변경되지 않습니다. 복구 램디스크는 기존 복구 프로세스와 같은 방식으로 로드됩니다. 커널은 recovery 이미지에서 로드됩니다. 복구 모드의 부팅 프로세스는 다음과 같습니다.

  1. 부트로더가 시작된 후 다음을 실행합니다.

    1. 복구 램디스크를 /로 푸시합니다.
    2. recovery 파티션에서 커널을 실행합니다.
  2. 커널은 램디스크를 /에 마운트하고 recovery 램디스크의 /system/bin/init 심볼릭 링크인 /init를 실행합니다.

  3. 1단계 init가 시작된 후 다음을 실행합니다.

    1. IsRecoveryMode() == trueForceNormalBoot() == false를 설정합니다.
    2. /lib/modules에서 공급업체 커널 모듈을 로드합니다.
    3. DoFirstStageMount()를 호출하지만 IsRecoveryMode() == true이므로 마운트를 건너뜁니다. 기기는 램디스크를 해제하지 않지만(/가 여전히 동일하기 때문) SetInitAvbVersionInRecovery()는 호출합니다.
    4. recovery 램디스크의 /system/bin/init에서 2단계 init를 시작합니다.

부팅 이미지 타임스탬프

다음 코드는 boot 이미지 타임스탬프 파일을 보여주는 예입니다.

####################################
# from generate-common-build-props
# These properties identify this partition image.
####################################
ro.product.bootimage.brand=Android
ro.product.bootimage.device=generic_arm64
ro.product.bootimage.manufacturer=unknown
ro.product.bootimage.model=AOSP on ARM64
ro.product.bootimage.name=aosp_arm64
ro.bootimage.build.date=Mon Nov 16 22:46:27 UTC 2020
ro.bootimage.build.date.utc=1605566787
ro.bootimage.build.fingerprint=Android/aosp_arm64/generic_arm64:S/MASTER/6976199:userdebug/test-keys
ro.bootimage.build.id=MASTER
ro.bootimage.build.tags=test-keys
ro.bootimage.build.type=userdebug
ro.bootimage.build.version.incremental=6976199
ro.bootimage.build.version.release=11
ro.bootimage.build.version.release_or_codename=S
ro.bootimage.build.version.sdk=30
# Auto-added by post_process_props.py
persist.sys.usb.config=none
# end of file
  • 빌드 시간에 system/etc/ramdisk/build.prop 파일은 일반 램디스크에 추가됩니다. 이 파일에는 빌드의 타임스탬프 정보가 포함되어 있습니다.

  • 런타임에 1단계 init는 램디스크에서 tmpfs로 파일을 복사한 후 램디스크를 해제하여 2단계 init가 이 파일을 읽고 boot 이미지 타임스탬프 속성을 설정할 수 있도록 합니다.