android AVB2.0(六)Super动态分区介绍

一、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_SIZE

BOARD_SUPER_PARTITION_GROUPS := test_dynamic_partitions
BOARD_TEST_DYNAMIC_PARTITIONS_PARTITION_LIST := system vendor
BOARD_TEST_DYNAMIC_PARTITIONS_SIZE :=yoursize
BOARD_EXT4_SHARE_DUP_BLOCKS := true

2. 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.img

2.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等。

bool FirstStageMount::CreateLogicalPartitions() {
    if (!IsDmLinearEnabled()) {
        return true;
    }auto metadata = android::fs_mgr::ReadCurrentMetadata(super_path_);
    if (!InitDmLinearBackingDevices(*metadata.get())) {
        return false;
    }
    return android::fs_mgr::CreateLogicalPartitions(*metadata.get(), super_path_);
}

bool FirstStageMountVBootV2::SetUpDmVerity(FstabEntry* fstab_entry) {
    AvbHashtreeResult hashtree_result;

    if (!fstab_entry->avb_keys.empty()) {
        if (!InitAvbHandle()) return false;

        if (avb_handle_->status() == AvbHandleStatus::kHashtreeDisabled ||
            avb_handle_->status() == AvbHandleStatus::kVerificationDisabled) {

            return true;  // Returns true to mount the partition directly.
        } else {
           hashtree_result = avb_standalone_handle->SetUpAvbHashtree(
	fstab_entry, false);
        }
    } else if (fstab_entry->fs_mgr_flags.avb) {
        if (!InitAvbHandle()) return false;
        hashtree_result = avb_handle_->SetUpAvbHashtree(fstab_entry, false);
    } else {
        return true;  // No need AVB, returns true to mount the partition directly.
    }
}

以上就是我理解的Super动态分区的全部内容,欢迎大家留言学习讨论。

为方便与大家及时交流,弄了一个微信公众号,欢迎大家留言沟通~
在这里插入图片描述

  • 6
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Android AVB (Android Verified Boot) 是安卓系统中的一种安全功能,目的是确保用户设备上的操作系统和应用程序未被篡改。它使用了基于密钥的验证方法,以验证设备上的固件和启动程序的完整性和可靠性。 Android AVB的工作原理是,在设备启动时,固件和启动程序会被验证。首先,设备会检查固件和启动程序的数字签名,以确保它们是由受信任的开发者签名的。如果签名验证通过,则设备会继续启动,否则会发出警告或者拒绝启动。 除了验证签名外,Android AVB还会检查系统分区的哈希值是否与预期的哈希值匹配。这些哈希值是在设备正常运行时生成的,并被记录在一个被称为AVB表的数据结构中。如果发现系统分区的哈希值与预期的哈希值不匹配,设备将中断启动并显示一条警告信息。 通过使用Android AVB,设备能够有效防止来自未经授权的来源的操作系统和启动程序的篡改。这增加了设备的安全性,使用户能够放心使用设备,而不担心潜在的恶意软件或未经授权的更改。 总之,Android AVB是安卓系统中的一种安全功能,它通过验证数字签名和哈希值来确保设备上的操作系统和启动程序的完整性。它帮助防止未经授权的篡改,提高了设备的安全性。 ### 回答2: Android AVBAndroid Verified Boot)是安卓系统中的一种验证引导机制,它通过在设备启动过程中验证系统的完整性,防止未经授权的修改及恶意软件损害系统安全。以下是关于Android AVB的一些要点。 首先,Android AVB使用数字签名验证系统引导映像的完整性。在设备启动时,引导加载程序(Bootloader)会验证引导映像的签名,只有通过数字证书签名的映像才能被加载,这样可以确保系统引导过程没有受到非法篡改。 其次,Android AVB启用分区级别的验证,每个分区的映像都需要通过数字签名进行验证。这使得系统分区、供应商分区和OEM分区等可以被独立验证,并且可以防止未经授权修改。 另外,Android AVB还使用了完整性元数据(Integrity Metadata)来确保系统分区的数据安全。完整性元数据存储了每个分区的哈希值和签名信息,设备启动时会加载并验证这些元数据,以确保分区的数据没有被篡改。 最后,Android AVB还可以在设备上使用强制加密(Force Encryption)来确保用户数据的密钥只能被正确验证的引导映像解锁。这可以防止未经授权的访问或修改用户数据。 总的来说,Android AVB通过数字签名、分区级别的验证以及完整性元数据等机制,确保了安卓设备系统引导过程的完整性和安全性,并且防止了未经授权的修改和恶意软件的攻击。 ### 回答3: Android AVB是指Android Verified Boot的缩写,是一种用于验证和保护Android设备的引导过程的安全机制。它的目标是检测和阻止未经授权的软件从设备的启动过程中加载和运行。 Android Verified Boot通过使用数字签名和哈希算法来验证引导镜像的完整性和真实性。在设备启动的过程中,它会使用设备制造商预装的公钥来验证引导镜像的数字签名是否有效,并且只有当验证通过时才会加载和运行系统。这样可以防止未经授权的软件或者恶意代码被插入到引导过程中,提高了设备的安全性。 此外,Android AVB还可以更容易地检测到设备的Root状态和未经授权的修改。通过保护系统分区和检测分区是否已被修改,它可以提供更可靠的保护机制,防止未经授权的软件或者恶意代码对设备进行篡改。这可以帮助用户避免安全漏洞和数据泄露。 总之,Android AVB是一种用于验证和保护设备启动过程的安全机制,通过验证引导镜像的完整性和真实性,检测设备的Root状态和分区是否被修改,提高了Android设备的安全性。这有助于保护用户的个人数据和设备免受恶意软件和未经授权的修改的威胁。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值