Sometimes disks have errors or an SSD disk has a bad NAND cell. Saving the whole hard disk data may not be needed and when only a specific file or two are important and which cannot be copied by cp or rsync because of “Unrecovered read error”.
Furthermore, the SSD reallocates the bad cells, when there are writes to the cell(s), which may not occur years, but reading may be each day. Reading from a sector with bad NAND cells will result in slow IO (multiple read commands are executed before giving up). Copying the file to a new place without only 512 bytes may not harm the data, but it is difficult to be done with the generic tool for copying.
This article is to save single files from a mounted ext4 file system with bad sectors using the ddrescue tool – https://www.gnu.org/software/ddrescue/ In fact, the ddrescue could save files or whole devices.
STEP 1) Install ddrescue.
Installing ddrescue is pretty easy. The tool is included in almost all Linux distributions and it doesn’t have many dependencies. Apparently, there is another dd_rescue tool, which is different than this one, just follow the link above for the tool used here.
CentOS 7/8 or Fedora:
yum install -y ddrescue
Ubuntu last 10 years versions:
apt install -y gddrescue
Gentoo:
emerge -v ddrescue
STEP 2) Rescuing a single file with read errors because of bad sectors in a mounted file system.
[root@srv Snapshots]# ddrescue -v \{9f02ae0a-6dae-4729-b6a6-ec3f0550f294\}.vdi test2.vdi GNU ddrescue 1.25 About to copy 15724 MBytes from '{9f02ae0a-6dae-4729-b6a6-ec3f0550f294}.vdi' to 'test2.vdi' Starting positions: infile = 0 B, outfile = 0 B Copy block size: 128 sectors Initial skip size: 384 sectors Sector size: 512 Bytes Press Ctrl-C to interrupt ipos: 13495 MB, non-trimmed: 0 B, current rate: 0 B/s opos: 13495 MB, non-scraped: 0 B, average rate: 162 MB/s non-tried: 0 B, bad-sector: 8192 B, error rate: 4608 B/s rescued: 15724 MB, bad areas: 2, run time: 1m 36s pct rescued: 99.99%, read errors: 18, remaining time: 0s time since last successful read: 0s Finished [root@srv Snapshots]# ls -al total 52602944 drwx------. 2 root root 4096 Jun 2 02:22 . drwxr-xr-x. 4 root root 4096 Jun 1 14:16 .. -rw-------. 1 root root 459981735 Nov 8 2018 2018-11-08T15-19-17-776317000Z.sav -rw-------. 1 root root 566704069 Jun 1 14:16 2020-06-01T11-16-05-735318000Z.sav -rw-------. 1 root root 8329887744 Jun 1 12:53 {3d30ebea-2e2f-4e33-8088-d3d66f315e2c}.vdi -rw-------. 1 root root 15724445696 Nov 8 2018 {9f02ae0a-6dae-4729-b6a6-ec3f0550f294}.vdi -rw-------. 1 root root 4012900352 Jun 1 14:16 {f7e72510-7dce-48fd-b62c-630664ad984f}.vdi -rw-r--r--. 1 root root 15724445696 Jun 2 02:24 test2.vdi -rw-------. 1 root root 9051041792 Jun 2 02:19 test.vdi
Here is an animated gif of the ddrescue procedure:
Keep on reading!