Treble 지원 기기는 1단계 마운트를 사용 설정하여 init
에서 system
과 vendor
파티션에 걸쳐 분산된 보안 강화 Linux(SELinux) 정책 프래그먼트를 로드하도록 해야 합니다. 또한 이러한 액세스는 커널 부팅 후 최대한 빨리 커널 모듈을 로드할 수 있게 합니다.
초기 마운트를 실행하려면 Android에서 모듈이 상주하는 파일 시스템에 액세스할 수 있어야 합니다. Android 8.0 이상에서는 init
의 1단계(즉, SELinux가 초기화되기 전)와 같은 초기에 /system
, /vendor
또는 /odm
의 마운트를 지원합니다.
Fstab 항목
Android 9 이하에서는 기기에서 기기 트리 오버레이(DTO)를 사용하여 초기 마운트된 파티션의 fstab
항목을 지정할 수 있습니다. Android 10 이상에서는 기기에서 1단계 램디스크에 있는 fstab
파일을 사용하여 초기 마운트된 파티션의 fstab
항목을 지정해야 합니다. Android 10에는 다음과 같이 fstab
파일에서 사용할 fs_mgr
플래그가 도입되었습니다.
first_stage_mount
는 파티션이 1단계 init에서 마운트되는 것을 나타냅니다.logical
은 동적 파티션임을 나타냅니다.avb=vbmeta-partition-name
은vbmeta
파티션을 지정합니다. 1단계 init는 다른 파티션을 마운트하기 전에 이 파티션을 초기화합니다. 이전 행에서 다른fstab
항목이 이미 항목의vbmeta
파티션을 지정한 경우 이 플래그의 인수는 생략될 수 있습니다.
다음 예에서는 system
, vendor
및 product
파티션을 논리(동적) 파티션으로 설정하는 fstab
항목을 보여줍니다.
#<dev> <mnt_point> <type> <mnt_flags options> <fs_mgr_flags> system /system ext4 ro,barrier=1 wait,slotselect,avb=vbmeta_system,logical,first_stage_mount vendor /vendor ext4 ro,barrier=1 wait,slotselect,avb=vbmeta,logical,first_stage_mount product /product ext4 ro,barrier=1 wait,slotselect,avb,logical,first_stage_mount
이 예에서 공급업체는 fs_mgr
플래그 avb=vbmeta
를 사용하여 vbmeta
파티션을 지정하지만 공급업체에서 이미 파티션 목록에 vbmeta
를 추가했으므로 product
는 vbmeta
인수를 생략합니다.
Android 10 이상을 실행하는 기기는 램디스크와 vendor
파티션에 fstab
파일을 배치해야 합니다.
램디스크
램디스크에서 fstab
파일의 위치는 기기가 램디스크를 사용하는 방법에 따라 다릅니다.
부팅 램디스크가 있는 기기는 fstab
파일을 부팅 램디스크 루트에 배치해야 합니다. 기기에 부팅 램디스크와 복구 램디스크가 둘 다 있으면 복구 램디스크를 변경할 필요가 없습니다. 예:
PRODUCT_COPY_FILES += device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_RAMDISK)/fstab.$(PRODUCT_PLATFORM)
램디스크로 복구를 사용하는 기기는 커널 명령줄 매개변수 androidboot.force_normal_boot=1
을 사용하여 Android로 부팅할지 계속 복구로 부팅할지 결정해야 합니다. 커널 버전 5.10 이상인 Android 12 이상으로 출시되는 기기는 bootconfig를 사용하여 androidboot.force_normal_boot=1
매개변수를 전달해야 합니다. 이러한 기기에서 1단계 init는 초기 마운트 파티션을 마운트하기 전에 루트를 /first_stage_ramdisk
로 전환하는 작업을 하므로 기기는 $(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk
에 fstab
파일을 배치해야 합니다. 예:
PRODUCT_COPY_FILES += device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk/fstab.$(PRODUCT_PLATFORM)
공급업체
모든 기기는 fstab
파일 사본을 /vendor/etc
에 배치해야 합니다. 왜냐하면 파티션의 초기 마운트를 완료하고 루트 전환 작업을 실행하여 /system
에 있는 마운트를 /
로 이동한 후에는 1단계 init에서 램디스크를 해제하기 때문입니다. 따라서 fstab
파일에 액세스가 필요한 모든 후속 작업은 /vendor/etc
에 있는 사본을 사용해야 합니다. 예:
PRODUCT_COPY_FILES += device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.$(PRODUCT_PLATFORM)
파티션 초기 마운트, VBoot 1.0
VBoot 1.0으로 파티션을 초기에 마운트하기 위한 요구사항은 다음과 같습니다.
- 기기 노드 경로는
fstab
과 devicetree 항목에서by-name
심볼릭 링크를 사용해야 합니다. 예를 들어/dev/block/mmcblk0pX
를 사용하여 파티션을 지정하는 대신 파티션 이름이 지정되어 있고 기기 노드가/dev/block/…./by-name/{system,vendor,odm}
인지 확인합니다. - 제품의 기기 설정(즉,
device/oem/project/device.mk
)에서PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION
및CUSTOM_IMAGE_VERITY_BLOCK_DEVICE
에 지정된 경로는fstab
/devicetree 항목에by-name
으로 지정된 상응하는 블록 기기 노드와 일치해야 합니다. 예:PRODUCT_SYSTEM_VERITY_PARTITION := /dev/block/…./by-name/system PRODUCT_VENDOR_VERITY_PARTITION := /dev/block/…./by-name/vendor CUSTOM_IMAGE_VERITY_BLOCK_DEVICE := /dev/block/…./by-name/odm
- 기기 트리 오버레이를 통해 제공된 항목은
fstab
파일 프래그먼트에서 반복되면 안 됩니다. 예를 들어 devicetree에/vendor
를 마운트하는 항목을 지정할 때fstab
파일에서 동일한 항목을 반복해서는 안 됩니다. verifyatboot
가 필요한 파티션은 초기에 마운트되면 안 됩니다(지원되지 않음).- 확인된 파티션의 verity 모드/상태는
androidboot.veritymode
옵션을 사용하여kernel_cmdline
에 지정되어야 합니다(기존 요구사항).
기기 트리 초기 마운트, VBoot 1.0
Android 8.x 이상에서는 init
가 devicetree를 파싱하고 fstab
항목을 생성하여 1단계에서 초기에 파티션을 마운트합니다. fstab
항목의 형식은 다음과 같습니다.
src mnt_point type mnt_flags fs_mgr_flags
기기 트리 속성은 다음 형식을 모방하도록 정의됩니다.
fstab
항목은 devicetree에서/firmware/android/fstab
아래에 있어야 하며android,fstab
으로 설정된 호환되는 문자열을 포함해야 합니다./firmware/android/fstab
아래의 각 노드는 하나의 초기 마운트fstab
항목으로 취급됩니다. 노드에는 다음의 정의된 속성이 있어야 합니다.dev
는by-name
파티션을 나타내는 기기 노드를 가리켜야 합니다.type
은 파일 시스템 유형이어야 합니다(fstab
파일에서와 동일).mnt_flags
는 마운트 플래그를 쉼표로 구분한 목록이어야 합니다(fstab
파일에서와 동일).fsmgr_flags
는 Androidfs_mgr flags
의 목록이어야 합니다(fstab
파일에서와 동일).
- A/B 파티션에는
slotselect fs_mgr
옵션이 있어야 합니다. - dm-verity가 사용 설정된 파티션에는
verify fs_mgr
옵션이 있어야 합니다.
예: N6P의 /system 및 /vendor
다음 예는 Nexus 6P에서 system
과 vendor
파티션의 devicetree 초기 마운트 방법을 보여줍니다.
/ { firmware { android { compatible = "android,firmware"; fstab { compatible = "android,fstab"; system { compatible = "android,system"; dev = "/dev/block/platform/soc.0/f9824900.sdhci/by-name/system"; type = "ext4"; mnt_flags = "ro,barrier=1,inode_readahead_blks=8"; fsmgr_flags = "wait,verify"; }; vendor { compatible = "android,vendor"; dev = "/dev/block/platform/soc.0/f9824900.sdhci/by-name/vendor"; type = "ext4"; mnt_flags = "ro,barrier=1,inode_readahead_blks=8"; fsmgr_flags = "wait"; }; }; }; }; };
예: Pixel의 /vendor
다음 예는 Pixel에서 /vendor
의 devicetree 초기 마운트 방법을 보여줍니다(A/B에 종속된 파티션에 slotselect
를 추가해야 함).
/ { firmware { android { compatible = "android,firmware"; fstab { compatible = "android,fstab"; vendor { compatible = "android,vendor"; dev = "/dev/block/platform/soc/624000.ufshc/by-name/vendor"; type = "ext4"; mnt_flags = "ro,barrier=1,discard"; fsmgr_flags = "wait,slotselect,verify"; }; }; }; }; };
파티션 초기 마운트, VBoot 2.0
VBoot 2.0은 AVB(Android 자체 검사 부팅)입니다. VBoot 2.0으로 파티션을 초기에 마운트하기 위한 요구사항은 다음과 같습니다.
- 기기 노드 경로는
fstab
과 devicetree 항목에서by-name
심볼릭 링크를 사용해야 합니다. 예를 들어/dev/block/mmcblk0pX
를 사용하여 파티션을 지정하는 대신 파티션 이름이 지정되어 있고 기기 노드가/dev/block/…./by-name/{system,vendor,odm}
인지 확인합니다. - VBoot 1.0에 사용되는 빌드 시스템 변수(예:
PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION
및CUSTOM_IMAGE_VERITY_BLOCK_DEVICE
)는 VBoot 2.0에서 필요하지 않습니다. 대신 VBoot 2.0에 도입된 빌드 변수(BOARD_AVB_ENABLE := true
포함)를 정의해야 합니다. 전체 구성에 관한 내용은 AVB를 위한 빌드 시스템 통합을 참조하세요. - 기기 트리 오버레이를 통해 제공된 항목은
fstab
파일 프래그먼트에서 반복되면 안 됩니다. 예를 들어 devicetree에서/vendor
를 마운트할 항목을 지정한다면fstab
파일에서 동일한 항목을 반복해서는 안 됩니다. - VBoot 2.0은 초기 마운트의 사용 설정 여부와 관계없이
verifyatboot
를 지원하지 않습니다. - 확인된 파티션의 verity 모드/상태는
androidboot.veritymode
옵션을 사용하여kernel_cmdline
에 지정되어야 합니다(기존 요구사항). AVB의 다음 수정사항을 포함해야 합니다.
기기 트리 초기 마운트, VBoot 2.0
VBoot 2.0의 devicetree 구성은 다음을 제외하고 VBoot 1.0과 동일합니다.
fsmgr_flag
는verify
에서avb
로 전환됩니다.- AVB 메타데이터가 있는 모든 파티션은 파티션이 초기에 마운트하고 있지 않더라도 devicetree의 VBMeta 항목에 있어야 합니다(예:
/boot
).
예: N5X의 /system 및 /vendor
다음 예는 Nexus 5X에서 system
과 vendor
파티션의 devicetree 초기 마운트 방법을 보여줍니다. 참고:
/system
은 AVB를 사용하여 마운트되고/vendor
는 무결성 확인 없이 마운트됩니다.- Nexus 5X에는
/vbmeta
파티션이 없으므로 최상위 vbmeta는/boot
파티션의 끝에 있습니다(자세한 내용은 AOSP 변경 목록 참조)./ { firmware { android { compatible = "android,firmware"; vbmeta { compatible = "android,vbmeta"; parts = "boot,system,vendor"; }; fstab { compatible = "android,fstab"; system { compatible = "android,system"; dev = "/dev/block/platform/soc.0/f9824900.sdhci/by-name/system"; type = "ext4"; mnt_flags = "ro,barrier=1,inode_readahead_blks=8"; fsmgr_flags = "wait,avb"; }; vendor { compatible = "android,vendor"; dev = "/dev/block/platform/soc.0/f9824900.sdhci/by-name/vendor"; type = "ext4"; mnt_flags = "ro,barrier=1,inode_readahead_blks=8"; fsmgr_flags = "wait"; }; }; }; }; };
예: Pixel의 /vendor
다음 예는 Pixel에서 /vendor
를 초기에 마운트하는 방법을 보여줍니다.
참고:
- AVB로 보호되는 파티션이므로 vbmeta 항목에서 더 많은 파티션이 지정됩니다.
/vendor
만 초기에 마운트되더라도 모든 AVB 파티션이 포함되어야 합니다.- A/B에 종속된 파티션에
slotselect
를 추가해야 합니다./ { vbmeta { compatible = "android,vbmeta"; parts = "vbmeta,boot,system,vendor,dtbo"; }; firmware { android { compatible = "android,firmware"; fstab { compatible = "android,fstab"; vendor { compatible = "android,vendor"; dev = "/dev/block/platform/soc/624000.ufshc/by-name/vendor"; type = "ext4"; mnt_flags = "ro,barrier=1,discard"; fsmgr_flags = "wait,slotselect,avb"; }; }; }; }; };