搜索内容

14.征服KVM虚拟化技术

14.征服KVM虚拟化技术

14.1. X86架构虚拟化技术

X86虚拟化技术说到底就是将一台性能强劲的物理服务器的资源分给若干个逻辑的虚拟机来使用,运行不同的应用,从整体上提高了服务器硬件的使用效率,降低了企业的IT成本,在其他处理器平台,虚拟化早已成熟,并有很多成熟的产品,如IBM基于PowerPC和AIX的Partition(微分区)技术。

X86虚拟化程序,如VMware的vSphere,主要是由虚拟机Virtual Machine,虚拟化实现程序VMM以及管理程序vCenter组成,宏观来看其主要管理对象是服务器的处理器,内存,存储,网络资源,通过虚拟化技术将虚拟机相互隔离,变成独立的计算资源单位来使用,帮助企业更加精细化的使用计算资源,又通过虚拟网络将它们连接,将这些虚拟机连接和整合。KVM其实和vShere有许多相似之处,下面就是学习使用KVM必备的虚拟化知识的精要。

    14.1.1.全虚拟化和半虚拟化

虚拟化技术可以分为全虚拟化(Full Virtualization,简称FV)和半虚拟化(Para Virtualization,简称PV),它们各有千秋,优势互补。

◆全虚拟化

一般来说,所谓全虚拟化是指虚拟机所有的硬件都是通过软件虚拟出来的,操作系统运行在此模式完全不知道这台计算机是通过软件虚拟出来的,它认为这就是真实的物理计算机,运行后和物理计算机无异,由于这种模式下虚拟机硬件完全需要软件实现并将虚拟机的指令完全翻译给Hypervisor(下文为了简洁,采用其另外一个名字VMM,名称不同但所指实为一物)所以会消耗大量的计算机资源,通常损失12%-20%的系统资源,其实质是虚拟机用计算机资源换取运行多种操作系统自由。

◆半虚拟化(又称准虚拟化或超虚拟化)

而半虚拟化则比较取巧,它只用软件虚拟必要的硬件,而不必要的硬件则直接使用,运行在半虚拟化模式,虚拟机可以接近真实主机的速度和效率运行,计算机资源消耗相对于全虚拟化来说小了很多,通常只有3%-5%,但缺点是要修改虚拟机操作系统,所以半虚拟化模式虚拟机操作系统知道自己运行在虚拟机中,由于并不是所有操作系统都可以修改系统内核,所以该模式只适用于开源的操作系统,如Linux,BSD等。

比较一下全虚拟化和半虚拟化技术,它们一个通用性强但计算机资源消耗较大,典型代表有VMware ESXi,微软Hyper-V,Red Hat KVM等,另外一个及其节省计算机却需要修改操作系统,典型代表有Xen,但就当下趋势而言,主流虚拟化产品对这两种虚拟化模式都提高很好的支持,如VMware ESXi和Red Hat KVM这两种典型的全虚拟化代表都能良好地支持半虚拟化技术,而半虚拟化代表Xen也早就可以支持全虚拟化技术。

对于企业而言,如果大量采用商业操作系统,如微软的Windows desktop和Server,那就选择通用性强的全虚拟化技术和产品,如果企业部署大量的开源系统,使用半虚拟化技术和产品可以极大地提高虚拟化效率,比较而言,半虚拟化可能更加不容易理解,图14-1和14-2是全虚拟化和半虚拟化示意图,希望对大家有所帮助。


