Android OTA 相关工具(二) 动态分区之 dmctl

news/2024/4/26 1:01:24/文章来源:https://blog.csdn.net/guyongqiangx/article/details/129229115

文章目录

    • 1. dmctl 的帮助信息
    • 2. create 操作
      • Zero
      • Linear
      • Snapshot,Snapshot-origin 和 Snapshot-merge
    • 3. list 操作
    • 4. suspend 和 resume 操作
    • 5. delete 操作
    • 6. getpath 操作
    • 7. getuuid 操作
    • 8. info 操作
    • 9. status 操作
    • 10. table 操作
    • 11. 其它

本文为洛奇看世界(guyongqiangx)原创,转载请注明出处。
文章链接:https://guyongqiangx.blog.csdn.net/article/details/129229115

我在上一篇《Android OTA 相关工具(一) 虚拟 A/B 之 snapshotctl》 中介绍了从虚拟 A/B 系统 (Android R)开始引入的 snapshot 调试工具 snapshotctl。

snapshotctl 本身可以做不少事情,比方说 dump 升级信息, map 和 unmap 各种虚拟分区等。

这一篇介绍动态分区调试工具 dmctl,配合 snapshotctl 工具,对各种 dm 开头的动态分区和虚拟分区进行调试更加方便。

为什么叫各种 ctl? 这里的 ctl 是 control 的简写,sanpshotctl 就是 snapshot control, 而 dmctl 就是 device mapper control。

因此,顾名思义,dmctl 就是用来操作控制 device mapper 设备的。Android 中用到的 device mapper 设备包括:

  • Linear,线性映射设备,将 super 设备上的各个区域映射为单独分区就使用 linear 设备
  • Snapshot,快照类设备,在虚拟 A/B 系统上引入了快照类设备包括:
    • snapshot-origin 设备
    • snapshot 设备
    • snapshot-merge 设备
  • Verity,一致性设备,Android 打开启动时验证以后,使用 verity 设备来确保分区完整

更多关于 Android OTA 升级相关文章的列表和内容,请参考《Android OTA 升级系列专栏文章导读》

如果您已经订阅了收费专栏,请务必加我微信,拉你进相应专栏的答疑群。

本文基于 Android 代码版本: android-11.0.0_r21,但后续版本也大同小异

在线代码:http://aospxref.com/android-11.0.0_r21/

我其实在《Android 动态分区详解(二) 核心模块和相关工具介绍》已经展示过 dmctl 工具的简单用法了。

这一篇专门介绍 dmctl 工具。

1. dmctl 的帮助信息

dmctl 工具的功能很多,学习 dmctl 的入口就是查看其帮助信息。

console:/ # dmctl help
usage: dmctl <command> [command options]dmctl -f file
commands:create <dm-name> [-ro] <targets...>delete <dm-name>list <devices | targets> [-v]getpath <dm-name>getuuid <dm-name>info <dm-name>status <dm-name>resume <dm-name>suspend <dm-name>table <dm-name>help-f file reads command and all parameters from named fileTarget syntax:<target_type> <start_sector> <num_sectors> [target_data]
console:/ # 

2. create 操作

通过 create 操作可以创建各种设备,目前的实现包括 zero, linear, verity, snapshot, snapshot-origin 等设备。

在使用 create 操作时,每一个设备都需要一组通用参数:

<target_type> <start_sector> <num_sectors>

这一组参数主要是指定目标设备的类型以及大小

除了通用参数外,对每一类 device mapper 设备,还需要提供相应的 <targets>参数,各设备详细的 <targets> 参数如下:

设备类型Targets 参数
Zero
Linear<block_device> <sector>
Android-verity<public-key-id> <block_device>
Bow<block_devices>
Snapshot-origin<block_devices>
Snapshot<block_device> <block_device> <mode> <chunk_size>
Snapshot-merge<block_device> <block_device> <chunk_size>

<targets>参数主要是指定源设备信息,以及附加参数。

dmctl 的 <targets>参数对应于 dmsetup 工具的 --table 信息。在代码中,dmctl 将 <targets> 参数转换为 table 信息,传递给底层创建设备。

所以,一个完整的 dmctl create <dm-name> 的参数应该是这样:

