我正在开发一个从紧凑型闪存和tmpfs运行的嵌入式Linux系统。闪存以只读方式安装,通常应保持这种状态,但偶尔我需要在闪存上写一些内容。
写入闪存(通过PATA接口)时应采取哪些预防措施?由于我无法回想起的原因,我使用的ext4
文件系统安装了barrier=1,data=ordered,nodelalloc,noatime,ro
这是一个可怕的想法吗?系统需要在零干预的情况下快速启动。我很想做tune2fs -c 0 -i 0
。这是一个更糟糕的想法吗?
另外,当我写东西时,我显然需要重新安装flash读写,执行写操作,然后重新安装只读。问题是有几个不同的进程(c ++二进制和shell脚本)可能需要这样做。很明显,让每个进程在完成后不加区分地重新安装文件系统只是一个坏主意。
协调这个的最佳方法是什么? flock
看起来很有希望;这是最好的方式,我需要担心什么?我不希望过时的锁阻止写入或使文件系统无限期地写入。
澄清: 通过“偶尔”写作,我的意思是系统可以使用多年,而无需编写任何内容。什么东西写,它可能是几百字节。与此同时,系统需要承受不可预测的电源循环而无需任何干预。
答案 0 :(得分:6)
ext4对此并不是很理想;最糟糕的情况是,当你的分区是RW并破坏文件系统时,电源会出现故障。
即使它们是为原始NAND设备设计的,像jffs2或yaffs这样的日志文件系统可能仍然有用。它们具有有用的特性,即它们的磁盘格式看起来更像是列表而不是树,因此更新的数据往往更紧密地打包,因此不太可能丢弃文件系统的相对静态部分。
我无法评论如何在这种情况下使ext4'安全';文件系统结构和fsck都不知道闪存设备的常见故障模式(特别是,在任何写入期间,整个数据块无效的时间很长。)这种行为当然特定于控制器上的CF卡,所以无论如何都不太可预测。
我能想到的最安全,最可预测的方法是在较小的嵌入式设备中使用相同的翻转缓冲数据布局。也就是说,您有两个可写区域(两个分区)。在任何给定时间,它们中至少有一个必须一致。当你想写时,选择两者中较老的一个。如果启动并检测缓冲区A中的不一致,请复制缓冲区B的内容(同时不允许对B进行任何写入。)
我会编写一个代表系统上所有进程管理unmount / remount的守护进程。这有许多优点:
答案 1 :(得分:4)
我用4GB CF卡制作了一个嵌入式系统。我用3个分区设置了它:
我正在使用ext2,因为我相信任何日志记录FS实际上会导致每次写入修改更多的块。在CF卡上运行闪存文件系统也没有意义,因为系统无法直接访问闪存块。 CF卡内部包含自己的块映射逻辑。
答案 2 :(得分:2)
由于您使用的是CF,因此磨损均衡很可能是内置的,因此使用内置磨损均衡的yaffs2,jffs2等文件系统将无法获益。事实上,大多数磨损均衡文件系统不建议内置磨损均衡的CF卡。您需要一个内置日志的文件系统,以便您可以安全地进行电源开关循环而不会导致系统损坏。有两种选择 - 选择具有日志功能的文件系统或选择数据库(假设写入是以数据库为中心的),其中包含像sqlite一样的耗损级别。对于文件系统,您可以使用ext3或ext4,但我个人推荐ext3,因为ext4仍然存在可能让您头疼的错误。我还建议像其他人一样有两个分区,一个是使用文件系统的纯只读,如squashfs,cramfs,另一个是使用ext3的读写。
话虽如此,我不确定你的设备是否内置EEPROM,但如果它有,你只需要每隔几年写几百字节,最简单的配置就是使用一个只读的文件。 EEPROM作为数百个字节的数据区域。
答案 3 :(得分:1)
我会创建一个单独的分区,安装rw。