GKI 모듈 파티션 구현

GKI와 GKI 모듈은 파티션의 나머지 부분과 별도로 업데이트할 수 있습니다. GKI 모듈은 system_dlkm이라고 하는 super 이미지의 별도 동적 파티션에 있기 때문입니다. GKI 모듈은 커널 빌드 시간 키 쌍을 사용하여 Google에서 서명하며 함께 빌드된 GKI와만 호환됩니다. GKI와 GKI 모듈 간에는 ABI 안정성이 없습니다. 모듈이 런타임 중에 올바르게 로드되도록 하려면 GKI 및 GKI 모듈을 함께 빌드하고 업데이트해야 합니다.

system_dklm 파티션 지원 구현

system_dlkm 파티션은 다른 동적 파티션으로 super 파티션에 있습니다. 이 파티션에는 다음이 포함될 수 있습니다.

  • Google 빌드 시간으로 서명된 커널 모듈
  • 아티팩트 depmod

빌드 system_dlkm

system_dlkm을 빌드하는 것은 다른 동적 파티션을 빌드하는 프로세스와 유사합니다. 빌드에 system_dlkm을 추가하려면 다음 단계를 따르세요.

  1. BoardConfig.mk에 다음 항목을 추가합니다.

    BOARD_USES_SYSTEM_DLKMIMAGE := true
    BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE)
    TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkm
    
  2. 파티션 목록에서 system_dlkmBOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm을 추가합니다.

  3. (선택사항) A/B 및 가상 A/B 기기의 경우 기기의 device.mk 파일에 다음 줄을 추가합니다.

    AB_OTA_PARTITIONS += system_dlkm
    

system_dlkm에 복사할 커널 모듈 식별

런타임 시 모듈을 성공적으로 로드하려면 GKI 및 GKI 모듈을 함께 빌드해야 합니다. 따라서 타겟 아키텍처용 GKI 빌드에서 커널 모듈을 식별하고 플랫폼 빌드 중에 이를 system_dlkm 파티션의 소스로 제공해야 합니다.

Android 13의 경우

BOARD_SYSTEM_DLKM_SRC가 기기의 필수 GKI 모듈 커널 객체 파일이 포함된 폴더를 가리키도록 설정하여 system_dlkm 파티션을 생성하는 빌드 시스템의 입력으로 사용합니다. 예:

폴더에 GKI 모듈 소스를 제공하고 BOARD_SYSTEM_DLKM_SRC가 이 폴더를 가리키도록 설정합니다. 예:

  BOARD_SYSTEM_DLKM_SRC := kernel/prebuilts/5.10/arm64/system_dlkm_staging

빌드 시간에 BOARD_SYSTEM_DLKM_SRC에 나열된 모듈이 $ANDROID_PRODUCT_OUT/system_dlkm에 설치됩니다.

Android 14의 경우

다른 *_dlkm 파티션에 사용되는 매크로(BOARD_*_KERNEL_MODULES)를 사용하여 구현을 간소화했습니다. 기기에 필요한 GKI 모듈 목록은 BOARD_SYSTEM_KERNEL_MODULES 매크로별로 참조되어야 합니다. 이러한 모듈은 빌드 시간에 $ANDROID_PRODUCT_OUT/system_dlkm에 설치됩니다. system_dlkm 파티션의 모듈에 종속된 vendor_dlkm 파티션의 모든 모듈은 vendor_dlkm 파티션의 modules.dep 파일에서 정확한 참조를 생성합니다. modules.dep에 의해 표시되는 이러한 교차 파티션 종속 항목으로 인해 공급업체 모듈이 로드될 때 모든 필수 GKI 모듈이 자동으로 로드됩니다.

예를 들어 사전 빌드에서 GKI arm64 커널 5.15system_dlkm 파티션에 모든 GKI 모듈을 설치하려면 다음과 같이 합니다.

 BOARD_SYSTEM_KERNEL_MODULES := $(wildcard kernel/prebuilts/5.15/arm64/*.ko)

런타임에 system_dlkm 마운트

읽기 전용 파일 시스템으로 사용되는 파일 시스템에 따라 fstab에 다음을 추가하여 런타임에 system_dlkm 파티션을 마운트합니다.

읽기 전용 파일 시스템으로서의 ext4

  system_dlkm /system_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb

읽기 전용 파일 시스템으로서의 erofs

  system_dlkm /system_dlkm erofs ro wait,logical,first_stage_mount,slotselect,avb

파티션 마운트와 모듈 로드

first_stage_init 중에 system_dlkm 파티션은 /system_dlkm에 읽기 전용 파일 시스템으로 마운트됩니다. 마운트에 성공하면 /system_dlkm/lib/modules를 가리키는 /system/lib/modules의 심볼릭 링크를 사용할 수 있습니다.

그런 다음, 공급업체 프로세스(예: .rc 스크립트)는 modules.load에 지정된 순서에 따라 커널 모듈을 로드할 수 있습니다. 공급업체 프로세스는 기호화된 링크 /system/lib/modules를 사용하여 모듈을 로드해야 합니다. 필요한 경우 공급업체 프로세스는 모듈을 나중에 로드할 수도 있습니다.

SELinux

system_dlkm 파티션의 모든 파일에는 system_dlkm_file의 파일 컨텍스트로 라벨이 지정됩니다. system_dlkm 파티션에서 GKI 모듈 파일을 로드하려면 모듈 로드를 담당하는 공급업체 프로세스에 따라 공급업체 도메인에 sepolicy가 있어야 합니다.

예를 들어 Cuttlefish에서 GKI 모듈을 로드하는 데 사용하는 dlkm_loader에는 shared/sepolicy/vendor/dlkm_loader.te의 정책 파일에 다음과 같은 권한이 있습니다.

allow dlkm_loader self:capability sys_module;
allow dlkm_loader system_dlkm_file:dir r_dir_perms;
allow dlkm_loader system_dlkm_file:file r_file_perms;
allow dlkm_loader system_dlkm_file:system module_load;

system-dlkm 파티션 유효성 검사

Google은 system_dlkm 파티션의 유효성을 검사할 수 있는 GKI VTS 테스트 사례를 제공합니다. 직접 테스트를 호출하려면 다음 atest 명령어를 사용하세요.

  atest -c vts_dlkm_partition_test