在嵌入式Linux上安全地写入紧凑型闪存

eat*_*ter 8 linux filesystems embedded locking embedded-linux

我正在开发一个从紧凑型闪存和tmpfs运行的嵌入式Linux系统.闪存以只读方式安装,通常应保持这种状态,但偶尔我需要向闪存写入内容.

写入闪存(通过PATA接口)时应该采取哪些预防措施?由于我无法回想起的原因,我正在使用ext4安装的文件系统barrier=1,data=ordered,nodelalloc,noatime,ro是否是一个可怕的想法?系统需要在零干预的情况下快速启动.我很想做tune2fs -c 0 -i 0.这是一个更糟糕的想法吗?

另外,当我写东西时,我显然需要重新安装flash读写,执行写操作,然后重新安装只读.问题是有几个不同的进程(c ++二进制和shell脚本)可能需要这样做.很明显,每个进程不加选择地重新安装文件系统只读它是一个坏主意.

协调这个的最佳方法是什么?flock看起来很有希 这是最好的方式,我需要担心什么?我不希望过时的锁阻止写入或使文件系统无限期写入.

澄清:通过"偶尔"写作,我的意思是系统可以使用多年而不需要写任何东西.什么东西写,它可能是几百字节.与此同时,系统需要承受不可预测的电源循环而无需任何干预.

Ian*_*son 6

使ext4安全

ext4对此并不是很理想; 最糟糕的情况是,当你的分区是RW并破坏文件系统时,电源会出现故障.

尽管它们是为原始NAND设备设计的,但像jffs2或yaffs这样的日志文件系统可能仍然有用.它们具有有用的特性,即它们的磁盘格式看起来更像是列表而不是树,因此更新的数据往往更紧密地打包,因此不太可能丢弃文件系统的相对静态部分.

在这种情况下,我无法评论如何使ext4'安全'; 文件系统结构和fsck都不知道闪存设备的常见故障模式(特别是,在任何写入过程中,整个数据块无效的时间很长.)这种行为当然特定于控制器上的CF卡,所以无论如何它都不是很可预测的.

我能想到的最安全,最可预测的方法是在较小的嵌入式设备中使用相同的翻转缓冲数据布局.也就是说,您有两个可写区域(两个分区).在任何给定时间,它们中至少有一个必须一致.当你想写时,选择两者中较老的一个.如果启动并检测缓冲区A中的不一致,请复制缓冲区B的内容(同时不允许对B进行任何写入.)

管理挂载/重新安装

我会写一个代表系统上所有进程管理unmount/remount的守护进程.这有许多优点:

  • 你将umount/remount逻辑分开,只需实现一次
  • 想要写入的进程不需要root权限
  • 你可以构建一些看门狗,以确保分区不会留在RW太长时间.如果是,您可以终止违规流程(可能会回滚)和重新安装RO.
  • 您可以测量安装RW的时间长度,这可以让您了解每次更新所涉及的风险