5

我有一个禁用写缓存的 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);

这将有助于刷新数据,还是我应该使用不同的方法?

4

2 回答 2

1

这是否有助于刷新数据,

是的,谁做 fsync 并不重要。

请注意,您可能还希望同步文件所在的目录,以便同步文件的元数据。

于 2015-03-10T13:25:37.933 回答
0

来自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.
于 2015-03-10T13:26:01.870 回答