我有下面的 shell 脚本,我想知道oflag的直接是自动同步还是明确要求:
dd bs=10M oflag=direct,sync of=ofile.bin
另外,说oflag=sync和conv=sync和conv=f sync有什么区别?
如果我将代码更改为下面的行会有什么影响?
dd bs=10M conv=fsync oflag=direct of=ofile.bin
我有下面的 shell 脚本,我想知道oflag的直接是自动同步还是明确要求:
dd bs=10M oflag=direct,sync of=ofile.bin
另外,说oflag=sync和conv=sync和conv=f sync有什么区别?
如果我将代码更改为下面的行会有什么影响?
dd bs=10M conv=fsync oflag=direct of=ofile.bin
我们可能可以排除
conv=sync
开始。它做了一些完全不同的事情,我希望你不想要:-)。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
[2]为什么 gunzip 到 dd 管道最后会变慢?
[3]在外部磁盘上执行大型 R/W 操作时系统滞后
[*]当您直接写入块设备节点时,Linux 会在块设备关闭时同步块设备(并且不被任何其他程序打开)。请参阅:块设备缓存与文件系统。有时我看到有人在写入块设备时不使用显式同步。它通常看起来工作正常......直到它不起作用。所以我建议至少使用
conv=fsync
.