1、服务器虚拟化技术原理与应用1 2内容提要虚拟化技术简介虚拟化实现技术硬件辅助虚拟化原理KVM/QEMU实现分析容器虚拟化Libvirt简介22024/11/1 周五虚拟化简介虚拟化(Virtualization)的本质 虚拟化是资源的逻辑表示,不受物理限制的约束。其技术本质就是由位于下层的软件模块,通过向上一层软件模块提供一个与它原先所期待的运行环境完全一致的接口和方法,抽象出一个虚拟机的软件或硬件接口,是的上层软件可以直接运行在虚拟机的环境上。虚拟化的层面 硬件层虚拟化:通过虚拟硬件抽象层来实现虚拟机,为虚拟机操作系统呈现和物理硬件相似或接近的硬件层。操作系统层虚拟化:指操作系统的内核可以提
2、供多个互相隔离的用户态实例,各自有自己独立的文件系统、网络和系统设置、库函数等等。又叫容器虚拟化。内存虚拟化:操作系统通过段式页式管理,提供用户态所有应用程序一个连续完整的内存空间,从而屏蔽物理内存细节,简化应用开发。编程语言层的虚拟化:由虚拟机runtime系统将中间代码动态翻译成硬件的机器语言执行,从而在不同硬件和操作系统上运行,例如java的JVM。32024/11/1 周五虚拟化简介系统虚拟化在系统虚拟化中,物理资源通常称为宿主(host),而虚拟出来的资源称为客户(guset),而虚拟化管理软件成为VMM42024/11/1 周五虚拟化简介虚拟化的优点 封装性:以虚拟机为粒度的封装似
3、的虚拟机运行环境的保存非常便捷,部署、备份和恢复都非常迅速。多实例:在一个计算机上运行多个虚拟机使得硬件资源的利用率更高。通过多态硬件服务器组成的集群资源池,可以根据负载动态启用或关闭服务器。隔离:相比同一操作系统中的多任务,每个应用程序可以在自己的操作系统中独立的运行,不会影响到其他程序。硬件无关性:通过虚拟化模拟出的应用程序所需的硬件资源,从而使得应用和具体硬件关联性大大降低;通过动态迁移技术更是可以将运行状态的虚拟机无缝的迁移到其他服务器上运行。52024/11/1 周五虚拟化实现技术系统虚拟化的实现方式 基于软件完全虚拟化:又称全虚拟化,通过软件的方式完整模拟底层硬件环境,让客户机操作
4、系统完全觉察不到是运行在一个虚拟平台上。这样的虚拟平台可以直接运行现有的操作系统,而无需对操作系统进行任何修改。具体的内容包括对处理器、内存和I/O的虚拟化处理。代表是Boches,Qemu 硬件辅助的全虚拟化:基于软件的完全虚拟化方式中,由于所有的指令执行都需要通过软件去模拟,在性能上会有一定的损失,导致虚拟机运行效率明显低于物理机。如果能把部分硬件(如物理CPU)能处理的指令直接交给硬件执行,而对于硬件不支持的操作则采用软件模拟的方式,这样就会大大提高效率。代表是基于KVM的QEMU,VMWare。半虚拟化:通过修改操作系统的代码来解决虚拟化过程中的问题来实现虚拟化。代表是Xen(Xen也
5、支持全虚拟化)62024/11/1 周五虚拟化实现技术异质与同质虚拟化 异质虚拟化:在一种指令体系架构的宿主机中虚拟另一种体系架构下的虚拟机。例如,x86虚拟arm,所有指令都需要重新翻译、模拟后执行,效率非常低下,通常不会超过10%。同质虚拟化:虚拟机和宿主机是同种指令体系架构,例如,x86虚拟x86,powerpc虚拟powerpc。同质虚拟化中很多指令可以直接在物理硬件上运行,而不需要逐条指令翻译。效率较高,现代实用级别服务器系统虚拟化都是同质虚拟化。敏感指令:同质虚拟化中,那些由于会产生冲突无法直接在物理硬件上运行的指令称作敏感指令。例如,涉及到硬件设备、内存寻址等方面的指令。同质虚拟
6、化的实现本质就是捕获与模拟。即补获敏感指令,模拟实现其行为。72024/11/1 周五虚拟化实现技术实现同质全虚拟化需要解决的问题 CPU虚拟化:实现CPU指令的模拟;中断和异常的模拟和注入 内存虚拟化:提供所有虚拟机一个从0开始的连续物理内存空间;在各虚拟机之间有效隔离、调度以及共享内存资源。IO虚拟化:管理有限的外设资源,截获guest os对设备的访问请求,通过软件模拟的方式来模拟真实设备的效果。82024/11/1 周五硬件辅助虚拟化硬件需求:确定机器有VTgrep vmx/proc/cpuinfo(INTEL芯片)grep svm /proc/cpuinfo(AMD芯片)确保BIOS
7、里开启VTIntel(R)Virtualization Tech Enabled确保内核版本较新,支持KVM用uname r查看内核版本,如果在2.6.20以下的linux版本,需升级内核。92024/11/1 周五硬件辅助虚拟化虚拟化漏洞与硬件辅助虚拟化基本原理x86 硬件支持 4 个特权级(Ring),一般内核运行在 Ring 0,用户应用运行在 Ring 3一些关键操作指令只能在最高特权级别上执行,它们一般被称为特权指令。如果在非特权级别上试图执行特权指令,将生成一个一般保护异常非特权指令则可以在任何一个权限级别执行敏感指令是VMM 不可以轻易让客户操作系统执行的指令,如果所有敏感指令都
8、是特权指令,就可以利用保护异常实现虚拟化当一部分敏感指令并不是特权指令,这就出现问题了。非特权指令在Ring1Ring3上是可以执行。VMM不会处理这些指令。这就是硬件架构上的虚拟化漏洞102024/11/1 周五硬件辅助虚拟化VT-x 引入两种模式,统称VMX模式根模式(VMX Root Operation):VMM 运行的模式非根模式(VMX Non-Root):客户机所运行的模式 非根模式的下所有敏感指令的行为被重新定义,他们不经虚拟化就直接运行或通过陷入再模拟的方式运行,在根模式下所有的指令行为没有变化非根模式下敏感指令引起的“陷入”称为VM-Exit,VM-Exit 自动从非根模式转
9、换为根模式VM-Entry 操作由VMM发起,通常是调度某个客户机运行,此时,CPU由根模式切换到非根模式VT-x 引入了VMCS,VMCS保存CPU需要的相关状态,VMCS主要提供CPU使用,CPU发生VM-Exit和VM-Entry时会自动更新VMCS。VMM通过指令配置VMCS,进而影响CPU112024/11/1 周五VMCS(Virtual-Machine Control Structure)VMCS是保存在内存中的数据,包含了虚拟CPU相关寄存器的内容和虚拟CPU相关的控制信息,每个VMCS对应一个虚拟CPU,任何时刻VMCS与物理CPU是一对一的绑定关系VMCS不同时刻可以绑定到
10、不同的物理CPU,这种绑定关系的变化称为VMCS的迁移VT-x提供了两条指令用于VMCS的绑定和解除绑定:VMPTRLD:将指定的VMCS与执行该指令的物理CPU绑定VMCLEAR:将执行该指令的物理CPU与他的VMCS解除绑定。该指令将物理CPU缓存中的VMCS结构同步到内存中,保证VMCS和新物理CPU绑定时,内存中的值是最新的VM-x提供两条指令用于VMX的打开和关闭VMXON:打开VMX操作模式VMXOFF:关闭VMX操作模式122024/11/1 周五VMCS 格式字节偏移描述0VMCS数据格式4VMX终止提示(VM-Exit执行不成功时产生VMX终止,CPU在吃出存入终止原因,以方
11、便调试)8VMCS数据域与cpu(相关,不同格式CPU可能不同格式)VMREAD:读VMCS中“索引”的数据VMWRITE:写VMCS中索引指定的域VMCS数据域包括六大信息:Guest state area:虚拟机状态域Host state area:宿主机状态域VM-Execution control fileldsVM-entry contorl fileldsVM-exit control fileldsVM退出信息VMCS 块格式132024/11/1 周五VM-Entry与VM-Exit执行基本的检查来确保VM-Entry能开始对VMCS中的宿主机状态有效性检查,以确保下一次VM-
12、Exit发生时可以正确的从客户机环境切换到VMM环境检查VMCS中客户机状态域的有效性;根据VMCS中客户机状态域来装载处理器状态根据VMCS中VM-Entry MSR-load区域装载MSR寄存器根据VMCS中VM-Entry事件注入控制的配置,可能需要注入一个事件到客户机中CPU首先将此次VM-Exit的原因记录到VMCS相应的信息域中,VM-Entry interruption-information字段有效位(bit31)清零CPU状态被保存到VMCS客户机状态,根据设置,CPU 也可能将客户机MSR保存到VM_Exit MSR-Store区域根据VMCS中宿主机状态和VM-Exit控
13、制域中的设置,将宿主机状态加载到CPU相应寄存器。CPU由非根模式切换到根模式,从宿主机状态域中CS:RIP指定的VM_Exit入口函数开始执行 VM-Entry的过程:VM-Exit的过程:142024/11/1 周五内存虚拟化X86体系内存管理架构152024/11/1 周五内存虚拟化内存寻址与页表结构162024/11/1 周五内存虚拟化虚拟机影子页表技术客户机页表GVA-GPA载入硬件MMU无法访问真正物理内存影子页表GVA-HPA载入硬件MMU访问真正物理内存载入硬件MMU,TLB缓存影子页表表项 两者关系客户机修改客户机页表TLB刷新INVLPG 影子页表同步客户机页表VTLB17
14、2024/11/1 周五内存虚拟化EPT(Extended Page Table)被用于支持内存虚拟化。EPT在非根模式下将客户机物理地址(gpa)转换为宿主机物理机地址(hpa),客户机的虚拟地址(gva)到客户机的物理地址(gpa)的转换由客户机页表实现CPU同时使用两套页表(在原有的CR3控制器页表的基础上引入了EPT页表的另一次映射)两次页表转换都由CPU硬件自动完成通过VMCS的“VM-Execution控制域”中的Enable EPT 字段进行激活EPT在VM entry 时生效当 EPT 生效时,EPT base pointer 指向Extended PageTable 当VM
15、exit 时EPT失效EPT硬件辅助技术182024/11/1 周五内存虚拟化使用EPT硬件直接从GVA转换到HPA192024/11/1 周五KVM虚拟机简介kernel-based Virtual Machine(KVM),是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术)。是基于硬件的完全虚拟化kvm由两个部分组成:一个是KVM Driver,已经成为linux内核的一个模块,负责虚拟机的创建,虚拟机内存的分配,虚拟机寄存器的读写以及虚
16、拟CPU的运行等。另外是一个稍微修改过的qemu,用于模拟PC硬件的用户空间组件,提供I/O设备模型以及访问外设的途径。qemu是一种模拟处理器,现在运用最多的就是将KVM和QEMU结合起来KVM使用了QEMU的一部分,并稍加改造,就成了可控制KVM的用户空间工具了202024/11/1 周五KVM基本结构212024/11/1 周五KVM 在 Linux 内核态与用户态的实现内核空间代码实现的功能包括以下几个方面:1.实现硬件辅助的虚拟化的核心功能。2.提供用户空间对KVM控制。3.对x86平台设备进行仿真。4.实现IO Port空间和MMIO空间的仿真。5.MMU虚拟化的支持。6.PCI-
17、Passthrough相关的功能。KVM 在 用户态的实现(qemu)包括以下部分:1.实现与KVM内核接口的用户空间逻辑。2.各种层次和类型的硬件设备的仿真。3.虚拟块设备的不同磁盘Image文件格式的支持。4.VNC,SPICE等表示层协议的支持。5.Virtio设备的后端。6.QMP 协议的支持。222024/11/1 周五KVM 在 Linux 内核态与用户态的实现内核空间代码实现的功能包括以下几个方面:1.实现硬件辅助的虚拟化的核心功能。2.提供用户空间对KVM控制。3.对x86平台设备进行仿真。4.实现IO Port空间和MMIO空间的仿真。5.MMU虚拟化的支持。6.PCI-Pa
18、ssthrough相关的功能。KVM 在 用户态的实现(qemu)包括以下部分:1.实现与KVM内核接口的用户空间逻辑。2.各种层次和类型的硬件设备的仿真。3.虚拟块设备的不同磁盘Image文件格式的支持。4.VNC,SPICE等表示层协议的支持。5.Virtio设备的后端。6.QMP 协议的支持。232024/11/1 周五KVM/QEMU的执行路径242024/11/1 周五QEMU的设备虚拟化设备虚拟化基本原理:1.模拟设备所具有的所有请求和响应的逻辑模块2.从操作系统的角度,模拟目标设备的软件接口,实现相应的功能3.对于真实设备硬件的内部逻辑以及同其他设备的连接,则不需要精确模拟252
19、024/11/1 周五QEMU的设备虚拟化设备模型的软件接口:PCI 配置空间寻址方式 通过平台相关的寄存器访问,由两个寄存器组成,一个指定设备和偏移,一个读取或写入数据。262024/11/1 周五QEMU的设备虚拟化2.PCI配置空间偏移地址PCI配置空间的模拟:客户机发现和初始化设备时会访问PCI配置空间。由于客户机使用相同的配置空间寄存器来访问设备的配置空间,因此只要拦截对这些寄存器的访问,就可以用进行相应的模拟272024/11/1 周五QEMU的设备虚拟化不同访问设备方式的模拟:端口IO(pic,dma):通过特定的指令访问IO空间,x86平台包括in,out,ins,outs。q
20、emu会事先注册特定端口的读写处理函数,当向这些端口发出IO指令时,就会调用相应的处理函数,完成指定的处理逻辑MMIO:某些内存区域没有被映射到RAM存储器,而是设备的MMIO或寄存器.操作系统通过页表将相应的内存区域映射到虚拟内存空间,并通过类似访问内存的方式访问设备寄存器。和端口IO类似,不同的是页表中并不存在相应的映射,因此会导致缺页异常,KVM拦截这些异常,进行处理或交给qemu进行处理282024/11/1 周五QEMU的设备虚拟化DMA和中断的模拟:DMA(Direct Memory Access):操作系统向特定的硬件寄存器写入DMA地址,然后向另一寄存器地址写入DMA命令来发起
21、DMA操作。由于DAM会读写IO端口或MMIO,因此可以用相应的读写处理函数进行拦截和模拟中断:当设备需要操作系统处理中断时,会通过虚拟中断控制器发出中断,CPU相应中断时,通过读写特定寄存器清除中断QEMU通过模拟中断控制器来进行处理292024/11/1 周五QEMU的磁盘虚拟化IDE简介与数据传输模式:IDE是英文Integrated Drive Electronics的缩写,翻译成中文叫做“集成驱动器电子装置”,它的本意是指把控制器与盘体集成在一起的硬盘驱动器。通常我们所说的IDE指的是硬盘等设备的一种接口技术。IDE接口也叫ATA(Advanced Technology Attach
22、ment)接口,即高级技术附加。PIO 模式(Programming Input/Output Model):一种通过CPU执行IO端口指令来进行数据读写的数据交换模式。DMA 模式(Direct Memory Access)是一种不经过CPU而直接从内存存取数据的数据交换模式302024/11/1 周五QEMU的磁盘虚拟化QEMU的PIO模拟312024/11/1 周五QEMU的磁盘虚拟化QEMU的DMA模拟322024/11/1 周五QEMU的磁盘虚拟化QEMU的磁盘Cache332024/11/1 周五QEMU的磁盘虚拟化半虚拟化驱动与QEMU中的VirtIO342024/11/1 周五
23、容器虚拟化技术什么是容器虚拟化?轻量级的虚拟化仅隔离进程和上下文相关资源模拟操作系统行为而不是硬件行为不需要提供指令解释机制以及全虚拟化的其他复杂特性更少的硬件资源需求,更快的运行速度。相同硬件条件下,可同时支撑虚拟机的数量以及创建、启动虚拟机的速度是全虚拟化的数十到数百倍典型代表:OpenVZ,LXC352024/11/1 周五容器虚拟化技术传统(硬件辅助)全虚拟化架构容器虚拟化架构362024/11/1 周五容器虚拟化技术LXC简介LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。提供了在单一可控主
24、机节点上支持多个相互隔离的server container同时执行的机制。Linux Container有点像chroot,提供了一个拥有自己进程和网络空间的虚拟环境,但又有别于虚拟机,因为lxc是一种操作系统层次上的资源的虚拟化。除了内核特性之外,LXC提供了一套用户态管理工具,常用的有:lxc-execute,lxc-start,lxc-kill,lxc-destroy,lxc-info,lxc-ps等等372024/11/1 周五容器虚拟化技术LXC的关键技术 Control Groups(cgoups)cgroups允许定义一个包括一个或多个进程(例如,sshd、apache等),然后
25、设置一系列资源控制和记账选项来控制该组和其他子系统分离,包括:文件系统访问、通用设备访问、内存资源、网络设备资源、CPU带宽、块设备IO带宽等 POSIX File CapabilitiesPOSIX文件能力是一种分配权限给一个进程允许更多的特定安全控制而不是传统的root对应user的常规unix操作系统权限分离382024/11/1 周五容器虚拟化技术Docker简介 docker 是一个基于LXC 的高级容器引擎。Docker基于底层的LXC特性基础上,在上层构建了一套更高层次的具备多个强大功能的工具集。Docker定义了一个将应用打包的规范,而它的所有依赖都被封装到了一个简单对象里,它
26、可以被传输到任意一台能运行 Docker的机器,并且在这里启动Docker的实例之后,它能够确保承载应用的执行环境将会与之前所定义的完全一致。392024/11/1 周五容器虚拟化技术Docker的技术实现:LXC Cgroup+namespace+Chroot+veth+用户态控制脚本Docker LXC+AUFS+构建与控制工具402024/11/1 周五容器虚拟化技术Docker的常用命令示例获取docker:配置好centos-extras软件源,yum install docker启动docker:service docker start 或 systemctl start dock
27、er.service下载一个镜像:docker pull centos查看确认镜像:docker images centos 运行一个容器并进入其bash:docker run -i t centos /bin/bash查看正在运行的容器列表:docker ps 在容器中安装软件包并退出:yum install wget;exit保存容器:docker commit id(docker ps查看的id的前2位即可)wget_centos(名称)停止容器:docker stop id(docker kill也类似,但stop发送SIGTERM,kill发送SIGKILL)412024/11/1
28、周五容器虚拟化技术Docker的常用命令示例 续:host与容器之间拷贝文件:docker cp contain_id:/tmp/a.txt /root(类似scp,也可以反过来从host拷贝到容器里,但需要先停止容器)删除一个容器:docker rm id删除一个模板:docker rmi image_name删除所有容器:docker rm docker ps -a q 422024/11/1 周五容器虚拟化技术容器虚拟化的局限虚拟机只能部署同类操作系统(Linux)基于相同内核,虚拟机无法加载特定内核模块或驱动隔离性不如全虚拟化,host更容易受到影响432024/11/1 周五Libv
29、irt简介什么是libvirt libvirt是一套免费、开源的支持Linux下主流虚拟化工具的C函数库。其旨在为包括kvm、vmware、xen、lxc等等在内的各种虚拟化平台提供一套方便、可靠的编程接口。支持与C,C+,Ruby,Python,Java等多种主流开发语言的绑定。442024/11/1 周五Libvirt简介什么是libvirt libvirt是一套免费、开源的支持Linux下主流虚拟化工具的C函数库。其旨在为包括kvm、vmware、xen、lxc等等在内的各种虚拟化平台提供一套方便、可靠的编程接口。支持与C,C+,Ruby,Python,Java等多种主流开发语言的绑定。
30、452024/11/1 周五Libvirt简介更详细的libvirt架构图462024/11/1 周五Libvirt简介Libvirt的优点:提供统一、稳定、开放的源代码的应用程序接口(API)、守护进程(libvirtd)和和一个默认命令行管理工具(virsh)。提供了对虚拟化客户机和它的虚拟化设备、网络和存储的管理。提供了一套较为稳定的C语言应用程序接口。目前,在其他一些流行的编程语言中也提供了对libvirt的绑定,在Python、Perl、Java、Ruby、PHP、OCaml等高级编程语言中已经有libvirt的程序库可以直接使用。它对多种不同的 Hypervisor 的支持是通过一
31、种基于驱动程序的架构来实现的,便于扩展。它作为中间适配层,屏蔽了底层各种 Hypervisor 的细节,为上层管理工具提供了一个统一的、较稳定的接口(API)。它使用 XML 来定义各种虚拟机相关的受管理对象。472024/11/1 周五Libvirt简介Libvirt中的主要对象 1)VirConnectPtr:代表了一个特定VMM建立的连接。每一个基于Libvirt的应用程序都应该先提供一个URI来指定本地或远程的某个VMM,从而获得一个VirConnectPtr连接。比如qemu+ssh:/host-virt/代表了通过ssh连接一个在host-virt机器上运行的qemu VMM。拿到
32、virConnectPtr连接后,应用程序就可以管理这个VMM的虚拟机和对应的虚拟化资源,比如存储和网络。2)VirDomainPtr:代表一个虚拟机,可能是激活状态或者仅仅已定义。3)VirNetworkPtr:代表一个网络4)VirStorageVolPtr:代表一个存储卷,通常被虚拟机当做块设备使用。5)VirStoragePoolPtr:代表一个存储池,用来分配和管理存储卷的逻辑区域。482024/11/1 周五Libvirt简介 一个libvirt虚拟机描述XML文件示例 ReactOS-on-QEMU uuid 131072 131072 1 hvm /usr/bin/qemu-k
33、vm 492024/11/1 周五Libvirt简介一个简单的libvirt示例502024/11/1 周五进一步学习资料系统虚拟化原理与实现-Intel Corporation;清华大学出版社 http:/wiki.qemu.org/http:/libvirt.org/https:/ 周五课程设计第一步 使用virt-manager创建安装一个普华服务器操作系统4.0的虚拟机第二部 使用libvirt编写一个程序,启动该虚拟机第三部 在该虚拟机中搭建docker环境,使用docker构建一个能够提供apache服务的镜像模板,使用该镜像模板创建一个容器提供http服务;522024/11/1 周五培训结束虚拟化技术532024/11/1 周五