1.基于闪存的存储
它取决于磁盘类型(传统硬盘驱动器还是固态磁盘)或其他我可能不知道的变量?它是否仅在Linux中发生(如果确实如此)或在其他OS中存在?
当您选择时,如果不进行彻底关机,则不应允许基于闪存的存储掉电。
在像SD卡这样的低成本存储设备上,您可能会丢失整个擦除块(比4KB大几倍),并丢失可能属于不同文件或文件系统基本结构的数据。
面对电源故障,一些昂贵的SSD可能会提供更好的保证。但是,第三方测试表明,许多昂贵的SSD无法做到这一点。重新映射块以进行“磨损平衡”的层是复杂且专有的。可能的故障包括驱动器上所有数据的丢失。
应用我们的测试框架,我们总共使用了三千多个故障注入周期来测试来自六个不同供应商的17个商用SSD。我们的实验结果表明,在17个经过测试的SSD设备中,有14个在电源故障下表现出令人惊讶的故障行为,包括位损坏,shorn写入,不可序列化的写入,元数据损坏以及整个设备故障。
2017年:https : //dl.acm.org/citation.cfm?id=2992782&preflayout=flat
2013:https://www.usenix.org/system/files/conference/fast13/fast13-final80.pdf?wptouch_preview_theme = enabled
2.旋转硬盘驱动器
旋转硬盘具有不同的特性。为了安全和简单起见,我建议假定它们具有与基于闪存的存储相同的实际不确定性。
除非您有具体的证据,否则您显然没有。我没有旋转硬盘的比较数据。
HDD可能会使一个不完整写入的扇区具有错误的校验和,这将在以后给我们带来很好的读取失败。从广义上讲,HDD的这种故障模式是完全可以预期的。在设计本机Linux文件系统时要牢记这一点。他们旨在fsync()
在面对此类断电故障时维护合同。(我们真的很想在SSD上看到这一保证)。
但是,我不确定Linux文件系统是否在所有情况下都能实现这一目标,或者是否有可能实现。
此类故障后的下一次引导可能需要修复文件系统。在Linux上,文件系统修复可能会问一些您不理解的问题,您只能在其中按Y并希望它能自行解决。
2.1如果您不知道什么是fsync()合同
fsync()合同是好消息和坏消息的来源。您必须首先了解好消息。
好消息:fsync()
有据可查,是写文件数据的正确方法,例如,当您单击“保存”时。众所周知,例如,文本编辑器必须使用原子替换现有文件rename()
。这是为了确保您始终保留旧文件或获取新文件(fsync()
在重命名之前编辑的文件)。您不想留下新文件的半写版本。
坏消息:多年来,在最受欢迎的Linux文件系统上调用fsync()可能会使整个系统挂起数十秒钟。由于应用程序对此无能为力,因此在没有fsync()的情况下乐观地使用Ruiname()是很常见的,这在此文件系统上似乎是相对可靠的。
因此,存在不正确使用fsync()的应用程序。
此文件系统的下一个版本通常避免fsync()挂起-在它开始依赖正确使用fsync()的同时。
这一切都非常糟糕。许多相互矛盾的内核开发人员所使用的轻蔑的语气和煽动性可能无法帮助理解这一历史。
当前的解决方案是,当前最受欢迎的Linux文件系统 默认情况下支持重命名()模式,而无需fsync()与以前的版本实现“ bug兼容”。可以使用mount选项禁用它noauto_da_alloc
。
这不是一个完整的保护。基本上,它在rename()时刷新待处理的IO,但它不等待IO完成重命名。但是,这比60秒危险窗口要好得多!另请参见答案,当用named()替换现有文件时,哪些文件系统需要fsync()来确保崩溃安全?
一些不太流行的文件系统不提供保护。XFS 拒绝这样做。而且,UBIFS也没有实现它,显然它可以接受,但需要大量工作才能使其成为可能。同一页还指出,UBIFS还有其他几个“ TODO”问题,涉及数据完整性,包括断电问题。UBIFS是直接在闪存上使用的文件系统。我想象UBIFS提到的闪存存储的某些困难可能与SSD错误有关。