如何将数据克隆到较小的硬盘?

如何将硬盘克隆到较小的硬盘。
1. Clonezilla很棒,但它不支持这种功能。 2. 此外,dd和PartImage也不支持此需求。 3. rsync不会复制MBR,因为MBR不是文件。
我需要克隆HDD而不是备份,因此rsync不是可接受的答案。
有什么建议吗?

2只有一个问题,为什么需要克隆?如果是为了UUID,那么在执行dd复制之前,您介意缩小文件系统吗?如果您不介意缩小,那么只需运行resize2fs将文件系统缩小到比目标磁盘更小的大小,然后进行dd复制。在另一侧再次运行resize2fs来扩展并填充新磁盘。 - darkdragn
13个回答

显然,你无法将一个较大的分区克隆到一个较小的分区(使用dd等工具),因为空间根本不足。

但是,如果较大分区上的文件也可以适应较小的分区,你可以使用rsync来复制这些文件。要使用的确切选项取决于你的特定用例,但是要简单地复制所有文件,可以使用以下命令:

rsync -av /mount/point/of/large/partition/ /mount/point/of/small/partition
编辑: 再次强调:你不能将一个较大的分区克隆到一个较小的分区。(但请继续阅读,你的问题仍然可以解决。)
原因很简单:你的源分区比目标分区要大。你期望怎样呢?应该丢弃一些块吗?哪些块?dd又该如何知道呢?当然,你可以使用ddbs=count=选项,只复制源分区的前几个块,使其适应目标分区,但最终你会得到一个损坏的分区。这肯定不是你想要的结果。
所以,由于你无法将较大的分区克隆到较小的分区,你唯一能做的就是首先使用像gparted这样了解文件系统细节的工具,将源分区的大小减小到小于或等于目标分区的大小,以确保不会丢失数据。然后才能使用dd命令来克隆分区。理想情况下,源分区的新大小应该与目标分区的大小相等(而不仅仅是小于或等于),否则在克隆后目标分区会有一些未分配空间。
请注意,你不应该简单地将较大驱动器的MBR复制到较小驱动器的MBR上(反之亦然)。MBR是硬盘的第一个部分,大小为512字节,包含有关硬盘布局的信息:
- 446字节 - 引导程序。 - 64字节 - 分区表。 - 2字节 - 签名。
(注意,446+64+2=512。)
如果你坚持要克隆MBR,那么只需克隆前446个字节就可以了。
dd if=/dev/source of=/tmp/mbr.bak bs=512 count=1
dd if=/tmp/mbr.bak of=/dev/target bs=446 count=1

...将/dev/source/dev/target替换为源硬盘和目标硬盘的设备名称,例如/dev/sda/dev/sdb。(更多信息请点击此处。

然而,正确的做法是在新的硬盘上进行干净的Grub重新安装(或者您在MBR上安装的其他引导程序)。

总结一下,如果您想要将一个较大的硬盘克隆到一个较小的硬盘上,请按照以下步骤进行:

  1. 在目标驱动器上设置一个分区表,其中包含与源驱动器上的分区数量相同的分区。源驱动器上的分区与目标驱动器上的分区应该一一对应,只是目标驱动器上的分区(有些)可以比源驱动器上的分区小。使用诸如 fdiskcfdisk 的工具来完成。

  2. 对于目标驱动器上比其对应的源驱动器上的分区小的每个分区,将源驱动器上的这个对应分区的大小减小到与目标驱动器上的分区大小相匹配。使用诸如 gparted 的工具来完成。

  3. 对于源驱动器上的每个分区,执行以下命令:

    dd if=/dev/sdaX of=/dev/sdbY
    

    ... 将源驱动器上的分区 /dev/sdaX 克隆到目标驱动器上的相应分区 /dev/sdbY(当然要适当替换设备名称)。

  4. 如果您坚持要克隆 MBR,请使用本帖子中更早写的两个 dd 命令(带有 /tmp/mbr.bak 的那些)。但是,请记住重新安装干净的 Grub 更好。


3rsync不会复制MBR,因为MBR不是一个文件,所以rsync不适用于克隆。我需要克隆硬盘,而不是备份 ;) - Maythux
3是的,rsync确实不适用于克隆。这正是我之前所说的-仔细阅读我的帖子吧。;) 我编辑了我的帖子,解释了如何克隆所有分区以及MBR。希望这更接近你想要的。 - Malte Skoruppa
1如何进行干净的Grub安装? - Ken Sharp
1@KenSharp 看这里,例如:https://help.ubuntu.com/community/Grub2/Installing - Malte Skoruppa
为什么你推荐在第一步使用fdisk/cfdisk,而在第二步使用parted/gparted?为什么要使用不同的工具? - gerrit
1@gerrit 使用parted/gparted作为第一步是完全可以的。就像很多情况一样,达到目标有很多种方法。fdisk/cfdisk是更基础的工具,在上述描述中,我只是试图提到最基本的工具来完成任务。 - Malte Skoruppa

