如何转换虚拟机镜像格式

介绍

在使用远程云服务器时,通常您会使用虚拟机:这是在较大的服务器集群中运行的整个操作系统的沙盒化、隔离实例。您还可以在本地桌面上使用诸如QEMU或VirtualBox等软件与虚拟机一起工作。虚拟机可以包括整个桌面界面,也可以仅运行SSH服务器以允许终端连接。无论哪种情况,它们在技术上都是相似的,并做出类似的假设。除了任何大规模的云优化之外,虚拟化环境之间唯一的显著差异是虚拟机硬盘和配置选项。这些被称为虚拟机镜像,在不同的提供商之间格式不同。

在本教程中,您将学习如何在各种虚拟机镜像格式之间进行转换(包括qcow2vdivhdvmdk),以便根据需要在桌面和云之间迁移您的虚拟环境。

先决条件

本教程中的命令可以在Windows、macOS或Linux上运行,只要您可以安装QEMU和VirtualBox以及它们的命令行工具。本教程提供了使用Homebrew软件包管理器的安装说明。您可以在macOS上,在Linux上或在WSL2下的Windows上安装Homebrew。

如果您在DigitalOcean droplet上运行,您应该至少有2个CPU和2GB的内存。

您还需要至少10GB的可用空间来运行本教程中的命令。

注意:如果您正在使用具有苹果Silicon CPU(2020年及以后制造)的macOS,则只能使用QEMU而不是VirtualBox。

QEMU

QEMU是最强大且得到广泛支持的开源虚拟化软件。它可以在所有主要平台上运行(包括Windows、macOS、Linux以及其他操作系统如Android),并且可以根据需要进行虚拟化和仿真。例如,如果您在Windows桌面上运行Linux服务器映像(这是一个常见的用例),那么这两个平台共享一个通用的底层架构(Intel/AMD x86),因此QEMU可以通过虚拟化实现全面性能。如果您正在使用QEMU混合和匹配架构,例如在x86 Linux或Windows上运行(作为“主机”或“客户”操作系统)与macOS或Android的ARM架构,QEMU将自动使用仿真来转换架构。

与虚拟化相比,仿真通常不会在生产环境中使用,因为它会增加显著的性能损失。但是,由于QEMU将虚拟化和仿真视为几乎等效,这提供了显著的兼容性优势,因为这意味着在每种情况下都可以使用相同的映像格式和相同的工具。

QEMU是命令行软件,并且与桌面虚拟化软件(如VMware或VirtualBox)相比,由于虚拟机可以配置的大量选项,它具有较高的学习曲线。它可以选择与GUI前端一起使用,例如在Windows或Linux上使用QtEmu,在macOS上使用UTM。本教程将提供使用QEMU的命令行说明。

安装QEMU

要安装QEMU,请使用Homebrew的brew install命令:

  1. brew install qemu

这将提供QEMU工具和命令的整套套件,包括qemu-img,用于在命令行上转换虚拟机镜像。通过运行which qemu-img命令来验证你是否可以使用qemu-img命令:

  1. which qemu-img
Output
/usr/local/bin/qemu-img

注意:如果你更喜欢在没有WSL2的Windows上工作,也可以使用其原生安装程序安装QEMU。

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:

  1. brew install --cask virtualbox

要在Ubuntu或基于Debian的Linux发行版上(包括WSL2下)安装VirtualBox,首先使用apt update刷新软件包源,然后apt install:

  1. sudo apt update
  2. sudo apt install virtualbox

要在没有WSL2的Windows上安装VirtualBox,请参考其下载页面

安装完VirtualBox后,请通过运行which vboxmanage验证是否可以访问vboxmanage命令:

  1. which vboxmanage
Output
​​/usr/local/bin/vboxmanage

有关虚拟化,除了QEMU和VirtualBox之外,还有其他可选方案。然而,大多数这些方案是特定于平台的(例如在Windows上的Hyper-V)或者是为大规模企业使用而设计的(例如VMware)。本教程将不直接涵盖这些方案,但您将在接下来的步骤中转换它们的镜像格式。

使用QEMU创建虚拟机镜像

为了演示转换虚拟机镜像,您可以首先使用QEMU创建一个镜像。如果您已经有要转换的镜像,则可以跳过此部分。

使用qemu-img create命令以-f qcow2标志在QEMU的默认qcow2格式中创建一个镜像:

  1. qemu-img create -f qcow2 ubuntu-desktop-22.04.qcow2 10G

到这一步,您将创建了一个空的虚拟机镜像。即使您将其命名为ubuntu-desktop-22.04.qcow2并提供了10G的容量,此时它既没有安装Ubuntu 22.04,也不具备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将是您的虚拟机认为其可用的容量,并且虚拟机镜像将自动缩放到的最大大小。

A typical next step would be to install Ubuntu 22.04 onto the virtual machine, using a Ubuntu 22.04 ISO. However, you can skip this step for this tutorial, as you won’t actually be working directly with this virtual machine. An ISO is another type of disk image that is usually read-only, and was historically written onto CD and DVD installation media, rather than an image of a writable hard disk. Other software exists for manipulating ISO images, such as mkisofs and dd. To learn more about installing Linux using QEMU, refer to the QEMU documentation.

将QEMU镜像转换为其他格式

创建了虚拟机镜像后,您可以使用qemu-img convert将其转换为其他格式。vdi是VirtualBox的默认图像格式。默认情况下,这不会擦除原始的虚拟机镜像,只会创建一个新的:

  1. 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

  1. ls ubuntu-desktop-22.04.vdi
Output
ubuntu-desktop-22.04.vdi

其他常见格式包括vmdk,主要由VMware使用,以及vhd,主要由Microsoft的Hyper-V使用。如果您的软件需要,您还可以创建一个“原始”图像,按照下一步的步骤。

将其他虚拟机格式转换为QEMU

如果您有一个以 vdi 格式的镜像,您可以使用VirtualBox提供的 vboxmanage 命令来转换它:

  1. 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中使用:

  1. qemu-img convert -f raw ubuntu-desktop-22.04.img -O qcow2 ubuntu-desktop-22.04-new.qcow2

现在,您可以删除原始镜像以回收磁盘空间:

  1. rm ubuntu-desktop-22.04.img

最后,您可以使用 qemu-img checkqemu-img info 命令输出一些来自虚拟机镜像的元数据:

  1. qemu-img check ubuntu-desktop-22.04.qcow2
Output
No errors were found on the image. Image end offset: 262144
  1. 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-img 转换图像的更多信息,请参阅 qemu-img 手册页 或其 官方文档

注意: 您还可以按照DigitalOcean的 自定义镜像文档 将这些虚拟机镜像上传到DigitalOcean以用作云服务器镜像。

结论

在本教程中,您使用了QEMU和VirtualBox的命令行工具来创建、转换和导出虚拟机镜像。您回顾了一些常见的虚拟机镜像格式示例,以及一些在处理虚拟机时的有用的默认假设。理解像虚拟化这样的常见概念的技术基础总是很有帮助的,特别是如果您需要迁移架构或云提供商。

接下来,您可能希望查看我们关于根据您的需求扩展虚拟机的指南

Source:
https://www.digitalocean.com/community/tutorials/how-to-convert-virtual-machine-image-formats