虚拟化简介
CPU虚拟化
在没有VMX(vritualization extesion)之前,通过权限解除(de-privileged),使Guest OS运行在ring1之上,而Guest OS的应用程序运行在ring3,遇到可以trap的敏感指令(即是特权指令的敏感指令)则下陷,不能trap的边界指令,则编译前通过半虚拟化转换为可以trap ring0的系统调用或是运行时通过模拟仿真、二进制编译,强行翻译成别的东西进行系统调用。
在VMX出现之后,通过VT-x、AMD-V或TrustZone(secure world/non-secure world)的硬件虚拟化技术,将VM的Guest OS和应用程序分别运行在non-root的ring0和ring3下(或non-secure world的EL1和EL0下)省去了de-privileged的过程,只有遇到non-root下的异常、IO访问、指令和特定寄存器的访问,才会触发VMExit事件。
这里再总结整理下,根据原理不同,虚拟化技术可以分为三种:
- 全虚拟化
- 也就是VM完全感受不到是在实际物理机还是VMM上运行,就如上述提到的在没有VMX辅助的情况下,使用模拟仿真或二进制翻译实现的系统调用(trap捕获-handle翻译-emulate模拟的过程)。当然随之带来的也是性能的极大损耗
- 二进制翻译可以分为解释执行(每条指令实时解释执行)、SBT静态翻译、DBT动态翻译
- 工业界:Vmware Workstation、VirtualBox、Qemu
- 半虚拟化
- 半虚拟化,VM可以实实在在感觉到是在VMM上运行,因为修改了Guest OS的原生内核,不能虚拟化的指令都发给VMM的hypercall,通过hypercall直接和hypervisor层通信。省去了捕获和模拟,一定程度上提升了效率
- 要修改内核,那显然是无法虚拟化windows了
- 工业界:Xen
- 硬件辅助的虚拟化
- 就是上述引入的VMX,运行某些指令或遇到某些事件时,就发生VM exit,给VMM处理
- 硬件虚拟化工业界:Intel的VT-x和AMD的AMD-V引入non-root模式,ARM的VHE引入EL2(TrustZone又引入EL3作为TrustZone Monitor)
- :VMware ESXi、Microsoft Hyper-V、Xen 3.0、KVM
内存虚拟化
Host OS需要通过CPU的MMU,完成VA-MA(PA)的转换,而Guest OS需要两级转换:GVA-GPA-[VMM维护]-MA(HPA)
而没有内存虚拟化支持的情况下,VMM一般需要给Guest OS进程维护一个GVA到HPA的影子页表来完成地址转换
IO虚拟化
VM中所有的IO都会触发异常,然后陷入VMM,VMM则利用host OS上运行的一个应用级进程模拟调用Host OS的系统调用,完成操作
以VM Workstation为例,这个过程通过VMdriver、VMM和VMApp来协同完成:
KVM介绍
基于内核的虚拟机
没有重新写一个VMM,而是选择了Linux Kernel,通过加载新的模块,将Linux Kernel变成一个VMM
基于虚拟化扩展(Intel VT或AMD-V)的x86硬件的开源的Linux原生全虚拟化解决方案。
KVM中虚拟机被实现成常规的Linux进程,由标准的Linux调度程序进行调度;虚拟机的每个vCPU都被实现为一个常规的Linux线程
KVM不执行硬件模拟,用户空间程序通过/dev/kvm接口设置一个客户机虚拟服务器的地址空间,向他提供模拟IO
- Guest:客户机系统,包括CPU(vCPU)、内存、驱动(console、网卡、IO设备驱动等),被KVM置于一种受限制的CPU模式下运行
- KVM:运行于内核空间,成为内核模块,提供CPU和内存的虚拟化,以及客户机的IO拦截,拦截Guest的IO交给Qemu处理。同时给用户空间的QEMU提供/dev/kvm字符设备
- QEMU:修改过的为KVM虚机使用的QEMU 代码(所以也叫QEMU-KVM),运行在用户空间,提供硬件IO虚拟化,通过IOCTL /dev/kvm设备和KVM交互执行创建VM、vCPU等对Guest的控制操作
对比VM workstation,KVM内核模块功能实现了VM driver和VMM,QEMU实现了VMApp
流程
KVM被加载时:
- 初始化内部的数据结构
- KVM模块检测当前的CPU,然后打开 CPU 控制及存取 CR4 的虚拟化模式开关,并通过执行 VMXON 指令将宿主操作系统置于虚拟化模式的根模式
- KVM 模块创建特殊设备文件 /dev/kvm 并等待来自用户空间的指令
IO虚拟化
支持虚拟化的CPU,带有特别优化过的指令集来控制虚拟化过程。当Guest尝试访问物理资源,就会将控制权交给VMM
VMM也可以利用硬件的虚拟化增强机制,将客户机在受限模式下对特定资源的访问完全由硬件重定向到VMM指定的虚拟资源
QEMU-KVM:
QEMU是纯软件实现的虚拟化系统,其中包含整套的虚拟机实现,包括处理器虚拟化、内存虚拟化、以及虚拟设备模拟
KVM对其进行了修改,VM运行时,QEMU会通过KVM提供的系统调用进入内核,由KVM负责将虚拟机置于处理的特殊模式运行
VM进行IO操作时,KVM会从上次系统调用出口处返回QEMU,由QEMU负责解析模拟设备。
QEMU使用了KVM模块的虚拟化功能,为自己的VM提供了硬件虚拟化加速。VM的配置创建、VM运行所依赖的虚拟设备、VM运行时的用户环境和交互、以及一些VM的特定技术:动态迁移,都是QEMU自己实现的
CPU虚拟化
虚拟机创建和运行时QEMU和KVM相互配合的过程,两者通信时通过/dev/kvm的IOCTL调用。创建VM可以理解为KVM为了某个特定的虚拟机创建对应的内核数据接口,KVM返回一个文件句柄来代表所创建的VM,伪代码:
open(“/dev/kvm”)
ioctl(KVM_CREATE_VM)
ioctl(KVM_CREATE_VCPU)
…
for (;;) {
exit _reason = ioctl(KVM_RUN) //返回意味着VMExit
switch (exit_reason) {
case KVM_EXIT_IO: /* … */
case KVM_EXIT_HLT: /* … */
}
}
内存虚拟化
在虚拟机模式下,MMU 的页表则必须在一次查询的时候完成两次地址转换。因为除了将客户机程序的虚拟地址转换了客户机的物理地址外,还要将客户机物理地址转化成真实物理地址。
实践
//Ubuntu18.04下搭建kvm
1 apt-get install qemu-kvm qemu-system libvirt-bin bridge-utils virt-manager
//直接克隆的ubuntu虚拟机,所以存在lock问题
2 rm /var/cache/apt/archives/lock
3 rm /var/lib/dpkg/lock
4 apt-get install qemu-kvm qemu-system libvirt-bin bridge-utils virt-manager
5 wget http://tinycorelinux.net/7.x/x86/release/TinyCore-current.iso
6 ls
7 qemu-system-x86_64 -smp 2 -enable-kvm -cdrom ./TinyCore-current.iso
8 virsh list --all
10 virsh destroy test
4 virt-manager //打开kvm软件
qemu窗口下,按下ctrl+alt+2,运行info kvm
KVM功能列表&工具
功能:
- 支持 CPU 和 memory 超分(Overcommit)
- 支持半虚拟化 I/O (virtio)
- 支持热插拔 (cpu,块设备、网络设备等)
- 支持对称多处理(Symmetric Multi-Processing,缩写为 SMP )
- 支持实时迁移(Live Migration)
- 支持 PCI 设备直接分配和 单根 I/O 虚拟化 (SR-IOV)
- 支持 内核同页合并 (KSM )
- 支持 NUMA (Non-Uniform Memory Access,非一致存储访问结构 )
工具集合:
-
libvirt:操作和管理KVM虚机的虚拟化 API,使用 C 语言编写,可以由 Python,Ruby, Perl, PHP, Java 等语言调用。可以操作包括 KVM,vmware,XEN,Hyper-v, LXC 等在内的多种 Hypervisor。可以认为是管理工具和具体虚拟机之间的一个纽带
-
libvirtd是一个daemon进程,virsh、virt-manager等工具呼叫libvirtd,而libvirtd调用qemu-kvm操作虚拟机
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jaElWZBC-1637383530114)(docker_go.assets/image-20211120103850265.png)]
-
-
Virsh:基于 libvirt 的 命令行工具 (CLI)
-
Virt-Manager:基于 libvirt 的 GUI 工具
-
virt-v2v:虚机格式迁移工具
-
virt-* 工具:包括 Virt-install (创建KVM虚机的命令行工具), Virt-viewer (连接到虚机屏幕的工具),Virt-clone(虚机克隆工具),virt-top 等
-
sVirt:安全工具