镜像文件基础:格式、分区表与系统/数据镜像的区别

做恢复模式下的镜像校验,第一步得先搞清楚你手里拿的到底是个什么东西。我见过不少同事,拿到一个 .img 文件就直接开刷,结果刷完发现分区对不上,或者根本挂载不了——说白了,就是没搞懂镜像文件的基础结构。

这一节,咱们把镜像文件的格式、分区表,以及系统镜像和数据镜像的区别捋清楚。嗯,这些知识在后续的校验环节会反复用到。

镜像文件格式:img、tar、gz 到底有什么区别?

先看最常见的三种格式。你想想看,一个完整的系统镜像,可能是裸分区数据,也可能是打包后的压缩包。它们的本质区别在于:是否包含分区布局信息,以及是否经过压缩。

格式 本质 是否包含分区表 是否压缩 典型用途
.img 原始磁盘/分区镜像 是(通常包含) 否 系统烧录、整盘备份
.tar 归档文件(无压缩) 否 否 文件级备份、系统迁移
.gz gzip 压缩流 否(仅压缩) 是 配合 tar 或 img 使用

.img 文件:这是最"原始"的镜像格式。它直接按字节复制磁盘或分区的内容,包含引导扇区、分区表、文件系统数据。我在项目中遇到过一台老设备,恢复模式只认裸 .img 文件,用 tar 包刷进去直接变砖——因为设备启动时需要从固定偏移读取分区表。

.tar 文件:它只打包文件和目录结构,不关心底层分区。说白了,tar 适合做文件级备份,比如把 /etc 和 /home 打包带走。但如果你要恢复一个完整的系统,tar 包没法帮你重建分区布局。

.gz 文件:gzip 是压缩算法,不是镜像格式。你经常看到 system.img.gz 或 rootfs.tar.gz,前者是压缩后的原始镜像,后者是压缩后的归档。校验时,你得先解压再校验,或者直接校验压缩包的哈希——嗯,这里有个坑,我后面会讲。

核心要点:恢复模式下,.img 文件可以直接 dd 写入块设备;.tar 文件需要先挂载目标分区再解包;.gz 文件必须先解压。搞混了格式,校验就无从谈起。

镜像分区表解析:MBR 与 GPT

分区表是镜像文件的"地图"。没有它,系统不知道从哪里启动、数据存在哪个扇区。我刚开始做嵌入式开发时,有一次刷了个不带分区表的裸镜像,结果设备启动后只认到一个 4GB 的"空盘"——其实就是分区表丢了。

目前主流的分区表有两种:MBR(主引导记录)和GPT(GUID 分区表)。

特性 MBR GPT
最大磁盘容量 2TB 9.4ZB(理论)
分区数量 最多 4 个主分区 最多 128 个(Windows 限制)
备份分区表 无 有(磁盘末尾备份)
校验机制 无(仅 55AA 签名) CRC32 校验
启动方式 BIOS/Legacy UEFI

在恢复模式下,你经常需要解析镜像文件中的分区表。比如用 fdisk -l 查看 .img 文件的分区布局:

# 查看镜像文件的分区表
fdisk -l system.img

# 输出示例:
Disk system.img: 4 GiB, 4294967296 bytes, 8388608 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 12345678-1234-1234-1234-123456789abc

Device         Start     End Sectors  Size Type
system.img1     2048  526335  524288  256M EFI System
system.img2   526336 1574911 1048576  512M Linux filesystem
system.img3  1574912 8388574 6813663  3.3G Linux rootfs (ARM-64)

你看,GPT 分区表会显示每个分区的起始扇区、大小和类型。校验时,我们需要确认这些偏移量是否与设备预期的布局一致。我曾经遇到过镜像文件的分区起始扇区偏移了 1 个扇区,结果刷进去后第二个分区完全读不出来——就是因为分区表里的 Start 值写错了。

个人经验:我习惯在恢复模式下先用 hexdump -C system.img | head -n 10 看一眼镜像头部。如果是 GPT,前 512 字节是保护 MBR,紧接着就是 GPT 头。看到 "EFI PART" 字符串,基本就能确认是 GPT 格式了。

系统镜像与数据镜像的区别

这个区别很关键,但很多人容易搞混。我简单说:系统镜像管"运行",数据镜像管"存储"。

系统镜像(System Image):包含操作系统内核、驱动、系统库、核心应用。它通常是只读的,恢复模式下刷写系统镜像后,设备就能正常启动。系统镜像一般包含分区表,并且有固定的分区布局。比如 Android 的 system.img、OpenWrt 的 firmware.bin。

数据镜像(Data Image):包含用户数据、应用配置、日志文件等。它是可读写的,恢复模式下刷写数据镜像通常是为了恢复用户数据或重置设备。数据镜像一般不包含分区表,它只是某个分区的裸数据备份。比如 userdata.img、data.tar.gz。

对比维度 系统镜像 数据镜像
内容 内核、驱动、系统库 用户数据、应用配置
读写属性 通常只读(刷写后不变) 可读写(用户可修改)
分区表 通常包含 通常不包含
校验重点 完整性、分区偏移、哈希 文件一致性、权限、属主
恢复场景 设备变砖、系统升级 数据恢复、出厂重置

在恢复模式下,校验策略也不同。系统镜像我一般做全量哈希校验,确保每个字节都和官方发布的一致。数据镜像则更关注文件级别的校验——比如用 fsck 检查文件系统一致性,或者用 diff 对比关键配置文件。

避坑指南:我曾经遇到过有人把数据镜像当系统镜像刷,结果设备启动后卡在 kernel panic——因为数据镜像里根本没有内核。反过来,把系统镜像刷到数据分区,会导致用户数据分区被覆盖,所有应用数据丢失。嗯,刷之前一定要确认镜像类型。

知识体系结构图

下面这张图帮你理清镜像文件的核心知识脉络:

镜像文件基础知识体系 镜像文件基础知识体系 镜像文件 镜像格式 分区表 镜像类型 .img .tar .gz MBR GPT 系统镜像 数据镜像 校验关注点 • 格式决定校验方式:.img 做块级哈希,.tar 做文件级校验 • 分区表决定偏移量:MBR 看 55AA 签名,GPT 看 CRC32 • 类型决定校验策略:系统镜像全量校验,数据镜像增量校验 • 三者互相关联:格式 → 分区表 → 类型 → 校验方法

这张图把镜像格式、分区表和镜像类型串在了一起。你从顶层往下看:拿到一个镜像文件,先看格式(img/tar/gz),再看分区表(MBR/GPT),最后确认是系统镜像还是数据镜像。每一步都决定了后续的校验策略。

我的习惯:每次拿到新镜像,我会先跑一个 file 命令看看文件类型,再用 fdisk -l 检查分区表,最后根据文件名和内容判断是系统还是数据镜像。这三步走完,心里就有底了。