我有一个虚拟机,是在 Virtual Box 下创建的。如何将其转换为物理机并安装到硬盘上的分区?我的主机操作系统是 Windows。
我在网上没有找到太多资料,而且我发现的资料也令人困惑。例如,我读过类似的问题,结果发现主机操作系统也是 Ubuntu,而不是 Windows。
创建磁盘映像可能是一种选择,但我以前从未做过这样的事情。如果需要创建某种安装介质,我有一个 32gb 的 U 盘。
答案1
将虚拟机转换为物理安装极其困难,而且通常结果都不太好。
真正继续的唯一方法是将 Ubuntu 全新安装到您的硬盘上,然后手动将您想要从 VM 中保留的数据复制到外部 USB 驱动器或类似设备,然后再复制回全新安装中。
答案2
概述
作为 2022 年对这个问题的更新答案,这样的过程比以前更加常见,虽然托马斯的回答曾经在某种程度上可能是正确的,但总的来说*它实际上并不像以前的答案看起来那么困难。
需要澄清的是,在 Windows 8 和 10 之前,Windows 从虚拟机迁移到物理机或从物理机迁移到虚拟机实际上是更困难的情况,这不仅是因为 Windows 正版的激活保护,还因为 Windows 的硬件抽象层 (HAL) 以及驱动程序和内核对实际硬件的依赖,如前所述这里借助 Windows 10,微软让 Windows 能够更好地适应突然的硬件变化
然而,在 OP 的案例中,它是一台使用 VirtualBox 运行虚拟版 Ubuntu 的 Windows 主机。虽然这个过程对某些人来说有些繁琐,但我认为它并不是一件非常困难的事情如果你说的只是转换虚拟机并将其放入裸机中(没有其他现有操作系统或需要保留其他操作系统)。
*困难的是,如果您希望将其作为双启动设置的一部分,而您只有一个硬盘驱动器。那么您将拥有一个使用多个虚拟分区创建的虚拟机,并尝试将这些多个分区放入单个物理分区,并且需要指定分区偏移量,这会导致额外的工作,即必须单独设置 Grub 和引导加载程序才能与 Windows 友好地运行,使用救援过程某种程度上。这是在这种情况下,我同意之前的答案,只需在所需的其他分区上进行全新安装以便安装程序可以在安装过程中负责配置您的启动选项。
但是,如果您或其他任何人遇到这种情况,并且最好有另一个硬盘驱动器来安装虚拟机,则该过程如下所述。
转换在 Windows 环境(主机操作系统)中创建的虚拟系统(基于 Linux)
为此,该过程涉及首先使用以下命令将虚拟机转换为磁盘映像垂直框管理然后启动 Linux 系统的实时启动 USB,将该映像写入硬盘。当与 Windows 共享硬盘并将其应用于不同的分区时,此过程略有不同。但是,对于使用新硬盘的用户,从映像文件直接写入磁盘就足够了,并且包含在以下步骤中,在 OP 提出的请求之前给出的步骤中。
更多关于 VirtualBox 克隆的信息这里。
创建虚拟机映像文件
打开提升的命令提示符(以管理员身份运行)并导航到 VirtualBox 的安装目录(或者,您可以将安装目录添加到 PATH,以便您可以从 VM 文件的位置运行 VBoxManage)
下面,我们假设 VirtualBox 安装在默认路径下
C:\Program Files\Oracle\VirtualBox
,我们的示例虚拟机位于另一个文件夹中,我们将引用该文件夹,C:\MyVMs\example.vdi
并将图像写入外部 USB 驱动器 (D:) 并D:\VMFolder\
命名为VMimage.img
# Adding VirtualBox's installed directory to our working environment
# This only changes the PATH temporarily within our command prompt window
C:\WINDOWS\system32> set PATH=%PATH%;C:\Program Files\Oracle\VirtualBox
# no output will indicate success but if you want to check if it's working
# you can either use echo:
C:\WINDOWS\system32> echo %PATH%
# or simply try to run VBoxManage:
C:\WINDOWS\system32> vboxmanage list hdds
# which outputs a list of all your installed VMs
使用相同的提升的命令提示符:
# Navigate to the location of our VM
C:\WINDOWS\system32> cd C:\MyVms
# You should now see the command prompt as:
C:\MyVMs>
# Run the command to convert our VM to a raw image file
C:\MyVMs> VBoxManage internalcommands converttoraw example.vdi D:\VMFolder\VMimage.img
# After hitting enter, it should show an output similar to this:
Converting image example.vdi with size 512110190592 bytes (488387MB) to raw...
# Prepare yourself, this may take awhile
根据您的虚拟机的大小、硬盘的读写速度以及 USB 驱动器(在我们的例子中为 D:)的速度,这可能需要相当长的时间。对我来说,运行这个大约需要 30-40 分钟,当您再次看到命令行提示符可用时,您就会知道它已完成。
将 .img 应用到物理硬盘(常规)
对于那些选择阻力较小的方法,并希望将映像应用到新硬盘或新系统中而不需要同时运行当前操作系统的人来说,可以通过启动实时启动USB他们喜欢的 Linux 发行版(选择尝试现场演示测试系统或同等系统),打开终端窗口,然后运行以下命令(确保映像的目标未安装在实时启动系统中):
对于以下示例,以前在 Windows 上引用的 USB 驱动器 (D:) 现在将在 Linux 系统上引用,而/media/user/usb
USB 实时启动驻留在/dev/sda
(并显示为主系统驱动器)上,并使本地硬盘驱动器(再次卸载)出现在类似/dev/sdb
blkid
您可以通过运行或然后仔细检查您的布局fdisk -l
:
dd if=/media/user/usb/VMFolder/VMimage.img of=/dev/sdb conv=sync,noerror status=progress bs=64K
如果需要,可以省略选项,但需要解释:
conv=sync,noerror
告诉dd
它如果由于读取错误而无法读取块,那么它至少应该向其输出写入正确长度的内容status=progress
输出一些信息,以dd
帮助你了解这个过程持续了多长时间bs=64K
块大小为 64x1024 字节。有些人可能会建议使用更大的块大小来提高复制/写入过程的速度,但每个人都有自己的意见。
此时,可以在实时启动会话环境中采取一些额外步骤来确保启动顺利进行,但这超出了本回答的范围,因为它偏离了原始提问者的问题。但是,在大多数情况下,它应该能够顺利启动,即使没有太多麻烦。如果没有,请尝试这文章或这一个用于解决启动问题。
如果不确定如何创建实时启动 USB系统,可以找到一个适用于 Ubuntu 的示例教程这里。
将 .img 应用到物理硬盘(特定于 OP)
如上所述,当尝试将转换后的虚拟机安装到与当前 Windows 系统相同的硬盘上的分区时,此过程的难度更大。由于 OP 提到之前从未创建过系统映像,因此再次建议遵循之前提交的答案的建议,因为它需要更高级的应用程序和使用各种命令,更不用说可以轻松避免的故障排除步骤了。
附注:在完成这些步骤并看到需要进行多少故障排除后,我修改了一些说明,因为很明显,如果没有其他办法,您至少应该使用安装程序在 Windows 旁边安装新版本的 Ubuntu,请按照以下指南操作这一个或您选择的一个。然后,在安装成功后,您可以启动到两个系统,假设您对 VM 使用的安装程序与在物理系统上全新安装的安装程序相同,然后继续以下步骤。
概述和难点解释
创建虚拟机映像时,映像文件本身就是整个系统,并包含分区表作为映像的一部分。一般来说,安装 Ubuntu 时,如果swap
使用 UEFI 系统,通常会导致创建 3 个不同的分区(如果选择使用分区,则为 4 个),因此,如果我们想运行预先测试和使用过的系统,显然只需要提取操作系统主要部分所在的分区。
换句话说,您只希望将root
("/") 分区(有时称为分区user
)复制到硬盘驱动器上的可用分区,但这样一来,您将缺少boot
和EFI
分区(如果后者适用),然后需要调整它们以适应 Windows 引导加载程序所在的位置,才能正常启动。这反过来又需要您设置 Windows 以忽略 Ubuntu 所在的分区磁盘管理器以防它检测出它是硬盘损坏并尝试chdisk
在下次启动时运行。
因此,为了避免上述所有问题,如前所述,首先使用与虚拟机相同的安装程序安装新版本的 Ubuntu 将有助于避免这些问题,因为您可以简单地复制虚拟机系统的主分区(或根分区)以覆盖新安装的相同分区,这样可以更简单地取代它,而不必排除不可避免出现的所有问题。然后,快速更新一些启动配置,您就可以开始了。
确定分区大小和扇区
您需要收集一些信息,以便仅将 VM 映像的主分区写入物理分区。安装新版本的 Ubuntu 后,确定 Ubuntu 的根目录位于物理驱动器上的哪个分区。然后对于映像文件,我们需要获取原始 VM 系统的根分区的偏移量。
使用与上面相同的参考,从实时启动 USB 会话中的终端窗口运行:
fdisk -l /media/user/usb/VMFolder/VMimage.img
的输出fdisk
将提供包含磁盘映像摘要的信息,然后列出其每个分区,其中包含设备、开始、结束、扇区、大小和类型的列。由于分区是不保证在磁盘上按数字顺序排列且无填充,最好root
挂载映像磁盘文件到环回设备先将其复制到物理磁盘分区。
为此,在收集上述命令的信息后,您需要确定虚拟机系统映像的根分区(通常是驱动器上最大的分区)的正确偏移量。您需要的偏移量是分区的起始位置乘以扇区大小。
例如,如果起始位为 128,扇区大小为 512,则偏移量为 65536。可以肯定的是,扇区大小位于输出摘要部分的顶部附近,fdisk
而起始位位于列出的分区的其中一列中。此外,为了确保您使用正确的偏移量,起始位可能是一个大得多的数字,因为它在磁盘映像中的位置更靠前,例如起始位可能为 1001472,因此,如果扇区大小为 512,则在这种情况下更可能使用的偏移量可能看起来更像是 512753664。
# There are two ways to accomplish the mount of the partition
# to a loop device. Choose one of them, I suggest the 2nd one
### Option 1
# make a temporary mount point in the live boot system
sudo mkdir /mnt/tmpboot
# then mount with the offset calculated as explained above
sudo mount -o loop,offset=512753664 /media/user/usb/VMFolder/VMimage.img /mnt/tmpboot
### Option 2
# alternatively, you can use 'losetup to accomplish the same thing without
# the need to create a temporary mount point, which also helps avert
# the risk of the partition being read/active when copying.
# Replace '512753664' with the offset you calculated earlier
sudo losetup -o 512753664 /dev/loop0 /media/user/usb/VMFolder/VMimage.img
### After Option 1 or 2
# the root partition of the image file now resides on
# either /dev/loop0 or /mnt/tmpboot | Now to write
# the partition using either of the above
# you will need to replace 'sdb3' with the correct partition
# that the fresh installation had created
dd if=/dev/loop0 of=/dev/sdb3 conv=sync,noerror status=progress bs=64K
# In case it's not obvious for above, replace /dev/loop0 with /mnt/tmpboot
# if you chose the former, option 1
由于您在尝试启动时会缺少boot
分区和EFI
分区,因此您可能必须选择将分区设为 LVM,以便在分区内创建多个分区,这意味着上述命令对您不起作用并且需要 VM 在设置期间也使用 LVM。
因为这样做已经太晚了,你可以尝试将boot
分区的内容复制到 Windows 的系统保留分区中,这样当你运行
如果您的虚拟机正在使用 LVM 运行,并且您在按照指示安装分区时遇到问题,请参阅如何从 dd/raw/vmdk 映像挂载 LVM 卷?
由于新安装的 Ubuntu 会安装引导加载程序,因此您需要更新新复制的分区的系统文件的一些配置,以便它能够识别已进行的移植。
附注:还有其他方法可以解决所有这些问题,例如使用qemu
可以找到的方法这里。
完成启动
现在,映像的分区已写入物理驱动器,您将需要挂载包含 VM 根分区的物理驱动器分区并进行一些修改。
# if it doesn't already exist create a mount point
sudo mkdir /mnt
# then mount the newly written partition
sudo mount /dev/sdb3 /mnt
# to make modifications to that system as that system (and not
# as the live boot USB system, we will need to chroot our way in
# this simply translates into running the following commands
sudo mount -t proc proc /mnt/proc
sudo mount -t sysfs sys /mnt/sys
sudo mount -o bind /dev /mnt/dev
sudo mount -t devpts pts /mnt/dev/pts
sudo chroot /mnt
# now we are in the VM's system acting similarly to if it was
# booted up and running, changes we make here affect our
# physical system
对于修复引导的这一部分,我们需要:
- 更新 Grub 引导加载程序
- 检查并更新 fstab 以查看 UUID 是否发生任何变化
- 如果适用,请更新 initramfs
如果您想使用类似脚本,可以简化上述操作这个否则,手动快速覆盖它:
# Update Grub by running below to override the booted UUID
sudo grub-install
# Run grub update to change the grub boot menu
sudo update-grub
# Alternatively, you could modify the configuration in /etc/default/grub
# by updating the following line
GRUB_DEVICE_UUID=***INSERT NEW UUID HERE***
# Then running the update-grub command from above
# -------
# To check fstab, we will need to note the UUIDs of all the partitions
# currently set for current boot partition and home partition
# just to be extra careful, get it by running
blkid
# Now check and update fstab if needed
# You can replace nano with a different text editor
# if preferred (such as vim or gedit)
sudo nano /etc/fstab
# Replace the UUID for home with the newly written partition's UUID
# and double check the UUID for boot matches the one reported by blkid
# Close and save by hitting Ctrl+X answering Yes to save changes
# hit Enter to confirm the filename and overwriting then run
sudo update-initramfs
关于更新 Grub 的更多详细信息,请参见这里fstab
。可以找到更详细的解释这里。
就这些了!除非您在尝试启动时遇到一些 ACPI 问题或安全启动问题,但这些问题在物理系统上全新安装 Ubuntu 后就会显现出来。
一些*额外*的最后步骤
在重新启动之前(虽然不是必需的),您可以退出 chroot 并卸载所有驱动器,从子路径开始。否则,只需输入 exit(两次,一次退出 chroot,另一次关闭终端窗口),然后关闭并移除 USB 以关闭实时启动会话就足够了。但为了安全起见,最好养成卸载我们安装的那些分区的习惯,以防将来可能给我们带来麻烦。
# To exit chroot
exit
# then unmount everything (sub paths first)
umount /mnt/proc
umount /mnt/sys
umount /mnt/dev/pts
umount /mnt/dev
umount /mnt
# and if desired, for laziness
sudo reboot
# otherwise exit the liveboot session through the shutdown menu
# so as to safely remove the USB live boot USB device
我现在明白了,为什么托马斯只是更简单地回答了前者。我祈祷这一切有一天能帮助到别人……