dd 命令 oflag 直接和同步標誌
我有下面的 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
開始。它做了一些完全不同的事情,我希望你不想要:-)。用 NUL 填充每個輸入塊到 ibs 大小;與 block 或 unblock 一起使用時,用空格而不是 NUL 填充
oflag=direct
不會自行自動同步。$$ * $$
conv=fsync
不同於oflag=sync
.oflag=sync
在每個輸出塊之後有效地同步。conv=fsync
最後做一個同步。最終結果是一樣的,但是一路上的表現是不同的:-)。
oflag=sync
可能會明顯變慢。您可以通過增加塊大小來緩解這種情況。- 如果特定於設備的記憶體很大
$$ 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
.