fsync(fd) 是否适用于外部程序创建的文件?
Does fsync(fd) work on a file created by external program?
我有一个禁用了写入缓存的 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 中,在 kernel/fs 缓存中的某个地方。
注意:元数据还不是问题:最终的元数据将在之后被写入并 fsynced 我已经确定数据已经到达磁盘盘片。数据本身就是问题。
所以问题是,我怎样才能帮助数据到达实际的磁盘盘片?
后来想到了运行这个单独的程序:
int fd = open(path);
fsync(fd);
close(fd);
这是否有助于刷新数据,还是我应该使用不同的方法?
Will that help flush the data,
是的,fsync 并不重要。
请注意,您可能还想 fsync 文件所在的目录,以便同步文件的元数据。
来自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.
我有一个禁用了写入缓存的 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 中,在 kernel/fs 缓存中的某个地方。
注意:元数据还不是问题:最终的元数据将在之后被写入并 fsynced 我已经确定数据已经到达磁盘盘片。数据本身就是问题。
所以问题是,我怎样才能帮助数据到达实际的磁盘盘片?
后来想到了运行这个单独的程序:
int fd = open(path);
fsync(fd);
close(fd);
这是否有助于刷新数据,还是我应该使用不同的方法?
Will that help flush the data,
是的,fsync 并不重要。
请注意,您可能还想 fsync 文件所在的目录,以便同步文件的元数据。
来自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.