KVM虚拟化技术才能在单个服务器硬件平台上运行多个虚拟机(VM)的能力在现在的IT基础构架中实现了了成本、系统管理和灵活性等方面的优势。在单个硬件平台上托管多个虚拟机,可降低硬件开销并帮助最大限度减少基础构架成本,例如煤耗和制热成本。将操作方法不同的系统作为虚拟机整合在一个硬件平台上,可简化通过管理层(例如开源虚拟化库(libvirt))和基于它的工具(例如图形化的虚拟机管理器(VMM))对这种系统的管理工作。虚拟化还提供了现在面向服务的高可用性IT操作中所需的操作灵活性,支持将正在运行的虚拟机从一个数学主机迁移到另一个主机,以满足硬件或化学场所问题的须要,或则通过负载平衡最大限度提升性能,或则应对日渐下降的处理器和显存需求。开源桌面虚拟化应用程序(例如VirtualBox)使用户甚至是大型企业(中大型业务部门或中大型企业)环境才能在单个数学系统上运行多个虚拟机。并且,VirtualBox等虚拟化环境是作为顾客端应用程序在桌面或服务器系统上运行的。企业估算环境须要更接近化学硬件(“裸机”)的高性能、面向服务器的虚拟化环境,支持用少得多的操作系统开支来执行虚拟机。裸机虚拟化机制可更好地管理硬件资源,也可最佳地借助对外置于大多数64位x86和PowerPC处理器中的虚拟化硬件支持。
裸机虚拟化机制使用一个称为虚拟机管理程序的小操作系统,来管理和计划虚拟机以及相关的资源。裸机虚拟机管理程序称为Type1虚拟机管理程序。两种最流行的裸机开源虚拟化技术是KernelVirtualMachine(KVM)和Xen。虽然Xen和KVM各有自己的优点和爱好者,但KVM的流行度和复杂度在不断降低,它如今已成为大多数Linux发行版的推荐默认虚拟化机制。比较KVM和XenXen虚拟化环境在传统上提供了Linux系统上性能最高的开源虚拟化技术。Xen使用一个虚拟机管理程序来管理虚拟机和相关的资源,还支持半虚拟化,这可在"晓得”自己已实现虚拟化的虚拟机中提供更高的性能。Xen提供了一个专门执行资源和虚拟管理与计划的开源虚拟机管理程序。在裸机化学硬件上引导系统时,Xen虚拟机管理程序启动一个称为Domain。或管理域的主虚拟机,该虚拟机提供了对所有在该化学主机上运行的其他虚拟机(称为Domainl至ijDomainN,或则简单地称为XenGuest)的中央虚拟机管理功能。不同于Xen,KVM虚拟化使用Linux内核作为它的虚拟机管理程序。对KVM虚拟化的支持自2.6.20版开始已成为主流Linux内核的默认部份。
使用Linux内核作为虚拟机管理程序是KVM遭到批评的一个主要方面,由于(在默认情况下)Linux内核并不符合Type1虚拟机管理程序的传统定义一“一个小操作系统”。虽然大多数Linux发行版所提供的默认内核的确这么,但可以轻松地配置Linux内核来降低它的编译大小,便于它仅提供作为Type1虚拟机管理程序运行所需的功能和驱动程序。RedHat自己的EnterpriseVirtualization产品仅借助这样一种特殊配置的、相对轻量型的Linux内核来运行。但更重要的是,“小”只是一个相对的词汇,现在具有数GB显存的64位服务器可轻松地提供现代Linux内核所需的几MB空间。KVM赶超Xen成为大多数企业环境首选的开源裸机虚拟化技术,这有多个诱因:KVM支持自2.6.20版开始已手动包含在每位Linux内核中。在Linux内核3.0版之前,将Xen支持集成到Linux内核中须要应用大量的补丁,但这依然未能保证每位可能硬件设备的每位驱动程序都能在Xen环境中正确工作。Xen支持所需的内核源代码补丁仅提供给特定的内核版本,这制止了Xen虚拟化环境借助仅在其他内核版本中可用的新驱动程序、子系统及内核修补和提高。
KVM在Linux内核中的集成使它还能手动借助新Linux内核版本中的任何改进。Xen要求在数学虚拟机服务器上运行一个特殊配置的Linux内核,以用作在该服务器上运行的所有虚拟机的管理域。KVM可在化学服务器上使用在该化学系统上运行的LinuxVM中使用的相同内核。Xen的虚拟机管理程序是一段单独的源代码,它自己的潜在缺陷与它所托管的操作系统中的缺陷无关。由于KVM是Linux内核的一个集成部份,所以只有内核缺陷还能影响它作为KVM虚拟机管理程序的用途。虽然Xen仍可提供比KVM性能更高的裸机虚拟化,但这种性能改进的价值往往比不上KVM虚拟化的简单性和易用性价值。KVM和Xen的常见管理工具作为一种比KVM更成熟的裸机虚拟化技术什么是linux,Xen提供了一组专门的管理命令,最知名的是xm命令行套件。像任何特定于技术的管理命令集一样,xm工具拥有自己的学习曲线物理服务器运行多个linux虚拟机,并且不是所有Linux系统管理员都熟悉它。KVM很大一部份初始管理基础构架承继自QEMU,这是一个已被广泛接受的Linux仿真和虚拟化包,它拥有相当的学习曲线且须要一定的专门知识。虽然任何独创的技术拥有自己的命令集是很自然的,但越来越多的虚拟化技术让Linux供应商开始寻求一个管理插口来运行它们。
RedHat毋庸置疑是第一家小型开源公司,但是它领导了开发libvirt虚拟化应用编程插口(API)的工作,以支持可管理多种虚拟化技术的工具的开发工作。libvirtAPI支持KVM、Xen、LXC容器、OpenVZ、User-modeLinux、VirtualBox、Microsoft®Hyper-V®和许多VMware技术等虚拟化技术。无需将赌注压在单个技术和相关的命令集上,专注于libvirt使系统管理员才能学习一组依赖于该API的命令行和图形化命令并继续使用这种工具,无论底层虚拟化技术有何变化都是这么。类似地,虚拟化工具供应商可直接使用libvirtAPI获得相同的利润。接出来的几节介绍基于libvirt的工具怎么简化KVM虚拟化站点的常见管理任务。那些内容重点介绍了使用virsh和virt-install命令的命令行示例,但所有这种任务都可在图形化的、基于libvirt的VMM(virt-manager)中执行。必须以root用户身分(或通过sudo命令)执行所有那些命令。本文剩下内容中的示例假定您已安装了合适的软件包,使Linux发行版才能支持KVM虚拟化并提供必要的工具。
按照您的Linux平台,所需的包会有所不同。比如,在RedHatEnterpriseLinux(RHEL)系统(或RHEL克隆)上,须要安装Virtualization、VirtualizationClient、VirtualizationPlatform和VirtualizationTools包组。使用储存池一篇介绍怎样创建简单KVM虚拟机的developWorks文章解释了怎样使用一个c盘镜像来安装虚拟机,该镜像是在支持虚拟机的服务器本地的c盘储存中创建的。自动创建每位用作c盘镜像的本地文件,是初步试验虚拟机的一种常见形式,但这些方法很快会显得历时、单调且无法管理。libvirt为虚拟机镜像和文件系统的位置提供了一种便捷的具象,称为储存池。储存池是一个本地目录、本地储存设备(化学设备、逻辑卷或SCSI主机总线适配器[HBA]储存)、网络文件系统(NFS)或块级连网储存,可使用libvirt管理它们,但是可在其中创建和储存一个或多个虚拟机镜像。本地储存很简单,但可能不灵活且不支持企业虚拟化的最关键需求:在虚拟机运行时将其从一个服务器迁移到另一个服务器的能力,这称作为实时迁移(livemigration)。
要轻松地支持实时迁移,虚拟机c盘镜像应坐落一个NFS、块级连网储存或可从多个虚拟机主机使用的HBA储存中。本节中的示例使用virsh命令,它是一个基于libvirt的命令套件,为创建和管理libvirt使用的所有对象一虚拟机(域)、存储卷、存储池、网络、网络插口、设备等提供了各个子命令。默认情况下,基于libvirt的命令使用虚拟化主机上的目录/var/lib/libvirt/images作为初始文件系统目录储存池。可使用virshpool-create-as命令轻松创建一个新的储存池。诸如,下边的命令显示了在创建基于NFS的(netfs)储存池时必须指定的强制性参数:virshpool-create-asNFS-POOLnetfs--source-host192.168.6.238--source-path/data/pool--target/var/lib/libvirt/images/NFS-POOL第一个参数(NFS-POOL)指定新储存池的名称,第二个参数指定所创建的储存池类型。--source-host选项的参数指定了通过NFS导入储存池目录的主机。--source-path选项的参数指定该主机上导入的目录的名称--target选项的参数指定了访问储存池时所使用的本地挂载点。
创建新储存池后,它将在virshpool-list命令的输出中列举。下边的示例显示了默认的储存池和在上一个示例中创建的NFS-POOL池:virshpool-list--all--detailsNameStateAutostartPersistentCapacityAllocationAvailabledefaultrunningyesyes54.89GB47.38GB7.51GBNFS-POOLrunningnono915.42GB522.64GB392.78GB在这个示例输出中,注意新储存池标记为不会手动启动,表明系统重新启动后它不会手动启动,并且它没有持久化,表明在系统重新启动后绝对不会定义它。储存池仅在它们受其XML描述支持时才会持久化,该XML描述坐落目录/etc/libvirt/storage中。XML储存池描述文件名与它们相关联的储存池名称相同,但文件扩充名是.xml。要为自动定义的储存池创建XML描述文件,可使用virshpool-dumpxml命令指定一个池名称,将其XML描述轮询为一个最终参数。此命令写入到标准输出,所以须要将它的输出重定向到合适的文件中。诸如,以下命令将为之前创建的NFS-POOL储存池创建正确的XML描述文件:cd/etc/libvirt/storagevirshpool-dumpxmlNFS-POOL>NFS-POOL.xml虽然将储存池持久化后,该池也不会标记为在重新启动虚拟化主机时手动启动。
可使用virshpool-autostart命令后跟一个储存池名称来将储存池设置为手动启动,如下边的示例所示:virshpool-autostartNFS-POOLPoolNFS-POOLmarkedasautostarted将储存池标记为手动启动,意味着储存池将在虚拟化王机重新启动时可用。在技术上,它意味着/etc/libvirt/storage/autostart目录包含该储存池XML描述的一个符号链接。创建储存池后,可在该池内创建一个或多个虚拟机,如下一节中所述。创建虚拟机本节中的示例借助您在上节中创建的储存池,但使用了virt-install命令,这是一个基于libvirt的命令,从名称可以看出linux怎么读,其设计宗旨是帮助从命令行创建虚拟机。下一个示例virt-install命令创建一个名为RHEL-6.3-LAMP的硬件虚拟机,它的名称表明这个虚拟机正在运行RHEL6.3且用作一个标准的LinuxWeb服务器。默认情况下,在创建新c盘池卷时会使用您的虚拟机名称,所以应仔细选择此名称。虚拟机名称一般遵守一种本地命名约定,它的设计应让您的管理员朋友能轻松辨识每位虚拟机的类型和用途。virt-install--nameRHEL-6.3-LAMP--os-type=linux--os-variant=rhel6--cdrom/mnt/ISO/rhel63-server-x86_64.iso--graphicsvnc--diskpool=NFS-01,format=raw,size=20--ram2048--vcpus=2--networkbridge=br0--hvm--virt-type=kvmvirt-install命令的其他选项表明这个虚拟机将针对Linux和RHEL6Linux发行版而优化(分别是--ostype和--osvariant),将使用ISO镜像/mnt/ISO/rhel63-server-x86_64.iso作为虚拟CD-ROM设备来安装(--cdrom)。
从虚拟CD-ROM驱动器引导时,virt-install命令使用VirtualNetworkComputing(VNC)合同创建一个图形控制台并尝试显示它(--graphics),在其中执行引导和后续安装流程。怎样联接到这个控制台取决于您怎么联接到虚拟化服务器,它是否拥有图形化功能等,因而不属于本文的介绍范畴。--disk选项的参数指定将在从储存池NFS-POOL手动分配的20GB储存中创建虚拟机,这个储存池已在上一节中创建。将以raw镜像格式创建这个虚拟机的c盘镜像,这是一种很容易跨大部份虚拟化和仿真技术移植的简单c盘镜像格式。其他virt-install命令参数的作用是,新虚拟机最初将配置2GB显存(--ram)和两个虚拟CPU(--vcpus),但是它通过集线器br0访问网路(--network)。virt-install命令的最后两个选项优化了虚拟机物理服务器运行多个linux虚拟机,将其用作完全虚拟化的系统(--hvm),并表明KVM是支持新虚拟机的基础虚拟机管理程序(--virt-type)。这两个选项都支持在创建和执行系统安装过程中进行个别优化,但是实际上是在未指定那些选项时的默认值。假如要保留虚拟机安装的命令日志,这么显式指定那些选项是个不错的做法,由于如此做会在日志中保留每位虚拟机的虚拟化环境信息。
您可使用类似的命令创建一个运行其他操作系统的虚拟机,为它使用一个合适的名称并适当地修改--cdrom、--os-type和--os-variant选项的参数。结束语基于Linux的开源虚拟化技术在不停地发展0KVM的易用性和持续发展已帮助它代替了可能更强悍的Xen虚拟化技术,成为开源Linux虚拟化的标准。无论选择哪种虚拟化技术,这些演化都突出了使用标准的、独立于技术的管理命令(例如libvirt虚拟化API所提供的命令)的价值。本文通过示例展示了怎样使用基于libvirt的命令来简化虚拟机的储存分配以及在储存中安装它的过程,但仅触碰了libvirtAPI和基于它的免费命令所提供的许多强悍管理功能的冰山一角。