Dd

如何防止 dd 的進度在 Linux 上毫無意義?

  • April 4, 2020

在 Linux 上執行dd複制 ISO 的命令時,我得到一個長時間(幾分鐘)保持打開狀態的進度列印。然後最後一個。

問題似乎是正在使用一個非常大的記憶體,這混淆了dd的輸出。

sudo dd bs=4M if=my.iso of=/dev/sdc status=progress

輸出(第一行顯示很長時間)。

1535115264 bytes (1.5 GB, 1.4 GiB) copied, 1.00065 s, 1.5 GB/s
403+1 records in
403+1 records out
1692844032 bytes (1.7 GB, 1.6 GiB) copied, 561.902 s, 3.0 MB/s

有沒有辦法防止這種情況發生,所以進度輸出是有意義的?

從第一行我們可以看出dd在一秒鐘內讀取和寫入了 1.5GB。即使是 SSD 也不能寫得那麼快。

發生的事情是 /dev/sdc 塊設備接受了它(寫回),但沒有將它發送到磁碟而是緩衝它並開始以磁碟可以接受的速率寫入磁碟。類似於 3MiB/s。

系統不能像那樣無限期地緩衝數據,它只能接受這麼多的數據來保持非送出的狀態。所以過了一段時間(在你的情況下,在寫入超過 1.5GB 但不到 2 秒之後(因為每秒寫入進度線)),dd系統write()呼叫將阻塞,直到數據被刷新到磁碟(在此期間它無法寫入進度消息)。當它通過時,dd可以發送幾個額外失去的兆字節,並且會在不到一秒的時間內發生,因此您只會獲得一個額外的進度線。

要查看不同的行為,您可以強制寫入同步,除非數據已送出到磁碟,否則不會返回。例如通過使用oflag=sync or oflag=dsyncor oflag=direct(雖然我不建議這樣做)。

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