精确克隆是不可能的,正如Malte Skoruppa已经提到的。然而,只要较大的磁盘没有满(Malte已经提到了这一点),Clonezilla就能够完成这个任务。
基本上,您需要启用高级选项,并“忽略”关于较小磁盘的警告消息。请参阅Clonezilla文档以获取详细信息和截图。 当我将一个160GB硬盘的备份恢复到一个64GB固态硬盘时,我遇到了同样的问题。对我来说,这个方法很有效。
另一种解决方案是将备份还原到相同大小的磁盘,并重新分区以适应较小磁盘的新分区模式。请参阅jsm-techblog.blogspot.de以获取详细操作步骤。

@DennisNolte,Clonezilla需要启用哪些高级选项?阅读文档后,我猜测应该是-k1,它会按比例在目标磁盘上创建分区表,并打开-r选项以自动调整分区中的文件系统大小。这正确吗? - Pro Backup
我现在不再百分之百确定了,但如果再做同样的事情,这些可能是我会尝试的选项。 然而,直到它正确运行之前,我确实需要尝试2或3次,可惜我没有记住具体采取了哪些步骤,除了使用高级选项。 - Dennis Nolte
我无法使用 k1 选项使其工作,但 -icds 选项对我有效。我会发布一个更详细的答案。 - bbodenmiller
我已经在http://askubuntu.com/a/504778/310789上添加了关于我如何使其工作的详细信息。 - bbodenmiller
Clonezilla可以通过磁盘到磁盘的复制来实现这一点,但只能在专家模式下(-icds参数)。@ProBackup要注意使用-k1,在我的情况下会生成一个段错误(Clonezilla Live 20160627)。相反,在克隆之前(和之后)使用Gparted来留出(和回收)所需的尽可能多的未分配空间,然后跳过磁盘空间检查(-icds)进行克隆。我在这里列出了将克隆到较小磁盘的步骤(如果您只有Linux,请跳过Win7部分关于MBR的内容)。 - chirale

Gparted应该能完成这个任务。

  1. 使用gparted调整大小后,从驱动器启动,给操作系统修复任何错误的机会,然后再使用Clonezilla进行镜像。

  2. 然后运行Clonezilla,并复制所需的硬盘分区。

我发现另一个对我很好的选择是:MondoRescure

Mondo Rescue是一个GPL灾难恢复解决方案。

它支持磁带、磁盘、网络和CD/DVD作为备份介质,支持多个文件系统、LVM、软件和硬件Raid。

可以在这里找到一个简单的指南:here

我将发布一些截图:

步骤1 备份(分区截图)

1.从支持的备份介质类型列表中选择。

enter image description here

2. 如果您正在备份到CD / DVD- + R [W],那么Mondo会询问您的CD刻录机是否具有BurnProof技术,是否在笔记本电脑内或是否具有其他特殊性质。如果您正在备份到磁带流式传输器,则不会看到此消息。
3. 您想要多少压缩?如果您的磁带流式传输器具有内置硬件压缩,则不需要任何压缩。如果您的CPU速度非常快,则选择最大压缩。对于大多数情况,平均压缩应该就可以了。

enter image description here

4. 如果你想备份整个电脑(不包括/sys、/run和/proc,当然也不包括/tmp),那么将此设置为默认的/即可。否则,请指定子集(例如/usr/local|/home),确保在每个路径之间加上一个竖线。

enter image description here

