While you can verify a zero-filled disk with hexdump (among other tools), it takes many hours on large-capacity drives. I cobbled together a bash script to quickly check a user-defined number of megabytes from the beginning, middle, and end of a disk for zeros. Here's what it looks like when run under OS X (disk 0 and 1 details have been truncated):
$ sudo zerocheck.sh
zerocheck.sh - check disk for zeros
/dev/disk0
...
/dev/disk1
...
/dev/disk2
#: TYPE NAME SIZE IDENTIFIER
0: *500.1 GB disk2
Enter disk to check (e.g., /dev/disk2)
/dev/disk2
How many megabytes to check from the beginning, middle, and end of the disk?
1
/dev/disk2 has 500107862016 bytes.
The first 1048576 bytes:
0000000 000000 000000 000000 000000 000000 000000 000000 000000
*
1048576
1048576 bytes from the middle:
250053931008 000000 000000 000000 000000 000000 000000 000000 000000
*
250054979584
And the final 1048576 bytes:
500106813440 000000 000000 000000 000000 000000 000000 000000 000000
*
500107862016
There are two versions of the script. One for OS X:
#!/bin/bash
# zerocheck.sh - check the beginning, middle, and end of a drive for zeros.
# "when you don't have the time or interest for a full hexdump"
# tested under:
# mac os x 10.6 - 10.10
echo -e "\nzerocheck.sh - check disk for zeros\n"
# check os, display block devices, assign user's choice to variable "DISK2CHK"
if [ "$(uname)" == "Darwin" ]; then
diskutil list
echo "Enter disk to check (e.g., /dev/disk2)"
read DISK2CHK
else
echo "This script has only been tested under OS X."
exit 1
fi
# ask for MBs to check, accepting only 1 or greater as valid input, and assign to variable "MB"
MB=0
until [ $MB -ge 1 2>/dev/null ]; do
echo -e "\nHow many megabytes to check from the beginning, middle, and end of the disk?"
read MB
done
# convert MBs to bytes and assign to variable "BYTES2CHK"
BYTES2CHK=$((MB * 1048576))
# get the number of bytes via diskutil, stripping leading "(", and assign to variable "BYTES"
BYTES=`diskutil info $DISK2CHK | awk '/Total\ Size/ {sub(/\(/, x); print $5}'`
# let the user know how many bytes the disk has
echo -e "\n$DISK2CHK has" $BYTES "bytes.\n"
# check beginning of disk. (-Ad = decimal; Nx = dump at most x bytes)
echo "The first $BYTES2CHK bytes:"
od -Ad -N$BYTES2CHK $DISK2CHK
# check middle of disk. (-jx = skip x bytes)
echo -e "\n$BYTES2CHK bytes from the middle:"
# divide $BYTES by 2 and assign result to variable "MIDDLEOFDISK"
MIDDLEOFDISK=`expr $BYTES / 2`
od -Ad -j$MIDDLEOFDISK -N$BYTES2CHK $DISK2CHK
# check end of disk:
echo -e "\nAnd the final $BYTES2CHK bytes:"
# subtract BYTES2CHK from BYTES and assign to variable "ENDOFDISK"
ENDOFDISK=$((BYTES - BYTES2CHK))
od -Ad -j$ENDOFDISK $DISK2CHK
And the other for Linux:
#!/bin/bash
# zerocheck.sh - check the beginning, middle, and end of a drive for zeros.
# "when you don't have the time or interest for a full hexdump"
# tested under:
# lubuntu 12.10 (though any distro with util-linux 2.19 or higher should work)
echo -e "\nzerocheck.sh - check disk for zeros\n"
# check os, display block devices, assign user's choice to variable "DISK2CHK"
if [ "$(uname)" == "Linux" ]; then
lsblk
echo "Enter disk to check (e.g., /dev/sdc)"
read DISK2CHK
else
echo "This script has only been tested under Linux."
exit 1
fi
# ask for MBs to check, accepting only 1 or greater as valid input, and assign to variable "MB"
MB=0
until [ $MB -ge 1 2>/dev/null ]; do
echo -e "\nHow many megabytes to check from the beginning, middle, and end of the disk?"
read MB
done
# convert MBs to bytes and assign to variable "BYTES2CHK"
BYTES2CHK=$((MB * 1048576))
# get the number of bytes via lsblk and assign to variable "BYTES"
BYTES=`lsblk -b $DISK2CHK | awk 'NR==2 {print $4}'`
# let the user know how many bytes the disk has
echo -e "\n$DISK2CHK has" $BYTES "bytes.\n"
# check beginning of disk. (-Ad = decimal; Nx = dump at most x bytes)
echo "The first $BYTES2CHK bytes:"
od -Ad -N$BYTES2CHK $DISK2CHK
# check middle of disk. (-jx = skip x bytes)
echo -e "\n$BYTES2CHK bytes from the middle:"
# divide $BYTES by 2 and assign result to variable "MIDDLEOFDISK"
MIDDLEOFDISK=`expr $BYTES / 2`
od -Ad -j$MIDDLEOFDISK -N$BYTES2CHK $DISK2CHK
# check end of disk:
echo -e "\nAnd the final $BYTES2CHK bytes:"
# subtract BYTES2CHK from BYTES and assign to variable "ENDOFDISK"
ENDOFDISK=$((BYTES - BYTES2CHK))
od -Ad -j$ENDOFDISK $DISK2CHK
The script can be tested on an image file:
/nix | Jan 26, 2014