在接下來的幾個月裡,我將需要將大量磁碟清除。擦除每個驅動器後,我需要一種快速方法來確保驅動器已完全填滿零。
我可以在十六進制編輯器中打開每個文件,但所有這些所做的只是讓我看到它的某些部分已歸零,驅動器越大,這就越毫無意義,因為它不能確定沒有非-其上存在零個字元。
我決定運行一些基準測試來測試我遇到的一些工具。我對每個工具進行了一系列 3 次獨立運行的計時,以驗證同一 1TB 磁碟的擦除情況,每次運行都在相同的系統負載下過夜執行。為了處理緩存,每次運行都會在隨機位置執行工具,每次運行之間至少有 500 秒的睡眠時間。
以下是每個工具在 3 次測試中的平均運行情況,依照從最慢到最快的順序排列。
來自我自己:
time hexdump /dev/sda
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
e8e0db6000
real 284m35.474s
user 223m4.261s
sys 2m49.729s
從戈登·戴維森:
time od /dev/sda
0000000 000000 000000 000000 000000 000000 000000 000000 000000
*
16434066660000
real 148m34.707s
user 77m10.749s
sys 2m54.611s
從尼爾:
time cmp /dev/zero /dev/sda
cmp: EOF on /dev/sda
real 137m55.505s
user 8m9.031s
sys 3m53.127s
從比迪:
time badblocks -sv -t 0x00 /dev/sda
Checking blocks 0 to 976762583
Checking for bad blocks in read-only mode
Testing with pattern 0x00: done
Pass completed, 0 bad blocks found. (0/0/0 errors)
real 137m50.213s
user 5m19.287s
sys 4m49.803s
從亨內斯:
time dd if=/dev/sda status=progress bs=4M | tr --squeeze-repeats "\000" "D"
1000156954624 bytes (1.0 TB, 931 GiB) copied, 8269.01 s, 121 MB/s
238467+1 records in
238467+1 records out
1000204886016 bytes (1.0 TB, 932 GiB) copied, 8269.65 s, 121 MB/s
D
real 137m49.868s
user 27m5.841s
sys 28m3.609s
從鮑伯1:
time iszero < /dev/sda
1000204886016 bytes processed
0 nonzero characters encountered.
real 137m49.400s
user 15m9.189s
sys 3m28.042s
即使是最快的測試工具似乎也能達到 137 分鐘的上限,即 2 小時 16 分鐘,而完全擦除磁碟平均只需 2 小時 30 分鐘。
這就是促使我問這個問題的原因 - 看起來這樣的工具應該是可能的至少一半假設磁碟只需要讀取而不寫入,則擦除磁碟機所需的速度。
是否存在針對上述問題的替代、更快的解決方案?
在理想的世界中,我正在尋找的解決方案將讀取整個磁碟並列印它找到的任何非零字符,就像 Bob 的 C++ 程式一樣。這將允許我返回並選擇性地擦除任何非零位元組而不是整個磁碟。但是,如果該工具讀取磁碟的速度非常快,則這不是一個嚴格的要求。
1. 這是 Bob 寫的 C++ 程序,緩衝區大小增加到 4194304 (4 MiB),編譯為:
g++ -Wl,--stack,16777216 -O3 -march=native -o iszero iszero.cpp
答案1
磁硬碟的讀取和寫入速度大致相同。磁帶機、RAM、CD-/DVD-/BD-R,甚至是軟碟也是如此。對於旋轉介質,它主要取決於資料在磁頭(或光碟機的雷射組件)下移動的速度。如果讀取和寫入的速度不同,則必須向上(或向下)旋轉媒體才能在讀取和寫入之間切換。
快閃記憶體的讀取速度明顯快於寫入速度。