Android如何 如何关闭 DM-verity

[DESCRIPTION]

在需要对image文件(如system.img)等进行解包->修改->打包->烧录后,可能会出现无法开机的现象。
这个问题主要是受到了DM-Verity的影响。

从P版本开始,DM-Verity由vboot1.0 更新到了 avb2.0,dm-verity 的关闭标志也从system image 的dm-verity metadata(vboot1.0) 中搬到了 vbmeta image(avb2.0)。

在vboot1.0 中,dm-verity 在eng build中默认关闭,在 userdebug/user build中默认开启。在userdebug build(不包括user load)中可以通过adb (并非 fastboot)直接关闭DM-verity而不需要先进行unlock。

在 avb2.0中, dm-verity 在所有build类型中默认开启,且只能在unlock之后才可以通过adb 或 fastboot关闭。

[SOLUTION]

解决的方法有两种(此项修改可能会导致CTS等测试无法通过,请根据实际需求使用):

1.在烧录前进行unlock操作,具体步骤请参考:

FAQ20567 替换谷歌system.img后无法开机

2.在编译前作一定的修改:

2.1 Android N之前有两种方法:

(1) 将build/target/product/verity.mk中的
PRODUCT_SUPPORTS_VERITY := true
改为:
PRODUCT_SUPPORTS_VERITY := false

(2) 在vendor/mediatek/proprietary/hardware/fstab/{platform}/fstab.in中(以vendor image为例):
/dev/block/platform/mtk-msdc.0/11230000.msdc0/by-name/vendor /vendor __MTK_VNDIMG_FSTYPE ro wait,verify,recoveryonly
将"verify"去除。

2.2 Android O中需要进行如下改动:

(1)在build/target/product/verity.mk中,将
PRODUCT_SUPPORTS_VERITY := true
PRODUCT_SUPPORTS_VERITY_FEC := true
改为 :
PRODUCT_SUPPORTS_VERITY := false
PRODUCT_SUPPORTS_VERITY_FEC := false

(2) 在/device/{mediatekprojects|mediateksample}/{Project}/ProjectConfig.mk中,将
MTK_DM_VERITY_OFF = no
改为 :
MTK_DM_VERITY_OFF = yes

(3)在/kernel/{arch|arch64}/{arm|arm64}/configs/{Project}defconfig中,将

CONFIG_DM_VERITY=y
改为 :
CONFIG_DM_VERITY=n
同时,添加:
CONFIG_MTK_DM_VERITY_OFF=y