# 通用参数格式
dmctl create <dm-name> <target_type> <start_sector> <num_sectors> <targets># Zero
dmctl create <dm-name> zero <start_sector> <num_sectors># Linear
dmctl create <dm-name> linear <start_sector> <num_sectors> <block_device> <sector># Android-verity
dmctl create <dm-name> android-verity <start_sector> <num_sectors> <public-key-id> <block_device># Bow
dmctl create <dm-name> bow <start_sector> <num_sectors> <block_devices># Snapshot-origin
dmctl create <dm-name> snapshot-origin <start_sector> <num_sectors> <block_devices># Snapshot
dmctl create <dm-name> snapshot <start_sector> <num_sectors> <block_device> <block_device> <mode> <chunk_size># Snapshot-merge
dmctl create <dm-name> snapshot <start_sector> <num_sectors> <block_device> <block_device> <chunk_size>

device mapper 设备基于最小的单位 sector 进行操作,sector 的大小可以配置,但通常都是默认的 512 bytes。

有些 device mapper 设备基于 chunk 进行操作,这里的 chunk 是比 sector 大的数据块。

例如快照设备基于 chunk 进行操作,其大小在创建 snapshot 时通过 chunksize 设置。

比如设置 chunksize = 8,表明 1 个 chunk 由 8 个 sector 构成,因此 1 x chunk = 8 x sector = 4KB。

snapshot 驱动中默认的 chunksize 为 32,对应 chunk 大小为 16KB。

Zero

代码里面说支持创建 zero 类型的设备,但是当我尝试创建时,提示失败,原因是"unknow target type":

console:/ # dmctl create dm-rocky-zero zero 0 2048
[ 1031.230156] device-mapper: table: 252:5: zero: unknown target type
dmctl E 10-11 17:26:57  3840  3840 dm.cpp:262] DM_TABLE_LOAD failed: Invalid argument
Failed to create device-mapper device with name: dm-rocky-zero

这个 zero 类型的设备类似系统自带的 /dev/zero,用于产生 0 的 device mapper 虚拟块设备,很少用到。

Linear

将在 super 设备内的 2048 sector 开始的 2466912 个 sector 映射为 dm-rocky 设备。

# 使用 dmctl create 创建虚拟设备 dm-rocky
# 映射信息: "linear 0 2466912 /dev/block/by-name/super 2048"
console:/ # dmctl create dm-rocky linear 0 2466912 /dev/block/by-name/super 2048
console:/ # ls -lh /dev/block/mapper/
total 0
drwxr-xr-x 2 root root 200 2022-04-02 15:55 by-uuid
lrwxrwxrwx 1 root root  15 2022-04-02 15:55 dm-rocky -> /dev/block/dm-7
lrwxrwxrwx 1 root root  15 2015-01-01 08:00 system-verity -> /dev/block/dm-3
lrwxrwxrwx 1 root root  15 2015-01-01 08:00 system_a -> /dev/block/dm-0
lrwxrwxrwx 1 root root  15 2015-01-01 08:00 userdata -> /dev/block/dm-6
lrwxrwxrwx 1 root root  15 2015-01-01 08:00 vendor-verity -> /dev/block/dm-4
lrwxrwxrwx 1 root root  15 2015-01-01 08:00 vendor_a -> /dev/block/dm-1
lrwxrwxrwx 1 root root  15 2015-01-01 08:00 vendor_dlkm-verity -> /dev/block/dm-5
lrwxrwxrwx 1 root root  15 2015-01-01 08:00 vendor_dlkm_a -> /dev/block/dm-2console:/ # dmctl table dm-rocky
Targets in the device-mapper table for dm-rocky:
0-2466912: linear, 259:3 2048# 查看 system_a 的映射表
console:/ # dmctl table system_a
Targets in the device-mapper table for system_a:
0-2466912: linear, 259:3 2048# 查看当前系统中的所有 device mapper 设备
console:/ # dmctl list devices
Available Device Mapper Devices:
userdata             : 252:4
system_a             : 252:0
vendor-verity        : 252:3
vendor_a             : 252:1
system-verity        : 252:2
dm-rocky             : 252:5

从上面看到,dm-rocky 和现在 system_a 分区的映射信息是一样的,此时系统将映射给 system_a 分区的部分又再次映射为新的分区设备 /dev/block/by-name/dm-rocky

Snapshot,Snapshot-origin 和 Snapshot-merge

创建 snapshot, snapshot-origin 和 snapshot-merge 的操作相对复杂,这里暂时不再详细列出来,后续考虑增加。

