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 的最大结束偏移去掉分区尾部填充。

相关推荐
律宏阔1 天前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔1 天前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴1 天前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千1 天前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei371 天前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei371 天前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei371 天前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
judezh1 天前
api 容器一直 unhealthy?我把一个 Agent 运行时的健康检查逐条拆了,查出四个问题
运维·docker
GeW1 天前
制造业高端化,为什么必须重估Linux和数据库?
linux
百万蹄蹄向前冲1 天前
双端同步!云服务器装最新Node.js v26.10全过程追踪
服务器·人工智能·node.js