Gắn vách ngăn từ sớm

Thiết bị hỗ trợ âm thanh Treble phải bật tính năng gắn kết ở giai đoạn đầu để đảm bảo init có thể tải Linux tăng cường bảo mật (SELinux) Các đoạn chính sách trải rộng trên systemvendor phân vùng. Quyền truy cập này cũng cho phép tải nhân mô-đun càng sớm càng tốt sau khi khởi động nhân.

Để thực hiện việc gắn kết sớm, Android phải có quyền truy cập vào hệ thống tệp trên chứa các mô-đun. Android 8.0 trở lên có hỗ trợ việc gắn kết /system, /vendor hoặc /odm sớm nhất là Giai đoạn đầu tiên của init (tức là trước khi khởi tạo SElinux).

Mục nhập fstab

Trong Android 9 trở xuống, các thiết bị có thể chỉ định các mục nhập fstab cho phân vùng được gắn sớm bằng cây thiết bị (DTO). Trong Android 10 trở lên, thiết bị phải chỉ định mục nhập fstab cho các phân vùng được gắn sớm bằng cách sử dụng tệp fstab trong giai đoạn đầu tiên đĩa RAM. của Android 10 ra mắt các cờ fs_mgr sau đây để dùng trong tệp fstab:

  • first_stage_mount cho biết một phân vùng đã được liên kết bằng khởi tạo giai đoạn đầu tiên.
  • logical cho biết đây là phân vùng động.
  • avb=vbmeta-partition-name chỉ định Phân vùng vbmeta. Init giai đoạn đầu tiên sẽ khởi chạy phân vùng này trước khi gắn các phân vùng khác. Đối số cho cờ này có thể bị bỏ qua nếu phân vùng vbmeta cho mục nhập đã được chỉ định bởi một mục nhập fstab khác ở dòng trước.

Ví dụ sau đây cho thấy các mục nhập fstab để đặt giá trị Phân vùng system, vendorproduct dưới dạng phân vùng logic (động).

#<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

Trong ví dụ này, nhà cung cấp chỉ định phân vùng vbmeta bằng cách sử dụng cờ fs_mgr avb=vbmeta, nhưng product bỏ qua đối số vbmeta vì nhà cung cấp đã thêm vbmeta vào danh sách phân vùng.

Các thiết bị chạy Android 10 trở lên phải đặt Tệp fstab trong ổ đĩa RAM và trong vendor phân vùng.

Ổ đĩa

Vị trí tệp fstab trong ổ đĩa RAM tuỳ thuộc vào cách thiết bị dùng ramdisk.

Các thiết bị có ramdisk khởi động phải đặt fstab trong thư mục gốc ramdisk khởi động. Nếu thiết bị có cả ổ đĩa ram khởi động và ramdisk khôi phục, bạn không cần thực hiện thay đổi nào đối với ramdisk khôi phục. Ví dụ:

PRODUCT_COPY_FILES +=  device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_RAMDISK)/fstab.$(PRODUCT_PLATFORM)

Thiết bị sử dụng tính năng khôi phục làm ổ đĩa RAM phải sử dụng tham số dòng lệnh kernel androidboot.force_normal_boot=1 thành quyết định xem nên khởi động vào Android hay tiếp tục khởi động vào quá trình khôi phục. Thiết bị Khởi chạy bằng Android 12 trở lên với kernel phiên bản 5.10 trở lên phải sử dụng bootconfig để truyền Tham số androidboot.force_normal_boot=1. Trong các thiết bị này, khởi tạo giai đoạn đầu tiên sẽ thực hiện thao tác chuyển đổi gốc thành /first_stage_ramdisk trước khi gắn các phân vùng gắn kết sớm, vì vậy, các thiết bị phải đặt tệp fstab vào $(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk. Ví dụ:

PRODUCT_COPY_FILES +=  device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk/fstab.$(PRODUCT_PLATFORM)

Nhà cung cấp

Tất cả các thiết bị phải đặt một bản sao của tệp fstab vào /vendor/etc Điều này là do quá trình khởi tạo giai đoạn đầu tiên giải phóng ramdisk sau khi hoàn thành việc gắn các phân vùng ban đầu và thực hiện chuyển đổi hoạt động gốc để di chuyển giá đỡ tại /system sang / Mọi thao tác tiếp theo cần truy cập vào fstab do đó phải sử dụng bản sao trong /vendor/etc. Ví dụ:

PRODUCT_COPY_FILES +=  device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.$(PRODUCT_PLATFORM)

Gắn kết phân vùng sớm, VBoot 1.0

Các yêu cầu đối với việc gắn kết sớm phân vùng bằng VBoot 1.0 bao gồm:

  1. Đường dẫn nút thiết bị phải sử dụng liên kết tượng trưng by-name trong Các mục fstab và devicetree. Ví dụ: thay vì chỉ định bằng cách sử dụng /dev/block/mmcblk0pX, hãy đảm bảo rằng các phân vùng được đặt tên và nút thiết bị là /dev/block/…./by-name/{system,vendor,odm}
  2. Đường dẫn đã cung cấp cho PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITIONCUSTOM_IMAGE_VERITY_BLOCK_DEVICE trong cấu hình thiết bị của sản phẩm (tức là, theo device/oem/project/device.mk) phải khớp với nút thiết bị khối tương ứng được chỉ định by-name trong Mục nhập fstab/devicetree. Ví dụ:
    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. Các mục nhập được cung cấp thông qua lớp phủ cây thiết bị không được lặp lại trong fstab mảnh tệp. Ví dụ: khi chỉ định một mục nhập cho gắn kết /vendor trong cây thiết bị, tệp fstab không được lặp lại mục nhập đó.
  4. Vách ngăn yêu cầu verifyatboot không được phép được kết nối sớm (việc này không được hỗ trợ).
  5. Bạn phải chỉ định chế độ/trạng thái xác minh cho các phân vùng đã xác minh trong kernel_cmdline sử dụng lựa chọn androidboot.veritymode (yêu cầu hiện tại).

Gắn devicetree sớm, VBoot 1.0

Trong Android 8.x trở lên, init phân tích cú pháp devicetree và tạo các mục fstab để gắn phân vùng sớm trong thời gian giai đoạn đầu tiên. Mục nhập fstab có dạng:

src mnt_point type mnt_flags fs_mgr_flags

Các thuộc tính Devicetree được định nghĩa để bắt chước định dạng đó:

  • fstab mục nhập phải dưới /firmware/android/fstab trong devicetree và phải có một chuỗi tương thích được đặt thành android,fstab.
  • Mỗi nút trong /firmware/android/fstab được coi là một mục nhập fstab gắn kết sớm. Một nút phải có các phần tử sau thuộc tính được xác định:
    • dev phải trỏ đến nút thiết bị đại diện cho phân vùng by-name
    • type phải là loại hệ thống tệp (như trong fstab tệp)
    • mnt_flags phải là danh sách cờ gắn được phân tách bằng dấu phẩy (như trong tệp fstab)
    • fsmgr_flags phải là danh sách Android fs_mgr flags (như trong tệp fstab)
  • Phân vùng A/B phải có lựa chọn slotselect fs_mgr.
  • Các phân vùng đã bật dm-verity phải có verify fs_mgr .

Ví dụ: /system và /vendor trên N6P

Ví dụ sau đây cho thấy việc gắn kết sớm devicetree cho system và phân vùng vendor trên Nexus 6P:

/ {
  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";
        };
      };
    };
  };
};