更多关于快照原理和操作的文章,请参考我介绍快照原理和实践的两篇文章:

  • Linux 快照 (snapshot) 原理与实践(一) 快照基本原理
    • 链接:https://blog.csdn.net/guyongqiangx/article/details/128494795
  • Linux 快照 (snapshot) 原理与实践(二) 快照功能实践
    • 链接:https://blog.csdn.net/guyongqiangx/article/details/128496471

关于 dmctl create 创建各种 device mapper 设备的示例,实际使用较少,后续陆续补充完善。

3. list 操作

使用 dmctl list 列举当前系统的所有 device mapper 设备:

console:/ # dmctl list devices
Available Device Mapper Devices:
userdata             : 252:6
vendor_dlkm-verity   : 252:5
system_a             : 252:0
vendor-verity        : 252:4
vendor_dlkm_a        : 252:2
vendor_a             : 252:1
system-verity        : 252:3

如果希望查看更多的详细信息,可以使用 -v 选项:

console:/ # dmctl list devices -v
Available Device Mapper Devices:
userdata             : 252:4target#1: 0-11534336: default-key, aes-xts-plain64 - 0 259:4 0 3 allow_discards sector_size:4096 iv_large_sectors
system_a             : 252:0target#1: 0-2466912: linear, 259:3 2048
vendor-verity        : 252:3target#1: 0-154592: verity, 1 252:1 252:1 4096 4096 19324 19324 sha1 758e924ff5378790707d7a890e656611a281e6ca 26cd8465eda1b97b94af4a2f95786b73cf61c777 10 restart_on_corruption ignore_zero_blocks use_fec_from_device 252:1 fec_blocks 19478 fec_start 19478 fec_roots 2
vendor_a             : 252:1target#1: 0-157240: linear, 259:3 2469888
system-verity        : 252:2target#1: 0-2427824: verity, 1 252:0 252:0 4096 4096 303478 303478 sha1 de3446b6b2b4e86e9b941df4f7714824e4a60e29 21f2e10d1358ed8ac32df838ba446c3fe6bf883a 10 restart_on_corruption ignore_zero_blocks use_fec_from_device 252:0 fec_blocks 305869 fec_start 305869 fec_roots 2
console:/ # 

-v 选项以后,不仅可以列举所有的 device mapper 设备,还能显示设备详细的映射信息。

4. suspend 和 resume 操作

使用 dmctl suspend 操作暂停对指定 device mapper 设备新的 I/O 操作,已经在进行中的 I/O 操作不受影响。

console:/ # dmctl info system_a
device        : system_a
active        : true
access        : ro 
activeTable   : true
inactiveTable : false
bufferFull    : false
console:/ # 
console:/ # 
console:/ # dmctl suspend system_a
console:/ # dmctl info system_a
device        : system_a
active        : false
access        : ro 
activeTable   : true
inactiveTable : false
bufferFull    : false
console:/ # 

从上面的操作可见,

dmctl suspend 操作之前,通过 dmctl info system_a 看到的 active 状态为 true;

dmctl suspend 操作之后,通过 dmctl info system_a 看到的 active 状态为 false;

使用 dmctl resume 操作恢复对指定 device mapper 设备(已经 suspend 暂停的设备)的 I/O 操作。

console:/ # dmctl resume system_a
console:/ # dmctl info system_a
device        : system_a
active        : true
access        : ro 
activeTable   : true
inactiveTable : false
bufferFull    : false

dmctl resume 之后,通过 dmctl info system_a 看到的 active 状态恢复为 true;

5. delete 操作

使用 dmctl delete 删除指定名称的 device mapper 设备:

# 查看当前所有的 device mapper 设备
console:/ # dmctl list devices
Available Device Mapper Devices:
userdata             : 252:4
system_a             : 252:0
vendor-verity        : 252:3
vendor_a             : 252:1
system-verity        : 252:2
dm-rocky             : 252:5# 删除名为 dm-rocky 的设备
console:/ # dmctl delete dm-rocky# 再次查看设备列表时,已经没有 dm-rocky 设备了
console:/ # dmctl list devices
Available Device Mapper Devices:
userdata             : 252:4
system_a             : 252:0
vendor-verity        : 252:3
vendor_a             : 252:1
system-verity        : 252:2

6. getpath 操作

使用 dmctl getpath 查看 system_a 分区的路径。

