Dd

dd 命令 oflag 直接和同步標誌

  • August 18, 2021

我有下面的 shell 腳本,我想知道oflag直接是自動同步還是明確要求:

dd bs=10M oflag=direct,sync of=ofile.bin

另外,說oflag=syncconv=syncconv=f ​​sync有什麼區別?

如果我將程式碼更改為下面的行會有什麼影響?

dd bs=10M conv=fsync oflag=direct of=ofile.bin

我們可能可以排除conv=sync開始。它做了一些完全不同的事情,我希望你不想要:-)。

用 NUL 填充每個輸入塊到 ibs 大小;與 block 或 unblock 一起使用時,用空格而不是 NUL 填充


oflag=direct不會自行自動同步。

$$ * $$ conv=fsync不同於oflag=sync. oflag=sync在每個輸出塊之後有效地同步。 conv=fsync最後做一個同步。

最終結果是一樣的,但是一路上的表現是不同的:-)。

  1. oflag=sync可能會明顯變慢。您可以通過增加塊大小來緩解這種情況。
  2. 如果特定於設備的記憶體很大

$$ 1 $$,這將影響例如status=progress選項報告的進度。 3. 如果您使用oflag=direct,則係統頁面記憶體中可能會累積大量寫入。這種積累會影響你看到的進度

$$ 2 $$. 而且,Linux 有時對建構的反應很差,並且會降低所有設備的性能$$ 3 $$.


$$ 1 $$“顯然你的硬體有數百兆的記憶體……在我的例子中,這是因為核心是$$ actually running inside a virtual machine $$" 。https://unix.stackexchange.com/a/420300/29483 $$ 2 $$ 為什麼 gunzip 到 dd 管道最後會變慢? $$ 3 $$ 在外部磁碟上執行大型 R/W 操作時系統滯後 $$ * $$ 當您直接寫入塊設備節點時,Linux 會在塊設備關閉時同步塊設備(並且不被任何其他程序打開)。請參閱:塊設備記憶體與文件系統。有時我看到有人在寫入塊設備時不使用顯式同步。它通常看起來工作正常……直到它不起作用。所以我建議至少使用conv=fsync.

引用自:https://unix.stackexchange.com/questions/508701