根据 sync 手册页,不能保证调用 sync 后光盘会刷新其缓存: “根据标准规范(例如 POSIX.1-2001),sync() 会安排写入,但可能会在实际写入完成之前返回。但是,由于版本 1.3.20 Linux 实际上会等待。(这仍然没有保证数据完整性:现代磁盘有大缓存。)“
而且,在fsync手册中,没有提到这一点。
有没有办法确保在调用 sync 后所有写入磁盘尤其是可移植设备 (USB) 的操作已完成?我遇到过调用sync/fsync后数据和元数据信息还没有完全写入光盘的情况。 我很好奇windows/linux中的“Safely remove device”怎么知道所有的数据都已经被设备自己完全写入了。
最佳答案
I am curious how "Safely remove device" in windows/linux knows that all data has been fully written by the device itself.
对于 IXish 系统:
使用 umount
command 卸载 USB 设备的分区或 umount()
system call .
做
blockdev --flushbufs
可能会刷新设备的缓冲区,但不会阻止任何人再次访问设备并重新填充缓冲区。
在/proc
文件系统中也有这个内核接口(interface):
/proc/sys/vm/drop_caches
可用于刷新不同的缓冲区:
逐字记录来自 https://www.kernel.org/doc/Documentation/sysctl/vm.txt
[...]
To free dentries and inodes:
echo 2 > /proc/sys/vm/drop_caches
[...]
关于c - 如何在 sync/fsync/syncfs 到可移植设备后确保数据完整性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20709080/