虚拟机镜像格式转换:从VHD到VMDK,一步步教你如何操作
虚拟机镜像格式转换:桌面到云端,再返回
当您与远程云服务器协作时,通常会使用虚拟机(VM):一个在大型服务器集群中运行的沙盒化、隔离的操作系统实例。您也可以在本地桌面使用QEMU或VirtualBox等软件来操作虚拟机。虚拟机可以包含完整的桌面环境,也可以仅运行SSH服务器以允许终端连接。无论哪种情况,它们在技术上是相似的,并具有相似的底层假设。除了任何大规模的云优化外,虚拟化环境之间唯一显著的区别在于虚拟机的硬盘和配置选项。这些被称为虚拟机镜像,并且在不同的供应商之间格式各异。
在本教程中,您将学习如何在虚拟机镜像格式之间进行转换(包括qcow2、vdi、vhd和vmdk),以便您可以根据需要将您的虚拟环境从桌面迁移到云端,再从云端迁移回桌面。
先决条件
只要您能安装QEMU和VirtualBox及其命令行工具,本教程中的命令就可以在Windows、macOS或Linux上运行。本教程使用Homebrew包管理器提供安装说明。您可以在macOS、Linux或WSL2的Windows上安装Homebrew。
如果您在Silicon Cloud droplet上运行,则至少应拥有2个CPU和2GB的内存。
在执行本教程中的命令时,您还需要至少有10GB的可用空间。
注意:如果您使用的是配备苹果芯片(2020年及以后生产)的macOS系统,则只能使用QEMU而不能使用VirtualBox。
QEMU (快速模拟器)
QEMU是最强大且得到广泛支持的开源虚拟化软件。它可在所有主要平台(包括Windows、macOS、Linux以及Android等操作系统)上运行,并具备所需的虚拟化和仿真能力。例如,如果您在Windows桌面上运行Linux服务器镜像(这是一种常见的用例),这两个平台共享共同的底层架构(Intel/AMD x86),因此QEMU可以通过虚拟化实现全功效。如果您使用QEMU来混合和匹配架构,例如在x86架构的Linux或Windows上运行ARM架构的macOS或Android(无论作为“主机”或“客户机”操作系统),QEMU将自动使用仿真来翻译架构。
与虚拟化相比,仿真通常不在生产环境中使用,因为它会造成显著的性能损失。然而,QEMU将虚拟化和仿真视为近似等同,提供了重要的兼容性优势,因为这意味着相同的镜像格式和相同的工具可以在任何场景中使用。
QEMU是一款命令行软件,与VMware或VirtualBox等桌面虚拟化软件相比,由于虚拟机的配置选项众多,学习曲线较陡。它还可以选择性地与GUI前端一起使用,如Windows或Linux上的QtEmu,以及macOS上的UTM。本教程将提供使用QEMU时的命令行指令。
安装QEMU
要安装QEMU,请使用Homebrew的brew install
命令。
- brew install qemu
这将提供全部的QEMU工具和命令,包括用于命令行上转换虚拟机镜像的qemu-img
。通过运行which qemu-img
命令来验证您是否可以访问qemu-img
命令。
- which qemu-img
/usr/local/bin/qemu-img
注意:如果您喜欢在不使用WSL2的Windows上工作,也可以使用QEMU的本地安装程序在Windows上安装它。QEMU在本教程中提供了大部分所需功能。您也可以安装VirtualBox,另一个流行的虚拟化软件包。
VirtualBox
VirtualBox是由Oracle提供的开源虚拟化软件。它支持所有x86操作系统(包括2020年之前制造的Windows、Linux和macOS计算机)。它不支持仿真或非x86架构,主要用于在Windows下运行Linux,反之亦然。然而,它比QEMU更简单易用,提供广泛兼容的默认设置,并且默认包含桌面界面。
由于不具备QEMU的那么多命令行功能,因此通常会配合专用的编排软件(如Vagrant)来自动化和复制虚拟机配置。不过,它包含了VBoxManage
命令行工具,可用于操作一些虚拟机镜像。
安装VirtualBox
在macOS上安装VirtualBox,使用brew install
加上--cask
标志,因为VirtualBox以完整的应用程序包的形式分发,Homebrew称之为cask。
- brew install --cask virtualbox
在Ubuntu或Debian衍生的Linux发行版(包括WSL2)上安装VirtualBox,首先使用apt update
来刷新软件包源,然后使用apt install
进行安装。
- sudo apt update
- sudo apt install virtualbox
要在没有WSL2的Windows上安装VirtualBox,请参考其下载页面。
安装VirtualBox后,通过运行which vboxmanage
来验证您是否可以访问vboxmanage
命令。
- which vboxmanage
/usr/local/bin/vboxmanage
有一些可用于虚拟化的QEMU和VirtualBox的替代方案。但是,大多数这些方案是针对特定平台的(例如Windows上的Hyper-V)或者设计用于大规模企业使用(例如VMware)。本教程不会直接涉及这些方案,但您可以在接下来的步骤中转换它们的镜像格式。
使用QEMU创建虚拟机镜像
为了展示转换虚拟机镜像,您可以从创建一个使用QEMU的镜像开始。如果您已经有一个要转换的镜像,您可以跳过本节。
使用qemu-img create
命令,并带有-f qcow2
参数,以QEMU默认的qcow2格式创建一个镜像。
- qemu-img create -f qcow2 ubuntu-desktop-22.04.qcow2 10G
在这一点上,您将创建一个空的虚拟机镜像。尽管您将其命名为ubuntu-desktop-22.04.qcow2
并设置容量为10G,但在这一点上,它既没有安装Ubuntu 22.04,也不具备10GB的大小。
格式化 ‘ubuntu-desktop-22.04.qcow2’, 格式=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=10737418240 lazy_refcounts=off refcount_bits=16
QEMU 镜像在磁盘上占用的空间始终尽可能少,同时对虚拟机内运行的任何软件反映出其最大声明容量。在这种情况下,10GB 将是虚拟机认为它可用的容量,也是虚拟机镜像会自动扩展到的最大大小。
一个典型的下一步是使用 Ubuntu 22.04 ISO 将 Ubuntu 22.04 安装到虚拟机上。然而,在本教程中,您可以跳过这一步骤,因为您实际上不会直接使用这台虚拟机进行工作。ISO 是另一种类型的磁盘映像,通常是只读的,以前通常被写入 CD 和 DVD 安装介质,而不是可写硬盘的镜像。还有其他软件可用于处理 ISO 映像,例如 mkisofs 和 dd。要了解有关使用 QEMU 安装 Linux 的更多信息,请参阅 QEMU 文档。
将 QEMU 映像转换为其他格式
一旦您创建了虚拟机映像,您可以使用 qemu-img convert
命令将其转换为其他格式。VDI 是 VirtualBox 的默认映像格式。默认情况下,这不会删除原始虚拟机映像,而只会创建一个新的映像。
- qemu-img convert -f qcow2 ubuntu-desktop-22.04.qcow2 -O vdi ubuntu-desktop-22.04.vdi
使用 -f
标志可以指定输入格式和输入文件名。使用 -O
标志可以指定输出格式和输出文件名。您还可以加上 -p
标志显示进度条,在转换非常大的图像时很有帮助。由于上一步创建的图像尚无内容,因此图像将立即转换。您可以使用 ls
确认您已经创建了 ubuntu-desktop-22.04.vdi
。
- ls ubuntu-desktop-22.04.vdi
ubuntu-desktop-22.04.vdi
其他常见的格式包括 VMDK(主要由 VMware 使用)和 VHD(主要由 Microsoft 的 Hyper-V 使用)。如果您的软件需要,您还可以创建“原始”镜像,按照下一步骤进行操作。
将其他虚拟机格式转换为 QEMU
如果您有一个以 VDI 格式存储的镜像,您可以使用 VirtualBox 提供的 vboxmanage
命令来进行转换。
- vboxmanage clonemedium ubuntu-desktop-22.04.vdi ubuntu-desktop-22.04.img –format raw
0%…10%…20%…30%…40%…50%…60%…70%…80%…90%…100% Clone medium created in format ‘raw’. UUID: 0501e707-c94e-4103-9069-d7b64a933d78
请注意,这将自动将所创建的镜像与您本地的 VirtualBox 配置进行注册,这可能会对您尝试创建临时副本造成不便。如果您无意中注册了重复的条目,则您可能需要手动从 VirtualBox 界面中删除任何新条目。
原始的虚拟机映像并未经过任何压缩,因此此命令将创建一个完整的 10GB 文件,而不像之前那样。您可以通过将上一步骤的语法颠倒来将其转换回 qcow2 格式,以供 QEMU 使用。
- qemu-img convert -f raw ubuntu-desktop-22.04.img -O qcow2 ubuntu-desktop-22.04-new.qcow2
现在你可以删除原始图像来释放磁盘空间。
- rm ubuntu-desktop-22.04.img
最后,您可以使用 qemu-img check
和 qemu-img info
命令来输出虚拟机镜像的一些元数据。
- qemu-img check ubuntu-desktop-22.04.qcow2
No errors were found on the image. Image end offset: 262144
- qemu-img info ubuntu-desktop-22.04.qcow2
image: ubuntu-desktop-22.04.qcow2
file format: qcow2
virtual size: 10 GiB (10737418240 bytes)
disk size: 196 KiB
cluster_size: 65536
Format specific information:
compat: 1.1
compression type: zlib
lazy refcounts: false
refcount bits: 16
corrupt: false
extended l2: false
有关使用 qemu-img
转换图像的更多信息,请参阅 qemu-img 手册页面或其官方文档。
注意:您还可以按照 Silicon Cloud 的自定义镜像文档的说明,将这些虚拟机镜像上传到 Silicon Cloud 并用作云服务器镜像。
结论
在本教程中,您使用了 QEMU 和 VirtualBox 的命令行工具来创建、转换和导出虚拟机镜像。您还回顾了一些常见的虚拟机镜像格式示例,以及一些在使用虚拟机时有用的默认假设。了解常见概念如虚拟化背后的技术总是很有帮助的,特别是如果您需要迁移架构或云服务提供商。
接下来,您可能想要查阅我们关于根据您的需求扩展虚拟机的指南。