Provided by: safecopy_1.7-5_amd64 bug

NAME

       safecopy - rescue data from a source that causes IO errors

SYNOPSIS

       safecopy [OPTION]... SOURCE DEST

DESCRIPTION

       safecopy  tries  to  get  as  much  data from SOURCE as possible, even resorting to device
       specific low level operations if applicable.

       This is achieved by identifying problematic or  damaged  areas,  skipping  over  them  and
       continuing  reading  afterwards.  The corresponding area in the destination file is either
       skipped (on initial creation that means padded with zeros) or deliberately filled  with  a
       recognizable pattern to later find affected files on a corrupted device.

       Safecopy  uses  an  incremental  algorithm  to identify the exact beginning and end of bad
       areas, allowing the user to  trade  minimum  accesses  to  bad  areas  for  thorough  data
       resurrection.

       Multiple  passes  over  the  same file are possible, to first retrieve as much data from a
       device as possible with minimum harm, and then trying to retrieve some  of  the  remaining
       data with increasingly aggressive read attempts.

       For  this  to  work,  the source device or file has to be seekable. For unseekable devices
       (like tapes) you can try to use an external script to execute a controlled skip  over  the
       damaged part for you.

       (For  example  by  using  "mt  seek"  and  "mt  tell"  on an SCSI tape device) See the "-S
       <seekscript>" parameter for details.

       Performance and success of this tool depend extremely on the device driver,  firmware  and
       underlying hardware.

       Currently  safecopy  supports  RAW  access  to CDROM drives to read data directly of a CD,
       bypassing some driver dependent error correction. This can speed up  data  retrieval  from
       CDs and reduce system load during recovery, as well as increase the success rate. Safecopy
       uses the disc status syscall to determine sector size and addressing of CDs. This fails on
       mixed-mode  or  multi-session CDs, since the sector layout can change within the disk, but
       would still work on the the big majority of disks. Other  disks  can  still  be  recovered
       using  normal  high level data access. Safecopy auto-detects the disk type involved during
       scan for disk and block size.

       Some CD/DVD drives are known to cause the ATAPI bus to crash on errors, causing the device
       driver  to  freeze  for times up to and beyond a minute per error. Try to avoid using such
       drives for media recovery. Using safecopys low level access features might help under some
       circumstances.

       Some drives can read bad media better than others. Be sure to attempt data recovery of CDs
       and DVDs on several different drives and computers.  You  can  use  safecopys  incremental
       recovery feature to read previously unreadable sectors only.

RELIABILITY

       Data  recovery  from  damaged  media  is a delicate task, in the worst case its success or
       failure can safe or ruin whole companies and seal affected peoples personal  fate.  It  is
       paramount that any tools written for that purpose are reliable and trustworthy.

       A  user  needs  to  know  what exactly the software is doing to his hardware and data. The
       outcome of any operation needs to be both understandable and predictable.

       An "intelligent data resurrection wizard" with unknown complex internal behaviour may be a
       nifty  tool, but does not meet the above requirements of predictable outcome, nor will the
       user know in advance what is done to his data.

       The operation sequence of  safecopy  has  been  kept  relatively  simple  to  assure  this
       predictability.  Unfortunately  feature  additions  have  risen the complexity and lead to
       undefined outcome in the past when include and exclude lists had  been  mixed,  especially
       when  mixing  different block sizes. In the worst case this could have lead to overwritten
       data in the destination file on a later incremental run with the mark (-M) option.

       From version 1.3 on, safecopy ships with a test suite that can be used to verify safecopys
       behaviour  in  a set of test cases, simulating the combination of bad blocks in input with
       different include and exclude lists, both with and without marking. Releases are only made
       if safecopy passes those test cases according to the specification.

       This   textual   specification  of  behaviour  of  safecopy  can  be  found  in  the  file
       specification.txt shipped with safecopy.

