Linux的DD命令

最近发现DD命令还挺有用的。

已经从板子当前活动槽 _a 提取完成。

文件:

  • xbl_config.elf(C:\Users\John Jiang\Documents\Codex\2026-08-12\xian\outputs\xbl_config.elf)
  • xbl_config_a 完整分区镜像(C:\Users\John Jiang\Documents\Codex\2026-08-12\xian\outputs\xbl_config_a_partition.img)

提取信息:

复制代码
当前槽位:          _a
分区:              /dev/block/by-name/xbl_config_a
实际块设备:        /dev/block/mmcblk0p3
完整分区大小:      237,568 字节
ELF有效大小:       139,448 字节(0x220B8)

ELF 的 SHA-256:

复制代码
5903F15B3B992126F294D3B1371557C0243FE23D855AE12976EC8CBAD5FC4A90

完整分区镜像 SHA-256:

复制代码
41DA633AC42E7BE17E0D5190FEFF81FF6C87C0D0E34CDDF1B075EAC0D8536DFB

提取出的 ELF 已确认:

  • 开头是标准 ELF64 文件头;
  • 包含 11 个 Program Header;
  • 其中仍有9个 PT_LOAD 配置载荷;
  • ELF 有效结束位置由最后一个安全元数据段确定为 0x220B8;
  • 分区剩余区域全部是 0x00 填充,已从 xbl_config.elf 中剔除;
  • 完整原始分区镜像也已保留,方便还原或复核。

它与之前的旧版本不同:

复制代码
旧版本大小:143,544 字节
旧版本 SHA:3C07ADF54086649A679B4D798F52D99148B975B424EC12D5B2BDD7E3ACD8C032

新版本大小:139,448 字节
新版本 SHA:5903F15B3B992126F294D3B1371557C0243FE23D855AE12976EC8CBAD5FC4A90

因此可以确认:这次确实提取到了新刷版本的 xbl_config.elf,不是之前文件的重复副本。

我是从板子当前启动槽的 xbl_config 原始分区直接读取出来的,没有通过 Android 文件系统查找,也没有修改或刷写分区。

1. 确认设备和当前槽位

复制代码
D:\Tools\platform-tools\adb.exe devices -l
D:\Tools\platform-tools\adb.exe shell getprop ro.boot.slot_suffix

板子返回:

复制代码
_a

说明目前使用 A 槽。

2. 查找 xbl_config 分区

复制代码
D:\Tools\platform-tools\adb.exe shell "ls -l /dev/block/by-name | grep -i xbl"

结果中有:

复制代码
xbl_config_a -> /dev/block/mmcblk0p3
xbl_config_b -> /dev/block/mmcblk0p4

因此当前正在使用的分区是:

复制代码
/dev/block/by-name/xbl_config_a

3. 获取 root 权限

读取原始块设备通常需要 root:

复制代码
D:\Tools\platform-tools\adb.exe root
D:\Tools\platform-tools\adb.exe wait-for-device
D:\Tools\platform-tools\adb.exe shell id

这里设备返回了:

复制代码
uid=0(root)

4. 查询分区大小

复制代码
D:\Tools\platform-tools\adb.exe shell "blockdev --getsize64 /dev/block/by-name/xbl_config_a"

返回:

复制代码
237568

即完整分区大小为 237,568 字节。

5. 直接提取完整分区

执行:

复制代码
D:\Tools\platform-tools\adb.exe pull ^
  /dev/block/by-name/xbl_config_a ^
  D:\tmp\xbl_config_a_partition.img

也可以使用 dd:

复制代码
D:\Tools\platform-tools\adb.exe shell ^
  "dd if=/dev/block/by-name/xbl_config_a of=/data/local/tmp/xbl_config_a_partition.img bs=4096"

D:\Tools\platform-tools\adb.exe pull ^
  /data/local/tmp/xbl_config_a_partition.img ^
  D:\tmp\xbl_config_a_partition.img

第一种方法更直接,而且不会在板子上留下临时文件。

这个操作只有读取:

复制代码
if=/dev/block/by-name/xbl_config_a

没有向分区写入任何内容。

6. 检查是否为 ELF

检查前几个字节:

复制代码
D:\Tools\platform-tools\adb.exe shell ^
  "dd if=/dev/block/by-name/xbl_config_a bs=64 count=1 2>nul | od -An -tx1"

开头是:

复制代码
7f 45 4c 46

对应:

复制代码
\x7FELF

说明分区开头直接就是 xbl_config.elf,不存在额外的 GPT 或文件系统封装。

7. 为什么还要裁剪?

完整分区大小为:

复制代码
237568 字节

但它包含:

复制代码
xbl_config ELF
+
分区尾部的 0x00 填充

通过解析 ELF Header 和所有 Program Header,计算每个段的:

复制代码
p_offset + p_filesz

最大的结束位置来自最后一个安全元数据段:

复制代码
0x21000 + 0x10B8 = 0x220B8

换算为十进制:

复制代码
0x220B8 = 139448 字节

检查 0x220B8 后面的全部内容,只有:

复制代码
0x00

因此:

  • xbl_config_a_partition.img:完整原始分区备份
  • xbl_config.elf:去掉分区尾部填充后的有效 ELF

8. 简化版操作

如果只想备份分区,执行下面几条就够了:

复制代码
set "ADB=D:\Tools\platform-tools\adb.exe"

"%ADB%" root
"%ADB%" wait-for-device
"%ADB%" shell getprop ro.boot.slot_suffix
"%ADB%" shell "ls -l /dev/block/by-name/xbl_config*"
"%ADB%" pull /dev/block/by-name/xbl_config_a D:\tmp\xbl_config_a_partition.img

注意最后一条中的 _a 要根据当前槽位调整。如果当前槽位是 _b,则应该执行:

复制代码
"%ADB%" pull /dev/block/by-name/xbl_config_b D:\tmp\xbl_config_b_partition.img

最核心的方法就是:

确认当前 A/B 槽位,通过 /dev/block/by-name/xbl_config_<slot> 读取完整原始分区,再根据 ELF Program Header 的最大结束偏移去掉分区尾部填充。

相关推荐
想做小南娘,发现自己是女生喵15 分钟前
第二周学习文档 Linux C 文件操作
linux·c语言·学习
元岳数字人小元15 分钟前
一台终端兼顾接待与咨询,AI数字人对话赋能线下多场景服务
运维·人工智能·人机交互·交互·语音识别·源代码管理
djjjx.23 分钟前
Linux进程篇(三):深度硬核!全面起底 Linux 进程状态变化与内核链表动态解绑
linux·运维·服务器
乔旭伟26 分钟前
Linux 服务器环境搭建实战笔记:最小化安装、Docker Compose 编排与上线检查全流程
linux·服务器·笔记
燕落南枝35 分钟前
HTML 学习:input 单选、复选与文件域详解
服务器·学习·html
Chenyu_3109 小时前
DPDK、TC 和 XDP:Linux 高性能网络到底在优化什么
linux·服务器·网络·缓存
qqxiaoxingxing9 小时前
HR重复性工作自动化落地指南:先梳理任务边界,再选工具
运维·自动化
王琦031810 小时前
持续集成持续交付企业示例
运维·ci/cd
Lsetea10 小时前
SSL证书指纹相同但文件哈希不同:PEM、DER与公钥摘要怎么比
运维·https·ssl证书·openssl·证书链
wtblszn10 小时前
废气处理余热回收设备远程运维系统方案
运维