Clone whole partition or hard drive to a sparse file
You want dd_rescue
.
dd_rescue -a -b 8M /dev/sda1 /mount/external/backup/sda1.raw
Just for completeness the call for ddrescue. The --sparse
or -S
flag allows the destination to be written sparsely:
$ ddrescue -S -b8M /dev/sda1 /mount/external/backup/sda1.raw
Or with long option:
$ ddrescue --sparse --block-size 8M /dev/sda1 /mount/external/backup/sda1.raw
Or if you prefer MiBs:
$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw
To allow the rescue to be interrupted and resumed, you can also make use of a logfile:
$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw ~/sda1.rescue.log
Note that GNU ddrescue
and dd_rescue
are different programs. But GNU ddrescue
seems to be more widespread. For example it is already packaged with GRML.
There was a patch offered in 2007 to provide sparse file support in GNU dd, but it looks to have not made it into coreutils (at least not as of 8.4). I doubt dd has changed too much since then, the patch might apply against the current version without a lot of work.
I'm also really impressed by the creative use of cp
in your question, and it got me on the track of using it to accomplish resuming (here resuming from ~80M into the source):
cp --sparse=always \
<(dd if=/dev/sda1 bs=8M skip=10) /dev/stdout \
| dd bs=8M seek=10 of=/mount/external/backup/sda1.raw
Edit: scratch that. The second dd
would of course be seeking to the wrong position in the output file, since it's not the same length as the input.