(4)
For O0:
在system/core/fs_mgr/Android.mk 中,将
ifneq (, ( f i l t e r e n g , (filter eng, (filtereng,(TARGET_BUILD_VARIANT)))
LOCAL_CFLAGS += -DALLOW_SKIP_SECURE_CHECK=1
endif
改为:
#ifneq (, ( f i l t e r e n g , (filter eng, (filtereng,(TARGET_BUILD_VARIANT)))
LOCAL_CFLAGS += -DALLOW_SKIP_SECURE_CHECK=1
#endif

For O1:
在/system/core/fs_mgr/Android.bp中,在
product_variables: {
前面添加:
cppflags: ["-DALLOW_SKIP_SECURE_CHECK=1"],

2.3 Android P上的修改步骤:

(1)关闭preloader的 verity:
修改 preloader 的custom 文件.
以evb6765_64_emmc为例:
vendor/mediatek/proprietary/bootable/bootloader/preloader/custom/evb6765_64_emmc/evb6765_64_emmc.mk中关闭boot verify:
MTK_SEC_USBDL=ATTR_SUSBDL_DISABLE
MTK_SEC_BOOT=ATTR_SBOOT_DISABLE
配置好后重新编译下载preloader (out中的preloader_project_name_SBOOT_DIS.bin)。
至此,未签名的image就可以download 和boot了。

(2)
对于 Android P + kernel-4.4:

  • adb root
  • adb disable-verity
  • adb reboot

对于 Android P + kernel-4.9 及以上:

  • boot to Home Screen
  • go to setting -> system -> Developer options -> OEM unlocking
    按照以下cmd执行
    (PC进入cmd窗口后,先进入到platform-tools目录,因为该目录下才有fastboot.exe.以下cmd才能正常运行.对应的platform-tools位于sdk目录下)
  • 输入"adb reboot bootloader"
  • 等到画面出现"=> fastboot mode…",输入"fastboot flashing unlock"
  • 画面会出现一段文字,press volume up key
  • 画面切换到下一个选单后,输入"fastboot reboot"
    手机重启完毕后,按以下指令执行:
  • adb root
  • adb disable-verity
  • adb reboot

Android 中的 dm-verity

  • 7
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Linux dm-verity是一个Linux内核模块,用于对块设备进行数据完整性校验。它通过使用哈希函数和预先计算的哈希树来实现校验,可以防止恶意修改或篡改块设备中的数据。 dm-verity的源代码位于Linux内核的"drivers/md/dm-verity.c"文件中。该文件包含了实现dm-verity功能所需的所有函数和数据结构。 dm-verity的主要流程如下: 1. 初始化:在加载模块时,dm-verity会注册自己为块设备处理器,并初始化一些数据结构和参数。 2. 设置参数:当用户通过命令行或者sysfs文件系统设置dm-verity参数时,dm-verity会解析这些参数并存储到对应的数据结构中。 3. 启动校验:当用户通过命令行或者sysfs文件系统启动dm-verity时,dm-verity会从块设备中读取哈希树,并使用哈希函数进行校验。 4. 处理请求:当用户对块设备发出读写请求时,dm-verity会拦截这些请求并进行数据校验。如果数据完整,则将请求转发到原始的块设备中;如果数据不完整,则返回错误 ### 回答2: Linux dm-verity是一种用于数据完整性校验的Linux内核模块。它通过计算数据块的校验值,确保数据在存储或传输过程中没有被篡改。下面对dm-verity的源码进行解析。 dm-verity的源码位于Linux内核的源码树中的drivers/md/dm-verity目录下。主要的源码文件包括verity_target.c、verity_blk.c和verity_metadata.c。 verity_target.c文件实现了dm-verity的核心逻辑。它定义了用于创建和管理verity设备的API接口函数。在这个文件中,dm-verity模块会将读取和写入请求传递给真实的存储设备,并使用verity_blk.c中的函数来计算和验证数据的校验值。它还负责处理校验失败的情况,例如将读取请求重定向到镜像设备。 verity_blk.c文件实现了校验块设备的功能。它使用了基本块设备的API函数,例如bio和request_queue,来处理请求。在这个文件中,校验模块会计算每个数据块的哈希值,将其与元数据中的预期值进行比较,并确定数据的完整性。这个过程是通过使用散列函数和加密算法来计算和比较校验值的。 verity_metadata.c文件定义了元数据的结构和操作函数。元数据是用于存储每个数据块的哈希值和其他校验相关信息的地方。它使用了dm自带的二叉树数据结构来组织数据块。 除了这些源码文件,dm-verity还涉及到一些其他的文件,如kconfig和Makefile等。这些文件用于配置和编译dm-verity模块,并将其与Linux内核进行集成。 总结起来,Linux dm-verity源码的解析涉及到多个文件,用于实现数据完整性校验的各个方面,包括读写请求的管理、校验值的计算和验证、元数据的存储等。通过分析这些源码文件,我们可以更深入地了解dm-verity模块的工作原理和实现细节。 ### 回答3: DM-Verity 是一种用于保护 Linux 文件系统完整性的技术。它基于数据验证和完整性保护,可防止篡改和数据损坏。DM-Verity的源代码解析可以帮助我们了解其工作原理和实现细节。 DM-Verity 的源代码主要分为两个部分:内核模块和用户空间工具。 内核模块部分是通过 Linux 内核的 Device Mapper(DM)框架实现的。它包含了核心的验证逻辑,在存储设备的块层进行数据验证。DM-Verity使用 Merkle 树的数据结构来计算和验证每个块的哈希值,这些哈希值存储在一个元数据区域中。当读取文件时,DM-Verity会对读取的数据块进行哈希计算,并与元数据中的哈希进行比对,以验证数据的完整性。如果哈希不匹配,则说明数据已被篡改。 用户空间工具部分提供了一套命令行工具来配置和管理 DM-Verity。主要的工具有 veritysetup 和 fsverityctl。veritysetup用于创建和配置DM-Verity设备,包括进行根文件系统的完整性保护。fsverityctl用于管理和查询已配置的 DM-Verity 设备,提供了一些实用的操作,比如启用和禁用 DM-Verity,查询校验结果等。 通过分析 DM-Verity 的源代码,我们可以了解到其实现的核心原理和具体实现细节。例如,可以了解到 DM-Verity 是如何在内核中通过设备映射层实现数据验证和完整性保护的。此外,还可以学习到DM-Verity如何使用 Merkle 树来计算和验证数据块的哈希值,以及如何通过元数据区域存储和管理这些哈希值。对于学习和理解 Linux 文件系统的完整性保护机制以及数据安全性的提升,DM-Verity的源代码解析是非常有价值的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cczhengv

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值