====== safecopy ======
There are some predefined settings:
* **stage1**: Preset to rescue most of the data fast, using no retries and **avoiding bad areas**. Skip 10% of size when bad block found. 1 read attempt.
* **stage2**: Preset to rescue more data, using no retries but searching for **exact ends of bad areas**. Skip 128 blocks when bad block found. 1 read attempt.
* **stage3**: Preset to rescue everything that can be rescued using maximum retries, head realignment tricks and low level access. Skip 1 block if bad block found. 4 read attempts.
^ ^ -f ^ -r ^ -R ^ -Z ^ -L ^ -I ^ -o ^ ^
^ stage ^ skip ^ resolution ^ reads ^ move head ^ low level ^ increm. mode ^ bad block out file ^ other ^
| stage1 | 10% | 10% | 1 | 0 | 2 | | stage1.badblocks | |
| stage2 | 128* | 1* | 1 | 0 | 2 | stage1.badblocks | stage2.badblocks | |
| stage3 | 1* | 1* | 4 | 1 | 2 | stage2.badblocks | stage3.badblocks | |
Every ''stage'' preset parameter can be overridden.
E.g. for stage 3 is not needed to give additional stress to device with -R 4 and -Z 1, and better is to use:
safecopy --forceopen -L 0 --stage3 -c 151275030 -Z 0 -R 1 /dev/sdb /dev/sdc
\\
****Note:** ''-c'' parameter is used to continue previous ''safecopy'' interrupted by CTRL+C.\\
Note:** With ''-f'' parameter other than 1* you can miss good areas in between two bad ones.
===== stage#.badblocks files =====
In current working directory, safecopy will create files with badblocks map: ''stage#.badblocks'', which are used in next stages.
Make sure ''stage#.badblocks'' files are sorted are unique before moving to next stage.
In other case following error will shown:
..................Parse error in badblocks file stage1.badblocks: not sorted correctly!
Aborted because of error!
Recovered bad blocks: 0
Unrecoverable bad blocks (bytes): 60 (18100224)
Blocks (bytes) copied: 151299151 (619721322496)
Number of lines in each ''stage#.badblocks'' file shows how each stage works:
# cat stage1.badblocks | sort | uniq | wc -l
51200
# cat stage2.badblocks | sort | uniq | wc -l
4720
# cat stage3.badblocks | sort | uniq | wc -l
1477
===== Usage example =====
Typical usage is:
safecopy --stage1 /dev/source output.img
mv stage1.badblocks stage1.badblocks.bak
cat stage1.badblocks.bak | sort | uniq > stage1.badblocks
safecopy --stage2 /dev/source output.img
mv stage2.badblocks stage2.badblocks.bak
cat stage2.badblocks.bak | sort | uniq > stage2.badblocks
safecopy --stage3 /dev/source output.img
===== Output =====
......................................... [244042830]
......................................... [244084814]
......................................... [244126798]
......................................... [244168782]
..................... 100%
Done!
Recovered bad blocks: 0
Unrecoverable bad blocks (bytes): 2 (209715200)
Blocks (bytes) copied: 244190646 (1000204886016)
# safecopy --forceopen -L 0 --stage2 /dev/sdb /dev/sdc
Low level device calls enabled mode: 0
Forced reopening of source file even if device is temporarily gone.
Reported hw blocksize: 4096
Filesize not reported by stat(), trying seek().
File size: 1000204886016
Blocksize: 4096
Fault skip blocksize: 524288
Resolution: 4096
Min read attempts: 1
Head moves on read error: 0
Incremental mode file: stage1.badblocks
Incremental mode blocksize: 4096
Badblocks output: stage2.badblocks
Starting block: 0
Source: /dev/sdb
Destination: /dev/sdc
Destination filesize not reported by stat(), trying seek().
Current destination size: 1000204886016
[1124830](+4607303680){X<<<<<<<}[1124831](+4096)
.........................[151273551](+615009157120){X [151273679]
<<<<<<<}[151273655](+425984)
.[151273690](+143360){XXXXX<<<<<<<}[151274319](+2576384)
.[151274323](+16384){XXX<<<<<<<}[151274620](+1216512)
.[151274700](+327680){X<<<<<<<}[151274788](+360448)
.[151275798](+20480){XXX<<<<<<<}[151276078](+1146880)
.[151276107](+118784){X<<<<<<<}[151276110](+12288)
.[151276125](+61440){XX<<<<<<<}[151276262](+561152)
.[151276326](+262144){X<<<<<<<}[151276345](+77824)
.[151276347](+8192){X<<<<<<<}[151276412](+266240)
.[151276511](+405504){X<<<<<<<}[151276512](+4096)
..[151278398](+7725056){XXXX<<<<<<<}[151278843](+1822720)
.[151278847](+16384){XX<<<<<<<}[151279033](+761856)
.[151279172](+8192){X<<<<<<<}[151279173](+4096)
.[151279178](+20480){X<<<<<<<}[151279179](+4096)
.[151279274](+389120){X<<<<<<<}[151279287](+53248)
.[151279318](+126976){XX<<<<<<<}[151279501](+749568)
.[151279567](+270336){X<<<<<<<}[151279640](+299008)
.[151279646](+24576){X<<<<<<<}[151279684](+155648)
.[151279685](+4096){XXX<<<<<<<}[151280013](+1343488)
.[151280572](+413696){X<<<<<<<}[151280636](+262144)
.[151280638](+8192){XX<<<<<<<}[151280812](+712704)
.................. 100%
Done!
Recovered bad blocks: 0
Unrecoverable bad blocks (bytes): 60 (18206720)
Blocks (bytes) copied: 244190646 (1000204886016)
===== Continue interrupted copy =====
......................................... [175312976]
..^C:-) 71%
Aborted by user request!
Recovered bad blocks: 0
Unrecoverable bad blocks (bytes): 2 (209715200)
Blocks (bytes) copied: 175316045 (718094520320)
With ''-I'' parameter //safecopy// works in incremental mode. Position is detemined from ''dest'' file size.
If ''dest'' is a block device parameter ''-c'' needs to be used:
safecopy --stage1 -c 175316045 -I my/previous/stage1.badblocks -L 0 --forceopen /dev/sdi /dev/sdd
===== Working with USB or erroneous drives =====
To disable SATA low level operations:
safecopy --forceopen -L 0 --stage1 /dev/source /dev/destination