dd 命令 oflag 直接和同步标志

dd 命令 oflag 直接和同步标志

我有下面的 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=syncoflag=sync在每个输出块之后有效同步。 conv=fsync最后进行一次同步。

最终结果是相同的,但一路上的表现是不同的:-)。

  1. oflag=sync可能会明显慢一些。您可以通过增加块大小来缓解这种情况。

  2. 如果设备特定的缓存很大[1],这将影响选项报告的进度status=progress

  3. 如果你这样做不是使用oflag=direct,则系统页面缓存中可能会积累大量写入操作。这种积累将影响您看到的进度[2]。而且,Linux 有时对构建的响应很差,并降低了性能全部设备[3]。


[1]“显然你的硬件有数百兆字节的缓存......就我而言,这是因为内核[实际上在虚拟机内运行]”。https://unix.stackexchange.com/a/420300/29483

[2]为什么从gunzip到dd管道最后会变慢?

[3]在外部磁盘上执行大量读写操作时系统滞后

[*]当直接写入块设备节点时,Linux 在块设备关闭时(并且未被任何其他程序打开)同步该块设备。看:块设备缓存与文件系统。有时我看到有人在写入块设备时不使用显式同步。它通常看起来工作正常......直到它不起作用。所以我建议至少使用conv=fsync.

相关内容