QEMU/KVM是在Linux中被广泛使用的虚拟化技术之一,而virtio作为一个半虚拟化I/O事实上的标准[1],是QEMU/KVM在I/O虚拟化部分的默认实现。virtio-net是virtio标准中的网卡设备,被广泛应用。本文将会沿着虚拟化,virtio半虚拟化I/O,virtio-net的基本情况这条路线逐渐深入。
下面在第一节介绍虚拟化的基本知识和虚拟化IO的相关方法,在第二小节介绍引入virtio的必要性和其基本知识,在第三小节介绍virtio-net的相关内容。
虚拟化基本知识
虚拟机已经悄然渗透到我们的生活中,随处可见。比如,申请云服务器的时候,我们申请到的机器就是一台虚拟机;在编写完服务端代码,部署我们的服务时,经常采用docker,kata等容器技术;再比如,我们可能需要VMware来创建一个隔离的环境来运行某些恶意的服务;亦或是自制了一个操作系统,但是又不想用硬件调试,那我们就可以用qemu来进行测试;甚至在新能源的车机上,都可能通过虚拟化技术运行着多套操作系统。看到这里,大家可能自然产生了一个疑问,这么多虚拟化的方法有什么异同,各自又有什么特点和适用场景呢?本节将会带领大家走进虚拟化,一窥虚拟化的基本知识,本小节内容和图片参考[2]、[3]、[8]。在深入之前,首先要确定什么是虚拟化。虚拟化的定义是指抽象和模拟计算机的硬件和软件的技术。计算机系统大概可以划分为四个层次:硬件、操作系统、库和用户程序,如下图所示:
而本节开始的描述的虚拟化场景中,都是抽象了这个结构中的某个层次,并为上层服务提供接口。
根据虚拟化层次的不同,我们可以将虚拟化技术划分为不同的种类:
- 直接对硬件资源进行虚拟化,也叫做系统级虚拟化。是通过模拟和抽象硬件资源,来提供虚拟化的ISA接口。我们常用的VMware,Xen,qemu都是属于这个类型的。
- 操作系统层次的虚拟化,也叫做轻量级虚拟化,进程虚拟化。操作系统本身就是对硬件的一种虚拟化,容器技术进一步通过namespace、Cgroups和overlayfs来提供对资源的隔离和限制,实现对操作系统的虚拟化。docker容器就是属于这个类型的。
- 应用层程序运行环境的虚拟化。对API调用进行虚拟化,无论是通过语言运行时还是拦截调用进行转换,都可以实现对宿主机设备的中的API虚拟化的目标。JVM,Wine等技术就属于这个类型。
本文主要讨论系统级虚拟化,下面介绍系统虚拟化的基本知识。
系统虚拟化
首先介绍一下系统级虚拟化知识中会出现的相关名词
- Guest OS:运行在虚拟机里面的操作系统
- Host OS:Type-2架构下支持虚拟机运行的操作系统
- VMM/Hypervisor:表示虚拟机资源管理器,是负责为虚拟机提供虚拟的硬件资源的,前者通常用于Type-2类型的虚拟机场景,后者通常用于Type-1类型的虚拟机场景
- Type-