console:/ # dmctl getpath system_a
/dev/block/dm-0

7. getuuid 操作

使用 dmctl getuuid 获取分区 system_a 的 UUID:

console:/ # dmctl getuuid system_a
a8f76dd5-278d-4800-973a-0c9fc8607ff2

8. info 操作

使用 dmctl info 查看 system_a 分区的信息:

console:/ # dmctl info system_a
device        : system_a
active        : true
access        : ro 
activeTable   : true
inactiveTable : false
bufferFull    : false

9. status 操作

使用 dmctl status 查看 system_a 分区的状态:

console:/ # dmctl status system_a
Targets in the device-mapper table for system_a:
0-2498104: linear

10. table 操作

使用 dmctl table 查看 system_a 分区的映射信息:

console:/ # dmctl table system_a
Targets in the device-mapper table for system_a:
0-2498104: linear, 259:3 2048

11. 其它

到目前为止,我写过 Android OTA 升级相关的话题包括:

  • 基础入门:《Android A/B 系统》系列
  • 核心模块:《Android Update Engine 分析》 系列
  • 动态分区:《Android 动态分区》 系列
  • 虚拟 A/B:《Android 虚拟 A/B 分区》系列
  • 升级工具:《Android OTA 相关工具》系列

更多这些关于 Android OTA 升级相关文章的内容,请参考《Android OTA 升级系列专栏文章导读》。

如果您已经订阅了动态分区和虚拟分区付费专栏,请务必加我微信,备注订阅账号,拉您进“动态分区 & 虚拟分区专栏 VIP 答疑群”。我会在方便的时候,回答大家关于 A/B 系统、动态分区、虚拟分区、各种 OTA 升级和签名的问题。

除此之外,我有一个 Android OTA 升级讨论群,里面现在有 400+ 朋友,主要讨论手机,车机,电视,机顶盒,平板等各种设备的 OTA 升级话题,如果您从事 OTA 升级工作,欢迎加群一起交流,请在加我微信时注明“Android OTA 讨论组”。此群仅限 Android OTA 开发者参与~

公众号“洛奇看世界”后台回复“wx”获取个人微信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_74625.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Word处理控件Aspose.Words功能演示:使用 C++ 在 Word (DOC/DOCX) 中添加或删除水印

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c; Aspose API支持流行文件格式处…