5. 如果您正在备份整个计算机,那么您可能希望排除某些目录,例如/shared/MP3。请在“排除目录”对话框中指定它们。请在每个路径之间使用竖线分隔,例如/shared/private|/scratch|/nfs|/windows。

enter image description here

6. 你的内核正常吗?Red Hat、Mandrake、SuSE、Debian和Slackware的用户通常应该回答“是”,因为这些供应商擅长生产可靠的内核。如果你使用的是Gentoo或LFS,那么你的内核可能是非标准的,这种情况下请回答“否”,以使用Mondo提供的安全内核(单独提供)。

enter image description here

7. 如果你想在将档案写入媒体后进行验证,请在此处选择“是”。如果你对自己的硬件和Linux发行版有绝对的信心,请选择“否”...然后默默祈祷一下。

enter image description here

8. 如果你确定要继续,请说“是”,然后找点其他事情做,让 Mondo 来备份你的电脑。如果你说“否”,那么你将被无情地抛到命令提示符下。:-)

enter image description here

9.备份过程现在将开始。首先需要进行一些预备工作,但备份已经基本开始了。为了简化备份过程,您被要求回答了一系列问题。下次,如果您愿意,您可以使用各种命令行开关来控制mondoarchive的行为,而不是回答一系列问题。有关详细信息,请参阅man页面。

enter image description here

10. Mondo将制作所有需要备份的文件目录。这可能需要长达五分钟的时间。文件列表将被分成一组,每组大约4 MB(在压缩之前)的文件。这通常需要一分钟左右的时间。

enter image description here

11. Mondo 给 Mindi 打电话。Mindi 生成可引导媒体镜像和辅助数据磁盘镜像,这些镜像基于您现有的 Linux 发行版和文件系统。这样,您可以确信 Mondo 的工具与您现有的文件系统和二进制文件兼容:Mondo 的工具就是您的工具。Mindi 运行时间最长为五分钟。

enter image description here

12. 最后,Mondo开始备份您的计算机。这个过程可能需要几分钟或几个小时,这取决于您要归档的数据量、您的CPU速度、RAM容量等因素。它将备份您的常规文件,然后是大文件(大小超过约32MB的文件)。如果您选择验证备份,Mondo也会执行此操作。

enter image description here

第二步 恢复(分区克隆)

1.选择您的备份介质。实时恢复过程与从Mondo媒体启动后键入mondorestore命令时的体验非常相似。

enter image description here

2. 当你插入磁带/光盘后,点击“确定”。如果你生成了磁带备份,那么磁带本身就足够了。如果你生成了光盘备份,第一张光盘就足够了。否则,你可能需要引导介质。

enter image description here

3. 标记您想要恢复的文件和目录。使用“更多”和“更少”按钮来打开和关闭子目录。

enter image description here

4. 指定要恢复文件的位置。一般来说,'/' 是合适的选择。如果您不想覆盖正在恢复的文件的较新版本,请指定 /tmp/BKP 或类似的恢复路径。

enter image description here

5. Mondorestore将从媒体中检索配置信息。(示例屏幕适用于磁带用户。CD用户将看到不同的内容。)

enter image description here

6. 数据将会被恢复到硬盘上 - 首先是常规文件,然后是恢复集中的任何大文件(32MB或更大)。

enter image description here


看起来很有趣。我打算试一试,然后再向你反馈结果。 - Maythux
@Maythux 反馈结果怎么样? - Highmastdon
你首先必须把所有东西刻录到光盘上吗? - Ken Sharp
对于那些喜欢立即尝试事物以使Mondo正常工作的人来说,您需要从上面的MondoRescue链接下载并按顺序安装lib-projectbuilder-perl、libmondorescue-perl、mindi-busybox、mindi和mondo的最新版本,以避免出现依赖关系不满足的问题。如果您不愿意编译源代码,也可以使用.deb软件包进行安装。 - Elder Geek
当前版本似乎没有此处列出的(1.5 版)的用户界面,并且 Mindy 测试无法启动。 - Elder Geek
备份到磁带和光盘?! - FlexMcMurphy

