在接下来的几个月里,我需要清空很多磁盘。在清除每个驱动器后,我需要一种快速的方法来确保驱动器已完全被零填充。
我可以用十六进制编辑器打开每一个,但这样做只是让我看到它的某些部分已被清零,而驱动器越大,这就越没有意义,因为它无法确定其中是否存在非零字符。
我决定运行一些基准测试来测试我遇到的一些工具。我对每个工具进行了 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 甚至软盘也是如此。对于旋转介质,它主要取决于数据在磁头(或光驱的激光组件)下移动的速度。如果读写速度不同,则必须加快(或减慢)介质的转速才能从读取切换到写入,然后再切换回来。
读取速度明显快于写入速度,这是闪存的特点。