我喜欢将整个分区或整个硬盘驱动器克隆到更大的外部磁盘上,但喜欢创建稀疏文件。我经常用于dd
克隆,但它不支持稀疏文件。作为解决方法,我使用了类似的方法:
cp --sparse=always <(dd if=/dev/sda1 bs=8M) /mount/external/backup/sda1.raw
然而,这对我来说有点太棘手,并且不允许我在中止时恢复该过程。有趣的是,有一个 NTFS 工具可以实现此目的 ( ntfsclone
),但 Linux 的本机文件系统 (EXT2-4) 却没有这样的工具。
有没有更好的工具,例如dd
具有稀疏支持的变体?我不想寻找一些用于磁盘备份的专有软件,而只是想制作一个稀疏克隆副本,如果需要,我可以将其安装为循环设备。
答案1
你要dd_rescue
。
dd_rescue -a -b 8M /dev/sda1 /mount/external/backup/sda1.raw
复制可能会随时被 中断Ctrl-C,显示当前位置。重新启动时可以使用该值,通过将-s
和 位置添加到原始命令中,例如
dd_rescue -a -b 8M -s 42000k /dev/sda1 /mount/external/backup/sda1.raw
更简单的是指定第三个文件名,它充当日志文件。重新启动时dd_rescue
将读取该日志文件并从中断处继续。
答案2
只是为了完整性,要求解救。--sparse
or标志-S
允许稀疏地写入目的地:
$ ddrescue -S -b8M /dev/sda1 /mount/external/backup/sda1.raw
或者使用长选项:
$ ddrescue --sparse --block-size 8M /dev/sda1 /mount/external/backup/sda1.raw
或者如果你愿意的话米布斯:
$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw
要允许中断和恢复救援,您还可以使用日志文件:
$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw ~/sda1.rescue.log
请注意,GNUddrescue
和GNUdd_rescue
是不同的程序。但 GNUddrescue
似乎更广泛。例如它已经打包了GRML。
答案3
有一个提供补丁2007 年在 GNU dd 中提供稀疏文件支持,但它看起来还没有进入 coreutils(至少在 8.4 中没有)。我怀疑 dd 从那时起已经改变了太多,该补丁可能适用于当前版本,而无需进行大量工作。
我对你的问题中的创造性使用也印象深刻cp
,它让我走上了使用它来完成恢复的轨道(这里从〜80M恢复到源代码):
cp --sparse=always \
<(dd if=/dev/sda1 bs=8M skip=10) /dev/stdout \
| dd bs=8M seek=10 of=/mount/external/backup/sda1.raw
编辑:从头开始。第二个dd
当然是在输出文件中寻找错误的位置,因为它的长度与输入的长度不同。
答案4
只是加上我的 2 美分。从原始磁盘创建稀疏文件的另一种方法是qemu-img使用类似:
qemu-img convert -f raw /dev/sda /tmp/sda.raw
您也可以在单个分区上使用它。此外,您还可以选择将原始磁盘/分区转换为 qemu-img 支持的任何其他格式(QCOW2、VHD[x]、vmdk 等)