OPTIONS

       --stage1
              Preset to rescue most of the data fast, using no retries and avoiding bad areas.

              Presets: -f 10% -r 10% -R 1 -Z 0 -L 2 -M BaDbLoCk -o stage1.badblocks

       --stage2
              Preset to rescue more data, using no retries but searching for exact  ends  of  bad
              areas.

              Presets: -f 128* -r 1* -R 1 -Z 0 -L 2 -I stage1.badblocks -o stage2.badblocks

       --stage3
              Preset  to  rescue  everything  that  can  be  rescued  using maximum retries, head
              realignment tricks and low level access.

              Presets: -f 1* -r 1* -R 4 -Z 1 -L 2 -I stage2.badblocks -o stage3.badblocks

       All stage presets can be overridden by individual options.

       -b <size>
              Blocksize for default read operations.  Set this to the physical sectorsize of your
              media.

              Default: 1*
              Hardware block size if reported by OS, otherwise 4096

       -f <size>
              Blocksize  in  bytes when skipping over badblocks.  Higher settings put less strain
              on your hardware, but you might miss good areas in between two bad ones.

              Default: 16*

       -r <size>
              Resolution in bytes when searching for the exact beginning or end of  a  bad  area.
              If you read data directly from a device there is no need to set this lower than the
              hardware blocksize.  On mounted  filesystems  however,  read  blocks  and  physical
              blocks  could be misaligned.  Smaller values lead to very thorough attempts to read
              data at the edge of damaged areas, but increase the strain on the damaged media.

              Default: 1*

       -R <number>
              At least that many read attempts are made on the first bad block of a damaged  area
              with  minimum resolution.  More retries can sometimes recover a weak sector, but at
              the cost of additional strain.

              Default: 3

       -Z <number>
              On each error, force seek the read head from start to end of the source  device  as
              often  as  specified.   That takes time, creates additional strain and might not be
              supported by all devices or drivers.

              Default: 1

       -L <mode>
              Use low level device calls as specified:

              0    Do not use low level device calls
              1    Attempt low level device calls for error recovery only
              2    Always use low level device calls if available

              Supported low level features in this version are:

              SYSTEM  DEVICE TYPE   FEATURE
              Linux   cdrom/dvd     bus/device reset
              Linux   cdrom         read sector in raw mode
              Linux   floppy        controller reset, twaddle

              Default: 1

       --sync Use synchronized read calls (disable driver buffering).  Safecopy will use O_DIRECT
              if supported by the OS and O_SYNC otherwise.

              Default: Asynchronous read buffering by the OS is allowed

       --forceopen
              Keep  trying  to reopen the source after a read errer useful for USB drives that go
              away temporarily.

              Warning: This can cause safecopy to hang until aborted manually!

              Default:  Abort on fopen() error

       -s <blocks>
              Start position where to start reading.   Will  correspond  to  position  0  in  the
              destination file.

              Default: block 0

       -l <blocks>
              Maximum length of data to be read.

              Default: Entire size of input file

       -I <badblockfile>
              Incremental  mode. Assume the target file already exists and has holes specified in
              the badblockfile.  It will be attempted to  retrieve  more  data  from  the  listed
              blocks or from beyond the file size of the target file only.

              Warning:  Without  this  option,  the  destination  file  will  be emptied prior to
              writing.  Use -I /dev/null if you want to  continue  a  previous  run  of  safecopy
              without a badblock list.

              Implies: -c 0 if -c is not specified

              Default: none ( /dev/null if -c is given )

       -i <bytes>
              Blocksize to interpret the badblockfile given with -I.

              Default: Blocksize as specified by -b

       -c <blocks>
              Continue copying at this position.  This allows continuing if the output is a block
              device with a fixed size as opposed to  a  growable  file,  where  safecopy  cannot
              determine  how  far  it  already got.  The blocksize used is the same as for the -I
              option.
              -c 0 will continue at the current destination size.

              Implies: -I /dev/null if -I is not specified

              Default: none ( 0 if -I is given )

       -X <badblockfile>
              Exclusion mode. If used together with -I, excluded blocks override included blocks.
              Safecopy will not read or write any data from areas covered by exclude blocks.

              Default: none

       -x <bytes>
              Blocksize to interpret the badblockfile given with -X.

              Default: Blocksize as specified by -b

       -o <badblockfile>
              Write a badblocks/e2fsck compatible bad block file.

              Default: none

       -S <seekscript>
              Use  external  script for seeking in input file.  (Might be useful for tape devices
              and similar).  Seekscript must be an executable that takes the number of blocks  to
              be skipped as argv1 (1-64) the blocksize in bytes as argv2 and the current position
              (in bytes) as argv3.  Return value needs to be the number  of  blocks  successfully
              skipped,  or 0 to indicate seek failure.  The external seekscript will only be used
              if lseek() fails and we need to skip over data.

              Default: none

       -M <string>
              Mark unrecovered data with this string instead of skipping it. This helps in  later
              finding  corrupted  files  on  rescued  file system images.  The default is to zero
              unreadable data on creation of output files, and leaving the data as it is  on  any
              later run.

              Warning:  When  used  in  combination with incremental mode (-I) this may overwrite
              data in any block that occurs in the -I file.   Blocks  not  in  the  -I  file,  or
              covered by the file specified with -X are save from being overwritten.

              Default: none

       --debug <level>
              Enable  debug  output.  Level  is  a  bit  field,  add  values  together  for  more
              information:
                   program flow:       1
                   IO control:         2
                   badblock marking:   4
                   seeking:            8
                   incremental mode:   16
                   exclude mode:       32
              or for all debug output: 255

              Default: 0

       -T <timingfile>
              Write sector read timing information into this file for later analysis.

              Default: none

       -h, --help
              Show the program help text.