大多数示例建议调整原始驱动器的大小或使用克隆。
调整大小:修改数据时有丢失数据的风险。
克隆:(CloneZilla)无法克隆到较小的磁盘,并且复制整个驱动器,甚至未使用的空间需要花费时间。
另一种方法相对较少风险,但非常手动,我经常使用。因为它不会触及源驱动器,以防万一出现故障可以回退。
这种方法还允许您在目标驱动器上切换文件系统。
按照以下步骤进行操作,您只需在目标驱动器上创建所需的文件系统即可。
将新的目标驱动器安装到计算机中:
从Ubuntu Live CD启动计算机。
在目标驱动器上使用gparted创建:ext4文件系统(或任何所选的文件系统)卷和交换卷以及交换文件系统。
在gparted中,在新的ext4卷上设置引导标志。
在我的示例源中,(原始驱动器) 是:/dev/sda 目标 (新的较小驱动器) 是:/dev/sdb 在您的设置中可能会有所不同。
# Mount src as read only under `/mnt/source`:
sudo mkdir /mnt/source ; sudo mount -o ro /dev/sda/mnt/souce

# Mount the destination drive under `/mnt/destination`
sudo mount /dev/sdb1 /mnt/destination/

# copy src filesystem to destination filesystem with:
sudo rsync -log /mnt/destination/rsync-copy.log  --progress -avr --exclude=/mnt/source/dev/ -A -H  -X   --numeric-ids  /mnt/source/* /mnt/destination/

Ubuntu使用UUID而不是设备名称来查找和挂载驱动器。由于我们有一个新的磁盘,我们希望更改目标fstab以使用新驱动器的UUID来挂载磁盘。
# list disk UUID:s and pick the appropriate one for your drive
ls -la /dev/disk/by-uuid

现在用UUID替换/mnt/destination/etc/fstab中的/和swap。如果您决定将挂载点更改为与原始驱动器不同的内容,请不要忘记更改文件系统。
如果GRUB版本一致很重要,再次从原始磁盘启动,并运行以下命令将GRUB安装到新驱动器上。
sudo grub-install /dev/dev/sdb

现在从您的计算机上移除源驱动器,然后启动目标驱动器。GRUB将无法完全引导并退出到GRUB恢复Shell中。
# load some needed grub modules
insmod ext2 
insmod linux
# lists your disk devices
ls

选择适当的设备(在我的例子中是hd0,msdos1
set root=(hd0,msdos1)

找到vmlinuz-xxxinitrd-xxx的确切名称,以配置GRUB使用。
ls /boot/

从上面的ls命令中获取vmlinuz和initrd的正确名称,并使用它们代替我在下面示例中使用的版本。
linux /boot/vmlinuz-2.6.32-5-amd64 root=/dev/sda single

如果/dev/sda是设备,下次您只使用目标磁盘重新启动机器时,该驱动器将成为根文件系统磁盘。
initrd /boot/initd.img-2.6.32-5-amd64
boot

这应该成功启动了机器。
最后,更新GRUB以使用新的磁盘UUID,这样您就不需要每次都重复这个手动过程。
sudo update-grub

使用Clonezilla可以将较大的硬盘“伪克隆”到较小的硬盘上。您可以有效地保存和恢复磁盘的分区。以下步骤(针对从HDD到SSD的转移)将帮助您完成此过程:
1. 第一个技巧是使用Gparted调整硬盘上的分区大小,缩小每个分区的大小以减少未使用空间的量。显然,分区的大小必须使得所有分区所需的总空间小于SSD的容量。
2. 然后运行Clonezilla,并使用saveparts选项复制各个硬盘分区,将其临时存储在外部USB驱动器上。请注意,必须保存分区(saveparts),而不是创建整个磁盘的镜像(savedisk)。
3. 将SSD安装到目标机器上后,第二个技巧是再次使用分区管理器在SSD上创建所需的分区结构。
4. 然后使用Clonezilla将保存的分区(使用restoreparts)恢复到SSD上。
请参阅:"将硬盘克隆到较小的固态硬盘,了解更多关于该过程的讨论以及一些参考来源的链接。

您可以使用ClonezillaGParted将数据转移到较小的驱动器上。
使用GParted Live CD缩小分区,使其适应新的驱动器。将分区移动到驱动器的末尾/右侧,以使空白(灰色)空间位于最后。如果在第一个分区之前已经有空白空间,请保留该空间,因为它可能包含引导或其他隐藏信息。
使用Clonezilla进行设备-设备克隆。选择高级选项并启用-icds选项以跳过磁盘大小检查。继续进行克隆,移除旧驱动器,并尝试从新驱动器启动。如果出现错误,请尝试-fsck-src-part选项,该选项可帮助您修复源磁盘上的错误。
Clonezilla docs中:

如果您确定镜像中的所有数据都可以适应较小的磁盘,即不会写入错误的磁盘空间,您可以选择选项“-icds”。警告!要选择此选项,您必须知道自己在做什么!

我阅读的一个常见问题解答建议使用Clonezilla的-icds-k1选项,但对我来说没有起作用。其他人提到可以使用GParted复制分区,但它无法复制所有分区类型,并且在使用该方法后,我的机器无法启动,可能是因为未复制某些隐藏在分区之间的信息。


免责声明:我是WereSync的原始作者。
使用WereSync可以实现这一点。WereSync遵循Malte's answer的一般流程,但只需要一个命令而不是多个命令。此外,如果您将克隆用作备份,它可以增量更新该备份,因为它在后台使用rsync。
要安装WereSync,请使用pip。
pip install weresync

从那里,你可以简单地使用WereSync命令。
 weresync -C -g 2 -E 1 /dev/sda /dev/sdb

上述命令将数据从/dev/sda复制到/dev/sdb。-C标志表示WereSync应检查两个驱动器上的分区是否相等,如果它们不相等,则WereSync应将分区从/dev/sda复制到/dev/sdb并调整大小以适应。新分区的UUID将不同。用于测试分区是否有效的系统可能有些棘手,因此在第一次备份之后,我建议省略此标志。
-g和-E命令可以省略,但在这种情况下,引导加载程序安装几乎肯定会失败。
-g指的是“grub分区”,或者grub应该安装在哪个分区上。通常,这是挂载在/上的分区。因此,如果你的/dev/sda2挂载在/上,你需要将-g 2传递给WereSync,就像上面的示例中那样。如果省略此选项,WereSync将尝试自行发现正确的分区,但这容易出错。我建议简单地传递该标志。
-E指的是EFI分区。如果你的EFI分区位于/dev/sda1上,请将-E 1传递给WereSync,就像上述命令中那样。
如果您为/boot文件夹拥有单独的分区,那么你需要让WereSync知道。如果您将其放在/dev/sda3上,则将 -B 3 传递给WereSync即可。
更详细关于此命令可能标志位的信息,请参见 WereSync命令文档

1你能添加一个LiveCD吗? - Tal
嗨 @DonyorM,看起来这似乎是最简单的解决方案,但它只适用于特定情况吗?例如,它能否在将大型驱动器缩小为仅包含Linux的小型驱动器时起作用?或者它也适用于Windows 7/8/10的情况? - George Pligoropoulos
1@GeorgePligoropoulos 这个方法适用于缩小仅包含Linux的驱动器。它可以复制Windows文件,但据我所知无法使其可引导。 - DonyorM

我想将一个坏掉的32Mb的旧256Mb紧凑型闪存卡克隆成一个新的32Mb的。这个闪存卡里面装有一个小型Linux设备,用于制造小弹簧线圈。
解决方法如下:
(当然,256Mb中实际使用的空间小于32Mb,所以完全适合)
  1. 使用dd创建一个256Mb闪存卡的映像(此示例假定卡已挂载在/dev/sdb):

    dd if=/dev/sdb of=image256.iso
    
  2. 使用unetbootin读取image256.iso ISO文件(磁盘映像选项)。

  3. 选择32Mb卡所在的USB驱动器,然后将映像转储到32Mb卡中。

没问题,这张32Mb的卡成功地让我的机器重新启动了。

你可以尝试分两步来完成。首先,将系统克隆到一个稀疏镜像中(随着添加更多内容,镜像会变得越来越大)。然后,从这个镜像中恢复到第二个较小的磁盘上。

在使用GParted将文件系统缩小后,我将两个硬盘放入RAID盒中,并设置为镜像模式,其中较大的硬盘是源硬盘,较小的硬盘是目标硬盘。我只需要点击盒子内部的重置按钮(不改变模式,即从Raid 1到Raid 0)就可以开始克隆。完美运行!:) 我使用的是GW3.5AX2-SU3/MB Raid盒。