Ví dụ: /vendor trên Pixel

Ví dụ sau đây cho thấy việc gắn kết sớm devicetree cho /vendor trên Pixel (hãy nhớ thêm slotselect cho các phân vùng tuân theo A/B):

/ {
  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";
        };
      };
    };
  };
};

Gắn kết phân vùng sớm, VBoot 2.0

VBoot 2.0 là phiên bản Xác minh quy trình khởi động của Android (AVB). Các yêu cầu đối với việc sớm gắn kết các phân vùng bằng VBoot 2.0 là:

  1. Đường dẫn nút thiết bị phải sử dụng đường liên kết tượng trưng by-name trong Các mục fstab và devicetree. Ví dụ: thay vì chỉ định phân vùng bằng /dev/block/mmcblk0pX, hãy đảm bảo rằng các phân vùng được đặt tên và nút thiết bị là /dev/block/…./by-name/{system,vendor,odm}
  2. Tạo các biến hệ thống (chẳng hạn như PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITIONCUSTOM_IMAGE_VERITY_BLOCK_DEVICE) được dùng cho VBoot 1.0 KHÔNG được cần thiết cho VBoot 2.0. Thay vào đó, hãy xây dựng các biến được giới thiệu trong VBoot 2.0 (bao gồm BOARD_AVB_ENABLE := true) phải được định nghĩa; cho một cấu hình đầy đủ, tham khảo Tích hợp hệ thống xây dựng cho AVB.
  3. Các mục nhập được cung cấp thông qua lớp phủ cây thiết bị không được lặp lại trong fstab mảnh tệp. Ví dụ: nếu bạn chỉ định một mục nhập cho gắn kết /vendor trong cây thiết bị, tệp fstab không được lặp lại mục nhập đó.
  4. VBoot 2.0 không hỗ trợ verifyatboot, cho dù là gắn kết sớm đã được bật hay chưa.
  5. Bạn phải chỉ định chế độ/trạng thái xác minh cho các phân vùng đã xác minh trong kernel_cmdline sử dụng androidboot.veritymode lựa chọn (yêu cầu hiện tại). Hãy nhớ bao gồm các bản sửa lỗi sau cho AVB:

Gắn devicetree sớm, VBoot 2.0

Cấu hình trong devicetree cho VBoot 2.0 giống như trong VBoot 1.0 với ngoại lệ sau đây:

  • fsmgr_flag được chuyển từ verify sang avb.
  • Tất cả các phân vùng có siêu dữ liệu AVB phải nằm trong mục nhập VBMeta trong devicetree, ngay cả khi phân vùng không được gắn sớm (ví dụ: /boot).

Ví dụ: /system và /vendor trên N5X

Ví dụ sau đây cho thấy một devicetree được gắn kết sớm cho Phân vùng systemvendor trên Nexus 5X. Lưu ý:

  • /system được gắn với AVB và /vendor là được gắn mà không xác minh tính toàn vẹn.
  • Vì Nexus 5X không có phân vùng /vbmeta, nên phần cấp cao nhất vbmeta nằm ở cuối phân vùng /boot (để biết thông tin chi tiết, tham khảo danh sách thay đổi của AOSP (Dự án nguồn mở Android)).
    / {
      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";
            };
          };
        };
      };
    };
    

Ví dụ: /vendor trên Pixel

Ví dụ sau đây cho thấy cách gắn /vendor ở giai đoạn đầu trên Pixel. Lưu ý:

  • Nhiều phân vùng hơn được chỉ định trong mục nhập vbmeta vì các phân vùng đó là được bảo vệ bằng AVB.
  • Bạn phải đưa tất cả phân vùng AVB vào, ngay cả khi chỉ có /vendor là được hỗ trợ từ sớm.
  • Hãy nhớ thêm slotselect cho các phân vùng tuân theo A/B.
    / {
      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";
            };
          };
        };
      };
    };