dd 命令 oflag 直接和同步标志

Ibr*_*ish 5 dd

我有下面的 shell 脚本,我想知道oflagdirect是否自动进行同步,或者是否明确需要:

dd bs=10M oflag=direct,sync of=ofile.bin
Run Code Online (Sandbox Code Playgroud)

另外,说oflag=syncconv=syncconv=f​​sync 有什么区别?

如果我把代码改成下面这行有什么影响?

dd bs=10M conv=fsync oflag=direct of=ofile.bin
Run Code Online (Sandbox Code Playgroud)

sou*_*edi 9

我们可能可以排除conv=sync开始。它做了一些相当不同的事情,我希望你不想要:-)。

用 NUL 填充每个输入块到 ibs-size;当与 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]在外部磁盘上执行大型 R/W 操作时系统滞后

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