This is what I done today, and recover my data. I was having problems duplicating (backing up a disk) with about 30 bad blocks. The first thing I have done is backup files using regular Filezilla to backup all good data. I notice that one big file was not copying correctly (Stopping in the middle and restarting the transfer). Luckly I have a previous backup of same file. To duplicate the disk, then I had to find the bad blocks on the disk using this procedure:
1st find out the problem disk identifying the HD info using fdisk -l
2nd if lets say your disk is /dev/sdb then you need to run the command
badblocks -v /dev/sdb it will list all you bad blocks on the drive. Luckily there will be a few. If no bad blocks are found, then your drive blocks are OK and need to figure something else out. My block size is 512 so I use that default number to run DD
3rd each block is 512 size, so what I done is to set bs=512
Each time I runned DD regularly as I always do, my data, after the errors, will come out corrupted. So I then use the parameters as explained on the page https://www.gnu.org/software/coreutils/manual/html_node/dd-invocation.html search the "For failing disks" part.
dd if=/dev/sdb of=/dev/sda bs=512 conv=noerror,sync iflag=fullblock
It took a while. Each bad block encountered sound like a banging on the faulty drive. It does copy block by block, and thru all my bad blocks made the same noise. The amount of times made a noise, was because it found another bad block and tells you about on display error msg. What the ‘conv=noerror,sync’ does, is to pad out bad reads with NULs, while ‘iflag=fullblock’ caters for short reads, but keeps in sync your data up to the end. No corruption at all, it just does not copy the faulty blocks and fills it with empty NULs.
After the copy with DD was done, I just replace that bad file reverting Filezilla from a past backup and everything worked OK. I hope this will be usefull for others trying to backup faulty drives.
NOTE: My bad blocks where pretty much close to each other. About 4 blocks at a time together in groups where detected bad. If your blocks are all over the disk, several files could be affected. Luckly, on my case, a big database 4gb file was only affected.
I don't know, but your hard drive should be getting requests to return bytes or several bytes at a time. I'd expect that dd would gracefully handle whatever the hard drive gives back. So if the drive actually signals that there's a complete failure to read that data (not sure they have a signal for that), then dd should handle that gracefully. Hard drives have brains in them to mitigate damage and deal with bad blocks. That mitigation has limits to it, but it's possible with a failing drive, to use it normally just a little more before it completely morphs in to a paper weight. Good luck. – James T Snell – 2011-07-11T17:12:34.327