Linux
為什麼 dd 從同一個磁碟讀取和寫入?
我一直
dd
在 Linux 中使用來覆蓋外部 USB 硬碟驅動器。當我使用 512 字節的預設塊大小時,使用以下命令:
# dd if=/dev/zero of=/dev/sdb
在整個操作過程中,硬碟驅動器 (/dev/sdb) 會交替讀取和寫入,每次大約 1GB。即
read 1GB
………………write 1GB
等等read 1GB
。write 1GB
從硬碟驅動器讀取的數據量與寫入它的數據量一樣多。我知道這種情況正在發生,因為它顯示在我的自定義 Conky 面板 (
diskio_read
,diskio_write
) 中,我知道這是 100% 可靠的磁碟 I/O 活動指示器。我已經在另一台電腦上使用不同的外部硬碟驅動器重複了此操作。它通過 USB 2.0 和 USB 3.0 發生。
相反,當我做同樣的事情,但使用 1MB 的塊大小時,使用以下命令:
# dd if=/dev/zero of=/dev/sdb bs=1M
除了開始時的少量讀取外,在操作過程中根本不會讀取硬碟驅動器。
鑑於這種現象發生在我的兩台不同的電腦和兩個不同的硬碟驅動器上,使用標準的 Linux 發行版(Xubuntu 14.04),任何想要的人都應該能夠在自己的電腦上複製它。
有人可以解釋一下這裡發生了什麼嗎?
如果您指定的塊大小(512 字節)小於磁碟的塊大小(通常為 4096 字節,但現在可能更多),則該塊將被部分寫入,因此必須保留該塊其餘部分的內容在寫作之前。
這是因為磁碟塊不能僅寫入 512 字節,但您必須一次寫入一個完整塊(4096 或更大)。當您寫入此(4096)數量或更多時,沒有部分寫入,因此不必讀取。
這基本上是 Linux 系統上緩衝 I/O 的症狀。與命令有關的對此的一個很好的概述
dd
位於是否有辦法確定 dd 的 bs 參數的最佳值?它支持 ctrl-d 的答案。然而,這也表明更大的塊大小(即大於 1M)可能會進一步提高性能。