我想问哪个文件系统最能抵御损坏和文件损坏。我的意思是,对我的数据来说最安全,可以防止在停电或断电的情况下丢失数据等。
例如:如果有人意外将我的 Ubuntu 机器从电源插座上断开,我希望我的数据是安全的。
答案1
当发生断电时,文件系统具有不同程度的抗损坏能力,从抗损坏能力最弱到抗损坏能力最强。
没有日志功能的文件系统。
例子:
ext2
,fat32
,fat16
此类文件系统无法防止因断电而导致的文件系统损坏。在写入过程中断电后,文件的元数据可能处于不一致状态,这意味着文件系统实际上已损坏并需要修复。修复不一定能够从单个时间点成功重建文件的元数据。例如,在某些情况下,修复工具可能无法了解有关文件的某些详细信息。
具有写回日志模式的文件系统。
例如:
ext3
/ext4
与data=writeback
,NTFS
对文件元数据的写入会被记录下来。写入期间断电后,文件的元数据可以回滚,使文件系统保持一致状态,无需修复。但是,对文件实际数据的任何更改都无法回滚,文件可能会处于不一致状态。
即使文件元数据已成功提交,文件中仍可能残留写入操作之前的旧数据。
具有有序日志模式的文件系统。
示例:
ext3
/ext4
与data=ordered
与写回模式非常相似。写入文件元数据的过程会被记录下来,系统会确保文件数据被写入前元数据更改已提交到日志中。写入期间断电后,元数据可以回滚,使文件系统保持一致状态,无需修复。对文件实际数据的任何更改都无法回滚,文件可能会处于不一致状态。
这与写回模式的不同之处在于,你至少永远不会留下较旧文件中的数据比其元数据更多,并且永远不会留下之前不属于该文件如果提交了元数据,那么可以保证文件数据至少与元数据保持同步,尽管它可能仍包含一些更新来自稍后写入该文件的部分数据。
有了这个约束可以提高安全性,并提高应用程序实现自己的数据完整性措施的能力,这些措施依赖于文件的元数据,至少反映了在某个阶段对文件所做的写入。
具有完整日志模式的文件系统。
例如:
ext3
/ext4
与data=journal
,Reiser4
元数据和所有文件数据的写入均会记录在日志中。写入过程中断电后,文件的元数据及其所有数据均可恢复到故障前的状态。
此模式的性能损失最大,因为所有数据都必须写入两次,从而导致吞吐量减半。因此,很少使用。依赖数据完整性的应用程序可以自行采取措施,确保文件数据可以从不一致状态恢复,只要它们可以信任文件的元数据即可。
特别提及:日志结构文件系统或写时复制
例子:
btrfs
,ZFS
某些文件系统(例如 btrfs)提供与完整日志文件系统类似的保护,但性能损失却没有那么大
btrfs
。日志结构文件系统. 写入元数据和所有文件数据都会写入一个很长的写入日志,这样就可以完全回滚文件元数据和内容,但这不需要对文件数据执行单独的“提交”步骤,因为文件数据在写入时会被复制,这样就可以回滚而无需写入两次。如果由于断电导致写入失败,则日志只会重播到上次成功的写入,这样仍然可以访问完全一致状态下的旧版本文件。ZFS
是写时复制文件系统具有与日志结构文件系统类似的优点。
笔记:写缓存和屏障
无论文件系统如何,驱动器本身的写入缓存都可以通过以不同于队列中顺序的方式执行排队写入命令来优化性能。然而,这实际上会使所有日志记录变得无用,或者至少使除写回之外的所有日志记录模式变得无用,因为写回不太可能受到此优化的太大影响。
然而,为了解决这个问题,驱动器已经实施了“写入屏障”的概念,计算机可以告诉驱动器,在开始特定写入之前,它必须完成所有先前的写入。现代操作系统使用写入屏障来确保日志文件系统能够从日志提供的完整性中充分受益。在典型的文件写入操作中,写入屏障会失去驱动器无序执行写入能力所带来的大部分性能优势,但某些应用程序(例如某些数据库服务器)即使启用了写入屏障,仍可能从中受益。
可以在分区的挂载选项中禁用写入屏障,但如果您使用的是更好的日志记录模式之一(例如有序日志记录或完整日志记录),则可能不想这样做。
某些磁盘驱动器设计有专用的备用电池,可在断电时用来完成写入队列中的所有写入。如果您有这样的驱动器并且相信备用电池可以完成此操作,则可以安全地禁用写入屏障并从驱动器中的无序写入中获得更多好处。
Ubuntu 当前的默认设置ext4
是有序日志模式。这比没有日志要好得多,因为文件系统本身不会处于损坏状态,而且它比写回,因为它保证如果文件的元数据更新,其内容也会更新。请注意,的默认值ext3
已更改为写回几年前。
btrfs
被设计为ext3/4
和未来的 Linux 发行版的替代品可能将其切换为默认设置,尽管这并非必然。如果确实发生这种情况,它将带来更好的干净回滚能力,而不会产生显着的性能损失。
答案2
就文件系统本身而言,默认文件系统 ext4 在断电时可以正常工作,就像任何日志文件系统一样。如果您考虑在故障时未完全保存的单个文件,那么没有文件系统可以帮助它们。