我已经阅读了有关 Linux 中命令的使用sync
及其工作原理的信息。但我无法理解何时真正应该在文件中使用它,而且我没有找到实际的例子。
例如,该命令sync --data file.txt
同步该命令的文件数据,但我没有找到关于何时应该使用它以及该命令如何工作的有用示例。
也许有一个工具可以监视这些更改,或者我需要做什么来检查该命令的效果?
答案1
从sync
联机帮助页:
内核将数据保存在内存中以避免进行(相对较慢的)磁盘读写。这可以提高性能,但如果计算机崩溃,数据可能会丢失或文件系统会损坏。
sync
确保内存中的所有内容都写入磁盘。
sync
在卸载卷、重新启动或关闭系统之前自动调用。
回答您的问题:sync
只要您想确保数据写入磁盘,您就可以调用。通常没有必要为本地驱动器明确执行此操作,但这样做不会有什么坏处。
答案2
Linux 中的 I/O 是通过虚拟文件系统 (VFS) 完成的。 VFS 缓存来自各种类型文件系统(ext?/XFS/BTFS、NFS、COW、FUSE 等)的数据结构。这意味着任何进程 I/O 都可以使用通用接口。将文件系统结构存储在内存中还使得目录和索引节点查找比每次查找磁盘要快得多。在检索数据时,读取可能仍会被暂停,但写入只会将数据移入缓冲区,更新 VFS 并返回。 包含修改数据的缓冲区称为“脏”缓冲区,并由系统在其选择的时间。 “干净”缓冲区包含与磁盘上副本相同的信息缓存,因此可以随时删除它们。
使用sync
强制系统写出脏缓冲区,并且在它们被安全地移出系统之前不会返回。正如“dr_”提到的,这必须在下马之前完成。一旦脏缓冲区被写出,它就会作为干净缓冲区保留在内存中,直到系统需要更多内存用于其他目的为止。
但有一点需要牢记;任何外部缓存对于系统来说都是未知的,因此sync
可能不完全安全。 NFS 就是一个典型的例子,一旦数据传输到远程系统,本地计算机就会释放缓冲区。远程机器可能还没有将数据写入磁盘,因此需要单独处理。另一种情况是使用外部 RAID 控制器。再次sync
确保数据已到达 RAID 控制器,但无法知道 RAID 控制器实际上已将其写入磁盘。
简而言之,在现代系统上,您通常不需要使用sync
.但是,如果您有理由相信文件系统的某些部分可能变得不可用,那么sync
ing 是明智的预防措施。例如,在对 LVM 进行任何更改之前,最好先以防sync
万一发生故障。同样,sync
建议在调整网络之前(如果您有 NFS 或类似设备),就像在移动系统或对电源进行任何操作之前进行的那样。
除非使用 O_SYNC 或类似命令打开文件。
答案3
想象一下,您在 NFS 上有一个文件,您可以将其以小块(例如逐个字符或逐行)附加到一台计算机上,然后在另一台计算机上读取。
一侧的程序对文件进行了写入,然后检查它是否在另一台计算机上发生了更改。它没有改变,因为改变被缓冲了。它只是还没有到达服务器。没有人知道系统何时决定实际发送它。
当您调用sync时,您会强制它立即刷新缓冲区。