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% 完整的系统与救砖能力。

准备工作#

  1. 准备一个普通 U 盘(格式化为 ext4 或 FAT32/exFAT 均可)。
  2. 插入开发板 USB 接口,确认自动挂载路径(OpenWrt 默认通常为 /mnt/sda1)。
  3. 检查存储挂载情况:
Terminal window
lsblk
df -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=1M
dd 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, Kernel
for p in 1 2 3 4; do
echo " -> 导出 mmcblk0p${p}..."
dd if=/dev/mmcblk0p${p} of="partitions/mmcblk0p${p}.img" bs=1M
done
# 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] 强制刷盘并校验完整性..."
sync
gzip -t emmc_clean_system.img.gz && echo " -> 压缩包校验通过 (CRC OK)"
echo "=================================================="
echo "备份全部完成!产物列表:"
ls -lh "$TARGET_DIR"
ls -lh "$TARGET_DIR/partitions"
echo "=================================================="

运行方式#

Terminal window
chmod +x backup_clean_system.sh
./backup_clean_system.sh

备份完成后卸载 U 盘即可:

Terminal window
cd /mnt
umount /mnt/sda1

备份产物说明#

执行完成后,U 盘中会生成以下结构:

文件 / 目录大小 (参考)作用说明
mmcblk0boot0.bin4.0 MB硬件引导分区 0(放 BL2/ATF,防救砖第一道防线)
mmcblk0boot1.bin4.0 MB硬件引导分区 1(备用引导)
gpt_header.bin17.0 KB原始 GPT 分区表头信息
partitions/mmcblk0p1.img512 KBU-Boot 环境变量 (env)
partitions/mmcblk0p2.img4.0 MBFactory 分区(出厂以太网 MAC 地址与硬件参数)
partitions/mmcblk0p3.img2.0 MBFIP / U-Boot 固件本体
partitions/mmcblk0p4.img32.0 MBKernel(纯内核镜像)
emmc_clean_system.img.gz~135 MB核心母盘镜像。包含完整的分区表、U-Boot、内核及原厂只读 Rootfs,不包含任何个人配置。

灾难恢复指南#

无论后续如何刷机变砖,只要能进入任意临时的 Linux 环境(或 U-Boot 终端),均可通过以下方式恢复。

场景 1:完全刷崩/无法启动(全量还原)#

在能识别 eMMC 的系统下(如 USB 引导的 Linux、内存盘 initramfs 或现有系统恢复),直接将压缩镜像解压还原回 eMMC 头部:

Terminal window
# 解压并写回 eMMC 头部(耗时仅需几秒)
zcat emmc_clean_system.img.gz | dd of=/dev/mmcblk0 bs=4M
sync
reboot

开机后,固件将自动识别 SquashFS,并重新在剩余的 7GB 空间初始化全新的 F2FS/ext4 用户空间,恢复为出厂纯净状态。

场景 2:Bootloader / BL2 损坏(设备无法点亮)#

如果通过编程器或 MTK 专用的 SP Flash Tool / 串口下载恢复:

  • 将 mmcblk0boot0.bin 刷入 eMMC 的 Boot0 硬件分区。
  • 将 partitions/mmcblk0p3.img 刷入 FIP 偏移位置。

场景 3:MAC 地址异常或丢失#

若出现网卡 MAC 地址变为全 F 或随机地址:

Terminal window
dd if=partitions/mmcblk0p2.img of=/dev/mmcblk0p2 bs=1M
sync

相关文章#

MT7987 (AirPi E87N) eMMC 纯净系统底层备份与恢复指南
https://iiii.fun/posts/openwrt/e87n/mt7987-e87n-emmc-backup/
作者
庆灵
发布于
2026-10-06
许可协议
CC BY-NC-SA 4.0