RECOVERDISK(1)          FreeBSD General Commands Manual         RECOVERDISK(1)

NAME

     recoverdisk - recover data from disk-like devices.

SYNOPSIS

     recoverdisk [-b bigsize] [-i interval] [-r readlist] [-s interval]
                 [-u pattern] [-v] [-w writelist] source [destination]

DESCRIPTION

     The recoverdisk utility reads all data from the source and retries read
     operations until they succeed.  If destination is specified all data read
     be written there.

     The internal work-list can be saved and loaded so that recoverdisk
     sessions can be resumed, for instance when a marginal source hard-disk
     shuts down.

     The work-list is initialized with a single item which covers the entire
     source and recoverdisk always chips away at the first item on the work-
     list.

     When a read succeeds, that part of the current chunk is eliminated from
     the work-list.

     When a read fails, that part of the item is appended to the worklist as a
     separate item, and will be retried in due order.  If destination is
     specified, the corresponding range is filled with '_UNREAD_'.

     The first pass attempts to read everything in "big-size" chunks, the
     second pass reads in "medium-size" chunks and third and subsequent passes
     read in "small-size" chunks.  This three stage process is an attempt to
     optimize the case where only a few bad blocks exist on source.  If too
     many read-errors are encountered, recoverdisk will fall back to smaller
     sizes sooner.

     The three sizes default to 128kB (or less if the sector size does not
     divide 128kB cleanly, for instance audio CD media), and the reported
     DIOCGSTRIPESIZE and DIOCGSECTORSIZE respectively.

     The options are as follows:

     -b bigsize
             The size of reads attempted in first pass.

     -m mediumsize
             The size of reads attempted in second pass.

     -s smallsize
             The size of reads attempted in third and subsequent passes.

     -r work-list-file
             Read the work-list from a file.

     -w work-list-file
             Write the work-list to a file when a read succeed, but at most
             once every minute.

     -l log-file
             Each successful read is logged with timestamp, offset and length.

     -t totalsize
             How many bytes should be recovered.  The default is what
             DIOCGMEDIASIZE reports for character and block devices or st_size
             if source is a regular file.

     -i pause
             sleep(3) this long between reads.  This reduces the load on the
             source device and the system in general.

     -p pause
             sleep(3) this long whenever a read fails.  This makes the source
             device look less sick to the operating system.

     -u pattern
             By default blocks which cannot be read are filled with the
             pattern `_UNREAD_' in the output file.  This option can be used
             to specify a different pattern.  If the pattern is the empty
             string, nothing is written.

     -v      Produce a detailed progress report with ANSI escapes and UTF-8.

     recoverdisk can be aborted with SIGINT, but with a sick source it may
     take up to several minutes before the current read operation returns from
     the kernel.

EXAMPLES

     # check if all sectors can be read on a USB stick:
     recoverdisk /dev/da0

     # recover data from failing hard drive ada3
     recoverdisk /dev/ada3 /data/disk.img

     # clone a hard disk
     recoverdisk /dev/ada3 /dev/ada4

     # read an ISO image from a CD-ROM
     recoverdisk /dev/cd0 /data/cd.iso

     # continue reading from a broken CD and update the existing worklist
     recoverdisk -r worklist -w worklist /dev/cd0 /data/cd.iso

     # recover a single file from the unreadable media
     recoverdisk /cdrom/file.avi file.avi

PRACTICAL ADVICE

     In Datamuseum.dk recoverdisk has been used to recover all sorts of data-
     media for two decades, here are some things we have learned:

     o   Interacting with failing hardware has a tendency to crash machines,
         so it is always a good idea to use the --w -work-list-file so that it
         is possible to continue.

     o   When attempting to recover hard to read data from failing hard disks,
         it pays to pamper the drive as much as possible:

     o   It is generally best to keep the drive in it's usual physical
         orientation, but it can also help to try other orientations.

     o   Insulate the drive from external vibrations.

     o   Keep the drive cool with a fan.

     o   If possible, power the drive from a laboratory power supply.

     o   Do not loose patience:  Let recoverdisk run as long as possible.

     o   (S)ATA controllers do not handle failing disks well, if this is a
         problem, use a USB-(S)ATA adapter instead.

     o   The recoverdisk source code is deliberately written to be easily
         portable to older versions of FreeBSD and to other operating systems.

     o   If you need to read ST-506, RLL or ESDI drives FreeBSD 3.5.1 is a
         good compromise.

     o   Sometimes forcing the disk to step between reads helps.  Since
         recoverdisk process the work-list in the order it is read, this can
         be accomplished by sorting the work-list with something like:
               % sort +0.5

     o   By default the CAM layer will retry failing read operations, but that
         will get stuck on the bad sectors for long time and delay recovering
         what actually can be read from a rapidly failing drive.  In that
         situation, set the appropriate
               kern.cam.*.retry_count
         sysctl to zero.

     o   For floppies and un-zoned hard disks (ST-506 to early IDE) set -b
         bigsize to the size of a track.

SEE ALSO

     dd(1), ada(4), cam(4), cd(4), da(4)

HISTORY

     The recoverdisk utility first appeared in FreeBSD 7.0 because Somebodytm
     forgot to make a backup copy.

AUTHORS

     The original implementation was done by Poul-Henning Kamp
     <phk@FreeBSD.org> with minor improvements from Ulrich Sporlein
     <uqs@FreeBSD.org>.

     This manual page was originally written by Ulrich Sporlein.

BUGS

     If a failing device causes the machine to crash, there is a risk that a
     chunk might have been successfully read and removed from the work-list,
     but not yet flushed to the destination.

     recoverdisk calls fdatasync(3) on the destination before writing the
     work-list to a temporary file, and calls it again on the temporary file
     before renaming it to the specified -w work-file-list filename.  But even
     then things dont always work out.

     recoverdisk should have an option for reconstructing the work-list from
     the destination by enumerating the -u pattern filled ranges.

FreeBSD 15.1-STABLE-HBSD         April 3, 2020                  RECOVERDISK(1)