PARAMETERS

       valid parameters for -f -r -b <size> options are:

       <integer>
              Amount in bytes - i.e. 1024

       <percentage>%
              Percentage of whole file/device size - e.g. 10%

       <number>*
              -b only, number times blocksize reported by OS

       <number>*
              -f and -r only, number times the value of -b

OUTPUT

       description of output symbols:

       .      Between 1 and 1024 blocks successfully read.

       _      Read of block was incomplete. (possibly end of file) The blocksize is  now  reduced
              to read the rest.

       |/|    Seek failed, source can only be read sequentially.

       >      Read failed, reducing blocksize to read partial data.

       !      A  low  level  error  on  read  attempt  of  smallest allowed size leads to a retry
              attempt.

       [xx](+yy){
              Current block and number of bytes continuously read successfully up to this point.

       X      Read failed on a block with minimum blocksize and is skipped.  Unrecoverable error,
              destination  file  is  padded  with  zeros.   Data  is now skipped until end of the
              unreadable area is reached.

       <      Successful read after the end of  a  bad  area  causes  backtracking  with  smaller
              blocksizes to search for the first readable data.

       }[xx](+yy)
              current block and number of bytes of recent continuous unreadable data.

HOWTO

       How do I...

       - resurrect a file from a mounted but damaged media, that copy will fail on:
              safecopy /path/to/problemfile ~/saved-file

       - create an filesystem image of a damaged disk/cdrom:
              safecopy /dev/device ~/diskimage

       - resurrect data as thoroughly as possible?

              safecopy source dest -f 1* -R 8 -Z 2
              (assuming logical misalignment of blocks to sectors)

              safecopy source dest -f 1* -r 1 -R 8 -Z 2

       - resurrect data as fast as possible, or

       - resurrect data with low risk of damaging the media further:
              (you can use even higher values for -f and -r)

              safecopy source dest -f 10% -R 0 -Z 0

       - resurrect some data fast, then read more data thoroughly later:

              safecopy source dest -f 10% -R 0 -Z 0 -o badblockfile
              safecopy source dest -f 1* -R 8 -Z 2 -I badblockfile

              Alternate approach using the new preset features:

              safecopy source dest --stage1

              safecopy source dest --stage2

              safecopy source dest --stage3

       - utilize some friends CD-ROM drives to complete the data from my damaged CD:
              safecopy /dev/mydrive imagefile <someoptions> -b <myblocksize> -o myblockfile
              safecopy /dev/otherdrive imagefile <someoptions> -b <otherblocksize> -I myblockfile
              -i <myblocksize> -o otherblockfile
              safecopy  /dev/anotherdrive  imagefile  <someoptions>  -b   <anotherblocksize>   -I
              otherblockfile -i <otherblocksize>

       - interrupt and later resume a data rescue operation:
              safecopy source dest
              <CTRL+C> (safecopy aborts)
              safecopy source dest -I /dev/null

       - interrupt and later resume a data rescue operation with correct badblocks output:
              safecopy source dest <options> -o badblockfile
              <CTRL+C> (safecopy aborts)
              mv badblockfile savedbadblockfile
              safecopy source dest -I /dev/null -o badblockfile
              cat badblockfile >>savedbadblockfile

       - interrupt and resume in incremental mode:
              (this needs a bit of bash scripting to get the correct badblock lists)
              safecopy source dest <options> -o badblockfile1
              safecopy source dest <options> -I badblockfile1 -o badblockfile2
              <CTRL+C> (safecopy aborts)
              latest=$( tail -n 1 badblockfile2 )
              if [ -z $latest ]; then latest=-1; fi;
              cat badblockfile1 | while read block; do
                   [ $block -gt $latest ] && echo $block >>badblockfile2;
              done;
              safecopy source dest <options> -I badblockfile2 -o badblockfile3

       - find the corrupted files on a partially successful rescued file system:
              safecopy /dev/filesystem image -M CoRrUpTeD
              fsck image
              mount -o loop image /mnt/mountpoint
              grep -R /mnt/mountpoint "CoRrUpTeD"
              (hint:  this  might not find all affected files if the unreadable parts are smaller
              in size than your marker string)

       - exclude the previously known badblocks  list  of  a  filesystem  from  filesystem  image
       creation:
              dumpe2fs -b /dev/filesystem >badblocklist
              safecopy /dev/filesystem image -X badblocklist -x <blocksize of your fs>

       - create an image of a device that starts at X and is Y in size:
              safecopy /dev/filesystem -b <bsize> -s <X/bsize> -l <Y/bsize>

       - combine two partial images of rescued data without access to the actual (damaged) source
       data:
              (This is a bit tricky. You need to get badblocks lists for both  files  somehow  to
              make safecopy know where the missing data is. If you used the -M (mark) feature you
              might be able to automatically compute these, however this feature is not  provided
              by safecopy. Lets assume you have two badblocks files.

              you have:
              image1.dat
              image1.badblocks (blocksize1)
              image2.dat
              image2.badblocks (blocksize2)

              The  file  size  of image1 needs to be greater or equal to that of image2. (If not,
              swap them) )

              cp image2.dat combined.dat
              safecopy   image1.dat   combined.dat   -I   image2.badblocks   -i   blocksize2   -X
              image1.badblocks -x blocksize1
              (This  gets  you  the  combined  data,  but  no output badblocklist.  The resulting
              badblocks list would be the badblocks that are
              a: in both badblocks lists, or
              b: in image1.badblocks and beyond the file size of image2 It should  be  reasonably
              easy  to  solve  this  logic in a short shell script. One day this might be shipped
              with safecopy, until then consider this your chance to contribute to a random  open
              source project.)

       - rescue data of a tape device:
              If the tape device driver supports lseek(), treat it as any file, otherwise utilize
              the "-S" option of safecopy with a to be self-written script to skip over  the  bad
              blocks.   (for  example  using  "mt seek") Make sure your tape device doesn't auto-
              rewind on close.  Send me feedback if you had any luck doing so, so  I  can  update
              this documentation.

