最近,我被要求在一个嵌入式项目中在 Linux 上进行模拟效果的 增强型写入过滤器Windows XP Embedded 的 EWF。
具体来说,我需要一种 EWF 来:
- 避免在磁盘上写入过多次数(我们使用 CF);
- 意外重启/故障/错误更改后保护程序/配置文件。
据我所知,Linux 没有类似 EWF 的功能,而且它在磁盘上的写入量也不如 Windows(见此答案),但我的上司要求我调查一些能够同时满足这两个要求的解决方案。
目前我正在尝试这个简单的战略:
- 我有一个小分区(挂载点:/safe),其中包含我应该保护的数据/目录(即整个/etc 目录)
- 在系统启动期间,我将所有必须保护的目录挂载到 RAM(tmpfs)中,然后将数据从 /safe 复制到其中。
- 如果一切顺利,我可以卸载 /safe。如果需要,一个小脚本允许我挂载 /safe 并“提交”对文件的更改(如果需要)。
- 我可以强制/只读:我需要的所有程序都在 RAM 中,并且它们正在 RAM 中写入内容。
有什么想法/建议吗?
我在 x86 架构上使用精简版的 Debian Lenny 和 Ext2 格式的分区(顺便问一下,有没有适合这项任务的简单日志记录/COW 文件系统的建议?)。
谢谢。
答案1
按照以下优秀方法解决如何:构建只读 Linux 系统。
从两个制造魔法的小脚本中的一个(使用奥夫斯联盟):
ro_mount_point="${rootmnt%/}.ro"
rw_mount_point="${rootmnt%/}.rw"
# Create mount points for the read-only and read/write layers:
mkdir "${ro_mount_point}" "${rw_mount_point}"
# Move the already-mounted root filesystem to the ro mount point:
mount --move "${rootmnt}" "${ro_mount_point}"
# Mount the read/write filesystem:
mount -t tmpfs root.rw "${rw_mount_point}"
# Mount the union:
mount -t aufs -o "dirs=${rw_mount_point}=rw:${ro_mount_point}=ro" root.union "${rootmnt}"
# Correct the permissions of /:
chmod 755 "${rootmnt}"
结果:系统受到保护并且应用程序可以写入其内容(在 RAM 中)。
如果我重新启动而不“提交”,系统上的所有更改都将丢失,但如果我需要某些更改保持永久,我可以重新将分区挂载为读写(这次 r/w 表示“在磁盘上”而不是“在 RAM 上”),执行“提交”并将分区重新挂载为只读。
脚本非常优雅,我还可以通过在 GRUB 中选择正确的标记条目在“受保护”(用于生产)或“不受保护”(用于开发)模式之间切换。