android AVB2.0(六)Super动态分区介绍
文章目錄
- 一、Super分區是什么?
- 二、Super分區工作原理
- 三、Super分區的配置和編譯
- 1.分區表的配置
- 2. Super鏡像的編譯
- 2.1 Super鏡像的編譯日志
- 2.2 Super鏡像的生成過程
- 四、Super分區在AVB中的校驗
一、Super分區是什么?
Super分區,也叫dynamic動態分區,動態分區是 Android 的用戶空間分區系統,在Android R版本開始引入。 android引入了super動態分區的設計,目的是為了解決像system,vendor等分區size大小不能動態調整的問題。 例如物理分區表中配置固定size后,如果軟件版本對system,vendor分區size需要頻繁調整時,需要修改物理分區表和重新編譯gpt表,使用起來不是很便利。 引入Super動態分區后,將system,vendor等分區一起“打包”在Super分區中,物理分區表只有super, 不再單獨配置system,vendor等分區的配置,其中的子分區可以動態地調整大小。 編譯的時候,會將system,vendor等分區的信息以metadata的形式記錄下來,生成super.img時會根據metadata信息進行處理。 另外super分區中的子分區,也可以通過fastbootd以fastboot的方式刷入,或者使用lpunpack解壓開。 采用Super分區后,AVB校驗流程也會有些不同 主要不同點在新增了vbmeta_system分區,這個分區和vbemta是類似的。 Vbmeta_system分區主要目的是為了校驗super分區,vbmeta_system中記錄了super分區中system,vendor子分區的描述信息。 這樣AVB校驗流程是avb先校驗vbmeta,vbmeta里面校驗vbmeta_system,然后vbmeta_system里面校驗system,vendor分區。二、Super分區工作原理
動態分區是使用 Linux 內核中的 dm-linear device-mapper 模塊實現的。 Linear是指將device mapper設備的線性范圍 映射到另一個設備的線性范圍 屬于LVM邏輯卷管理。 Super 分區包含列出了 每個子分區的名稱和塊范圍的metadata元數據。在開機 init的fisrt stage第一階段運行期間,會解析并驗證metadata元數據, 并創建虛擬block設備來表示每個子分區,創建logical邏輯分區出來。在init啟動的第一階段會去加載和處理,采用和以前類似的AVB校驗流程, 驗證通過后,super包含的幾個分區全部采用hashtree類型做dm-verity驗證。 在運行過程中對訪問的block數據進行dm-verity安全校驗。 校驗通過過,分別掛載這幾個邏輯子分區。三、Super分區的配置和編譯
1.分區表的配置
在vbmeta_system在A/B功能打開的情況下,請增加兩個64KB大小的vbmeta_system分區,如果沒有A/B,則只需要增加一個64KB的vbmeta_system分區。
而super分區則不需要A/B,大小可設置大一點也沒有太大影響,多余的空間幾個分區可以共享。
Board配置主要包括板卡makefile、initrc配置、fstab配置和BoardConfig的配置。其他的配置這里暫不列了。
BOARD_DYNAMIC_PARTITION_ENABLE ?= true BOARD_BUILD_SUPER_IMAGE_BY_DEFAULT := true PRODUCT_BUILD_SUPER_PARTITION := true BOARD_SUPER_PARTITION_SIZEBOARD_SUPER_PARTITION_GROUPS := test_dynamic_partitions BOARD_TEST_DYNAMIC_PARTITIONS_PARTITION_LIST := system vendor BOARD_JLQ_DYNAMIC_PARTITIONS_SIZE :=yoursize BOARD_EXT4_SHARE_DUP_BLOCKS := true2. Super鏡像的編譯
Super鏡像的編譯,主要是查看對應的python腳本如何打包和生成super.img,下面介紹一下這個鏡像生成的過程。
2.1 Super鏡像的編譯日志
下面是android R上編譯打包super.img的部分日志:
[100% 125545/125545] Target super fs image for debug: out/target/product/xxx/super.img 2021-04-15 20:48:15 - build_super_image.py - INFO : Building super image from info dict... 2021-04-15 20:48:15 - sparse_img.py - INFO : Total of 215260 4096-byte output blocks in 21 input chunks. 2021-04-15 20:48:15 - sparse_img.py - INFO : Total of 45014 4096-byte output blocks in 11 input chunks. 2021-04-15 20:48:15 - sparse_img.py - INFO : Total of 55612 4096-byte output blocks in 12 input chunks. 2021-04-15 20:48:15 - sparse_img.py - INFO : Total of 227012 4096-byte output blocks in 22 input chunks. 2021-04-15 20:48:15 - common.py - INFO : Running: "lpmake --metadata-size 65536 --super-name super --metadata-slots 3 --device super:12884901888 --group test_dynamic_partitions_a:6438256640 --group test_dynamic_partitions_b:6438256640 --partition system_a:readonly:881704960:test_dynamic_partitions_a --image system_a=out/target/product/xxx/system.img --partition system_b:readonly:0:test_dynamic_partitions_b --partition system_ext_a:readonly:184377344:test_dynamic_partitions_a --image system_ext_a=out/target/product/xxx/system_ext.img --partition system_ext_b:readonly:0:test_dynamic_partitions_b --partition product_a:readonly:227786752:test_dynamic_partitions_a --image product_a=out/target/product/xxx/product.img --partition product_b:readonly:0:test_dynamic_partitions_b --partition vendor_a:readonly:929841152:test_dynamic_partitions_a --image vendor_a=out/target/product/xxx/vendor.img --partition vendor_b:readonly:0:test_dynamic_partitions_b --sparse --output out/target/product/xxx/super.img“2021-04-15 20:48:27 - common.py - INFO : lpmake I 04-15 20:48:15 22465 22465 builder.cpp:1031] [liblp]Partition system_a will resize from 0 bytes to 881704960 bytes lpmake I 04-15 20:48:15 22465 22465 builder.cpp:1031] [liblp]Partition system_ext_a will resize from 0 bytes to 184377344 bytes lpmake I 04-15 20:48:15 22465 22465 builder.cpp:1031] [liblp]Partition product_a will resize from 0 bytes to 227786752 bytes lpmake I 04-15 20:48:15 22465 22465 builder.cpp:1031] [liblp]Partition vendor_a will resize from 0 bytes to 929841152 bytes 2021-04-15 20:48:27 - build_super_image.py - INFO : Done writing image out/target/product/xxx/super.img2.2 Super鏡像的生成過程
看下build/core/Makefile中處理super分區的部分
.PHONY: superimage superimage: $(INSTALLED_SUPERIMAGE_TARGET)ifeq (true,$(BOARD_BUILD_SUPER_IMAGE_BY_DEFAULT)) $(INSTALLED_SUPERIMAGE_TARGET): $(INSTALLED_SUPERIMAGE_DEPENDENCIES)$(call pretty,"Target super fs image for debug: $@")$(call build-superimage-target,$(INSTALLED_SUPERIMAGE_TARGET),\$(call intermediates-dir-for,PACKAGING,superimage_debug)/misc_info.txt)INSTALLED_SUPERIMAGE_TARGET := $(PRODUCT_OUT)/super.img INSTALLED_SUPERIMAGE_DEPENDENCIES := $(LPMAKE) $(BUILD_SUPER_IMAGE) \$(foreach p, $(BOARD_SUPER_PARTITION_PARTITION_LIST), $(INSTALLED_$(call to-upper,$(p))IMAGE_TARGET))INTERNAL_OTATOOLS_MODULES := \build_super_image \lpmake \build_super_image對應的是build\tools\releasetools\build_super_image.py
lpmake是host工具,在android/out/host/linux-x86/bin/lpmake
misc_info.txt兩個,一個是obj中的,一個是out中的
另外可用lpunpack工具進行解壓super.img,可以查看到各個子img鏡像
這個工具默認沒有編譯,源碼在system/extras/partition_tools/
重點看一下misc_info.txt中如下打印,和BoardConfig中配置是相對應的。
use_dynamic_partitions=true lpmake=lpmake build_super_partition=true super_metadata_device=super super_block_devices=super super_super_device_size=12884901888 dynamic_partition_list= system vendor super_partition_groups=test_dynamic_partitions super_test_dynamic_partitions_group_size=6438256640 super_test_dynamic_partitions_partition_list= system vendor super_partition_size=12884901888四、Super分區在AVB中的校驗
總體上和非super分區的校驗差不多,差異點在于校驗的分區多了一個vbmeta_system,
且需要創建邏輯分區,需要從fstab的avb_keys中獲取hash tree的key等。
以上就是我理解的Super動態分區的全部內容,歡迎大家留言學習討論。
總結
以上是生活随笔為你收集整理的android AVB2.0(六)Super动态分区介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#中Finalize方法的问题
- 下一篇: 关于asp.net2.0资源文件本地化多