FAQ

       Q:     Why  create  this tool if there already is something like dd-rescue and other tools
              for that purpose?

       A:     Because I didn't know of dd(-)rescue when I started, and I felt  like  it.  Also  I
              think  safecopy  suits  the  needs  of a user in data loss peril better due to more
              readable output and more understandable options  than  some  of  the  other  tools.
              (Then  again  I  am  biased. Compare them yourself) Meanwhile safecopy supports low
              level features other tools don't.

       Q:     What exactly does the -Z option do?

       A:     Remember back in MS-DOS times when a floppy would make a "neek nark" sound 3  times
              every time when running into a read error?  This happened when the BIOS or DOS disk
              driver moved the IO head to its  boundaries  to  possibly  correct  small  cylinder
              misalignment,  before it tried again.  Linux doesn't do that by default, neither do
              common CDROM drives or drivers.  Nevertheless forcing this behaviour  can  increase
              your  chance of reading bad sectors from a CD __BIG__ time.  (Unlike floppies where
              it usually has little effect)

       Q:     Whats my best chance to resurrect a CD that has become unreadable?

       A:     Try making a backup image on many different computers and drives.  The abilities to
              read  from  bad  media vary extremely. I have a 6 year old Lite On CDRW drive, that
              even reads deeply and purposely scratched CDs (as  in  with  my  key,  to  make  it
              unreadable)  flawlessly. A CDRW drive of the same age at work doesn't read any data
              from that part of the CD at all, while most DVD and combo drives  have  bad  blocks
              every  couple  hundred  bytes.   Make  full use of safecopys RAW access features if
              applicable.  (-L 2 option)

              As a general guideline:
              -CDRW drives usually do better than read-only CD drives.
              -CD only drives sometimes do better on CDs than DVD drives.
              -PC drives are sometimes better than laptop ones.
              -A drive with a clean lens does better than a dirtball.
              -Cleaning up CDs helps.
              -Unless you use chemicals.
              -Using sticky tape on a CD will rip of the reflective layer  permanently  rendering
              the disk unreadable.

       Q:     Whats my best chance to resurrect a floppy that became unreadable?

       A:     Again  try different floppy drives. Keep in mind that it might be easier to further
              damage data on a bad floppy than on a CD.  (Don't overdo read attempts)

       Q:     What about BlueRay/HDDVD disks?

       A:     Hell if I knew, but generally they should be similar to DVDs.  It probably  depends
              how the drives firmware acts up.

       Q:     My hard drive suddenly has many bad sectors, what should I do?

       A:     Speed is an essential factor when rescuing data from a bad hard drive.  Accesses to
              bad areas or even just time running can further damage the drive and make  formerly
              readable  areas unreadable, be it due to temperature rise, damaged heads scratching
              still good parts of the surface, bearings degrading due  to  vibration,  etc.   Its
              advisable  to  shut  the system down and remove the hard drive from the computer as
              soon as errors occur and as fast as possible without causing further damage.

              (Don't pull the plug! Press reset to force reboot and then  power  down  via  power
              button/ACPI)

              Set  up  a  rescue  system  with  enough  disk space to store all the data from the
              damaged drive (and possibly multiple copies of it).  If you have an  external  hard
              drive  case  that  connects  via USB SATA or SCSI, allowing a hot plug of the drive
              into a running system, use it.  This allows you to prepare everything  without  the
              need  for the drive to power up and possibly BIOS or operating system involuntarily
              accessing it.  You also get easier access to the  drive  to  check  temperature  or
              noise during operation.

              When  you  rescue  data,  rescue  good  data  first before attempting to access bad
              sectors. Safecopy allows you to skip known problem sectors using a badblock exclude
              file  (-X)  which  you might be able to retrieve from system logs or from the drive
              internal logs, via smartmontools or similar  software.  Be  aware  that  you  might
              possibly  need  to  convert  physical  sector  numbers  into  logical block numbers
              depending on your source.

              Also you should tell safecopy to  jump  out  of  any  problematic  areas  ASAP  and
              continue somewhere else. Parameters "-f 10% -r 10% -R 0 -Z 0" would do the trick by
              making safecopy  skip  10%  of  the  device  content  and  continue  there  without
              backtracking.  You  can  always attempt to get the data in between later, first get
              the supposedly good data on the rest of the drive. Depending on the method of  data
              recovery  you  plan  on using, it may make sense to mark the bad data with the "-M"
              option.  This allows you to later find  files  affected  by  data  corruption  more
              easily.  Use the "-o" option to make safecopy write a badblock list with all blocks
              skipped or unreadable.

              When safecopy is done with this first run, you can attempt a second  go  trying  to
              get more data. Using smaller values for "-f" and allowing safecopy to backtrack for
              the end of the affected area "-r 1*".  Be sure to use incremental mode "-I" to only
              read the blocks skipped in the first run.

              It  may  make  sense to let the drive cool down between runs.  Once you got all the
              data from the "good" areas of the drive you can risk more "thorough" access to  it.
              Increase  the  numbers of retries "-R" in case of bad blocks, maybe together with a
              head realignment "-Z 1". "-f 1*" would make safecopy try to read  on  every  single
              block, not skipping over bad areas at all.

              If  your  drive stops responding, power it down, let it cool down for a while, then
              try again.

              (I heard from people who brought dead drives back to  live  for  a  short  time  by
              cooling them to low temperatures with ice-packs.)

              !!!  If the data is really important, go to a professional data recovery specialist
              right away, before doing further damage to the drive.

EXIT STATUS

       safecopy returns 0 (zero) if there were no unrecoverable errors.
       safecopy returns 1 if some data could not be recovered.
       safecopy returns 2 in case the copying was aborted due to error or signal.

AUTHORS

       safecopy and its manpage have been designed and written by CorvusCorax.

BUGS

       Please use the project page on sourceforge <http://www.sf.net/projects/safecopy> to get in
       contact with project development if you encounter bugs or want to contribute to safecopy.

COPYRIGHT

       Copyright © 2009 CorvusCorax
       This  is  free  software.   You  may  redistribute copies of it under the terms of the GNU
       General Public License version 2 or above.  <http://www.gnu.org/licenses/gpl.html>.  There
       is NO WARRANTY, to the extent permitted by law.

SEE ALSO

       Programs with a similar scope are among others
       ddrescue(1), dd-rescue(1), ...

                                            2012-03-10                                SAFECOPY(1)