Do partial transfer if destination device is shorter than the source
[badblock-guess.git] / README
1 $Id$
2
3
4 badblock-guess: Quickly recover most of the data from a damaged disk
5
6
7 Purpose
8 -------
9
10 badblock-guess will try to find all readable sectors of the disk in minimal
11 time. It is similiar to:
12         dd if=<src_dev> of=<dst_dev> bs=512 conv=noerror,sync
13
14 but dd(1) solution can last for many weeks/months on heavily corrupted disk
15 media as each bad sector attempted to be read costs about 5secs (your disk
16 bad-blocks performance may significantly vary). badblock-guess tries to first
17 find and recover most of the data from healthy zones of the disk and later it
18 will start trying to recover smaller bits of information spread between/around
19 badblock zones - the principle of its operation is the fact that badblocks
20 usually occur in chunks. If you don't user-terminate badblock-guess and leave
21 it to finish completely itself, its execution time should be approx. the same
22 as for dd(1). You may also use it to guess the remaining execution time as
23 during its later execution phases it will be showing the remaining number of
24 sectors ("TODO=x") while most of them are probably badblocks in this phase of
25 execution.
26
27 This program will not recover data of any sector with failing read command.
28 If dd(1) command above finishes for you in a reasonable time, you don't need
29 this program. No special read methods are used. No vendor-specific dependencies
30 exist. No IDE, SCSI or any other specific device is required.
31
32
33 License
34 -------
35
36 GNU GENERAL PUBLIC LICENSE, Version 2, June 1991.
37
38 See the file COPYING for its details. It is also available at:
39         http://www.gnu.org/licenses/gpl.txt
40
41
42 Usage
43 -----
44
45 Syntax: badblock-guess <src_dev> [<dst_dev (OVERWRITTEN & DESTROYED!!!)>]
46
47 Possible device cases (watch out for <src_dev> vs. <dst_dev> differences!):
48
49         No <dst_dev> is specified: Just the <src_dev> is scanned for errors and
50                 the detected badblocks list is output.
51
52         <src_dev> is a harddrive (/dev/hdc): Other harddrive of equal or higher
53                 capacity is recommended
54
55         <src_dev> is a partition (/dev/hdc1): Partition on any other physical
56                 drive in the system with the exactly same partition size is
57                 recommended
58
59         <dst_dev> is a file: File must exist but it will be enlarged when
60                 needed. Commands:
61                         rm -f /tmp/hdc1.img; touch /tmp/hdc1.img
62                 are recommended to specify file "/tmp/hdc1.img" for <dst_dev>
63
64 All the numbers are always expressed as sector (that means 512 bytes)
65 number/count!
66
67 Never terminate badblock-guess by CTRL-C or kill(1) if you want to utilize its
68 results - always use 'f' followed by ENTER ('f' for 'finish'). You may not see
69 'f' while typing it - type it blindly (without quotes - just the one letter!).
70 During finishing the program will produce the badblocks list output to its
71 stdout while it will be clearing the 'bad' or 'not-yet-done' zones of the
72 target disk (if any specified).
73
74 TODO: Resuming of the operation from the badblocks list to continue the
75       scanning is not yet implemented.
76
77
78 hdparm
79 ------
80
81 Although not required it is strongly recommended to turn of drive readahead
82 during severe disk failure recoveries. You can use
83
84         /sbin/hdparm -A0a0 /dev/hdX     (or /dev/sdX etc.)
85
86 for your drive to do it. You may need to install some extra package with
87 hdparm(8) for your Linux distribution.
88
89 Be aware that the disk performance will be critically hit - you may expect read
90 performance about 90KB/s (approx. 7.5GB/24hours if no badblocks read retrying
91 is needed). YMMV.
92
93
94 Linux kernel flaw
95 -----------------
96
97 Linux kernels have internal blocksize 1KB but the partitions can be sized by
98 512 sectors and thus the last odd partition sector gets inaccessible.
99 This isn't a problem for a the disk devices as AFAIK all the disks have always
100 even number of sectors.
101
102 This program is aware of this flaw and it will not report last such sector as
103 BAD - just the appropriate warning is supplied (to stderr). This may be visible
104 for example while recovering NTFS partition with odd cylinder number (=>odd
105 sector count) as NTFS uses the last partition sector for its superblock backup.
106 Fortunately CHKDSK will fix it back, of course.
107
108
109 Compilation
110 -----------
111
112 Type:
113         make
114
115 And you should have now the binary file "badblock-guess" compiled out.
116 You may need to install the following packages of your Linux distribution:
117         e2fsprogs, e2fsprogs-devel
118         glib, glib-devel        (this is NOT glibc!)
119         other standard C compilation tools and libraries...
120
121 Compiled out binary is fully statically linked, you can bring it with you on
122 the floppy everywhere (running Linux is still required, of course!).
123
124
125 Operation description
126 ---------------------
127
128 During its run it will update its progress line. All the numbers are always
129 expressed as sector (that means 512 bytes) number/count.
130
131         @342342/819223,TODO=8192,bad=0,largest=8192,hunks=1
132          ^A     ^B          ^C       ^D        ^E         ^F
133
134 A=currently reding sector 342342 ...
135 B=... out of total sector 819223 of the disk (or partition)
136 C=8192 secters weren't yet attempted to be read
137 D=0 sectors were found with proof of read failure
138 E=currently read hunk of 8192 sectors
139  =also there is a maximum size of hunk 8192 sectors
140 F=total remaining hunks to be processed
141
142 Initially there is just one hunk (0-media_size) to be read. When no errors on
143 the disk are found, this one hunk is finished and no output (bad sectors list)
144 is generated.
145
146 When we find bad a sector, we divide our todo-listed hunks by the schema:
147
148 > successfuly read 10 ->[1 bad]<todo 1><todo 2><todo 4><todo 9><todo 19>|end
149
150 We always read the biggest hunk "todo", "todo" hunks of the size are read in
151 backwards order (to approach the found bad blocks from the other side).
152
153 In this case the program would start with the status line (*):
154
155 @27/46,TODO=35,bad=1,largest=19,hunks=5
156  ^A ^B      ^C     ^D        ^E       ^F
157
158 A=we start reading the first sector of the largest hunk <todo 19> (10+1+1+2+4+9)
159 B=total number of sectors on the disk (10+1+1+2+4+9+19)
160 C=still have to read all <todo> hunks (1+2+4+9+19)
161 D=we found just one confirmed bad sector <bad 1> (1)
162 E=the largest hunk "todo" on the disk is <todo 19> (19)
163 F=total number of the remaining "todo" hunks <t1><t2><t4><t9><t19> (1+1+1+1+1)
164
165 If you terminate badblock-guess run (by 'f' key, see above!), you can be sure
166 that you will loose the data of at most <largest> sectors after any bad sector
167 found. But you still can loose <TODO> sectors of data.
168
169 (*) The status line is printed once per a second and thus in real you can't
170     predict the exact states of the progress status line, of course.
171
172
173 Output badblock list format
174 ---------------------------
175
176 Output badblock list has form
177
178 first_sector-behind_last_sector <tab>   ;<comments>
179
180 "behind_last_sector" is last_bad_sector+1. Thus single bad sector would be:
181         5678-5679
182
183 The following three types of output lines can occur. The first one is just
184 a shortcut for the second+third - such output is chosen when TODO blocks are
185 consequently following BAD blocks.
186
187 1000-9192       ;BAD=100, TODO(@1100-@9192)=8092
188 1000-1100       ;BAD=100
189 1100-9192       ;TODO=8092