前言:本文围绕QEMU,介绍虚拟机相关进阶知识。为更好地理解本文,读者最好能够了解虚拟机的基本概念。

1. 虚拟机层次结构示意图

图1.1 虚拟机层次结构

2. Hypervisor

Hypervisor介于虚拟机和宿主机操作系统之间,负责对宿主机资源(为方便表述,本文均以硬件资源为例,但实际上被虚拟化的不只有硬件资源)进行虚拟化,并将虚拟化后的硬件资源提供给虚拟机。Hypervisor分为两类:

Type-1 Hypervisor:位于操作系统内核空间,具备对宿主机硬件资源的直接访问权限。代表:Microsoft Hyper-V、Linux KVM、VMWare ESXi。

Type-2 Hypervisor:位于用户空间,需要通过操作系统内核才能访问硬件。代表:QEMU、Oracle VirtualBox。

注意:

1. QEMU是Hypervisor,而不是虚拟机本身。

2. 一个Hypervisor之上可以运行多个虚拟机。

3. QEMU的工作模式

图3.1 QEMU的层次与工作模式

如上图所示,QEMU有两种工作模式:

3.1 QEMU本身作为Hypervisor。QEMU与Linux内核交互,从而获取虚拟化后的硬件。这就是前文所述的Type-2 Hypervisor。

交互层次:VM - QEMU - Linux Kernel - Driver - Hardware

3.2 QEMU作为虚拟机与Linux KVM交互的中间层,仅负责传递交互信息,而不发挥Hypervisor的实际功能。真正发挥Hypervisor功能的是Linux KVM。

交互层次:VM - QEMU - Linux KVM - KVM Virtual Driver - Hardware

第二种工作模式能够直接利用KVM,因而效率更高。而第一种工作模式多用于不需要和硬件直接交互的场合,例如在虚拟机中启动虚拟机。

4. libvirtdlibvirtvirt-manager的概念及与QEMU的关系

libvirtd是Linux中的一个守护进程,其使用的是libvirt库。

libvirt与QEMU的关系,类似于Kubernetes与Docker的关系:QEMU负责实际管理一台宿主机上的所有虚拟机;而libvirtd适用于一台宿主机上启用多台虚拟机的场景,它提供了一系列在虚拟机之间进行资源调度的接口,这些接口底层仍然是以QEMU命令来实现的。

virt-manager是libvirt的图形化界面。在virt-manager上的所有操作,都会被映射为libvirt命令;libvirt命令又会被映射为QEMU命令;如果QEMU处于第3节所述的第二种工作模式,那么QEMU命令又会再次被映射为KVM命令。

从图1.1虚拟机分层的视角来看,virt-manager、libvirt、QEMU与KVM都属于Hypervisor层次。结合图3.1可知,前三者都处于用户空间,只有KVM处于内核空间。

5. 磁盘镜像

虚拟机所有计算资源(包括CPU和内存)都是由Hypervisor提供的。但是,Hypervisor无法直接提供虚拟机的存储资源。最常见的提供虚拟机存储资源的方式,是磁盘镜像。

磁盘镜像是一系列可以模拟各种存储设备的文件的总称。最常见的磁盘镜像文件就是.iso文件,它模拟的是一个光驱。当然,不同的磁盘镜像文件还可以模拟硬盘、软盘、磁带、USB设备等各种常见设备类型的驱动。

磁盘镜像本质上是一种虚拟设备,因此它需要专门的驱动程序来解析(换言之,不能直接使用真实存储设备的驱动,来解析磁盘镜像)。在Linux中,回环设备(loop device)能够解析磁盘镜像。Linux对磁盘镜像解析成功后,将会挂载一个虚拟块设备,在这个虚拟块设备上进行的所有操作,与真实设备上完全相同。

磁盘镜像可直接被KVM解析,从而作为虚拟机的磁盘设备。因此,如果是以KVM作为Hypervisor,那么解析磁盘镜像时,并不要求虚拟机中存在回环设备,因为KVM能够直接解析磁盘镜像。

QEMU中常用的磁盘镜像格式是raw和qcow2。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