有没有更快的方法来验证驱动器是否已完全归零?

有没有更快的方法来验证驱动器是否已完全归零?

在接下来的几个月里,我需要清空很多磁盘。在清除每个驱动器后,我需要一种快速的方法来确保驱动器已完全被零填充。

我可以用十六进制编辑器打开每一个,但这样做只是让我看到它的某些部分已被清零,而驱动器越大,这就越没有意义,因为它无法确定其中是否存在非零字符。

我决定运行一些基准测试来测试我遇到的一些工具。我对每个工具进行了 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 甚至软盘也是如此。对于旋转介质,它主要取决于数据在磁头(或光驱的激光组件)下移动的速度。如果读写速度不同,则必须加快(或减慢)介质的转速才能从读取切换到写入,然后再切换回来。

读取速度明显快于写入速度,这是闪存的特点。

相关内容