This is part 5 of a multi-part series. See part 1 for the beginning of the series.
Cloning hard drives with dd_rescue
In cases where a hard drive is failing, often simply cloning the drive is all that is required to recover data. There are many other situations where cloning a drive is important though, such as when attempting to recover from a broken partition table or major filesystem corruption.
The primary tool for cloning drives is called dd_rescue. Running dd_rescue -h or simply dd_rescue with no options will give you a summary of the various command-line options:
dd_rescue Version 1.14, garloff@suse.de, GNU GPL ($Id: dd_rescue.c,v 1.59 2007/08/26 13:42:44 garloff Exp $) dd_rescue copies data from one file (or block device) to another. USAGE: dd_rescue [options] infile outfile Options: -s ipos start position in input file (default=0), -S opos start position in output file (def=ipos), -b softbs block size for copy operation (def=65536), -B hardbs fallback block size in case of errs (def=512), -e maxerr exit after maxerr errors (def=0=infinite), -m maxxfer maximum amount of data to be transfered (def=0=inf), -y syncfrq frequency of fsync calls on outfile (def=512*softbs), -l logfile name of a file to log errors and summary to (def=""), -o bbfile name of a file to log bad blocks numbers (def=""), -r reverse direction copy (def=forward), -t truncate output file (def=no), -d/D use O_DIRECT for input/output (def=no), -w abort on Write errors (def=no), -a spArse file writing (def=no), -A Always write blocks, zeroed if err (def=no), -i interactive: ask before overwriting data (def=no), -f force: skip some sanity checks (def=no), -p preserve: preserve ownership / perms (def=no), -q quiet operation, -v verbose operation, -V display version and exit, -h display this help and exit. Note: Sizes may be given in units b(=512), k(=1024), M(=1024^2) or G(1024^3) bytes This program is useful to rescue data in case of I/O errors, because it does not necessarily abort or truncate the output.
Note that there is also a GNU ddrescue with a similar feature set, but with entirely incompatible command-line arguments.
In the simplest of cases, dd_rescue can be used to copy infile (let's say, for example, /dev/sda) to outfile (again, for example, /dev/sdb).
dd_rescue /dev/sda /dev/sdb
In most cases, you'll want a little more control over how dd_rescue behaves though. For example, to clone failing /dev/sda to /dev/sdb:
dd_rescue -d -D -B 4k /dev/sda /dev/sdb
(to use the default 64k block size) or, for really bad drives, to force only one read attempt:
dd_rescue -d -D -B 4k -b 4k /dev/sda /dev/sdb
Adding the -r option to read backwards also helps sometimes.
Changing block sizes
By default, dd_rescue uses a block size of 64k (overridden with -b). In the event of a read error, it tries to read again in 512-byte chunks (overridden with -B). If a drive is good (or only beginning to fail), a larger block size (usually in the 512kB-1MB range) will give you significantly better performance.
If a drive is failing, forcing the default block size to the same value as the fall-back size will keep dd_rescue from re-reading (and therefore possibly damaging) failed blocks.
Direct I/O
The -d and -D options turn on direct I/O for the input and output files respectively. Direct I/O turns off all OS caching, both read-ahead and write-behind. This is much more efficient (and safer) when reading from and writing to hard drives, but should generally be avoided when using regular files.
Other useful options
-r Read backwards. Sometimes works more reliably. (Very handy trick...)
-s num Start position in input file.
-S num Start position in output file. (Defaults to the same as -s.)
-e num Stop after num errors.
-m num Maximum amount of data to read.
-l file Write a log to file.
Copying partitions
dd if=/dev/sda of=/dev/sdb count=1
The default block size of dd is 512 bytes, which, conveniently, is the size of boot sector + partition table at the beginning of the drive.
Note: This trick doesn't quite work on MS-DOS partition tables with extended partitions! In that case, use sfdisk to copy the partition table (after running the above command to pick up the boot sector):
Next, re-read the partition table on /dev/sdb using hdparm:sfdisk -d /dev/sda | sfdisk /dev/sdb
Next we can clone the NTFS filesystem on /dev/sda1 to /dev/sdb1 using the ntfsclone command from ntfsprogs:hdparm -z /dev/sdb
ntfsclone --rescue -O /dev/sdb1 /dev/sda1
Finally we clone /dev/sda2 to /dev/sdb2 using dd_rescue using a 1MB block size (for speed):
dd_rescue -d -D -B 4k -b 1M /dev/sda2 /dev/sdb2
To be continued in part 6.
No comments:
Post a Comment