In the coming months, I’m going to need to zero out a lot of disks. After wiping each drive, I need a quick way of making sure that the drive has been completely filled with zeroes.
I could open each one in a hex editor, but all this does is allow me to see that certain parts of it have been zeroed, which is increasingly pointless the bigger a drive gets, as it doesn’t verify for sure that no non-zero characters exist on it.
I decided to run some benchmarks to test a few tools that I came across. I timed each tool in a series of 3 separate runs verifying the wipe of the same 1TB disk, with each run executing overnight at the same system load. To deal with caching, each run executed the tools at randomised positions, with a sleep of at least 500 seconds between each tool.
Below is each tool’s average run across the 3 tests, sorted from slowest to fastest.
From myself:
time hexdump /dev/sda
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
e8e0db6000
real 284m35.474s
user 223m4.261s
sys 2m49.729s
From Gordon Davisson:
time od /dev/sda
0000000 000000 000000 000000 000000 000000 000000 000000 000000
*
16434066660000
real 148m34.707s
user 77m10.749s
sys 2m54.611s
From Neal:
time cmp /dev/zero /dev/sda
cmp: EOF on /dev/sda
real 137m55.505s
user 8m9.031s
sys 3m53.127s
From Beardy:
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
From Hennes:
time dd if=/dev/sda status=progress bs=4M | tr --squeeze-repeats " 00" "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
From Bob1:
time iszero < /dev/sda
1000204886016 bytes processed
0 nonzero characters encountered.
real 137m49.400s
user 15m9.189s
sys 3m28.042s
Even the fastest of the tools tested seems to cap out at the 137 minute mark, which is 2 hours and 16 mins, whereas even a full wipe of the disk averages 2 hours and 30 minutes.
This is what prompted me to ask this question – it seems like it should be possible for such a tool to be at least half the speed it takes to wipe a drive, given that the disk only needs to be read from and not written to.
Does an alternative, faster solution to the above exist?
In an ideal world the solution I’m looking for would read the entire disk and print any non-zero characters it finds, just like Bob’s C++ program. This would allow me to go back and selectively wipe any non-zero bytes rather than the entire disk. However, this wouldn’t be a strict requirement if the tool was very fast at reading the disk.
1. This is a C++ program written by Bob, with the buffer size changed to 4194304 (4 MiB) and compiled with:
g++ -Wl,--stack,16777216 -O3 -march=native -o iszero iszero.cpp