我有下面的 shell 脚本,我想知道是否奥弗拉格的直接的是否同步自动或明确要求时:
dd bs=10M oflag=direct,sync of=ofile.bin
还有说的有什么区别oflag=同步和转换=同步和转换=fsync?
如果我将代码更改为下面这行,会有什么影响?
dd bs=10M conv=fsync oflag=direct of=ofile.bin
答案1
我们或许可以conv=sync
从一开始就排除这一可能性。它做了一些相当不同的事情,我希望你不想要:-)。
用 NUL 填充每个输入块至 ibs 大小;与 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
.