简介
当你在使用远程云服务器时,你通常是在使用一个虚拟机:一个在更大的服务器集群中运行的整个操作系统的沙盒化、孤立的实例。你也可以使用QEMU或VirtualBox等软件,在你的桌面上与虚拟机一起工作。虚拟机可能包括整个桌面界面,也可能只运行一个SSH服务器以允许终端连接。无论哪种情况,它们在技术上都是相似的,并做出类似的假设。除了任何大规模的云计算优化,虚拟化环境之间的唯一显著区别是,虚拟机的硬盘和配置选项。这些被称为虚拟机图像,在不同的供应商之间的格式是不同的。
在本教程中,你将学习如何在虚拟机镜像格式(包括qcow2,vdi,vhd, 和vmdk )之间进行转换,这样你就可以把你的虚拟环境从你的桌面带到云端,并根据需要再回来。
前提条件
本教程中的命令可以在Windows、macOS或Linux上运行,只要你能安装QEMU和VirtualBox以及它们的命令行工具。本教程提供了使用Homebrew软件包管理器的安装说明。你可以在macOS、Linux或WSL2下的Windows上安装Homebrew。
如果你在DigitalOcean droplet上运行,你应该至少有2个CPU和2GB的内存。
你还需要至少10GB的自由空间来运行本教程中的命令。
注意:如果你使用的是苹果硅CPU(2020年及以后制造)的macOS,你将只能使用QEMU,而不是VirtualBox。
QEMU
QEMU是最强大和最广泛支持的开源虚拟化软件。它在所有主要平台上运行(包括Windows、macOS、Linux和其他操作系统,如Android),并能够根据需要进行虚拟化和仿真。例如,如果你在Windows桌面上运行一个Linux服务器镜像(一个常见的使用案例),这两个平台共享一个共同的底层架构(英特尔/AMDx86),所以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 。
brew install qemu
这将提供整套的QEMU工具和命令,包括qemu-img ,它用于在命令行上转换虚拟机图像。通过运行which qemu-img ,验证你是否能够访问qemu-img 命令。
which qemu-img
Output/usr/local/bin/qemu-img
注意:如果你喜欢在没有WSL2的情况下在Windows上工作,你也可以使用其本地安装程序在Windows上安装QEMU。
QEMU提供了本教程中你所需要的大部分功能。你也可以安装VirtualBox,另一个流行的虚拟化软件包。
VirtualBox
VirtualBox是由Oracle提供的开源虚拟化软件。它支持所有x86操作系统(Windows、Linux和2020年前生产的macOS电脑)。它不支持仿真或非x86架构,使其主要用于在Windows下运行Linux,反之亦然。然而,它也比QEMU更容易使用,提供广泛兼容的默认设置,并默认包括一个桌面界面。
它不像QEMU那样提供大量的命令行功能,因此它经常与Vagrant等专门的协调软件搭配使用,以实现虚拟机配置的自动化和再现。然而,它确实包括VBoxManage 命令行工具,它可以用来操作一些虚拟机图像。
安装VirtualBox
要在macOS上安装VirtualBox,请使用带有–cask 标志的brew install ,因为VirtualBox是作为一个完整的应用程序包分发的,Homebrew称之为cask。
brew install --cask virtualbox
要在Ubuntu或Debian衍生的Linux发行版上安装VirtualBox(包括在WSL2下),首先使用apt update 来刷新你的软件包来源,然后使用apt install 。
sudo apt update
sudo apt install virtualbox
要在没有WSL2的Windows上安装VirtualBox,请参考其下载页面。
在安装完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 的容量,但此时它既没有安装Ubuntu 22.04,也没有10GB大。
OutputFormatting '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将是你的虚拟机认为它可用的容量,也是虚拟机镜像将自动扩展到的最大尺寸。
典型的下一步是使用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
Outputubuntu-desktop-22.04.vdi
其他常见的格式包括vmdk ,主要由VMware使用,以及vhd ,主要由微软的Hyper-V使用。如果你的软件需要,你也可以创建一个 "原始 "镜像,按照下一步进行。
将其他虚拟机格式转换为QEMU
如果你有一个vdi 格式的镜像,你可以使用 VirtualBox 提供的vboxmanage 命令来转换它。
vboxmanage clonemedium ubuntu-desktop-22.04.vdi ubuntu-desktop-22.04.img --format raw
Output0%...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
OutputNo errors were found on the image.
Image end offset: 262144
qemu-img info ubuntu-desktop-22.04.qcow2
Outputimage: 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
注意:你也可以按照DigitalOcean的自定义图像文档,将这些虚拟机图像上传到DigitalOcean,作为云服务器图像使用。
总结
在本教程中,你使用QEMU和VirtualBox的命令行工具来创建、转换和导出虚拟机镜像。你回顾了一些常见的虚拟机镜像格式的例子,以及一些有用的默认假设来处理虚拟机。了解虚拟化等常见概念的基础技术总是很有帮助的,特别是当你需要迁移架构或云供应商时。