我有一个项目,我必须在断电的情况下经常更新磁盘上的数据。当在文件中使用相等长度的数据完全覆盖512b(我的驱动器的1个扇区)时,文件系统是否标记已更改的扇区并在准备冲洗时在磁盘上更新它们?或者它每次刷新更改时都会写入整个文件吗?我主要关注ext4,但我很好奇是否与每个文件系统相同。
如果标准不是跟踪更改但是覆盖整个文件有没有办法改变这个?一些写选项?
答案 0 :(得分:1)
通常,Linux文件缓存在页面缓存中,并且在页面级别跟踪页面是否脏。在Intel x86平台上,页面大小为4k,因此如果你弄脏4k页面,那么4k页面就会被写回来。
如果您只想覆盖单个512字节扇区,并且您有一个具有512字节扇区的HDD,则可以使用O_DIRECT标志打开该文件,如果发出512字节写入,则在文件偏移量上打开512字节的倍数,并且您从中获取写入的内存缓冲区也是512字节对齐的,然后您可以绕过页面缓存,并且写入将直接进入磁盘(因此O_DIRECT)。
请注意,许多现代磁盘确实使用4k物理扇区,但出于向后兼容性原因,它们模拟512字节扇区。这些磁盘有时称为512e扇区(e表示模拟)。在这些驱动器上,如果进行512字节扇区写操作,磁盘将执行读 - 修改 - 写周期,因为驱动器内部一次只能写4k。这对于性能影响很明显,但从功能角度来看,它看起来与传统的老式512扇区硬盘相同。