May*_*hux 46 clone software-recommendation dd clonezilla
如何将硬盘克隆到较小的硬盘。
dd
PartImage 不支持这种需求。rsync
不会复制 MBR,因为 MBR 不是文件。我需要克隆硬盘而不是进行备份,所以rsync
这不是一个可以接受的答案。
有什么建议?
Mal*_*ppa 40
您显然不能将较大的分区克隆到较小的分区(使用dd
等),因为根本没有足够的空间。
但是,如果较大分区上的文件也适合较小分区,则可以使用rsync
复制这些文件。要使用的确切选项取决于您的特定用例,但要简单地复制所有文件,请执行以下操作:
rsync -av /mount/point/of/large/partition/ /mount/point/of/small/partition
Run Code Online (Sandbox Code Playgroud)
编辑: 再一次:您不能将较大的分区克隆到较小的分区上。(但请继续阅读,您的问题还可以解决。)
原因很简单:你的源分区比你的目标分区大。你能指望什么?应该丢弃一些块吗?哪个?而应该怎么dd
知道?当然,您可以使用dd
'sbs=
和count=
options 仅复制源分区的第一个这么多块,以便它适合您的目标分区,但最终会导致分区损坏。那当然不是你想要的。
所以,既然您无法克隆一个更大的分区到一个较小的分区,你能做的唯一一件事就是第一源分区的大小缩小到尺寸小于或等于与一些目标分区像gparted
一个知道的文件系统细节,这样您就不会丢失数据。而只有那么你可以使用dd
克隆的分区。理想情况下,源分区的新大小应等于目标分区的大小(而不仅仅是更小或相等),否则克隆后目标分区上将有一些未分配的空间。
另请注意,你应该不是简单地复制MBR较大的驱动器上的小驱动器的MBR(或反之,对于这个问题)。MBR 大小为 512 字节,是硬盘驱动器的第一部分,包含有关硬盘驱动器布局的信息:
(请注意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
Run Code Online (Sandbox Code Playgroud)
...分别用源和目标硬盘驱动器的设备名称替换/dev/source
和/dev/target
,例如,/dev/sda
和/dev/sdb
。(更多信息可在此处获得。)
但是,正确的方法是在新硬盘上重新安装干净的 Grub(或 MBR 上的任何内容)。
总而言之,如果要将较大的驱动器克隆到较小的驱动器上,请执行以下操作:
在目标驱动器上布置一个分区表,其分区数与源驱动器上的分区数相同。源驱动器上的分区和目标驱动器上的分区之间应该是一一对应的,只是目标驱动器上的(某些)分区可以小于源驱动器上的相应分区。使用诸如fdisk
或 之类的工具cfdisk
。
对于目标驱动器上每个小于源驱动器上对应分区的分区,减小源驱动器上该对应分区的大小以匹配目标驱动器上的分区大小。使用诸如此类的工具gparted
。
对于源驱动器上的每个分区,发出命令
dd if=/dev/sdaX of=/dev/sdbY
Run Code Online (Sandbox Code Playgroud)
... 将分区/dev/sdaX
从源驱动器克隆到/dev/sdbY
目标驱动器上的相应分区(当然,适当地替换设备名称。)
如果您还坚持要克隆 MBR,请使用本文dd
上面进一步编写的两个命令(带有这些/tmp/mbr.bak
内容的命令)。但是,请记住,重新安装干净的 Grub 会更好。
小智 15
由于 Malte Skoruppa 已经发布,因此无法进行精确克隆。但是,只要较大的磁盘未满,clonezilla 就能够完成此任务(Malte 已经提到了这一点)。
基本上,您需要启用高级选项并“忽略”有关较小磁盘的警告消息。有关屏幕截图的详细信息,请参阅Clonezilla 文档。将 160GB HDD 的备份恢复到 64GB SSD 时,我遇到了同样的问题。对我来说,这很有效。
另一个应该是您想要的结果的解决方案是恢复到相同大小的磁盘并重新分区以使新的分区模式适合较小的磁盘。有关如何执行此操作的详细信息,请参阅jsm-techblog.blogspot.de。
Gparted应该可以胜任
使用 gparted 调整大小后,从驱动器启动以使操作系统有机会在使用 Clonezilla 进行映像之前修复任何错误。
然后运行 Clonezilla 并复制所需的硬盘分区
我发现对我来说很棒的另一个选择:MondoRescure
Mondo Rescue 是一个 GPL 灾难恢复解决方案。
它支持磁带、磁盘、网络和 CD/DVD 作为备份介质、多个文件系统、LVM、软件和硬件 Raid。
一个简单的指南可以在这里找到
我将发布一些屏幕截图:
1. 从支持的备份媒体类型列表中选择。
2.如果您要备份到 CD/DVD-+R[W],那么 Mondo 会询问您的 CD 刻录机是否具有 BurnProof 技术、是否在笔记本电脑中,或者是否异常。如果您正在备份到磁带流媒体,那么您将不会看到此消息
3.你想要多少压缩?无,如果您的磁带流媒体有内置的硬件压缩。最大值,如果您的 CPU 速度非常快。在大多数情况下,平均值应该很好。
4.如果你想备份整台电脑(不包括/sys、/run和/proc,当然还有/tmp),那就把它保留为/,这是默认的。否则,指定子集,(例如 /usr/local|/home )确保在每个路径之间放置一个管道。
5.如果您要备份整个计算机,那么您可能希望排除某些目录,例如/shared/MP3。请在“排除目录”对话框中指定它们。请在每个路径之间放置一个管道,例如 /shared/private|/scratch|/nfs|/windows
6.你的内核正常吗?Red Hat、Mandrake、SuSE、Debian 和 Slackware 用户通常应该说“是”,因为这些供应商擅长生产可靠的内核。如果您使用的是 Gentoo 或 LFS,那么您的内核可能是非标准的,在这种情况下,请说“不”以使用 Mondo 的故障安全内核(单独提供)。
7.如果您想在将档案写入媒体后对其进行验证,请在此处选择“是”。如果您对自己的硬件和 Linux 发行版有绝对的信心,请说“不”……并祈祷一下。
8.如果您确定要继续,请说“是”并在 Mondo 备份您的计算机时找点其他事情做。如果您说“不”,那么您将在 shell 提示符下被毫不客气地抛弃。:-)
9.备份过程现在将开始。首先要执行一些预备份任务,但备份基本上正在进行中。为了简化备份过程,您被问到了一系列问题。下次,如果您愿意,可以使用各种命令行开关调用 mondoarchive 来控制其行为,而不是回答一系列问题。有关详细信息,请参阅手册页。
10.Mondo 将为所有要备份的文件制作一个目录。这最多可能需要五分钟。文件列表将分为几组,每组大约 4 MB(压缩前)的文件。这通常需要一分钟。
11.蒙多打电话给明迪。Mindi 生成基于您现有的 Linux 发行版和文件系统的可启动媒体映像和辅助数据磁盘映像。这样,您就可以确定 Mondo 的工具将与您现有的文件系统和二进制文件兼容:Mondo 的工具就是您的工具。Mindi 最多需要五分钟才能运行。
12.最后,Mondo 开始备份您的计算机。此过程可能需要几分钟或几小时,具体取决于您存档的数据量、CPU 的速度、您拥有的 RAM 量等。它将备份您的常规文件,然后备份您的大文件(大于大约 32MB 的文件)。如果您选择验证备份,Mondo 也会这样做。
1.选择您的备份媒体类型。实时恢复过程与从 Mondo 媒体启动后键入不带参数的 mondorestore 时所经历的过程非常相似。
2. 插入磁带/CD 后点击“确定”。如果您生成了磁带备份,那么磁带本身就足够了。如果您生成了 CD 备份,那么第一张 CD 就足够了。否则,您可能需要启动媒体。
3.标记要恢复的文件和目录。使用“更多”和“更少”按钮打开和关闭子目录。
4.指定要将文件还原到的位置。一般来说,'/'是合适的。如果您不想覆盖要恢复的文件的较新版本,则指定 /tmp/BKP 或类似文件作为恢复路径。
5.Mondorestore 将从媒体中检索配置信息。(示例屏幕适用于磁带用户。CD 用户会看到不同的内容。)
6.数据将恢复到硬盘 - 首先是常规文件,然后是恢复集中的任何大(32MB 或更大)文件。
大多数示例建议重新调整原始驱动器的大小或使用克隆。
调整大小:修改数据时有丢失数据的风险。
克隆:(CloneZilla)你不能克隆到一个较小的磁盘,复制整个驱动器需要时间,甚至是未使用的空间
另一种风险较小但我使用的非常手动的方法。因为它使源驱动器保持不变,以防万一您因为某些故障而想退回。
此方法还允许您在目标驱动器上切换文件系统
通过以下过程,您只需在目标驱动器上创建您选择的文件系统。
将新的目标驱动器与原始驱动器一起安装到您的计算机中:
在我的示例中,源(原始驱动器)是:/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/
Run Code Online (Sandbox Code Playgroud)
Ubuntu 使用 UUID 而不是设备名称来查找和挂载驱动器。由于我们有一个新磁盘,我们希望更改目的地fstab
以使用新驱动器的 UUID 来挂载磁盘。
# list disk UUID:s and pick the appropriate one for your drive
ls -la /dev/disk/by-uuid
Run Code Online (Sandbox Code Playgroud)
现在替换/
和swap
中的 UUID /mnt/destination/etc/fstab
。如果您决定将其更改为与原始驱动器不同的内容,请不要忘记更改挂载点的文件系统。
如果 GRUB 是相同版本很重要,请再次从原始磁盘启动并运行并运行以下命令将 GRUB 安装到新驱动器
sudo grub-install /dev/dev/sdb
Run Code Online (Sandbox Code Playgroud)
现在从您的计算机中删除源驱动器并启动目标驱动器。GRUB 将无法完全引导并退出到 GRUB 恢复 shell 中的恢复 shell:
# load some needed grub modules
insmod ext2
insmod linux
# lists your disk devices
ls
Run Code Online (Sandbox Code Playgroud)
选择合适的设备(在我的例子中是hd0,msdos1
)
set root=(hd0,msdos1)
Run Code Online (Sandbox Code Playgroud)
找到GRUB的确切名称vmlinuz-xxx
并initrd-xxx
配置要使用的 GRUB
ls /boot/
Run Code Online (Sandbox Code Playgroud)
查看并使用从ls
上面获得的 vmlinuz 和 initrd 的正确名称,并使用它们代替我在下面使用的示例版本
linux /boot/vmlinuz-2.6.32-5-amd64 root=/dev/sda single
Run Code Online (Sandbox Code Playgroud)
如果/dev/sda
是设备,则下次您仅使用目标磁盘重新启动机器时,该驱动器将成为 rootfs 磁盘。
initrd /boot/initd.img-2.6.32-5-amd64
boot
Run Code Online (Sandbox Code Playgroud)
这应该已经成功启动了机器
最后更新 GRUB 以使用新的磁盘 UUID,这样您就不需要每次都重复此手动过程:
sudo update-grub
Run Code Online (Sandbox Code Playgroud)