OpenWRT 应用一种 OverlayFS 存储方案:
An overlay-filesystem tries to present a filesystem which is the result of overlaying one filesystem on top of the other.
OpenWRT 将存储分为两个部分:
rootfs :只读的 SquashFSrootfs_data :可写这其中, rootfs_data 位于 rootfs 的“上层”,这使得用户看起来可以修改和删除所有文件,但事实上这依然是在通过上层的 rootfs_data 写入数据实现的。
这样做的好处是:
rootfs 在事实上是只读的,所以无论如何“删除”,在 恢复出厂设置 时,只需要删除 rootfs_data 的所有内容,原始数据都可以恢复rootfs 都是完整的OverlayFS 大致结构如下:
VFS
↓
OverlayFS
│
├── SquashFS
│ ↓
│ Driver
│ ↓
│ Hardware
│
└── Writable FS
↓
Driver
↓
Hardware
由于 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 等等其他方案上面运行,以支持不同设备。