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 system
và
vendor
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ùngvbmeta
. 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ùngvbmeta
cho mục nhập đã được chỉ định bởi một mục nhậpfstab
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
, vendor
và product
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:
- Đườ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ụcfstab
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}
- Đường dẫn đã cung cấp cho
PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION
vàCUSTOM_IMAGE_VERITY_BLOCK_DEVICE
trong cấu hình thiết bị của sản phẩm (tức là, theodevice/oem/project/device.mk
) phải khớp với nút thiết bị khối tương ứng được chỉ địnhby-name
trong Mục nhậpfstab
/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
- 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ệpfstab
không được lặp lại mục nhập đó. - 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ợ). - 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ọnandroidboot.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ànhandroid,fstab
.- Mỗi nút trong
/firmware/android/fstab
được coi là một mục nhậpfstab
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ùngby-name
type
phải là loại hệ thống tệp (như trongfstab
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ệpfstab
)fsmgr_flags
phải là danh sách Androidfs_mgr flags
(như trong tệpfstab
)
- 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à:
- Đườ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ụcfstab
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}
- Tạo các biến hệ thống (chẳng hạn như
PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION
vàCUSTOM_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ồmBOARD_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. - 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ệpfstab
không được lặp lại mục nhập đó. - VBoot 2.0 không hỗ trợ
verifyatboot
, cho dù là gắn kết sớm đã được bật hay chưa. - 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ụngandroidboot.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
sangavb
.- 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 system
và vendor
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"; }; }; }; }; };