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
을 추가하려면 다음 단계를 따르세요.
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
파티션 목록에서
system_dlkm
BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm
을 추가합니다.(선택사항) 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.15
의 system_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