文件系统:覆盖等长数据

File-system: Overwriting data of equal length

我有一个项目,在断电的情况下,我必须非常频繁地更新磁盘上的数据。当用等长的数据覆盖文件中的 512b(我的驱动器的 1 个扇区)时,文件系统是否标记已更改的扇区并在准备刷新时在磁盘上更新它们?还是每次刷新更改时都会写入整个文件?我主要关注 ext4,但我很好奇它是否与每个文件系统都相同。

如果标准不是跟踪更改而是覆盖整个文件,有没有办法改变这个?一些写入选项?

通常 Linux 文件缓存在页面缓存中,页面是否脏在页面级别进行跟踪。在 Intel x86 平台上,页面大小是 4k,所以如果你弄脏了一个 4k 页面,它就是被写回的 4k 页面。

如果您只想覆盖一个 512 字节的扇区,并且您的 HDD 有 512 字节的扇区,您可以使用 O_DIRECT 标志打开文件,如果您发出 512 字节的写入,在一个 512 字节的倍数的文件偏移量上,并且你写入的内存缓冲区也是 512 字节对齐的,那么你可以绕过页面缓存,写入将直接进入磁盘(因此 O_DIRECT).

请注意,许多现代磁盘确实使用 4k 物理扇区,但出于向后兼容的原因,它们正在模拟 512 字节扇区。这些磁盘有时称为 512e 扇区(e 表示模拟)。在这些驱动器上,如果您执行 512 字节扇区写入,磁盘将执行读取-修改-写入循环,因为驱动器内部一次只能写入 4k。这对您来说是性能上的损失,但从功能的角度来看,它看起来与传统的老式 512 扇区 HDD 相同。