要实现“掉电不损坏启动程序”,我们需要从物理隔离文件系统特性两个层面来配合。

下面我为你详细拆解原理和实现步骤。

1. 核心原理:为什么分区能保护系统?

A. 物理层面的“隔离墙”

eMMC 芯片内部实际上是一个巨大的存储阵列。分区 就像是在这块地上画了界线:

  • 分区 A (系统区):地址范围 0 ~ 100MB。
  • 分区 B (日志区):地址范围 100MB ~ 500MB。

一旦划分好,Linux 内核会强制执行这个边界。当你在分区 B 写日志时,哪怕程序有 Bug 或者掉电导致文件系统写乱,数据乱飞也只会“污染”分区 B 的范围,永远无法跨越 100MB 这个边界去覆盖分区 A 的启动程序。这就是物理隔离带来的安全性。

B. 逻辑层面的“只读锁”

仅仅分区还不够,如果系统运行起来后,某个进程误操作了 rm -rf /,照样会删掉系统文件。所以必须挂载为只读

  • 当一个分区以 ro (Read-Only) 方式挂载时,Linux 内核会拒绝所有针对该分区的写请求。
  • 掉电保护原理:既然根本没有写入操作,那么无论何时掉电,存储介质上的数据状态永远是一致的、正确的,不存在“写了一半”的情况。

2. 实战例子:eMMC 分区设计方案

假设你的 eMMC 总大小为 1GB,我们规划如下:

分区名称 大小 用途 文件系统类型 挂载方式 掉电风险
分区 1 (boot) 64MB 存放 U-Boot、内核、设备树 FAT32RAW 只读 (ro) 无风险
分区 2 (rootfs) 256MB 存放 Linux 根文件系统 SquashFS (压缩只读) 只读 (ro) 无风险
分区 3 (data) 剩余空间 存放日志、配置文件 ext4f2fs 读写 (rw) 可能损坏 (但可修复)

3. 具体实现步骤

第一步:分区(切蛋糕)

在 Linux 系统启动后(或者在产线生产时),使用 fdisk 工具对 eMMC 设备(假设是 /dev/mmcblk0)进行分区:

# 创建分区表
fdisk /dev/mmcblk0
# 创建分区1 (64MB) -> /dev/mmcblk0p1
# 创建分区2 (256MB) -> /dev/mmcblk0p2
# 创建分区3 (剩余) -> /dev/mmcblk0p3
第二步:格式化(选容器)

这是关键一步,不同的用途要用不同的文件系统:

  1. 系统分区

    • 推荐:SquashFS。这是一种压缩的、只读的文件系统。
    • 原理:它生成镜像那一刻就定死了,只能读,不能写。即便你想挂载为读写模式,内核都会报错。这是最安全的。
    • 如果必须兼容某些更新需求,也可以用 ext4,但必须强制挂载为只读。
  2. 日志分区

    • 推荐:ext4f2fs
    • 原理:ext4 有日志功能,掉电后可以通过日志恢复数据结构,虽然可能丢失最后几行日志,但文件系统本身不会崩。

命令示例:

# 格式化日志分区为 ext4
mkfs.ext4 /dev/mmcblk0p3
第三步:挂载(定规则)

在系统启动脚本(如 /etc/fstab)中配置挂载策略:

# <device>      <mount point>  <type>   <options>         <dump> <pass>
/dev/mmcblk0p1  /boot          vfat     ro,noload         0      0
/dev/mmcblk0p2  /              squashfs ro                0      0
/dev/mmcblk0p3  /var/log       ext4     rw,errors=remount-ro 0     1
  • 注意 /boot/ 的 options 都是 ro (Read-Only)。
  • /var/logrw (Read-Write)。

4. 进阶:如何解决“系统需要保存配置”的问题?

你可能会问:“我的系统分区只读,那我要保存 IP 地址、密码配置怎么办?”

这就需要用到OverlayFS (覆盖文件系统) 技术,这是嵌入式 Linux 最常用的技巧。

原理:

  1. Lower Layer (底层):只读的系统分区,存放出厂默认配置。
  2. Upper Layer (上层):可读写的 Data 分区中的一个目录(比如 /data/overlay)。
  3. Merge View (合并视图):用户看到的是两层合并后的结果。

效果:

  • 当你读取 /etc/config 时,系统去底层读。
  • 当你修改 /etc/config 并保存时,系统自动把修改写到上层的 /data/overlay 里。
  • 下次读取时,系统发现上层有这个文件,就优先读上层的(覆盖了下层的)。

掉电后果:

  • 系统核心文件在底层,绝对安全。
  • 你的修改在上层(Data 分区),如果掉电,最坏情况是配置没保存成功,或者 Data 分区需要修复,但系统核心文件永远不会坏,设备重启后依然能跑起来。

5. 总结

要做到你想要的效果,核心逻辑是:

  1. 分区隔离:把“命”(系统)和“身外之物”(日志)放在不同的物理区域。
  2. 只读挂载:系统区加上“写保护锁”,杜绝误操作和掉电写损坏。
  3. 日志文件系统:数据区使用带日志功能的文件系统(ext4/f2fs),配合 fsck(文件系统检查工具),在启动时自动修复可能的掉电损坏。

这样设计,你的设备就成了“小强”,随便暴力断电,只要硬件不坏,系统都能自启动恢复。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