我有一个禁用写缓存的SATA硬盘:
hdparm -W0 /dev/foo
我正在使用具有以下挂载选项(以及其他选项)的ext4
分区进行操作:
data=ordered
auto_da_alloc
Linux 内核版本为 2.6.32-5-686
。
现在,我有一个无法修改的外部程序,但我知道它通过以下方式创建一个文件:
int fd = open(path);
write(fd, data, data_size);
close(fd);
即它在关闭前不会同步。因此,此时,数据可能位于RAM中,位于内核/fs缓存中的某个位置。
注意:元数据还不是问题:最终元数据将在我确保数据到达磁盘盘片后写入和同步。数据本身就是问题所在。
所以问题是,我怎样才能帮助数据到达实际的磁盘盘片?
我想过之后运行这个单独的程序:
int fd = open(path);
fsync(fd);
close(fd);
这是否有助于刷新数据,或者我应该使用不同的方法?
是的,这将有助于刷新数据吗?
它会的,谁做同步并不重要。
请注意,您可能还希望同步文件所在的目录,以便同步文件的元数据。
从 man fsync
:
Calling fsync() does not necessarily ensure that the entry in the
directory containing the file has also reached disk. For that an
explicit fsync() on a file descriptor for the directory is also
needed.