如何在同步/ fsync / syncfs到便携式设备后确保数据完整性

时间:2013-12-20 17:38:01

标签: c linux io

基于同步手册页,无法保证在调用同步后光盘将刷新其缓存: “根据标准规范(例如,POSIX.1-2001),sync()会调度写入,但可能会在实际写入完成之前返回。但是,因为版本1.3.20 Linux确实在等待。(这仍然没有保证数据完整性:现代磁盘有大量缓存。)“

而且,在fsync手册中,没有提到这一点。

有没有办法确保在调用同步后所有对光盘特别是便携式设备(USB)的写入都已完成?我遇到过调用sync / fsync后数据和元数据信息没有完全写入光盘的情况。 我很好奇Windows / linux中的“安全删除设备”是如何知道所有数据都是由设备本身完全写入的。

2 个答案:

答案 0 :(得分:2)

  

我很好奇Windows / linux中的“安全删除设备”是如何知道所有数据都已由设备本身完全写入。

对于IXish系统:

使用umount commandumount() system call卸载USB设备的分区。


blockdev --flushbufs

可能会刷新设备的缓冲区,但不会让任何人再次访问设备并重新填充缓冲区。


/proc文件系统中还有这个内核接口:

/proc/sys/vm/drop_caches

可用于刷新不同的缓冲区:

https://www.kernel.org/doc/Documentation/sysctl/vm.txt

逐字逐句
  

[...]

     

要释放dentries和inode:

  echo 2 > /proc/sys/vm/drop_caches
     

[...]

答案 1 :(得分:1)

至少在原则上,这是一个Linux错误。同步功能的规范是将数据完全写入永久存储器;将它留在硬件缓存中是不符合的。

我不确定正确的解决方法是什么,但您可以strace使用hwparm选项运行的-F实用程序(我认为这是正确的),看看是什么它正在做(或阅读来源,但strace更容易)。