仅从硬盘克隆正在使用的空间

kro*_*oka 16 linux hard-drive clone dd clonezilla

我可以使用 dd、rsync、clonezilla 或任何工具在 Linux 中仅克隆硬盘中正在使用的空间吗?我需要从 1 TB 硬盘(仅使用 2 GB 空间)备份到 500 GB 硬盘。

Kam*_*ski 29

你可以,但你应该先准备你的磁盘。诀窍是使用稀疏文件或压缩。这种方法很耗时,会产生很高的 I/O。在您的情况下(在 1 TB 硬盘上使用 2GB),文件副本(如锯末的评论中所建议)可能是更好的解决方案。如果——另一方面——你有例如 850GB 的 1TB 正在使用中,其中有许多小文件,你想一次备份 MBR、分区表、元数据,那么我的方法将是一种合理的保存方式图像文件至少有 150 GB(除非数据压缩得足够好,否则仍然无法放入 500 GB 的 HDD)。

我是为磁盘使用率较高的用户编写的。另请注意,源驱动器应该是健康的,并允许覆盖空白空间。我提供的解决方案主要用于备份,而不是恢复或取证。时间和 I/O 成本不仅会在映像创建期间支付,还会在(如果)映像写回磁盘时支付。如果该方法适合您,请三思。

假设您需要克隆/dev/sdb并且有几个分区:/dev/sdb1, /dev/sdb2...

准备

要充分利用稀疏文件或压缩,您应该用零覆盖空白空间。如果 Windows 分区可能会因 Windows 休眠而出现问题,请阅读

## Most commands need sudo.
mount -o rw /dev/sdb1 /mnt
dd if=/dev/zero of=/mnt/zero_file bs=32M
## Long wait here. Expect the following outcome: (which means that all empty space was zeroed)
### dd: error writing '/mnt/zero_file': No space left on device
sync
rm /mnt/zero_file
umount /dev/sdb1
## Repeat this with /dev/sdb2, /dev/sdb3 etc.
Run Code Online (Sandbox Code Playgroud)

如果分区布局中有很大的空白,那么你也应该用零填充它们。交换分区(如果有)需要特殊处理,以使生成的图像尽可能小。Windows 文件如hiberfil.syspagefile.sysswapfile.sys可能会在zero_file创建之前被删除。我不会在这里详细介绍这些情况。

稀疏文件法

如果目标文件系统(将保存图像文件的位置)支持稀疏文件,则可以使用此方法。要生成稀疏图像文件,请调用:

## dd probably needs sudo here.
dd if=/dev/sdb of=/foo/bar/my_image.dd bs=512 conv=sparse
Run Code Online (Sandbox Code Playgroud)

(编辑:最初有bs=32M但它不是好的选择conv=sparse。比较这个问题。)

要将图像写回:

## dd probably needs sudo here.
dd if=/foo/bar/my_image.dd of=/dev/sdb bs=32M
Run Code Online (Sandbox Code Playgroud)

好处:

  • 可以挂载(mount -o offset=…或使用kpartx)映像来访问其中的文件。

缺点:

  • 目标文件系统必须支持稀疏文件。
  • 您应该记住在复制 ( cp --sparse=always) 时保持稀疏。

压缩文件法

要生成图像:

## dd probably needs sudo here.
dd if=/dev/sdb bs=32M | gzip -c > /foo/bar/my_image.dd.gz
Run Code Online (Sandbox Code Playgroud)

要将图像写回:

## dd probably needs sudo here.
gzip -cd < /foo/bar/my_image.dd.gz | dd of=/dev/sdb bs=32M
Run Code Online (Sandbox Code Playgroud)

这些命令可能在没有 的情况下构建ddgzip只有。我曾经dd确保 32 MiB 缓冲区。

好处:

  • 生成的文件是非稀疏的,不需要特殊处理。
  • 如果源磁盘上的文件易于压缩,图像大小将进一步减小。

缺点:

  • 没有完全解压就很难访问压缩图像中的文件(一些 FUSE 可能有用,虽然我不确定,从未尝试过;考虑使用squashfs 方法)。

提示

  • 在我写了这个答案的第一个版本之后很久,我才知道有一个virt-sparsify工具。看起来很有用。

  • 要压缩快用gzip --fast,要压缩最好用gzip --bestman gzip有关更多选项,请参阅。

  • 如果可以,请使用pigz代替gzip。这应该会加快速度,因为pigz可以使用多个处理器内核。如果您愿意,可以使用其他压缩器。

  • 要监控进展调用ddstatus=progress操作。如果dd已经在没有它的情况下运行(例如,您dd不支持status=progress或忘记使用它),请USR1向工具发送信号(这不会终止正在运行的dd命令):

      kill -s USR1 $(pidof dd)
    
    Run Code Online (Sandbox Code Playgroud)

    并根据需要重复。

  • 作为替代,dd您可以使用pv阅读。例子:

     pv -B 32m /dev/sdb | dd of=/foo/bar/my_image.dd bs=512 conv=sparse
     pv -B 32m /dev/sdb | gzip -c > /foo/bar/my_image.dd.gz
    
    Run Code Online (Sandbox Code Playgroud)

  • 感谢您分享如此精彩的答案。我注意到您可能想要提及的是,**ls** 和 **du** 在构建稀疏图像时会报告不同的文件大小。据我所知 **dd** 将报告两个大小中较大的一个,**ls** 也是如此,但是 **du** 将打印文件系统上存在的更准确的文件大小。 (2认同)

归档时间:

查看次数:

38937 次

最近记录:

4 年,7 月 前