Python实现贝叶斯优化器(Bayes_opt)优化LightGBM分类模型(LGBMClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。1.项目背景贝叶斯优化器(BayesianOptimization) 是一种黑盒子优化器&#xff0c;用来寻找最优参数。贝叶斯优化器是基…

第50天|LeetCode739. 每日温度、LeetCode496. 下一个更大元素 I

1.题目链接&#xff1a;739. 每日温度 题目描述&#xff1a; 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&a…

使用docker pull 跨系统架构拉取镜像

使用docker pull 跨系统架构拉取镜像使用docker pull 跨系统架构拉取镜像docker hub上找到相应的镜像在个人电脑中的执行拉取镜像命令&#xff1a;执行查看镜像命令&#xff1a;执行检查镜像命令&#xff1a;执行保存镜像命令&#xff1a;使用docker pull 跨系统架构拉取镜像 …

断点续传实现

断点续传 1、 什么是断点续传 通常视频文件都比较大&#xff0c;所以对于媒资系统上传文件的需求要满足大文件的上传要求。http协议本身对上传文件大小没有限制&#xff0c;但是客户的网络环境质量、电脑硬件环境等参差不齐&#xff0c;如果一个大文件快上传完了网断了没有上…

高频面试题|RabbitMQ如何防止消息的重复消费?

一. 前言最近有很多小伙伴开始找工作&#xff0c;在面试时&#xff0c;面试官经常会问我们这样一个题目&#xff1a;RabbitMQ如何防止重复消费?有很多小伙伴这个时候都在想&#xff0c;消息怎么还会重复消费呢???.......所以他们在面试后就跑来问壹哥&#xff0c;针对这个比…

Python实现GWO智能灰狼优化算法优化循环神经网络回归模型(LSTM回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。1.项目背景灰狼优化算法(GWO)&#xff0c;由澳大利亚格里菲斯大学学者 Mirjalili 等人于2014年提出来的一种群智能优…

针对面试官的盘问-如何回答职场中的一些问题

(点击即可收听)初入职场,面对面试官的提问,如何回答01你为什么从上家公司离职?个人成长不足,不符合自己的预期&#xff08;关系到个人竞争力,希望找到一份更有挑战,个人提升更大的工作&#xff09;,切忌与面试官倒苦水,说前公司老板的不是业务发展缓慢,上升空间有限(有些不符合…

力扣-换座位

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;626. 换座位二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其他总结前言 …

redis(11)事务秒杀案例

秒杀案例描述 现在有1个秒杀的功能&#xff0c;1个原来价值5000元的手机现在搞活动&#xff0c;降价到1块钱&#xff0c;做秒杀活动。库存就10个&#xff0c;假设有10000人抢购。 目前逻辑是&#xff1a;抢到了商品库存就减1&#xff0c;然后把用户id加入到秒杀成功者清单中 Re…

【华为OD机试模拟题】用 C++ 实现 - 统计匹配的二元组个数(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明统计匹配的二元组个数题目输入输出描述示例一输入输出说明示例二输入输出说明备注Code使用说明 参加华为od机试,一定要注意不要完全背诵代码&

【华为OD机试模拟题】用 C++ 实现 - 卡片组成的最大数字(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明卡片组成的最大数字题目输入输出描述示例一输入输出示例二输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高…

高压放大器在声波谐振电小天线收发测试系统中的应用

实验名称&#xff1a;高压放大器在声波谐振电小天线收发测试系统中的应用研究方向&#xff1a;信号传输测试目的&#xff1a;声波谐振电小天线颠覆了传统电小天线以电磁波谐振作为理论基础的天线发射和接收模式&#xff0c;它借助声波谐振实现电磁信号的辐射或接收。因为同频的…

CPRI和10GBASE-KR的关系

目录 10GBASE-KR 10GBASE-KR的分层结构 10GBASE-KR 电气特性 发送器特性 接收器特性 CPRI CPRI与10GBASE-KR的差异 基于对CPRI协议和10GBASE-KR规范的分析完成本文&#xff0c;尝试解答CPRI和10GBASE-KR的关系问题&#xff0c;尝试给出如下结论&#xff1a; 当CPRI支持背…

使用xca工具生成自签证书

本文使用 xca 生成自签证书。 概述 之前使用 openssl 生成证书&#xff0c;在 golang 中测试&#xff0c;发现客户端连接失败&#xff0c;经查发现是Subject Alternative Name不支持导致的。因虚拟机 openssl 版本较低&#xff0c;有个功能无法实现&#xff0c;且升级麻烦&…

Matlab论文插图绘制模板第79期—无线条等高线填充图

资源群里有朋友问如何绘制等高线填充图&#xff0c;但删除线条&#xff0c;只保留填充颜色的那种。 那么&#xff0c;本期就来分享一下无线条等高线填充图的绘制模板。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;Matlab论文插图绘制模板系列&#xff0c;旨在降低大…

Linux基础命令-stat显示文件的状态信息

文章目录 stat 命令介绍 语法格式 基本参数 测试三个时间的变化过程 1&#xff09;使用cat命令 2&#xff09;使用echo命令 3&#xff09;使用chmod命令 4&#xff09;使用vim命令 参考实例 1&#xff09;显示文件的状态信息 2&#xff09;以简洁的形式显示状态信…

【论文速递】COLING 2022 - 带有事件论元相关性的事件因果关系抽取

【论文速递】COLING 2022 - 带有事件论元相关性的事件因果关系抽取 【论文原文】&#xff1a;Event Causality Extraction with Event Argument Correlations 【作者信息】&#xff1a;Cui, Shiyao and Sheng, Jiawei and Cong, Xin and Li, Quangang and Liu, Tingwen and S…

Delphi 中 FireDAC 数据库连接(总览)

本系列包含一组文章&#xff0c;描述了如何用在Delphi中使用FireDAC设置数据库驱动和管理数据库连接。通过这一些列文章的学习&#xff0c;将熟练掌握FireDAC数据库连接管理应用。自由使用FireDAC&#xff01;主题说明定义连接描述了如何存储和使用FireDAC连接参数以及连接定义…

ROS进行深度相机的标定

前言 自己使用标定板对深度相机进行标定。 参考&#xff1a;http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration 一、准备标定板 在下面的网站中可下载棋盘格标定板&#xff0c;可用A4纸打印下来。 http://wiki.ros.org/camera_calibration/Tutorials/…