从虚拟机(VM)迁移到物理系统

怎样将.vdi或.vmdk文件转换为物理硬盘上的真实安装?
能否将Ubuntu虚拟机安装迁移到物理机上?如果可能,这个过程有多难以完成,需要采取哪些步骤来准备迁移?
我想在虚拟机上进行一些测试,如果成功了,希望将该系统迁移到物理硬件上,而不是重新安装所有东西。这种操作可行吗?

2相关链接:是否可以将虚拟机转换为物理环境? 在SU上。 - kenorb
5个回答

是的,这是可能的。甚至不是那么难,只需要一些时间、一个Ubuntu LiveCD、粘背胶和一个外部USB硬盘(如果你没有多个内部硬盘)。
初步步骤:将磁盘转换为有用的格式
VMWare和VirtualBox(等等)都使用不适合直接写入磁盘的磁盘格式。你可以这样做,但我个人觉得先将其写入一个中间的标准映像更方便。你可以在当前系统上完成这个操作,而不需要启动LiveCD。
  • 打开终端并输入以下命令:

    cd /media/wherever-the-image-is/
    
    # 对于VMWare
    sudo apt-get install qemu-kvm
    qemu-img convert your-vmware-disk.vmdk -O raw disk.img
    
    # 对于VirtualBox
    VBoxManage clonehd your-virtualbox-disk.vdi disk.img --format RAW
    
  • /media/wherever-the-image-is/disk.img 移动到不打算写入的地方。如果你计划将其写入当前所在的磁盘,你需要将它放在一个单独的内部磁盘上,或者最坏情况下是一个外部磁盘。

  • 以下说明假设你已将其移动到 /media/dave/disk.imgdave 是一个外部USB磁盘)

  • 在进行任何严肃的写入之前,请确保备份。虽然这是一个老生常谈的话,但一处笔误就有可能彻底损坏系统。要做好事情会出错的准备并且有备份。CloneZilla可以帮助您对整个磁盘进行备份,如果您有存储数据的地方。

将图像写入自己的磁盘

您需要执行类似以下操作。 这假定您要覆盖整个磁盘。 如果您想进行与Windows并行安装,请不要按照这些说明!请跳过项目符号后面的内容。

  • 启动Ubuntu Live CD并点击“试用Ubuntu”。

  • 挂载存储vmdk镜像的位置(例如外部USB磁盘为/media/dave)。不要挂载您想要写入的位置。

  • 然后我们开始工作:

    sudo dd if=/media/dave/disk.img of=/dev/sdX
    

    您需要将sdX替换为目标磁盘的正确路径。 sudo密码为空,只需按回车键即可。

  • 然后您可以打开gparted或其他工具,您应该能够看到Ubuntu分区位于磁盘上。您应该能够将其扩展出来。

将图像与另一个操作系统一起写入磁盘

这可能是一种更安全的方法。思路非常相似,只是您需要正确安装Ubuntu,然后将文件从disk.img同步过来。

  • 这次的 LiveCD 必须与您的虚拟安装版本相同。进入 Live CD,再次点击安装。

  • 按照安装程序进行操作,根据需要重新分区。大约10分钟后,安装完成并要求您重新启动。不要重新启动。即使您不小心重新启动了,确保下一步指令在 LiveCD 中执行。

  • 挂载新安装的分区和您之前存储的外部磁盘上的disk.img(在资源管理器中双击它们)。

  • 在终端中挂载您的 disk.img 镜像:

    sudo mkdir /media/oldinstall
    sudo mount -o loop /media/dave/disk.img /media/oldinstall
    

    -注意- 在创建所需的 .img 文件之后,有时当您尝试将其作为循环设备挂载时,可能会遇到以下错误

    "NTFS signature is missing. Failed to mount '/dev/loop0': Invalid argument The device '/dev/loop0' doesn't seem to have a valid NTFS."

    .img 文件有时在实际分区之前包含主引导记录和分区表,您可能希望挂载该分区。因此,您需要找出所需分区的偏移量。可以使用 parted 工具来完成此操作。有关示例,请参阅此链接中 sisco311 的回答 http://ubuntuforums.org/archive/index.php/t-1576011.html

    因此,如果您已确定偏移量为“xxx”,则可以使用以下命令挂载分区

    sudo mount -o loop,offset=xxx /media/dave/disk.img /media/oldinstall
    
  • 从那里,您可以选择拷贝文件或者直接将所有文件覆盖到新的 Ubuntu 安装上,使用类似以下命令:

    sudo rsync /media/oldinstall/ /media/my-new-install/
    
  • 重新启动,您应该能看到旧的 VMWare 安装,但在裸机上运行。如果出现严重的 grub 问题,您可以通过 返回 Live CD,进行 chroot 并修复问题 来解决。


