I have a USB flash drive usb 3, the reading speed is much more than the writing speed.
Let’s say that 99% of the flash memory is already full with zeros, and I would like to fill it with zeros until 100%, by overwriting all the memory flash with zeros dd if=/dev/zero of=/dev/FLASH.
This process is going to be long, and it will minimize the life expectancy of the flash drive.
I thought, maybe it would be much quicker to check which areas are non-zero, and overwrite only those non-zertos areas with zeros?
Are there anyways of doing this? If it is interesting, I would need all this for security reasons.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Security reasons aside, let’s do it. We can (ab)use GNU ddrescue.
To detect sectors of zeros --generate-mode is useful.
When
ddrescueis invoked with the--generate-modeoption it operates in “generate mode”, which is different from the default “rescue mode”. That is, if you use the--generate-modeoption,ddrescuedoes not rescue anything. It only tries to generate amapfilefor later use.
[…]
ddrescuecan in some cases generate an approximatemapfile, frominfileand the (partial) copy inoutfile, that is almost as good as an exactmapfile. 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
ddrescueis invoked with the--fill-modeoption it operates in “fill mode”, which is different from the default “rescue mode”. That is, if you use the--fill-modeoption,ddrescuedoes not rescue anything. It only fills with data read frominfilethe blocks ofoutfilewhose status character frommapfilecoincides with one of the type characters specified as argument to the--fill-modeoption.
(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).
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0