Security reasons aside, let's do it. We can (ab)use GNU ddrescue
.
To detect sectors of zeros --generate-mode
is useful.
When ddrescue
is invoked with the --generate-mode
option it operates in "generate mode", which is different from the default "rescue mode". That is, if you use the --generate-mode
option, ddrescue
does not rescue anything. It only tries to generate a mapfile
for later use.
[…]
ddrescue
can in some cases generate an approximate mapfile
, from infile
and the (partial) copy in outfile
, that is almost as good as an exact mapfile
. It makes this by simply assuming that sectors containing all zeros were not rescued.
[…]
ddrescue --generate-mode infile outfile mapfile
(source)
Let's pretend your device is outfile
from previous ddrescue
run. We cannot use it as infile
(because ddrescue
refuses to work when infile
and outfile
are the same file), we need a dummy one, /dev/zero
will do. We should know the physical sector size of your device and use it with -b
option. This command may help:
lsblk -o NAME,PHY-SEC /dev/FLASH
Here I assume it's 512
.
ddrescue -b 512 --generate-mode /dev/zero /dev/FLASH flash.map
Now flash.map
describes every sector either as non-tried (?
) or as finished (+
), depending on whether it was full of zeros or not. The next step is to fill non-zero sectors with zeros; --fill-mode
is perfect for this job:
When ddrescue
is invoked with the --fill-mode
option it operates in "fill mode", which is different from the default "rescue mode". That is, if you use the --fill-mode
option, ddrescue
does not rescue anything. It only fills with data read from infile
the blocks of outfile
whose status character from mapfile
coincides with one of the type characters specified as argument to the --fill-mode
option.
(source)
We must use the same -b
value as with --generate-mode
, additionally --force
to overwrite the output device. This is the command:
ddrescue -b 512 --force --fill-mode=+ /dev/zero /dev/FLASH flash.map
This time /dev/zero
is not just a dummy argument, it's the actual source of data (zeros) written to the device.
Now /dev/FLASH
is filled with zeros. Note there may be buffers you need to flush before you physically disconnect the device (useful links: 1, 2, 3).
dd if=/dev/zero of=/dev/FLASH
would be a heck of a lot faster than writing a program to read the drive one block at a time, comparing it to zeros, and rewriting it if it is.dd if=/dev/zero of=/dev/FLASH
is not secure enough for legal/compliance purposes, if that is a concern readmoar on secure erase.