我有一个在一块闪存上运行 Debian 10 的单板设备。使用 UBIFS,并将其分为两个卷:一个 ro 根和一个 rw /var。我发现在电源循环/重置条件下,我可以得到 0 字节文件。我将我的“设置”保存在 /var/opt/myApp 中。将 /var 的挂载选项更改为包含sync
似乎会使这些事件消失。
我知道通常的建议是异步优于同步,但通常会用“通常,但并非总是”来警告,几乎没有解释异常可能是什么。
另一种解决方案是修改我将数据写入磁盘的所有调用站点,不仅在文件关闭时刷新,而且同步(我用python做了很多)。从编码/完整性的角度来看,安装sync
似乎既减少了工作量,又避免了我错过在某些地方添加同步保护,因为它是通用的。
此外,我允许设备将数据保存到 USB 拇指驱动器。我想我也应该安装这些同步,以减少在将数据写入它们后立即将它们拉出时的损失。
这是一个适当的特殊配置来证明使用的合理性sync
吗?还是我应该使用替代解决方案?
这是我的意见:抱歉提前冗长。
当我们具体谈论时,
ubifs
我们应该总是sync
选择/类似的选项。ubifs
支持write-back caching
这意味着写入文件的更改不会直接写入闪存。它们首先存储在页面缓存中,然后写入闪存。(阅读有关
write buffers
UBIFS 中 NAND 闪存的更多信息)这通过减少写入次数来提高文件系统性能。
请注意,这是
asynchronous
fs 的行为。正如您在问题中所说,当您使用 -sync 选项安装 UBIFS 时,它会使文件系统
synchronous
(每次更改都写入闪存)但是以性能下降为代价。如果您正在使用
asynchronous
像 ubifs 这样的文件系统,那么确保将写入写入闪存的责任在于应用程序开发人员。这是 write(2) 的手册页所说的:使用
sync
- 同步整个 fs。可能不是最优的fsync
- 主要做这项工作fdatasync
- 仅刷新数据更改而不刷新元数据(权限)。比可能更优化fsync
(不确定)另请阅读有关 fsync 的 Good Read
所以最后,你的选择:
sync
选项改进应用程序。最后一个想法,可能想切换到同步 fs 之类的
jffs2
(如果使用 NAND 闪存,则不是完全同步的)。我知道这不是您问题的答案,但是,写了这么多还不如写这个....