1225 字
6 分钟
MT7987 (AirPi E87N) eMMC 纯净系统底层备份与恢复指南
针对基于联发科 MT7987 / Filogic 系列的硬件底板(如 AirPi E87N 等),采用“精准物理扇区截断 + 底层分区提取”方式,在不备份插件、用户配置(不扫空闲垃圾扇区)的前提下,实现体积最小、速度最快且完全防变砖的纯净出厂固件备份。
为什么不建议直接 dd 整盘?
以板载 8GB eMMC 为例:
mmcblk0boot0/1:硬件级 BL2 / ATF 引导(各 4MB,独立于 GPT 表)。mmcblk0p1 ~ p4:Env、Factory(MAC 与硬件参数)、FIP (U-Boot)、Kernel,共计约 40MB。mmcblk0p5:系统分区,前段为 ~130MB 的只读 SquashFS 根系统,后段为 7GB 的 F2FS/ext4 用户空间。
直接进行整盘 dd 会盲读后段 7GB 的空白与脏碎片,不仅耗时数分钟至十几分钟,还极易压缩出 1GB 左右的无用体积。通过严谨计算扇区,只抓取前导数据至 SquashFS 末尾,耗时仅需 3~5 秒,镜像压缩后仅约 130MB,却具备 100% 完整的系统与救砖能力。
准备工作
- 准备一个普通 U 盘(格式化为 ext4 或 FAT32/exFAT 均可)。
- 插入开发板 USB 接口,确认自动挂载路径(OpenWrt 默认通常为
/mnt/sda1)。 - 检查存储挂载情况:
lsblkdf -h /mnt/sda1一键备份自动化脚本
在 U 盘挂载目录(以 /mnt/sda1 为例)创建 backup_clean_system.sh:
#!/bin/sh# MT7987 (AirPi E87N) 纯净系统备份脚本# 仅备份引导、底层、出厂参数及原生固件,不打包用户配置与插件set -e
# 目标存储路径(自动带时间戳)TARGET_DIR="/mnt/sda1/backup_e87n/clean_sys_$(date +%Y%m%d_%H%M%S)"mkdir -p "$TARGET_DIR/partitions"cd "$TARGET_DIR"
echo "=================================================="echo " AirPi E87N (MT7987) eMMC 纯净系统底层备份"echo "=================================================="
# 1. 备份硬件 Boot 分区 (BL2 / ATF)echo "[1/4] 备份硬件引导分区 (mmcblk0boot0 / boot1)..."dd if=/dev/mmcblk0boot0 of=mmcblk0boot0.bin bs=1Mdd if=/dev/mmcblk0boot1 of=mmcblk0boot1.bin bs=1M
# 2. 导出独立 GPT 底层分区echo "[2/4] 提取 GPT 分区表与 p1~p4 独立镜像..."# GPT 头部 34 个扇区 (17KB)dd if=/dev/mmcblk0 of=gpt_header.bin bs=512 count=34
# 依次导出 Env, Factory, FIP/U-Boot, Kernelfor p in 1 2 3 4; do echo " -> 导出 mmcblk0p${p}..." dd if=/dev/mmcblk0p${p} of="partitions/mmcblk0p${p}.img" bs=1Mdone
# 3. 动态精准计算原生系统镜像边界echo "[3/4] 计算纯净出厂固件的精准物理扇区..."
# 获取 p5 分区在 eMMC 上的起始扇区P5_START_SECTOR=$(fdisk -l /dev/mmcblk0 | grep 'mmcblk0p5' | awk '{print $2}')
# 获取 /rom 文件系统的实际大小 (单位: 1K blocks),换算为 512 字节扇区数ROM_KBLOCKS=$(df -k /rom | awk 'NR==2 {print $3}')ROM_SECTORS=$((ROM_KBLOCKS * 2))
# 预留 16MB 安全对齐裕量 (32768 扇区,确保完整覆盖文件系统 superblock)MARGIN_SECTORS=32768
# 精确总扇区数 = p5起点 + /rom占用 + 裕量TOTAL_SECTORS=$((P5_START_SECTOR + ROM_SECTORS + MARGIN_SECTORS))TOTAL_MB=$((TOTAL_SECTORS * 512 / 1024 / 1024))
echo " -> p5 分区起始扇区: ${P5_START_SECTOR}"echo " -> /rom 占用扇区数: ${ROM_SECTORS} (${ROM_KBLOCKS} KB)"echo " -> 截断终止扇区: ${TOTAL_SECTORS} (物理大小: 约 ${TOTAL_MB} MB)"echo " -> 正在抓取纯净母盘并实时压缩..."
# 精准抓取前导扇区并压缩dd if=/dev/mmcblk0 bs=512 count=${TOTAL_SECTORS} | gzip -1 > emmc_clean_system.img.gz
# 4. 同步落盘与校验echo "[4/4] 强制刷盘并校验完整性..."syncgzip -t emmc_clean_system.img.gz && echo " -> 压缩包校验通过 (CRC OK)"
echo "=================================================="echo "备份全部完成!产物列表:"ls -lh "$TARGET_DIR"ls -lh "$TARGET_DIR/partitions"echo "=================================================="运行方式
chmod +x backup_clean_system.sh./backup_clean_system.sh备份完成后卸载 U 盘即可:
cd /mntumount /mnt/sda1备份产物说明
执行完成后,U 盘中会生成以下结构:
| 文件 / 目录 | 大小 (参考) | 作用说明 |
|---|---|---|
mmcblk0boot0.bin | 4.0 MB | 硬件引导分区 0(放 BL2/ATF,防救砖第一道防线) |
mmcblk0boot1.bin | 4.0 MB | 硬件引导分区 1(备用引导) |
gpt_header.bin | 17.0 KB | 原始 GPT 分区表头信息 |
partitions/mmcblk0p1.img | 512 KB | U-Boot 环境变量 (env) |
partitions/mmcblk0p2.img | 4.0 MB | Factory 分区(出厂以太网 MAC 地址与硬件参数) |
partitions/mmcblk0p3.img | 2.0 MB | FIP / U-Boot 固件本体 |
partitions/mmcblk0p4.img | 32.0 MB | Kernel(纯内核镜像) |
emmc_clean_system.img.gz | ~135 MB | 核心母盘镜像。包含完整的分区表、U-Boot、内核及原厂只读 Rootfs,不包含任何个人配置。 |
灾难恢复指南
无论后续如何刷机变砖,只要能进入任意临时的 Linux 环境(或 U-Boot 终端),均可通过以下方式恢复。
场景 1:完全刷崩/无法启动(全量还原)
在能识别 eMMC 的系统下(如 USB 引导的 Linux、内存盘 initramfs 或现有系统恢复),直接将压缩镜像解压还原回 eMMC 头部:
# 解压并写回 eMMC 头部(耗时仅需几秒)zcat emmc_clean_system.img.gz | dd of=/dev/mmcblk0 bs=4Msyncreboot开机后,固件将自动识别 SquashFS,并重新在剩余的 7GB 空间初始化全新的 F2FS/ext4 用户空间,恢复为出厂纯净状态。
场景 2:Bootloader / BL2 损坏(设备无法点亮)
如果通过编程器或 MTK 专用的 SP Flash Tool / 串口下载恢复:
- 将
mmcblk0boot0.bin刷入 eMMC 的 Boot0 硬件分区。 - 将
partitions/mmcblk0p3.img刷入 FIP 偏移位置。
场景 3:MAC 地址异常或丢失
若出现网卡 MAC 地址变为全 F 或随机地址:
dd if=partitions/mmcblk0p2.img of=/dev/mmcblk0p2 bs=1Msync相关文章
MT7987 (AirPi E87N) eMMC 纯净系统底层备份与恢复指南
https://iiii.fun/posts/openwrt/e87n/mt7987-e87n-emmc-backup/