我有下面的 shell 脚本,我想知道oflag的direct是否自动进行同步,或者是否明确需要:
dd bs=10M oflag=direct,sync of=ofile.bin
Run Code Online (Sandbox Code Playgroud)
另外,说oflag=sync和conv=sync和conv=fsync 有什么区别?
如果我把代码改成下面这行有什么影响?
dd bs=10M conv=fsync oflag=direct of=ofile.bin
Run Code Online (Sandbox Code Playgroud)
我们可能可以排除conv=sync开始。它做了一些相当不同的事情,我希望你不想要:-)。
用 NUL 填充每个输入块到 ibs-size;当与 block 或 unblock 一起使用时,用空格而不是 NUL 填充
oflag=direct 不会自动同步。[*]
conv=fsync不同于oflag=sync。 oflag=sync在每个输出块之后有效地同步。 conv=fsync最后进行一次同步。
最终结果是一样的,但一路上的表现是不同的:-)。
oflag=sync可能会慢很多。您可以通过增加块大小来缓解这种情况。
如果特定于设备的缓存很大[1],这将影响由status=progress选项报告的进度。
如果不使用oflag=direct,则系统页面缓存中可能会产生大量写入。这种积累会影响你看到的进展[2]。而且,Linux 有时对构建的响应很差,并且会降低所有设备的性能[3]。
[1]“显然你的硬件有数百兆字节的缓存......就我而言,这是因为内核[实际上在虚拟机内运行]”。https://unix.stackexchange.com/a/420300/29483
[*]当您直接写入块设备节点时,Linux 会在块设备关闭时同步该块设备(并且不会被任何其他程序打开)。请参阅:块设备缓存与文件系统。有时我看到有人在写入块设备时不使用显式同步。它通常看起来工作正常......直到它没有。所以我建议至少使用conv=fsync.