yanghn2002

View My GitHub Profile

OpenWRT 存储方案

OpenWRT 应用一种 OverlayFS 存储方案:

An overlay-filesystem tries to present a filesystem which is the result of overlaying one filesystem on top of the other.

OverlayFS

OpenWRT 将存储分为两个部分:

  1. rootfs :只读的 SquashFS
  2. rootfs_data :可写

这其中, rootfs_data 位于 rootfs 的“上层”,这使得用户看起来可以修改和删除所有文件,但事实上这依然是在通过上层的 rootfs_data 写入数据实现的。

这样做的好处是:

  1. 由于 rootfs 在事实上是只读的,所以无论如何“删除”,在 恢复出厂设置 时,只需要删除 rootfs_data 的所有内容,原始数据都可以恢复
  2. 只读文件系统可以完全避免数据被篡改,无论如何 rootfs 都是完整的

OverlayFS 大致结构如下:

   VFS
    ↓
OverlayFS
    │
    ├── SquashFS
    │     ↓
    │   Driver
    │     ↓
    │  Hardware
    │
    └── Writable FS
             ↓
           Driver
             ↓
          Hardware

典型应用:SquashFS+UBIFS

由于 OpenWRT 在一般情况下运行在嵌入式资源受限的环境下,存储设备一般是 NAND/NOR ,所以需要 MTD 子系统的支持,同时 rootfs_data 一般选择 UBIFS 。

MTD (Memory Technology Device) 子系统 是 Linux Kernel 专门为 NAND/NOR 等存储设备其特殊性设计的抽象层,主要是由于它们没有硬件控制器,所以难以支持像标准块设备一样访问。
UBI (Unsorted Block Images) 子系统 在其上层提供了磨损均衡 (Wear leveling) 以及坏块处理支持。
这些都是为了在 NAND/NOR 这类“裸”设备上运行可写文件系统必须的。

最后, SquashFS+UBIFS 的 OverlayFS 方案大致结构如下:

   VFS
    ↓
OverlayFS
    │
    ├──── SquashFS
    │        ↓
    │ mtdblock driver
    │        ↓
    │  MTD subsystem
    │        ↓
    │ Hardware (NAND/NOR)
    │
    └── UBIFS
          ↓
    UBI subsystem
          ↓
    MTD subsystem
          ↓
    Hardware (NAND/NOR)

当然, OpenWRT 这种 OverlayFS 也可以在 SSD/HDD-ext4 等等其他方案上面运行,以支持不同设备。