虚拟化简介
1 一句话介绍
虚拟化就是将物理资源从时空维度进行划分,逻辑表示成多份资源,是一种资源抽象化的过程。
2 基本概念
- VMM (Virtual Machine Monitor):虚拟机监控系统,也叫 Hypervisor,是虚拟化层的具体实现。
- HostOS:宿主机(物理服务器)运行的操作系统。
- GuestOS:客户机(虚拟机)运行的操作系统。
- Interface:接口是一个针对资源的概念,又称物理端口。例如以太网接口。
- Port:端口是一个针对网络协议服务的概念,分为物理端口和虚拟端口,例如数据端口。一个Port可以调用多个接口的资源。一个接口通常只对应一个端口。
3 计算虚拟化
3.1 计算虚拟化架构
计算虚拟化架构包含宿主机虚拟化、裸金属虚拟化和混合虚拟化三种类型。
3.1.1 宿主机虚拟化
VMM作为一个应用程序运行在主机操作系统上(HostOS)。
- 特点:易于实现,依赖操作系统,两次OS开销大
- 代表产品:VMware Workstation、VirtualBox
3.1.2 裸金属虚拟化
VMM直接部署在裸金属设备上。
- 特点:不依赖操作系统,需开发内核
- 代表产品:VMware ESX、Xen
3.1.3 混合虚拟化
VMM嵌入主机操作系统内核。
- 特点:不依赖操作系统,无需开发内核
- 代表产品:RedHat KVM
3.1.4 三种架构示意图
3.2 计算虚拟化类型
3.2.1 CPU Ring级别
CPU指令集(X86)依据权限大小依次分为Ring0、Ring1、Ring2和Ring3四个等级。
Ring0级别指令集权限最高,称为内核态指令集,运行在操作系统内核层面。VMM运行在该级别。
Ring3级别指令集权限最低,称为用户态指令集,只能在用户应用程序中执行。
应用程序如果需要访问硬件资源,需要进行系统调用(如fork),需要切换到内核态,带来性能开销。
3.2.2 三种虚拟化类型
GuestOS在HostOS和VMM看来是一个应用,运行在用户态只会执行Ring3级别指令。但是,GuestOS作为一个完整的操作系统,会下发Ring0级别的指令,此时会造成异常。根据处理异常的方式,引出三种类型虚拟化:
- 半虚拟化:定制一个GuestOS,将原本直接与硬件交互的Ring0指令改成能够与VMM正常交互的指令,代表技术是Xen。
- 全虚拟化(基于二进制翻译):就是VMM直接捕获该异常,对异常做二进制翻译处理,并模拟返回正常结果给GuestOS,但是这种异常处理方式,对性能损耗较大。
- 全虚拟化(基于硬件辅助):CPU提供Root Mode和Non-root Mode两种运行模式,两种模式均支持Ring0~3级别指令。当然GuestOS执行部分特权指令时还是会发生异常,不过由Root Mode下CPU自动捕获并交由VMM处理,CPU模式切换效率也高于二进制翻译。性能逼近半虚拟化,成为主流。
4 网络虚拟化
4.1 Linux虚拟网络
4.1.1 虚拟网卡
传统主机物理网络流量图如下:
外部网线→物理网卡(nic)&以太网口(eth)→内核网络协议栈→用户空间应用程序。
虚拟机通信则通过相应的虚拟网络设备实现(虚拟网卡virtual nic,虚拟网口virtual eth等)。
Linux内核模块tap/tun及veth-pair实现了虚拟网卡的的功能:
- TAP模拟二层网络设备,拥有虚拟的MAC地址,可直接处理以太网帧。通常用作虚拟机的虚拟网卡vnic。
- TUN模拟三层网络设备,且只能处理IP包。
- Veth-pair成对出现,通常用于两个Linux Namespace直接互联(容器网络使用较多),Namespace与Linux网桥互联。
4.1.2 虚拟交换机
Linux通过Bridge(网桥,简称br)内核模块实现虚拟交换机的功能,默认工作在L2层,可配置IP工作在L3层。
OpenStack场景下几类重要的网桥:
- br-int:集成网桥,集成宿主机内所有虚拟机网卡。
- br-tun:通信网桥,提供统一通信层,进行vxlan解封装处理。
- policy(ply)/qbr网桥:提供虚拟机ACL、QoS等功能。
- br-phynet:物理网桥,对接物理网络。
4.2 VirtIO
VirtIO是一种IO半虚拟化方案。此方案规定了客户机与Hypervisor(例如KVM等)的IO通信协议。该方案可分为四层:
- 前端驱动位于GuestOS内,包括virtio_blk、virtio_net、virtio_pci、virtio_console、virtio_balloon、virtio_scsi等驱动模块。
- VirtIO和Transport是前后端驱动通信的桥梁,VirtIO负责实现前后端通知机制,Transport实现数据流转发。
- 后端驱动位于Hypervisor,实现对宿主机硬件设备的模拟,KVM虚拟化方案中由QEMU模块实现。
5 KVM虚拟化方案
通常KVM虚拟化方案包括KVM、QEMU、VirtIO等部分,是基于硬件辅助的全虚拟化技术,是目前主流的虚拟化技术方案。KVM虚拟化架构包含两个核心模块:
- KVM模块:是Linux内核的一个模块,负责CPU以及内存虚拟化、拦截Guest OS下发的IO指令,将其返回给QEMU。
- QEMU:系统模拟器,运行在用户态,负责解释来自KVM的IO指令,转换成Host OS的系统调用,让Host OS完成真正的IO操作。
从Host角度看,Guest只是一个进程(实际在QEMU进程内运行)。KVM负责将进程中的线程虚拟化成vCPU,将Guest的物理内存虚拟化成虚拟内存。每个用户态QEMU进程对应一个虚拟机。QEMU与KVM的交互接口为/dev/kvm,通过open及ioctl系统调用来操作虚拟vCPU、虚拟内存以及KVM本身。
6 Libvirt
Libvirt是虚拟化平台的管理组件,提供完善的管理API,默认自带virsh命令行工具,支持与其他管理工具或上层应用对接(例如Openstack)。Libvirt是基于驱动架构的管理组件,支持对接不同的Hypervisor(例如Xen、KVM&QEMU等)。运行Libvirt守护进程的宿主机,均可执行如下管理动作:
- 虚拟机管理:虚拟机生命周期的操作、多种不同类型设备的热插拔操作等。
- 支持远程连接: SSH 协议远程连接虚拟机。
- 存储管理:创建多种类型的文件镜像,挂载 NFS 共享,枚举现有 LVM 卷组,创建新的 LVM 卷组和逻辑卷,对裸磁盘设备分区,挂载 iSCSI 共享等。
- 网络接口管理:管理物理的和逻辑的网络接口,枚举现有接口,配置(和创建)接口、桥接、VLAN、端口绑定等。
- 虚拟 NAT 和基于路由的网络:管理和创建虚拟网络。
7 存储虚拟化
通过共享磁盘文件系统(又称共享集群文件系统)方式实现底层异构存储(集中式、本地磁盘、分布式)资源的统一池化。OCFS2是Oracle开发的共享磁盘文件系统,华为虚拟化平台FusionCompute的VIMS共享磁盘文件系统就是基于OCFS2进行定制开发的。VIMS介于服务器与底层存储之间,向虚拟机操作系统提供对磁盘集群的访问能力。
- 用户态进程处理磁盘格式化、挂载等任务。
- 内核态主要提供VIMS文件服务的一般操作,例如打开、删除等操作。
8 虚拟化关键特性
8.1 NUMA
NUMA(Non-Uniform Memory Access,非一致内存访问)是提升多核CPU性能的特性。每个核心有单独总线、内存控制器和IO等,将内存和CPU进行绑定划分,把固定大小的内存分配给指定CPU序列,形成一个Node,整个CPU、内存资源由多个Node组成。CPU访问本端Node内存的速度要远快于访问远端Node内存。
8.2 大页内存
页表缓存(TLB)具有固定数据的空间槽,用于存放将内存虚拟地址映射至物理地址的标签页表条目。当内存分页调大时,页表数量就变小,TLB能映射更多的内存,提高CPU内存寻址负载。内存=页表数量×大页内存。
9 参考
- 点赞
- 收藏
- 关注作者
评论(0)