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

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

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

答案1

可以,但你应该先准备好磁盘。诀窍是使用稀疏文件或压缩。这种方法很耗时,会产生大量 I/O。对于你的情况(在 1 TB 硬盘上使用 2GB),文件复制(如 sawdust 的评论中所建议)可能是一种更好的解决方案。另一方面,如果您使用了 1 TB 中的 850 GB,其中有许多小文件,您想要一次性备份 MBR、分区表、元数据等,那么我的方法将是一种合理的方法,可以节省至少 150 GB 的映像文件(除非数据压缩得足够好,否则仍然无法放入 500 GB 的硬盘中)。

我正在为磁盘使用率较高的用户编写这篇文章。还要注意,源驱动器应该是健康的,并允许覆盖空白空间。我给出的解决方案主要是为了备份,而不是恢复或取证。时间和 I/O 成本不仅在创建图像期间支付,而且在(如果)将图像写回磁盘时也会支付。请仔细考虑该方法是否适合您。

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

准备

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

如果源驱动器是 SSD,那么它可能足以用于fstrim其中的每个文件系统。否则(当然,如果是 HDD),您需要物理地写入零。您可以这样做:

## 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.

如果分区布局中存在较大的间隙,则还应将其填充为零。交换分区(如果有)需要特殊处理,以使生成的映像尽可能小。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

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

要写回图像:

## dd probably needs sudo here.
dd if=/foo/bar/my_image.dd of=/dev/sdb bs=32M

优点:

  • 可以安装(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

要写回图像:

## dd probably needs sudo here.
gzip -cd < /foo/bar/my_image.dd.gz | dd of=/dev/sdb bs=32M

这些命令可能无需构建ddgzip仅需构建。我曾经dd确保 32 MiB 缓冲区。

优点:

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

缺点:

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

提示

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

  • 压缩快速使用gzip --fast,压缩最佳使用。更多选项gzip --best请参阅。man gzip

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

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

      kill -s USR1 $(pidof dd)
    

    并根据需要重复。

  • dd你也可以使用read 来代替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
    

答案2

如果目标磁盘已经格式化,则将第二个磁盘插入与第一个磁盘相同的机器并挂载,并且如果您运行的是 Linux 或 Mac:

rsync -avP --ignore=/media/disk2 / /media/disk2

如果目标磁盘已经格式化,则第二个磁盘将被格式化并安装到另一台电脑上,并且如果您运行的是 Linux 或 Mac:

rsync -avP / user@ip_of_disk2_host:/media/disk2

这假设您只想备份文件而不考虑底层驱动器。这将执行每个文件的备份,并且仅对 2 GB 的数据运行相当快。

答案3

我认为已经有一个使用 gzip 或稀疏内容的相当不错的答案,但它相当做作。答案中对优缺点的讨论确实值得一看!

我可以补充一下回复关于处理树莓派上的 SD 卡备份,使用普通的 时也存在可能产生巨大磁盘空间开销的问题dd。建议使用image-backup,这听起来完全符合 OP 所需的任务。

答案4

  1. 制作 gparted live USB
  2. 启动 gparted 并将原始驱动器上的分区大小调整为 2+ gb
  3. 通过驱动器复制
  4. 将新复制的分区调整为其完整大小

相关内容