图14-1 全虚拟化示意图(图片来源:https://clearwaterthoughts.wordpress.com/

图14-2 半虚拟化示意图(图片来源:https://clearwaterthoughts.wordpress.com/

此外,近来异军突起的以Docker为代表的容器( Containers)项目或产品的也号称是虚拟化技术,这话倒没错,容器技术是操作系统层虚拟化(OS-level virtualization)的一种实现,可以说是一种非典型的轻量级虚拟化技术,但其主要是利用LXC(Linux Containers)隔离技术,开始可以运行在Linux上,后来几乎所有的操作系统都支持Docker了,而非通过软件来虚拟出计算机硬件,所以Docker等产品消耗资源极少,目前KVM也支持此种类型的虚拟化技术,Docker的官方定义如下:

Docker containers wrap up a piece of software in a complete filesystem that contains everything it needs to run: code, runtime, system tools, system libraries – anything you can install on a server. This guarantees that it will always run the same, regardless of the environment it is running in.

可以看出其主要是通过容器技术,为操作系统提供代码,运行库,系统工具和库,将一个操作系统分割为多个容器来使用,其架构图如图14-3所示。

图14-3 Docker的架构图(图片来源:https://www.docker.com/what-docker 

可以看出,Docker所谓的虚拟化和KVM的虚拟化区别还是很大的。

    14.1.2.寄居架构和裸金属架构

VMM是虚拟化技术的核心和关键,其主要分为寄居架构(Hosted)和裸金属架构(Bara metal)VMM两大种类。

◆寄居架构

大家经常会碰到基于寄居架构VMM的虚拟化产品,如常见的VMware Player、VirtualBox以及VMWare Workstation等虚拟化产品,构建在某一操作系统之上,它们不仅可以运行虚拟机,并且还可以运行Nest Host。在虚拟化领域,Nested指的是一种虚拟机,即虚拟机中的虚拟机(OSes in OS)。

具体点说,就是Windows 7是Host OS,Ubuntu是Guest OS,而在Ubuntu中又使用VirtualBox创建了一部Windows XP虚拟机,那么这部Windows XP虚拟机就称为Nested Host,VMware的产品支持Nested虚拟机,并有vSphere in a box的实施方案,而开源KVM虚拟机,理论上则支持无限的Nested虚拟机嵌套,无论是VMware还是KVM,Nested虚拟机十分适合做虚拟化实验和测试,尽管效率是其最大的硬伤。此种虚拟化又称之为II型虚拟化,离不开操作系统环境,或者是Windows,或者是Linux,抑或是Mac OS,没有操作系统就无法运作。

◆裸金属架构

基于裸金属架构的VMM则要比寄居架构的潇洒得多,无须任何操作系统就可以直接在裸机上运行,典型产品如VMware ESXi,Xen、KVM和Microsoft Hyper-V,当然,这里的裸机并不是随便一部裸机,而是经过虚拟化产品提供商认证过的“裸机”才行,因为前面介绍给了,VMM通常是由定制的Linux来实现,为了保持VMM足够精简就不能包含太多无关的驱动和支持,所以实际应用中,需要要在“裸机”上运行虚拟化产品,首先要检测该“裸机”是否被虚拟化提供商所支持,通常虚拟化产品提供商网站都提供其兼容硬件产品列表以供参考。此外,此类可以直接和存储设备相连,生产环境一般使用此类产品,并且通过这种VMM部署和运行大量虚拟机,这种虚拟化又称之为I型虚拟化。

再来比较一下这两种VMM,裸金属架构的VMM大多是基于定制和精简的Linux系统,凭借硬件虚拟化技术出色的支持,及其本身低系统开销,虚拟化效率要比寄居架构的要高出很多,而寄居架构VMM则基于作系统,虚拟化效率不高且受制于操作系统,主要用于测试,检测和运行其他平台应用,图14-4是关于两种VMM比较的示意图。


图14-4 寄居架构和裸金属架构对比图(图片来源:Wikipedia.com)

这里要提一下KVM的虚拟化技术,如果采用通用Linux系统并安装KVM,这时其实就是将这台Linux服务器变成了VMM,可以视为寄居架构,也可以视为裸金属架构,谁叫Linux和KVM如此暧昧,但如果是采用Red Hat的虚拟化产品RHEV,此类产品采用精简和定制的Linux,并和KVM整合构建出相应的虚拟化产品,这就属于裸金属架构。

    14.1.3.宿主主机(Host)/宿主主机操作系统(Host OS)和客户机(Guest)/客户机操作系统(Guest OS)

Host指的是实施虚拟化的物理主机,Guest指的是虚拟机,而Host OS指的是物理主机的操作系统,Guest OS则是指虚拟机的操作系统。例如,在服务器上安装了Windows Server 2016操作系统,并利用其提供的Hyper-V虚拟化技术创建了一部CentOS虚拟机,这时我们就称服务器为宿主主机(Host),Windows Server 2016为宿主主机操作系统(Host OS)而CentOS虚拟主机为客户机(Guest),CentOS就是客户机操作系统(Guest OS)。

此外,需要补充的是Nested Host,Nest在英文中是鸟巢、筑巢的意思,而所谓Nested Host就是虚拟机中运行虚拟机(OSes in OS),例如在上述实例中的虚拟机CentOS中再创建一个KVM虚拟机,并运行Windows 7,那么Windows 7就是Nested host,比较著名的VMware虚拟机方案vSphere in a box,就是基于Nested Host,从而实现其虚拟技术的测试。需要提醒大家的是,VMware ESX所支持的Nested虚拟机只支持一层,即只能在虚拟机中再运行一个虚拟机,但KVM却没有这个限制,理论上可以无限层级的虚拟化,只要硬件支持。

    14.1.4.虚拟机三种主流网络模式

后网络时代,大多智能手机都可以随时连入互联网,哪还有几台计算机或虚拟机不支持网络不连接互联网呢,网络无论是在真实环境还是虚拟环境都是不可或缺的。虚拟世界中,无论哪种虚拟化技术创建的虚拟机,也不论是桌面级的虚拟化产品还是企业级的虚拟化产品大多都支持三种虚拟网络模式:

◆桥接(Bridged)模式

桥接模式虚拟网络是指计算机物理网卡和虚拟网卡通过虚拟交换机进行桥接,此模式下,虚拟机可以访问网络内任何一台计算机(无论是Host还是Guest),并可以手动配置其网络参数,以实现通过LAN的路由器访问互联网。桥接网络中,虚拟机和宿主机器的关系,就像连接到同一个集线器上的两台计算机。虚拟交换机的名称对于KVM来说是brX和tapX
虚拟网络设备,对于VMware虚拟化产品来说就是VMnet0。此种虚拟网络模式环境中,物理网卡和虚拟网卡同处于相同网段且地位相同,所以它们的IP地址要设置为同一网段。需要强调的是,上述虚拟交换机功能上和物理网络中的真实交换机完全相同,只不过是通过软件实现而已,实现如图14-5所示。

图14-5 桥接网络示意图(图片来源:VMware.com)

◆NAT(Network address translation)模式

NAT模式和物理网络环境中在Cisco路由器上设置的网络地址转换(NAT)功能相同,主要是将LAN中私有IP地址,如192.168.x.x和10.x.x.x等地址转换为互联网上的IPv4地址(IPv6无需NAT),抑或将互联网上的IPv4或IPv6地址转换为LAN中相应的私有IP地址,这样既可以节约宝贵的IPv4地址又可以令LAN中众多的计算机畅游互联网,在虚拟化环境,此种网络模式就是让虚拟机借助虚拟的NAT交换机,分享宿主主机的网络功能实现互联网的访问。目前,对大多数虚拟化程序,无论是面向桌面端的还是面向企业端的,如VMware workstation和ESXi,Red Hat KVM等默认都采用此模式,便捷可靠的网络连接。需要注意的是,在模式中虚拟机的网卡和物理网卡对应不同的网段,虚拟机的网卡所对应的是一个自可定义的虚拟网络,其示意图如14-6所示。

图14-6 NAT网络示意图(图片来源:VMware.com)

◆Host-Only模式

此模式下,虚拟机网络是一个全封闭的网络,只能能够访问宿主主机,就好像用上了***一样,网络中建立了一个只连接客户机和宿主主机的非加密的数据通道。一般除了用于开发和测试外很少用到,但要知道此模式,其示意图如14-7所示。

图14-7 Host-Only网络示意图(图片来源:VMware.com)

本质上,三种网络模式对应三种虚拟网络交换机,并提供三种运作方式的虚拟网络,满足虚拟机的不同的需求,犹如开发者一定要熟悉顺序,分支,循环三种逻辑结构一样,要十分熟悉,烂熟于心。

目前,上述三种模式是商业化产品对网络支持的基本模式,但对于主流的KVM而言,默认只支持NAT模式,需要桥接模式得手动配置网桥等虚拟交换设备。

除了计算机核心硬件虚拟化之外,更为重要和复杂的是网络虚拟化,虽然前面已经涉及到部分虚拟网络的内容,如虚拟网络三种模式,但这对于KVM来说,还是远远不够的。

网络虚拟化其实是比硬件虚拟化更加庞杂的技术,其与计算机硬件虚拟为虚拟机非常类似,其实就是将虚拟化原理应用于物理网络基础架构,将物理网络中的所有设备,如交换机,路由器,防火墙,以及负载均衡器等设备通过软件技术重构为虚拟交换机、虚拟路由器、虚拟防火墙、虚拟和虚拟负载平衡器虚拟化等设备,近来网络虚拟化发展迅猛,如火爆的软件定义网络(SDN),Cisco早就推出了Nexus 1000v虚拟交换机,并可以应用在vShpere云计算环境中,KVM环境也不示弱,有vOpenSwitch等虚拟化交换机项目,可以预见,网络虚拟化将是虚拟化的下一个重要战场,IT巨头都在摩拳擦掌,积极开发相关产品,积极收购相关厂商,期待在网络虚拟化领域有所作为。

至于存储虚拟化,它的思路和网络虚拟化类似,就是将物理存储设备变成虚拟的存储设备,将物理机房转化为虚拟机房(软件定义数据中心,SDDC),更为前瞻的说法是虚拟化一切,即将适合的物理设备虚拟化后,无论是计算机硬件,网络及各种网络设备和存储设备,其最终目的都是通过开源云操作系统KVM来管理,提高物理设备使用效率,灵活性和伸缩性,进而更好地为企业服务。

总之,虚拟化技术总是和云计算如影随形,但它不是云计算的附庸,而是一种独立发展的技术,虚拟化只是实现云计算的一个技术手段而已。此外,虚拟化技术也不是万金油,什么地方都可以使用,而且一用就有效果,许多环境是不适合应用虚拟化技术的。有了虚拟化技术的相关概念和知识后,还需要了解云计算本身的一些概念和知识。

14.2.KVM虚拟化技术

KVM (Kernel Based Virtual Machine)是Linux原生的虚拟化技术,2006年下半年由以色列Qumranet开发的基于Linux kernel的虚拟机解决方案, 2007年初就被Linux kernel 2.6.20纳入内核成为内核的一部分,以一种极其简洁和巧妙地方式将Linux瞬间变身为VMM,可见其思想和技术足够先进。KVM是一个与VMware ESXi类似的虚拟化程序,开始只支持全虚拟化技术,后来通过Virtio项目半虚拟化技术改善其I/O设备的效率,目前来说可以说是以硬件辅助虚拟化为依托,以全虚拟化技术为主体,并以半虚拟化技术为补充的一项独特的开源虚拟化技术。

KVM代码短小精干,集成在Linux的内核中,可以在Linux系统中创建虚拟机。由于KVM就是Linux内核的一部分并且完全开源,所以它和KVM的理念和开发方式相仿,又紧密相关,不成为亲密搭档都难。为了实现云计算技术,它们配合默契,相濡以沫。

    14.2.1.部署KVM的准备工作

准备工作包括检测服务器硬件虚拟化支持以及操作系统等是否满足实施虚拟化的条件,详细项目如下。

服务器处理器要求
检测处理器是否为64位
由于虚拟化技术限制,运行KVM虚拟化的处理器必须为64位,可以运行如下命令来检测处理器:

lscpu | grep Architecture
Architecture:          x86_64

直接看结果就知道结果了。

检测处理器虚拟化技术支持
运行KVM的计算机处理器必需要支持硬件辅助虚拟化,否在KVM将无法工作,在终端中运行如下命令进行测试:

egrep "svm|vmx" /proc/cpuinfo

Intel处理器将显示如下信息:
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ssbd ibrs ibpb stibp tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec arat spec_ctrl intel_stibp flush_l1d arch_capabilities
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ssbd ibrs ibpb stibp tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec arat spec_ctrl intel_stibp flush_l1d arch_capabilities
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ssbd ibrs ibpb stibp tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec arat spec_ctrl intel_stibp flush_l1d arch_capabilities
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ssbd ibrs ibpb stibp tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec arat spec_ctrl intel_stibp flush_l1d arch_capabilities

AMD处理器将显示如下信息:

flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl tsc_reliable nonstop_tsc cpuid extd_apicid pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ssbd ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xsaves clzero arat npt svm_lock nrip_save vmcb_clean flushbyasid decodeassists overflow_recov succor
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl tsc_reliable nonstop_tsc cpuid extd_apicid pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ssbd ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xsaves clzero arat npt svm_lock nrip_save vmcb_clean flushbyasid decodeassists overflow_recov succor
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl tsc_reliable nonstop_tsc cpuid extd_apicid pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ssbd ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xsaves clzero arat npt svm_lock nrip_save vmcb_clean flushbyasid decodeassists overflow_recov succor
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl tsc_reliable nonstop_tsc cpuid extd_apicid pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ssbd ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xsaves clzero arat npt svm_lock nrip_save vmcb_clean flushbyasid decodeassists overflow_recov succor

支持该功能的CPU可以看到返回的信息中含有vmx(Intel产品)或svm(AMD产品)字样。由于目前绝大多数的服务器CPU是64位并且支持硬件虚拟化,如果找不到vmx或svm标志,多数情况是由于服务器BIOS中禁用了此项功能,只需重启计算机并进入BIOS配置界面启用硬件虚拟化即可,如果是虚拟机中学习,需要修改CentOS虚拟机处理器的设置,将Virtualize Intel VT-x/EPT or AMD-V/RVI选项选中。

服务器内存要求
虚拟化对内存可以说是如饥似渴,容量越大越好,速度越高越好,这是没有任何悬念的,最近经手的项目的服务器最少也得64GB的内存。内存过小会导致大量额外的I/O操作极大地影响虚机性能,性能将会下降的很快,所以内存容量宁可大一点也绝不能小了。

服务器存储要求
首先KVM虚拟化本身需要巨量的I/O操作,如快照,克隆,乃至迁移,主要与硬盘读写操作相关,通常来说,对于服务器性能,主要的瓶颈就是I/O设备较慢,I/O操作会产生大量的系统中断并消耗大量服务器资源,所以虚拟化乃对于存储速度要求比较高,生产环境DAS最好全部采用SSD硬盘阵列来提高虚拟化的整体效率和容错性。

服务器操作系统
选择64位的CentOS 8版本来运行KVM,将CentOS 8变成一个强大的VMM,这也是KVM的硬性规定。

创建KVM目录结构
创建如下结构的目录以便于逐步深入实践KVM,具体操作如下:

mkdir -p /KVM/{iso_images,kvm_images,kvm_templates,sys_images}
tree /KVM/
/KVM/
├── iso_images      #保存系统安装ISO镜像
├── kvm_images      #KVM虚拟磁盘镜像存储池
├── kvm_templates       #保存KVM虚拟机模板镜像
└── sys_images      #KVM虚拟磁盘文件DSA保存目录

上述目录后面将会用到,并且令学习和使用有序高效。

    14.2.2.部署KVM及虚拟化管理程序

安装前先要使用如下命令添加libvirtd用户组:

groupadd libvirtd

随后使用如下命令开始安装KVM:

dnf -y install qemu-kvm libvirt virt-install

上述软件包中,qemu-kvm用于管理基于kvm的虚拟机,它和KVM总是如影随形,密切合作。KVM在系统的内核空间(Kernel Space)的模块,而QEMU则是可以虚拟几乎所有处理器架构的开源项目,qemu-kvm是QEMU将KVM整合,并通过ioctl调用/dev/kvm接口,将有关CPU指令的部分交由内核模块来实现,是KVM相应的用户空间(User Space)程序,可视为KVM的VMM,实现KVM的各种功能,它们之间的关系有点类似内核中的netfilter内核模块及其命令行管理工具iptables。Bridge工具是创建和管理桥接设备的工具集,成功安装后可以使用如下命令来检测安装是否成功:

lsmod|grep kvm
Intel处理器服务器:
kvm_intel             183621  0
kvm                   586948  1 kvm_intel
irqbypass              13503  1 kvm

AMD处理器服务器:

lsmod|grep kvm
kvm_amd               106496  0
ccp                    98304  1 kvm_amd
kvm                   745472  1 kvm_amd
irqbypass              16384  1 kvm

或直接运行如下命令查看:

ll /dev/kvm
crw-rw-rw-. 1 root kvm 10, 232 Jul 21 20:11 /dev/kvm

运行如下命令查看一下KVM的版本并检测系统中虚拟机:

virsh -c qemu:///system list
Id    Name                           State
----------------------------------------------------

运行命令后如显示如上信息表示安装成功,由于还没有创建虚拟机,所以下面内容为空。之后运行如下命令启动虚拟化的守护进程:

systemctl start libvirtd 
systemctl enable libvirtd 

关键的网络配置部分,由于KVM默认的网卡模式为NAT模式,即共享宿主主机的网络,优点是实现简单,使用便捷,而在生产环境,多需要桥接模式,即虚拟机如真实服务器一样具有独立的网卡和网络配置,在网络中和宿主主机的平起平坐,所以还要为KVM创建网卡的桥接,具体实现方法请参考第1章的相关内容。

成功配置网桥之后,再次运行ip命令,已经可以看到br0了,说明桥接创建成功。这就是上述添加的虚拟桥接交换机。至此,KVM Host主机的桥接网络配置完成,以后创建的KVM虚拟机就可以和VMware的虚拟机一样,大模大样地使用桥接网络了,万完事具备只欠东风了,下面将开始KVM虚拟机的安装。

    14.2.3.通过图形界面部署KVM虚拟机

由于很多操作系统只支持图形界面(GUI),如Windows server,或是图形界面安装比较方便,如RHEL或CentOS,这就比较麻烦了,因为CentOS默认是没有图像界面的,安装一个图形界面不是不可以,不过降低了服务器的安全,最好的办法就是通过Windows环境的X server程序-Xming在远程管理端运行KVM图形化程序virt-manager,具体实现方法如下。
Xming下载地址:
https://cfhcable.dl.sourceforge.net/project/xming/Xming/6.9.0.31/Xming-6-9-0-31-setup.exe

在远程管理的的Windows系统中安装Xming程序,典型的Windows程序,一路next即可顺利安装,然后启动该程序,然后在CentOS中运行如下命令安装virt-manager:

dnf install -y virt-manager

下面就以在KVM中安装CentOS 8之前的老版本7.7为例来介绍KVM的使用,具体方法如下:

cd /KVM/iso_images/
wget http://mirror.csclub.uwaterloo.ca/centos/7.7.1908/isos/x86_64/CentOS-7-x86_64-Minimal-1908.iso

成功下载后,运行如下命令启用图形界面:

virt-manager

单击virt-manager界面中的最左侧的创建虚拟机按钮创建CentOS 7虚拟机,具体操作如图14-8所示。

图14-8 创建CentOS 7虚拟机

然后在弹出的窗口中保持默认的Local install media选项,单击Forward按钮,在随后出现的对话框中选择Use ISO image选项,并单击右侧的Browse按钮,在出现的对话框中选择Browser Local按钮,指定CentOS 7.7的安装镜像的位置,接下来根据提示便可完成设置,方法和Windows中的VirtualBox或VMware Player差不多,最后,完成安装进入了熟悉的界面,具体效果如图14-9所示。

图14-9 登录到CentOS 7.7虚拟机

除了CentOS等开源系统之外,还可以安装大家熟悉的Windows server系统,如Windows server 2008R2,官方180天体验版本下载地址如下:

cd /KVM/iso_images/
wget https://download.microsoft.com/download/4/1/D/41DEA7E0-B30D-4012-A1E3-F24DC03BA1BB/7601.17514.101119-1850_x64fre_server_eval_en-us-GRMSXEVAL_EN_DVD.iso

之后的方法和部署CentOS的方法大同小异,大家可以如上法炮制,此外,还可以和第1章介绍过的PXE服务器配合使用,这样安装起来就便捷和高效多了,方法和实体服务器相仿,关键是要将KVM虚拟机设置为从网络启动。

    14.2.4.使用命令行创建KVM虚拟机

要创建KVM虚拟机,首先要有安装镜像,这里以Ubuntu服务器版本作为演示实例,Windows服务器操作方法类似,只是比较麻烦一些。具体实现如下,首先下载Ubuntu server 18.04安装镜像并保存到服务器根目录下KVM的iso_images目录下,具体操作如下:

cd /KVM/iso_images/                                                                         #切换到指定目录
wget http://cdimages.ubuntu.com/releases/18.04.3/release/ubuntu-18.04.3-server-amd64.iso    #下载安装镜像
modprobe kvm-intel                                                                          #自动加载kvm_intel模块,如果是AMD处理器改为kvm_amd
lsmod | grep kvm

根据第1章的配置方法,配置Bridge,成功配置后,即可部署Ubuntu server 18.04虚拟机,然后就可以开始开始安装Ubuntu server 18.04,只不过命令有点长,终端的输出比较多,具体操作如下:

virt-install --name=us1804x64 \                                                             #指定虚拟机名称
--hvm \                                                                                     #使用全虚拟化,半虚拟化为paravirt)
--ram 4096 \                                                                                #设置虚拟内存大小为2GB,单位为MB
--vcpus=2 \                                                                                 #设置CPU核心数量(虚拟处理器核心数量只能小于等于宿主主机CPU核心数量)
--os-type=Linux \                                                                           #设定操作系统类别为Linux
--os-variant=ubuntu18.04  \                                                                 #设置操作系统名称
--arch=x86_64 \                                                                             #指定处理器架构
--disk path=/KVM/sys_images/us1804x86_64.img,size=30 \                                      #指定虚拟磁盘文件的位置和容量,容量单位是GB
--network network=default \                                                                 #将网络模式设置为桥接,如使用桥接网络配置时可设为 "--network bridge=br0,model=virtio",virtio为提高网卡效率的驱动,不用过于纠结,完成安装后还可以进行配置,如添加桥接或NAT等网络
--accelerate \                                                                              #启用加速
--graphics vnc,listen=0.0.0.0,port=6000 \                                                   #设置VNC监控端口,绑定IP,为了安全指定端口为6000,要使用SPICE,可以是用spice替代vnc(不能指定端口)
--cdrom /KVM/iso_images/ubuntu-18.04.3-server-amd64.iso -d                                  #设置虚拟光驱对应安装镜像ISO文件位置并从虚拟光驱启动

执行此命令后,即可看到如下结果:

[Tue, 01 Oct 2019 22:36:50 virt-install 3084] DEBUG (cli:200) Launched with command line: /usr/share/virt-manager/virt-install --name=us1804 --hvm --ram 4096 --vcpus=2 --os-type=Linux --os-variant=ubuntu18.04 --arch=x86_64 --disk path=/KVM/kvm_images/us1804.img,size=10 --network bridge=br0 --accelerate --graphics vnc,listen=0.0.0.0,port=6000 --cdrom /KVM/iso_images/ubuntu-18.04.3-server-amd64.iso -d
[Tue, 01 Oct 2019 22:36:50 virt-install 3084] DEBUG (virt-install:243) Distilled --network options: ['network=default']
[Tue, 01 Oct 2019 22:36:50 virt-install 3084] DEBUG (virt-install:159) Distilled --disk options: ['path=/KVM/kvm_images/us1804.img,size=10']
[Tue, 01 Oct 2019 22:36:50 virt-install 3084] DEBUG (cli:214) Requesting libvirt URI default
[Tue, 01 Oct 2019 22:36:50 virt-install 3084] DEBUG (cli:217) Received libvirt URI qemu:///system
[Tue, 01 Oct 2019 22:36:50 virt-install 3084] DEBUG (disk:283) Creating volume 'us1804.img' on pool 'kvm_images'
[Tue, 01 Oct 2019 22:36:50 virt-install 3084] DEBUG (disk:409) disk.set_vol_install: name=us1804.img poolxml=
<pool type='dir'>
  <name>kvm_images</name>
...
  </seclabel>
</domain>

[Tue, 01 Oct 2019 22:36:51 virt-install 3084] DEBUG (virt-install:641) Domain state after install: 1
Domain installation still in progress. Waiting for installation to complete.
...

首先根据上述输出,KVM创建了一个XML格式的虚拟机的定义文件,该文件保存在/etc/libvirt/qemu目录下,名称应该和虚拟机名称相同,详细信息如下:

ll
total 4
drwx------. 3 root root   42 Oct  1 20:55 networks
-rw-------. 1 root root 5723 Oct  1 22:36 us1804.xml
...

Tips:KVM虚拟机目录
KVM虚拟机配置文件默认目录:/etc/libvirt/qemu
KVM虚拟机默认目录/var/lib/libvirt/,该目录包括了KVM虚拟机运行所需相关目录:

ll /var/lib/libvirt/
total 0
drwx--x--x. 2 root root   6 Jun 25 23:56 boot
drwxr-xr-x. 2 root root 116 Oct  1 22:35 dnsmasq
drwx--x--x. 2 root root   6 Jun 25 23:56 filesystems
drwx--x--x. 2 root root  29 Oct  1 22:16 images
drwx------. 2 root root   6 Jun 25 23:56 network
drwxr-x--x. 9 qemu qemu 108 Oct  1 23:15 qemu
drwx--x--x. 2 root root   6 Jun 25 23:56 swtpm

最后运行如下命令来查看虚拟机的状态:

virsh -c qemu:///system list
 Id    Name                           State
----------------------------------------------------
 2     us1804                         running

可以看到目前虚拟机的状态是运行,它的确运行良好,但是什么也看不到,需要通过VNC客户端去连接KVM虚拟机。

需要特别注意的是,--os-variant的参数比较麻烦,因为KVM对其有着明确的命名规范,所以一定要使用规范名称,运行如下命令来查询:

osinfo-query os
 Short ID             | Name                                               | Version  | ID                                      
----------------------+----------------------------------------------------+----------+-----------------------------------------
...         
 centos6.0            | CentOS 6.0                                         | 6.0      | http://centos.org/centos/6.0            
 centos6.1            | CentOS 6.1                                         | 6.1      | http://centos.org/centos/6.1            
 centos6.10           | CentOS 6.10                                        | 6.10     | http://centos.org/centos/6.10           
 centos6.2            | CentOS 6.2                                         | 6.2      | http://centos.org/centos/6.2            
 centos6.3            | CentOS 6.3                                         | 6.3      | http://centos.org/centos/6.3            
 centos6.4            | CentOS 6.4                                         | 6.4      | http://centos.org/centos/6.4            
 centos6.5            | CentOS 6.5                                         | 6.5      | http://centos.org/centos/6.5            
 centos6.6            | CentOS 6.6                                         | 6.6      | http://centos.org/centos/6.6            
 centos6.7            | CentOS 6.7                                         | 6.7      | http://centos.org/centos/6.7            
 centos6.8            | CentOS 6.8                                         | 6.8      | http://centos.org/centos/6.8            
 centos6.9            | CentOS 6.9                                         | 6.9      | http://centos.org/centos/6.9            
 centos7.0            | CentOS 7.0                                         | 7.0      | http://centos.org/centos/7.0            
...               
 rhel5.0              | Red Hat Enterprise Linux 5.0                       | 5.0      | http://redhat.com/rhel/5.0              
 rhel5.1              | Red Hat Enterprise Linux 5.1                       | 5.1      | http://redhat.com/rhel/5.1              
 rhel5.10             | Red Hat Enterprise Linux 5.10                      | 5.10     | http://redhat.com/rhel/5.10             
 rhel5.11             | Red Hat Enterprise Linux 5.11                      | 5.11     | http://redhat.com/rhel/5.11             
 rhel5.2              | Red Hat Enterprise Linux 5.2                       | 5.2      | http://redhat.com/rhel/5.2              
 rhel5.3              | Red Hat Enterprise Linux 5.3                       | 5.3      | http://redhat.com/rhel/5.3              
 rhel5.4              | Red Hat Enterprise Linux 5.4                       | 5.4      | http://redhat.com/rhel/5.4              
 rhel5.5              | Red Hat Enterprise Linux 5.5                       | 5.5      | http://redhat.com/rhel/5.5              
 rhel5.6              | Red Hat Enterprise Linux 5.6                       | 5.6      | http://redhat.com/rhel/5.6              
 rhel5.7              | Red Hat Enterprise Linux 5.7                       | 5.7      | http://redhat.com/rhel/5.7              
 rhel5.8              | Red Hat Enterprise Linux 5.8                       | 5.8      | http://redhat.com/rhel/5.8              
 rhel5.9              | Red Hat Enterprise Linux 5.9                       | 5.9      | http://redhat.com/rhel/5.9              
 rhel6.0              | Red Hat Enterprise Linux 6.0                       | 6.0      | http://redhat.com/rhel/6.0              
 rhel6.1              | Red Hat Enterprise Linux 6.1                       | 6.1      | http://redhat.com/rhel/6.1              
 rhel6.10             | Red Hat Enterprise Linux 6.10                      | 6.10     | http://redhat.com/rhel/6.10             
 rhel6.2              | Red Hat Enterprise Linux 6.2                       | 6.2      | http://redhat.com/rhel/6.2              
 rhel6.3              | Red Hat Enterprise Linux 6.3                       | 6.3      | http://redhat.com/rhel/6.3              
 rhel6.4              | Red Hat Enterprise Linux 6.4                       | 6.4      | http://redhat.com/rhel/6.4              
 rhel6.5              | Red Hat Enterprise Linux 6.5                       | 6.5      | http://redhat.com/rhel/6.5              
 rhel6.6              | Red Hat Enterprise Linux 6.6                       | 6.6      | http://redhat.com/rhel/6.6              
 rhel6.7              | Red Hat Enterprise Linux 6.7                       | 6.7      | http://redhat.com/rhel/6.7              
 rhel6.8              | Red Hat Enterprise Linux 6.8                       | 6.8      | http://redhat.com/rhel/6.8              
 rhel6.9              | Red Hat Enterprise Linux 6.9                       | 6.9      | http://redhat.com/rhel/6.9              
 rhel7.0              | Red Hat Enterprise Linux 7.0                       | 7.0      | http://redhat.com/rhel/7.0              
 rhel7.1              | Red Hat Enterprise Linux 7.1                       | 7.1      | http://redhat.com/rhel/7.1              
 rhel7.2              | Red Hat Enterprise Linux 7.2                       | 7.2      | http://redhat.com/rhel/7.2              
 rhel7.3              | Red Hat Enterprise Linux 7.3                       | 7.3      | http://redhat.com/rhel/7.3              
 rhel7.4              | Red Hat Enterprise Linux 7.4                       | 7.4      | http://redhat.com/rhel/7.4              
 rhel7.5              | Red Hat Enterprise Linux 7.5                       | 7.5      | http://redhat.com/rhel/7.5 
 rhel7.6              | Red Hat Enterprise Linux 7.6                       | 7.6      | http://redhat.com/rhel/7.6
 rhel8.0              | Red Hat Enterprise Linux 8.0                       | 8.0      | http://redhat.com/rhel/8.0
...
 ubuntu14.04          | Ubuntu 14.04 LTS                                   | 14.04    | http://ubuntu.com/ubuntu/14.04          
 ubuntu14.10          | Ubuntu 14.10                                       | 14.10    | http://ubuntu.com/ubuntu/14.10          
 ubuntu15.04          | Ubuntu 15.04                                       | 15.04    | http://ubuntu.com/ubuntu/15.04          
 ubuntu15.10          | Ubuntu 15.10                                       | 15.10    | http://ubuntu.com/ubuntu/15.10          
 ubuntu16.04          | Ubuntu 16.04                                       | 16.04    | http://ubuntu.com/ubuntu/16.04          
 ubuntu16.10          | Ubuntu 16.10                                       | 16.10    | http://ubuntu.com/ubuntu/16.10          
 ubuntu17.04          | Ubuntu 17.04                                       | 17.04    | http://ubuntu.com/ubuntu/17.04          
 ubuntu17.10          | Ubuntu 17.10                                       | 17.10    | http://ubuntu.com/ubuntu/17.10          
 ubuntu18.04          | Ubuntu 18.04 LTS                                   | 18.04    | http://ubuntu.com/ubuntu/18.04          
 ubuntu18.10          | Ubuntu 18.10                                       | 18.10    | http://ubuntu.com/ubuntu/18.10          
 ubuntu4.10           | Ubuntu 4.10                                        | 4.10     | http://ubuntu.com/ubuntu/4.10           
 ubuntu5.04           | Ubuntu 5.04                                        | 5.04     | http://ubuntu.com/ubuntu/5.04           
 ubuntu5.10           | Ubuntu 5.10                                        | 5.10     | http://ubuntu.com/ubuntu/5.10           
 ubuntu6.06           | Ubuntu 6.06 LTS                                    | 6.06     | http://ubuntu.com/ubuntu/6.06           
 ubuntu6.10           | Ubuntu 6.10                                        | 6.10     | http://ubuntu.com/ubuntu/6.10           
 ubuntu7.04           | Ubuntu 7.04                                        | 7.04     | http://ubuntu.com/ubuntu/7.04           
 ubuntu7.10           | Ubuntu 7.10                                        | 7.10     | http://ubuntu.com/ubuntu/7.10           
 ubuntu8.04           | Ubuntu 8.04 LTS                                    | 8.04     | http://ubuntu.com/ubuntu/8.04           
 ubuntu8.10           | Ubuntu 8.10                                        | 8.10     | http://ubuntu.com/ubuntu/8.10           
 ubuntu9.04           | Ubuntu 9.04                                        | 9.04     | http://ubuntu.com/ubuntu/9.04           
 ubuntu9.10           | Ubuntu 9.10                                        | 9.10     | http://ubuntu.com/ubuntu/9.10           
 win1.0               | Microsoft Windows 1.0                              | 1.0      | http://microsoft.com/win/1.0            
 win10                | Microsoft Windows 10                               | 10.0     | http://microsoft.com/win/10             
 win2.0               | Microsoft Windows 2.0                              | 2.0      | http://microsoft.com/win/2.0            
 win2.1               | Microsoft Windows 2.1                              | 2.1      | http://microsoft.com/win/2.1            
 win2k                | Microsoft Windows 2000                             | 5.0      | http://microsoft.com/win/2k             
 win2k12              | Microsoft Windows Server 2012                      | 6.3      | http://microsoft.com/win/2k12           
 win2k12r2            | Microsoft Windows Server 2012 R2                   | 6.3      | http://microsoft.com/win/2k12r2         
 win2k16              | Microsoft Windows Server 2016                      | 10.0     | http://microsoft.com/win/2k16           
 win2k3               | Microsoft Windows Server 2003                      | 5.2      | http://microsoft.com/win/2k3            
 win2k3r2             | Microsoft Windows Server 2003 R2                   | 5.2      | http://microsoft.com/win/2k3r2          
 win2k8               | Microsoft Windows Server 2008                      | 6.0      | http://microsoft.com/win/2k8            
 win2k8r2             | Microsoft Windows Server 2008 R2                   | 6.1      | http://microsoft.com/win/2k8r2          
 ...

从上述规范的操作系统名称列表中选择一个最为合适的即可,上述命令中选择Ubuntu 18.04 LTS对应的规范名称 ubuntu18.04,由于全部的规范名称太多,可以使用如下命令来缩小范围:

osinfo-query os|grep ubuntu

或:
osinfo-query os|grep rhel

这样,就只显示和Ubuntu或rhel相关的名称了。此外为了便于使用,笔者将虚拟机创建命令单独创建了两个小脚本deploy_us1804.sh和deploy_centos77.sh。

执行完一长串虚拟机创建命令后,如果一切顺利,KVM就将在后台进行安装,安装过程中肯定需要交互操作,这时就需要使用VNC客户端连接到虚拟机即可看到安装过程,下载地址如下:
◆Windows版本
https://www.realvnc.com/download/file/viewer.files/VNC-Viewer-6.19.923-Windows.exe

◆CentOS版本
https://www.realvnc.com/download/file/viewer.files/VNC-Viewer-6.19.923-Linux-x64.rpm

Windows版本是典型的安装方法,至于CentOS 8 ,只需用rpm命令即可顺利完成安装,安装好后,关掉CentOS的防火墙,使用Windows下的RealVNC或Ubuntu默认客户端Remmina连接KVM系统的IP地址和端口,这时Ubuntu的安装界面就呈现在眼前了,关键操作如图14-10,11和12所示。

图14-10 RealVNC设置登录信息

图14-11 熟悉的Ubuntu安装界面

图14-12 更新软件仓库的KVM虚拟机

通过VNC客户端我们可以与安装过程互动直到完成安装。

    14.2.4.SPICE远程管理KVM虚拟机

虚拟机安装完成后,还需要进行相关的配置,和安装物理服务器完全一样,如修改虚拟机配置,Harding,安装最新补丁,配置网络等。

虚拟机成功地创建和运行后,大致说来可以直接通过SSH登录到虚拟机以命令行的方式操作虚拟机,或使用VNC或SPICE远程控制。具体来说,Windows环境可以使用RealVNC或SPIC客户端来远程管理虚拟机,推荐使用SPICE,官方下载地址如下:
https://releases.pagure.org/virt-viewer/virt-viewer-x64-8.0.msi

下载安装最新版本的安装文件后后,输入KVM服务器的地址和端口号并以冒号分隔即可连接,上述安装为了安全,采用可以指定端口的VNC,如果要切换成SPICE方式,可以使用如下命令对虚拟机进行编辑:
virsh edit us1804

定位到如下配置:

<graphics type='vnc' port='6000' autoport='no' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>

修改配置为:

<graphics type='spice' port='6000' autoport='no' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>

保存后重启虚拟机,关掉Windows和CentOS 8系统的防火墙,然后在SPICE客户端中输入spice://192.168.1.168:6000,单击连接即可看到虚拟机,使用修改配置的方式,可以指定SPICE的端口,为了安全起见目前推荐先安装时采用vnc模式,然后再修改为spice模式,并将SPICE默认端口5900修改为指定端口。

Tips:什么是SPICE(Simple Protocol for Independent Computing Environments,独立计算环境简单协议)
SPICE是KVM默认采用远程通信协议,可以令客户端能显示远程虚拟主机的操作界面并且使用其设备,如键盘,鼠标,声音等。用户可以获得如同操作本地机器一样的体验,和VNC相比,SPICE智能分配CPU和GPU任务到客户端执行,大量连接时可以有效地减轻服务器负担,并且可以方便地截屏,USB设备重定向以及向虚拟机发送组合键等额外功能。

也许会有朋友提出质疑,那前面还费那么大劲通过命令行创建虚拟机和桥接,配置网络,直接使用Virt-manager不就可以了吗?既轻松又便捷.其实不然,首先Virt-manager在功能上和VMware Client等类似的商业软件相比,还比较简陋,只实现了一些常用功能,功能稍微复杂,就离不开命令行,如创建桥接网络,绑定网桥等。此外,在企业环境中,服务器大多托管在IDC,由于通过VNC方式连接很占用带宽,所以多出情况是采用SSH+命令行的方式进行虚拟化操作;最后,随着自动化管理和配置工具的流行,采用命令行很容易实现批量部署和配置,如通过Ansible自动批量和配置创建虚拟机等。所以
就目前而言Virt-manager可能更加适合桌面环境环境的虚拟化应用,如创建有限的虚拟机,快照等操作。不过随着KVM项目以及KVM项目的发展和推进,相信今后起功能会越来越完善,即便如此,Virt-manager也是无法替代上述虚拟化命令,最好对于KVM图形界面和命令行都很熟悉,这样在KVM环境才能得心应手。

14.3.管理KVM虚拟机的基石

当选择Virt-manager主菜单-帮助-关于时,总能看到一句话,由libvirt强力驱动,如图14-13所示。

图14-13 libvirt强力驱动

那libvirt是什么呢?谈到管理KVM为什么一定要知道libvirt?Libvirt严格意义上讲只是一个实现虚拟机各种功能和管理工具的应用程序接口(API),不仅KVM的运作离不开libvirt,而且KVM常用的虚拟机管理工具,如上述使用到的virt-install和virsh等程序都是基于libvirt API,作为KVM的好搭档,KVM自然也支持这个程序接口。

libvirt项目最初是为Xen设计的一套API,但支持多种虚拟化技术,如KVM、QEMU、VMware等。由于Open,使得libvirt对KVM提供了良好的支持。此外,libvirt 还支持流行的容器虚拟化Container技术,支持LXC、OpenVZ等。libvirt主要功能是屏蔽了底层各种VMM实现细节并且让底层VMM对用户空间的管理工具完全透明,其实通过libvirt,虚拟化管理工具可以管理各种不同的VMM及其客户机。

libvirt主要由三个部分组成,即应用程序编程接口(API)库,守护进程(libvirtd)和命令行管理工具(virsh)。简而言之,API为虚拟机管理工具 virsh和virt-manager等提供了程序库支持;Libvirtd守护进程负责监听虚拟机的请求以及对虚拟机进行管理;virsh是 libvirt虚拟机管理的一个功能强大命令行工具,可以实现各种虚拟机管理操作。

    14.3.1.KVM虚拟机管理必知必会

虚拟机的管理其实和物理主机比较类似,无外乎启动,关闭,挂起,查看虚拟机信息和状态,进一步的操作是快照,克隆和迁移,都是libvirt实现的。

◆启动,关闭和重启虚拟机
运行虚拟机可以使用如下命令实现:

virsh start us1804
Domain us1804 started

如果要实现虚拟机自动随宿主主机一同启动,可以使用如下命令:
virsh autostart us1804
Domain us1804 marked as autostarted

这样,下次宿主主机启动后,虚拟机就在自动启动了。使用如下命令要取消虚拟机自动启动:
virsh autostart --disable us1804
Domain us1804 unmarked as autostarted

有开就有关,要关闭虚拟机的话,具体操作如下所示:
virsh shutdown us1804
Domain us1804 is being shutdown

需要注意的是,有时候使用上述命令无法关机(经常会遇到),这就需要强制关闭虚拟机,具体操作如下:

virsh destroy us1804
Domain us1804 destroyed

此操作类似按住计算机电源键强制关机,所以除非必要请谨慎使用尤其是Business环境。重启操作也不能忽视,可以使用如下命令直接重启虚拟机:

virsh reboot us1804
Domain us1804 is being rebooted

◆挂起和恢复
很多情况,需要将虚拟机暂时挂起,具体操作如下:

virsh suspend us1804
Domain us1804 suspended

如果要恢复到挂起前的状态,运行如下命令:

virsh resume us1804
Domain us1804 resumed

为什么挂起和恢复的明明是虚拟机,但返回的信息却是domain呢,这是因为在KVM环境,宿主主机Host称之为node,而将客户机Guest称之为domain。

◆查看状态
由于企业环境大多采用命令行而非图形界面,虚拟机都在后台运行,它们运行状态如何呢?这就需要使用命令来获得虚拟机的详细信息:

virsh list

或:
virsh -c qemu:///system list

其实这两个命令前面已经反复用到了,但它们的信息太简单,可以使用如下命令获得更详细的信息:

virsh dominfo us1804
 Id    Name                           State
----------------------------------------------------
 3     us1804                      running

获得KVM虚拟机的详细信息:

virsh dominfo us1804
Id:             3
Name:           us1804
UUID:           f930d8c4-d52a-4b46-b36e-cdc53f3966f1
OS Type:        hvm
State:          running
CPU(s):         4
CPU time:       422.7s
Max memory:     8388608 KiB
Used memory:    8388608 KiB
Persistent:     yes
Autostart:      disable
Managed save:   no
Security model: selinux
Security DOI:   0
Security label: system_u:system_r:svirt_t:s0:c83,c623 (enforcing)

获得KVM宿主主机的详细信息:

virsh nodeinfo
CPU model:           x86_64
CPU(s):              4
CPU frequency:       2808 MHz
CPU socket(s):       4
Core(s) per socket:  1
Thread(s) per core:  1
NUMA cell(s):        1
Memory size:         16776628 KiB

获得KVM虚拟机CPU的详细信息:

virsh vcpuinfo us1804
VCPU:           0
CPU:            1
State:          running
CPU time:       239.9s
CPU Affinity:   yyyy

VCPU:           1
CPU:            2
State:          running
CPU time:       29.0s
CPU Affinity:   yyyy

VCPU:           2
CPU:            1
State:          running
CPU time:       55.8s
CPU Affinity:   yyyy

VCPU:           3
CPU:            1
State:          running
CPU time:       34.3s
CPU Affinity:   yyyy

获得KVM虚拟机系统的详细信息:

virsh sysinfo |more
<sysinfo type='smbios'>
  <bios>
    <entry name='vendor'>Phoenix Technologies LTD</entry>
    <entry name='version'>6.00</entry>
    <entry name='date'>04/13/2018</entry>
    <entry name='release'>4.6</entry>
  </bios>
  <system>
    <entry name='manufacturer'>VMware, Inc.</entry>
    <entry name='product'>VMware Virtual Platform</entry>
    <entry name='version'>None</entry>
    <entry name='serial'>VMware-56 4d 25 ee d7 e8 8d 6c-57 d3 e6 15 8f 72 1a df</entry>
    <entry name='uuid'>ee254d56-e8d7-6c8d-57d3-e6158f721adf</entry>
    <entry name='sku'>Not Specified</entry>
    <entry name='family'>Not Specified</entry>
  </system>
......

◆彻底删除KVM虚拟机
当不在需要某个虚拟机时,可以运行如下命令将其彻底铲除:
virsh destroy us1804 #强制关机
virsh undefine us1804 #将/etc/libvirt/qemu/下虚拟机定义的XML文件删除

然后去默认的镜像保存目录/var/lib/libvirt/images/或自定地文件夹将该虚拟机的系统镜像彻底删除即可,需要注意的是,如果虚拟机有快照,需要先将快照删除后再进行上述操作才能成功。

    14.3.2.创建虚拟机快照和克隆

使用KVM快照和克隆功能能够极大地提高虚拟机的使用效率,下面就来在命令行中实现KVM快照和克隆的高效功能。

◆创建快照
对虚拟机做快照,保存虚拟机运行时的状态,比如说刚刚安装完系统对干净的系统进行快照,或重要更新前对系统进行快照等,可以在虚拟机损坏或出现故障时快速恢复到正常状态,需要注意的是,有两种KVM的快照,一种是直接基于KVM本身提供的快照功能,但它对于虚拟磁盘格式有要求,必须是QCOW2格式才可以创建快照,如果采用RAW格式,需要转换后才可以创建快照。第二种方式是间接方式,借用逻辑卷管理(LVM)的快照功能对虚拟机进行快照操作,当然其要求保存虚拟磁盘文件存储为LVM格式,由于间接方式虽然能达到快照的效果,但本身和KVM关系不大,这里只给出相关LVM命令而不深入:
sudo lvcreate -s /dev/ubuntu-vg/root -n root_snap -L 8M //假设虚拟磁盘在此分区,快照卷的大小通常是相应逻辑卷的1%-10%,大小不合适会报"...has insufficient free space..."的错误,根据自己的实际情况灵活调整为合适的值并完成LVM快照

相关参数
-s:为指定的逻辑卷创建快照
-n:指定快照名称
-L:指定快照卷大小

运行如下命令检测LVM快照卷创建结果:

sudo lvscan         #确认LVM快照成功

这时发现,逻辑卷组中多出了kvm_vol_snap,说明LVM快照成功。要使用LVM快照卷只需直接使用mount命令挂载即可,具体操作如下:

sudo mount /dev/ubuntu-vg/root_snap /mnt        #挂在即可使用快照卷

需要注意的是,快照卷多了,没用的一定要删除,删除快照卷可以使用如下命令:

sudo lvremove /dev/vg01/root_snap       #删除无用的快照卷
sudo lvscan                                 #再次确认无用的快照卷被删除

下面重点来深入到通过KVM提供的命令为全新的KVM虚拟机us1804创建一个名为initial的快照,以保存其全新状态,具体操作如下:

virsh snapshot-create-as us1804 initial
Domain snapshot initial created

然后使用如下命令查看刚刚创建的快照:

virsh snapshot-list us1804
 Name                 Creation Time             State
------------------------------------------------------------
 initial              2019-10-02 10:30:07 -0400 running

名称为initial的快照创建的时间和状态一目了然。Business可能需要每天为运行正常的系统创建一个快照,具体实现如下:

virsh snapshot-create-as us1804 10022019OK
Domain snapshot 10022019OK created

十分建议在完成虚拟机的安装后立即进行快照,此外,生产环境,可能每天都创建大量快照,如何管理这些快照呢?这就需要使用查看虚拟机镜像快照的版本:

virsh snapshot-list us1804
 Name                 Creation Time             State
------------------------------------------------------------
 10022019OK           2019-10-02 10:31:48 -0400 running
 initial              2019-10-02 10:30:07 -0400 running

对快照操作前务必搞清楚当前快照版本,使用如下命令来查看当前最新的快照版本:

virsh snapshot-current us1804

◆恢复虚拟机快照
最好先确认虚拟机已经处于先关闭状态,然后使用如下命令恢复虚拟机快照到所需状态:

virsh snapshot-revert us1804 initial

◆删除虚拟机快照
工作环境每天会创建大量快照,快照虽然可以很方便地将虚拟机恢复到某个状态,但快照太多会占用大量存储空间并且可能降低虚拟机的I/O性能,这就得不偿失了,所以要定期(如一周)将无用的快照彻底删除,具体操作如下:

virsh snapshot-delete us1804 10022019OK

虚拟环境,除了超级实用的快照功能之外,克隆功能也十分必要,可以节省大量部署系统的时间,所谓克隆就是以已经安装好的虚拟机为蓝本,将其复制并创建为一个全新的虚拟机,由于是直接复制,所以新虚拟机和原虚拟机内容完全相同,需要注意的是,如果源虚拟机网络设置为静态IP地址,需要修改新虚拟机网络设置以避免IP冲突等问题,如果原虚拟机设置为DHCP方式获取IP地址,只要MAC地址不同(通常克隆时会自动创建一个不同的MAC,但为了谨慎,需要使用ifconfig命令对比确认)就不会有麻烦了,下面就以上述虚拟机us1804为蓝本创建一个副本,名为us1804-10022019,关键实现如下:

virsh shutdown us1804       #关闭虚拟机us1804

◆创建克隆us1804
运行如下命令克隆虚拟机:

virt-clone -o us1804 -n us1804-10022019 -f /KVM/sys_images/us1804-10022019.img
WARNING  Setting the graphics device port to autoport, in order to avoid conflicting.
Allocating 'us1804-10022019.img'                                                                                  |  30 GB  00:00:05

Clone 'us1804-10022019' created successfully.

克隆过程中会有文字界面的进度条显示克隆进度。由于虚拟机文件大多比较大,所以复制的时间比较长,并且巨量的I/O操作将消耗大量系统资源,建议此操作在系统负载比较低的凌晨操作。成功克隆后不要急于启动新虚拟机,先要需要修改新虚拟机的VNC端口号,避免与原虚拟机冲突而导致无法连接的问题,具体修改方法如下:

virsh edit us1804-10022019
<graphics type='vnc' port='6002' autoport='no' listen='0.0.0.0'>

需要注意的是,如果autoport='yes'时,port的值为'-1',所以要自己指定端口就一定要改为no。修改后便可以启动全新虚拟机us1804-04132016了,切记要避免IP地址冲突,一定要修改新虚拟机网络配置,并用VNC来进行管理和操作了,详细实现如下:

virsh start us1804-10022019

◆删除快照
如果要删除所克隆的虚拟机,可以使用如下命令:

virsh destroy us1804-10022019
virsh undefine us1804-10022019

这只是删除了该虚拟机的定义文件us1804-10022019.xml,至于虚拟磁盘文件,还需要使用如下命令手动删除:

cd /KVM/sys_images/
rm -rf us1804-10022019.img

成功执行上述命令后所克隆的虚拟机被彻底删除。

本章小结
本章帮助大家掌握可以帮助企业节约大量成本的虚拟化技术-KVM,KVM是Linux内核的一个模块,稍加配置即可将CentOS定制成为一个虚拟化服务器,这样,一台物理服务器的运算资源就得以充分利用,服务器的使用效率也从原先的30%-50%,提高到80%以上,从而为公司节省大量银子,此外,由于KVM基于开源技术,除了在硬件上可以省上一笔之外,在软件的授权费用上也节约不少,诚然,KVM的用户体验稍差,功能也没有VMware vSphere强大,不过依然是中小企业虚拟化技术的首选,而为云计算和虚拟化而生的CentOS 8和KVM的组合对于企业而言就是免费的大餐。

EOF

扩展阅读
基于内核的虚拟机
https://zh.wikipedia.org/wiki/%E5%9F%BA%E4%BA%8E%E5%86%85%E6%A0%B8%E7%9A%84%E8%99%9A%E6%8B%9F%E6%9C%BA

Has KVM Won the OpenStack Hypervisor War? (If you can call it a war!)
https://www.leostream.com/leostream-blog/has-kvm-won-the-openstack-hypervisor-war-if-you-can-call-it-a-war/

How to install KVM on RHEL 8 / CentOS 8
https://computingforgeeks.com/how-to-install-kvm-on-rhel-8/

AWS just announced a move from Xen towards KVM. So what is KVM?
https://medium.com/@dbclin/aws-just-announced-a-move-from-xen-towards-kvm-so-what-is-kvm-2091f123991

How to Install and Configure KVM on RHEL 8
https://www.linuxtechi.com/install-configure-kvm-on-rhel-8/

参考文献
https://www.linux-kvm.org/page/Main_Page
https://www.linux-kvm.org/page/Documents
https://en.wikipedia.org/wiki/Kernel-based_Virtual_Machine
https://en.wikipedia.org/wiki/VMware_ESXi
https://en.wikipedia.org/wiki/VMware
https://linuxconfig.org/how-to-create-and-manage-kvm-virtual-machines-from-cli
https://blog.programster.org/kvm-cheatsheet
https://blog.programster.org/kvm-missing-default-network

图片来源
14-1:https://clearwaterthoughts.files.wordpress.com/2011/05/2-physical-server-rings-and-levels.jpg?w=300&h=245
14-2:https://clearwaterthoughts.files.wordpress.com/2011/05/2-virtual-server-rings-and-levels.jpg
14-4:https://upload.wikimedia.org/wikipedia/commons/e/e1/Hyperviseur.png
14-5:https://www.vmware.com/support/ws4/doc/img/bridged_1.gif
14-6:https://www.vmware.com/support/ws5/doc/img/nat_1_t.png
14-7:https://www.vmware.com/support/ws5/doc/img/host-only_1_t.png

版权声明:
作者:WaterBear
链接:https://l-t.top/2639.html
来源:雷霆运维
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录