파티션 초기 마운트

Treble 지원 기기는 1단계 마운트를 사용 설정하여 init에서 systemvendor 파티션에 걸쳐 분산된 보안 강화 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-namevbmeta 파티션을 지정합니다. 1단계 init는 다른 파티션을 마운트하기 전에 이 파티션을 초기화합니다. 이전 행에서 다른 fstab 항목이 이미 항목의 vbmeta 파티션을 지정한 경우 이 플래그의 인수는 생략될 수 있습니다.

다음 예에서는 system, vendorproduct 파티션을 논리(동적) 파티션으로 설정하는 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를 추가했으므로 productvbmeta 인수를 생략합니다.

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_ramdiskfstab 파일을 배치해야 합니다. 예:

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으로 파티션을 초기에 마운트하기 위한 요구사항은 다음과 같습니다.

  1. 기기 노드 경로는 fstab과 devicetree 항목에서 by-name 심볼릭 링크를 사용해야 합니다. 예를 들어 /dev/block/mmcblk0pX를 사용하여 파티션을 지정하는 대신 파티션 이름이 지정되어 있고 기기 노드가 /dev/block/…./by-name/{system,vendor,odm}인지 확인합니다.
  2. 제품의 기기 설정(즉, device/oem/project/device.mk)에서 PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITIONCUSTOM_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
    
  3. 기기 트리 오버레이를 통해 제공된 항목은 fstab 파일 프래그먼트에서 반복되면 안 됩니다. 예를 들어 devicetree에 /vendor를 마운트하는 항목을 지정할 때 fstab 파일에서 동일한 항목을 반복해서는 안 됩니다.
  4. verifyatboot가 필요한 파티션은 초기에 마운트되면 안 됩니다(지원되지 않음).
  5. 확인된 파티션의 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 항목으로 취급됩니다. 노드에는 다음의 정의된 속성이 있어야 합니다.
    • devby-name 파티션을 나타내는 기기 노드를 가리켜야 합니다.
    • type은 파일 시스템 유형이어야 합니다(fstab 파일에서와 동일).
    • mnt_flags는 마운트 플래그를 쉼표로 구분한 목록이어야 합니다(fstab 파일에서와 동일).
    • fsmgr_flags는 Android fs_mgr flags의 목록이어야 합니다(fstab 파일에서와 동일).
  • A/B 파티션에는 slotselect fs_mgr 옵션이 있어야 합니다.
  • dm-verity가 사용 설정된 파티션에는 verify fs_mgr 옵션이 있어야 합니다.

예: N6P의 /system 및 /vendor

다음 예는 Nexus 6P에서 systemvendor 파티션의 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으로 파티션을 초기에 마운트하기 위한 요구사항은 다음과 같습니다.

  1. 기기 노드 경로는 fstab과 devicetree 항목에서 by-name 심볼릭 링크를 사용해야 합니다. 예를 들어 /dev/block/mmcblk0pX를 사용하여 파티션을 지정하는 대신 파티션 이름이 지정되어 있고 기기 노드가 /dev/block/…./by-name/{system,vendor,odm}인지 확인합니다.
  2. VBoot 1.0에 사용되는 빌드 시스템 변수(예: PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITIONCUSTOM_IMAGE_VERITY_BLOCK_DEVICE)는 VBoot 2.0에서 필요하지 않습니다. 대신 VBoot 2.0에 도입된 빌드 변수(BOARD_AVB_ENABLE := true 포함)를 정의해야 합니다. 전체 구성에 관한 내용은 AVB를 위한 빌드 시스템 통합을 참조하세요.
  3. 기기 트리 오버레이를 통해 제공된 항목은 fstab 파일 프래그먼트에서 반복되면 안 됩니다. 예를 들어 devicetree에서 /vendor를 마운트할 항목을 지정한다면 fstab 파일에서 동일한 항목을 반복해서는 안 됩니다.
  4. VBoot 2.0은 초기 마운트의 사용 설정 여부와 관계없이 verifyatboot를 지원하지 않습니다.
  5. 확인된 파티션의 verity 모드/상태는 androidboot.veritymode 옵션을 사용하여 kernel_cmdline에 지정되어야 합니다(기존 요구사항). AVB의 다음 수정사항을 포함해야 합니다.

기기 트리 초기 마운트, VBoot 2.0

VBoot 2.0의 devicetree 구성은 다음을 제외하고 VBoot 1.0과 동일합니다.

  • fsmgr_flagverify에서 avb로 전환됩니다.
  • AVB 메타데이터가 있는 모든 파티션은 파티션이 초기에 마운트하고 있지 않더라도 devicetree의 VBMeta 항목에 있어야 합니다(예: /boot).

예: N5X의 /system 및 /vendor

다음 예는 Nexus 5X에서 systemvendor 파티션의 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";
            };
          };
        };
      };
    };