如何转换虚拟机镜像的格式
作者:Alex Garnett
导语
使用远程服务器时,其实通常使用的是虚拟机。虚拟机是一个操作系统的实例,单独封闭在更大的服务器集群中。您还可以通过例如QUMU与VirtualBox等软件在自己的电脑上使用虚拟机。虚拟机可能包括整个桌面,或者只运行SSH服务器来保证与终端的连接。但无论是何种情况,它们都运用了类似的技术,拥有相似的功能。除了大规模的云优化以外,虚拟环境之间唯一的区别在于虚拟机的硬盘和配置。这些称之为虚拟机镜像,且不同供应商采用不同镜像格式。
本教程将介绍如何转换虚拟机镜像的格式,包括qcow2,vdi, vhd和vmdk,由此帮助您按需将虚拟环境从电脑上传至云端,或者再次传回。
前期准备
只要您安装了带有命令行工具的QEMU和VirtualBox,无论您使用的是Windows、macOS还是Linux系统,本教程中的代码都能成功运行。本教程还会介绍如何用Homebrew包管理器进行安装,您可以在macOS、Linux或WSL2的Windows系统中安装Homebrew。
此外,为了运行本教程中的代码,您需要至少10GB的空间。
注意:如果您的macOS使用的是Apple Silicon处理器,即2020年后生产的设备,您将无法使用VirtualBox,只能使用QEMU。
QEMU
QEMU是功能最强大也是应用最广泛的开源虚拟化软件,可以在所有主要平台,包括Windows,macOS,Linux甚至Android等上运行,按需进行虚拟化与仿真。举一个常见的例子,当在Windows桌面运行Linux服务器镜像时,这两个平台将共享一个底层架构Intel/AMD x86,QEMU可以因此通过虚拟化来实现全部性能。如果您用QEMU混合与匹配架构,例如以x86 Linux或Windows作为主/客机操作系统,然后在其中运行macOS或者Android的ARM架构,QEMU会自动使用仿真功能转换架构。
与虚拟化相比,仿真通常不用于生产环境中,因为会大幅度降低性能。然而QEMU将仿真与虚拟化一视同仁,使相同的镜像格式和工具适用于所有情况,进而展现出显著的兼容性优势。
QEMU是命令行软件,虚拟机可以配置的选项数量十分庞大,因此与VMware与VirtualBox等虚拟化软件相比,QEMU更难上手。它还可以与GUI前端,例如Windows与Linux系统上的QtEmu与macOS系统上的UTM,一起使用。本教程将介绍如何通过命令行使用QEMU。
安装QEMU
使用Homebrew的 brew install
安装QEMU:
$ brew install qemu
这将下载全部QEMU工具和命令,其中包括用于在命令行中转换虚拟镜像的 qemu-img
。运行 which qemu-img
命令来验证您可以使用 qemu-img
。
$ which qemu-img
Output
/usr/local/bin/qemu-img
注意:如果您不想通过WSL2使用Windows,您也可以用QEMU自带的安装器进行安装。
QEMU包含本教程中需要的大部分功能。但您还可以安装另一个很流行的虚拟化包,也就是VirtualBox。
VirtualBox
VirtualBox是由Oracle提供的开源虚拟化软件,支持所有x86操作系统(Windows, Linux和2020前的macOS计算机),但不支持仿真功能或非x86的架构,所以主要用于在Windows中运行Linux,或是Linux中运行Windows。然而它比QEMU更简单,提供兼容广泛的默认设置,且默认包含桌面界面。
VirtualBox并不提供像QEMU那么多的命令行功能,因此常与Vagrant等用于编排的软件一起使用,来使虚拟机配置重现和自动化。不过VirtualBox包含VBoxManage命令行工具,也可以用于操作虚拟机镜像。
安装VirtualBox
使用 brew install
命令和 –cask
标记在macOS上安装VirtualBox,因为VirtualBox以完整应用程序包的形式发行,Homebrew将其称为cask:
$ brew install --cask virtualbox
如果要在Ubuntu或是Debian衍生的Linux发行版(包括WSL2)上安装VirtualBox,首先使用命令 apt update
刷新包源,再用 apt install
命令安装:
$ sudo apt update
$ sudo apt install virtualbox
如果想在Windows上安装VirtualBox,同时又不想经过WSL2,可以参考VirtualBox Wiki中的下载说明部分。
VirtualBox安装完成后,运行 which vboxmanage
命令来验证您有权限访问 vboxmanage
:
$ which vboxmanage
Output
/usr/local/bin/vboxmanage
QEMU和VirtualBox都提供虚拟化选项,但其中大部分都为平台限定(如Windows上的Hyper-V),或是为大型企业设计(如VMware)。本教程不会直接介绍它们,但会在接下来的部分介绍如何转换镜像格式。
使用QEMU创建虚拟机镜像
在演示如何转换虚拟机镜像前,可以先从使用QEMU创建镜像入手。如果您已经有待转换的镜像,可以直接跳过这部分。
运行带有 -f qcow2
标记的 qemu-img create
命令来创建QEMU默认的 qcow2
格式镜像:
$ qemu-img create -f qcow2 ubuntu-desktop-22.04.qcow2 10G
如此,您就创建了空的虚拟机镜像。虽然您将其命名为 ubuntu-desktop-22.04.qcow2
,并给它提供了 10G
的容量,但目前这个镜像中既没有安装22.04版本的Ubuntu,也没有10GB那么大。
Output
Formatting 'ubuntu-desktop-22.04.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=10737418240 lazy_refcounts=off refcount_bits=16
QEMU镜像会在尽可能少占用磁盘空间的同时,为虚拟机中运行的软件提供创建时设置的最大容量。这个例子设置的虚拟机的可用容量为10GB,也是虚拟机镜像会自动扩展到的最大空间。
通常来说,下一步可以是使用22.04版本的Ubuntu ISO将Ubuntu 22.04安装至虚拟机中。但既然这个虚拟机只用于举例,不会投入使用,您就可以跳过这一步。ISO是另一种磁盘镜像,通常为只读。ISO曾被用于CD与DVD安装媒介中,并非可写硬盘的镜像。操作ISO镜像的软件也有许多,如mkisofs和dd。可以参阅QEMU文档,了解更多用QEMU安装Linux的信息。
将QEMU镜像转换为其它格式
创建VM镜像后,可以用命令转换它的格式。VirtualBox默认的镜像格式是 vdi
。而且默认情况下,转换格式并不意味着将原VM镜像删除,而是创建一个新镜像:
$ 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
Output
ubuntu-desktop-22.04.vdi
其它常见格式包括主要由VMware使用的 vmdk
,和Microsoft中Hyper-V使用的 vhd
。如果您的软件需要,您还可以按以下步骤创建一个“原始”镜像。
将其它虚拟机格式转换为QEMU
VirtualBox提供了 vboxmanage
命令用来转换 vdi
格式的镜像:
$ vboxmanage clonemedium ubuntu-desktop-22.04.vdi ubuntu-desktop-22.04.img --format raw
Output
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
Output
No errors were found on the image.
Image end offset: 262144
$ qemu-img info ubuntu-desktop-22.04.qcow2
Output
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与VirtualBox的命令行工具来创建、转换与导出虚拟机镜像,还介绍了一些常见的虚拟机镜像格式示例,以及使用虚拟机时有用的默认设置。了解虚拟化等常见概念背后的技术可能对您今后的工作很有帮助,尤其当需要迁移架构或改变云服务提供商时。