7你知道有没有一种可以自动完成这个任务的工具? - the_drow
1对于在Windows/VirtualBox上的设置,VBoxManage internalcommands converttoraw your-virtualbox-disk.vdi /dev/sdX命令仍然有效。只需要在运行第一个命令之前切换到Program Files\Oracle\VirtualBox目录即可。 - Aust
3@Aust 我怀疑在Windows中/dev/sdX不是有效的目标。据我所知,它应该是\\Device\Harddisk0或类似的东西。 - Danatela
5VBoxManage internalcommands converttoraw your-virtualbox-disk.vdi /dev/sdX 这个命令行不起作用。在Linux中会出现错误:VBoxManage: error: Cannot create destination file "/dev/sdX": VERR_ALREADY_EXISTS。需要先使用 VBoxManage 命令将其发送到一个镜像,然后再使用DD将镜像写入物理磁盘。 - L. D. James
1我刚刚用Xubuntu 19.04做了这个,但还需要更多步骤: 1)在光盘启动模式下,进入新的安装磁盘并编辑/etc/fstab文件,将根目录和交换驱动器的挂载点改为现有的(可以通过sudo fdisk -l和ls -lA /dev/disk/by-uuid找到UUID)。 2)修复grub并不容易,在我的情况下,最好的解决方法是使用一个工具 - https://help.ubuntu.com/community/Boot-Repair,它可以修复它。 - MiroJanosik
这个方法非常好用。将其保存为.img文件并存储在USB驱动器上(50GB的vdi文件)。这是一个全新的Win10虚拟机安装。使用Ubuntu Live 20.10启动另一台计算机,并使用dd命令复制到经过gparted擦除的硬盘驱动器上。所有分区都按预期出现,然后可以使用gparted来调整它们的大小。这是一个非常快速的重置计算机的方法。然后只需要进行驱动程序更新等操作,因为硬件不同。 注意:VBoxManage卡住了,所以必须以root身份运行。可能是挂载问题,但没有报错信息。 - Sir_Scofferoff

也许这不完全是你所要求的,但它可能能够实现你想做的事情。
由于所有的设置都存储在你的主目录中,你可以将其备份到真实磁盘上的另一个分区。在真实磁盘上安装了新的Ubuntu之后,只需再次运行备份程序,就可以恢复你的主目录并保留所有设置。
你可以使用一个非常好用的备份程序,叫做“Déjà Dup”。
来自Ubuntu软件中心的信息:
Déjà Dup是一个简单的备份工具。它隐藏了正确备份的复杂性(加密、离线和定期备份),并使用duplicity作为后端。
特点包括:
- 支持本地、远程或云备份位置,如Amazon S3或Rackspace Cloud Files - 安全加密和压缩你的数据 - 增量备份,可以从任何特定的备份中恢复 - 定期备份计划 - 与你的GNOME桌面良好集成

enter image description here

你会在两个小时内完成的!
祝你好运!

1听起来很简单。有人可以确认它确实有效吗? - Mateng
在其他事情中... 在那个时间点上,用户编号(UID)可能会有所不同。 - Tomachi

