如何在同步/ fsync / syncfs到便携式设备后确保数据完整性
基于同步手册页,无法保证在调用同步后光盘将刷新其缓存:“根据标准规范(例如,POSIX.1-2001),sync()调度写入,但可能在实际写入之前返回但是,由于版本1.3.20 Linux确实在等待。(这仍然不能保证数据的完整性:现代磁盘有很大的缓存。)“
并且,在fsync手册中,没有提到这一点。
有没有办法确保在调用同步后所有写入光盘特别是便携式设备(USB)的写入? 我遇到过调用sync / fsync后数据和元数据信息没有完全写入光盘的情况。 我很好奇Windows / linux中的“安全删除设备”是如何知道所有数据都是由设备本身完全写入的。
我很好奇Windows / linux中的“安全删除设备”是如何知道所有数据都是由设备本身完全写入的。
对于IXish系统:
使用umount
命令或umount()
系统调用卸载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
[…]
至少在原则上,这是一个Linux错误。 同步function的规范是将数据完全写入永久存储器; 将它留在硬件缓存中是不符合要求的。
我不确定正确的解决方法是什么,但是您可以使用-F
选项运行hwparm
实用程序(我认为这是正确的)以查看它正在做什么(或者读取源代码,但strace
更容易)。