尝试UDPCast
整个想法是将vmdk文件从虚拟机流式传输到物理机器,然后写入物理硬盘。
以下是操作步骤。
由于您有一个vmdk文件,可能可以使用VMWare Workstation,甚至是附加了此vmdk的完整虚拟机。运行带有此特定vmdk的虚拟机,但不要使用普通引导,而是使用PartedMagic liveCD进行引导。
启动liveCD后,导航到主菜单,并找到“UDPCast Disk Cloning”。其对话框是自解释的(请参见屏幕截图) UDPCast Disk Cloning start screen
选择此虚拟机作为“发送方”,然后选择要广播的驱动器(使用Unix表示法,如/dev/sda)。
在启动sender之后,您还需要启动receiver。由于您有一个物理硬盘,我假设您也有一台连接了该硬盘的完整计算机。同样,在这里,您需要启动带有UDPCast Disk Cloning的liveCD,并选择receiver以及适当的物理硬盘。
值得注意的是,您应该做好所有必要的准备工作,以确保虚拟机和物理硬件之间具有网络连接。如果您的vmdk包含私人数据,则应采取必要的预防措施,因为其内容将通过网络进行实时传输。另一件事是,您的目标硬盘的存储容量不应少于vmdk的容量。这是显而易见的,但也值得注意的是,您的镜像会一对一地布局在目标硬盘上,您需要使用gparted或类似工具执行适当的操作,以利用新硬盘的更大容量。

我想指出,这种方法非常直接和相对容易执行。也就是说,你唯一需要做的准备工作就是准备一个装有UDPCast或其他足够下载和运行UDPCast所需的LiveCD。如果你有虚拟硬盘映像,那么你肯定已经在虚拟机中使用过它了,而虚拟机已经设置好并准备就绪;另一方面,你也已经准备好了物理系统,它也已经为任务做好了准备。 - PF4Public
还有更多:UDPCast可以直接从PXE启动。https://www.udpcast.linux.lu/bootloader.html#pxe - PF4Public

如果您已经安装了VirtualBox,那么您可以使用VBoxManage命令将VDI(VirtualBox驱动映像)文件转换为IMG格式,然后将其复制到物理磁盘上。例如:
VBoxManage clonehd --format RAW file.vdi file.img

然后,您可以使用dd命令将文件复制到物理分区中:
dd if=./file.img of=/dev/<partition_here>

注意:如有需要,请使用sudo。在指定/dev时要小心选择正确的设备。

1vdi文件是一个虚拟磁盘,可以包含多个分区对吧?如果将其写入/dev/下的特定分区而非/dev/下的磁盘,它将如何工作? - gtux

如果您将新的物理磁盘连接到虚拟机所在的机器上,您可以直接将VDI转换为物理磁盘,而无需进行中间转换,这样可能会节省大量时间和磁盘空间。前提是您的物理磁盘与虚拟磁盘的最大容量相同或更大。在我的情况下,目标是将VDI转换为ZFS zvol,但使用任何块设备的方法应该是相同的。
首先创建一个指向您的块设备的VMDK文件:
VBoxManage internalcommands createrawvmdk -filename physical.vmdk -rawdisk /dev/sdX

然后(在虚拟机关闭的情况下!)您可以将VDI克隆到VMDK:
VBoxManage clonemedium --existing virtual.vdi physical.vmdk

这会花一些时间... 完成后,您可以删除VMDK文件,因为它只是用作VirtualBox查找物理设备的指针。

在我的情况下,新的zvol与虚拟磁盘的大小完全相同。考虑到您的物理磁盘可能不同,您需要使用某种分区调整机制来填充整个磁盘。也许可以使用Gparted或其他工具。您应该能够将其指向物理/dev/sdX设备,同时仍连接到虚拟机,这样您就不必依赖引导CD启动物理主机。

调整大小完成后,将驱动器插入物理机器中,祈祷一下,然后开机。

如果您想继续使用VirtualBox与物理驱动器,请保留VMDK文件,并使用VBoxManage storageattach将其连接到虚拟机。


看起来好像它能工作,但数据在某种程度上被损坏了,操作系统无法正常启动。 - Display Name
1将一个.vdi或.vmdk文件转换为真实物理磁盘是一回事,使其可引导则完全是另外一回事。在此之前,必须处理好引导加载程序、/etc/fstab等等。 - xpt