设置独立的KVM虚拟化
在第二章中,您了解了KVM内部。现在,在本章中,您将学习如何将Linux服务器设置为虚拟化主机。我们正在谈论使用KVM进行虚拟化,并使用libvirt作为虚拟化管理引擎。
KVM支持虚拟化,并为您的服务器或工作站做好准备以托管虚拟机。从技术上讲,KVM是用于具有虚拟化扩展功能的x86架构硬件的一组内核模块。加载后,它将Linux服务器转换为虚拟化服务器(管理程序)。可加载模块是kvm.ko,它提供核心虚拟化功能以及特定于处理器的模块kvm-intel.ko或kvm-amd.ko。
根据https://en.wikipedia.org/wiki/Hypervisor的说法。系统管理程序或虚拟机监视器 (VMM)是创建和运行虚拟机的计算机软件,固件或硬件。
仅加载KVM内核模块来启动虚拟机是不够的。您需要一个仿真器来仿真虚拟机的硬件外围设备。现在该介绍QEMU了。
快速仿真器(QEMU)是一种开源计算机仿真器。该仿真器将帮助您运行旨在在一种体系结构之上运行一种体系结构的操作系统。例如,Qemu可以在x86平台上运行为ARM平台上创建的操作系统;但是,这里有一个陷阱。由于QEMU使用动态转换(一种用于 在主机上执行虚拟机指令的技术),因此VM运行缓慢。
如果QEMU运行缓慢,它如何以接近本机的速度运行快速的基于KVM的虚拟机?KVM开发人员考虑了此问题,并修改了QEMU作为解决方案。修改后的QEMU称为 qemu-kvm,它可以直接与KVM模块进行交互,并且可以直接在CPU上安全地执行来自VM的指令,而无需使用动态转换。简而言之,我们使用qemu-kvm二进制文件来运行基于KVM的虚拟机。
它变得越来越混乱了,对吧?如果qemu-kvm可以运行虚拟机,那么为什么需要使用libvirt。答案很简单,libvirt管理qemu-kvm,而qemu-kvm运行KVM虚拟机。
该QEMU-KVM二进制现在已经过时,所有的代码在现在与合并QEMU系统-x86_64的 二进制文件。为了便于理解,我们使用qemu-kvm。一些Linux发行版仍然带有qemu-kvm。
事不宜迟,让我们看看本章将介绍哪些主题:
• libvirt简介
• libvirt管理工具
• 硬件设置建议
熟悉libvirt
Libvirt是位于最终用户和管理程序之间的一组API库。
可以使用libvirt支持的任何虚拟化技术来构建管理程序。在撰写本文时,libvirt支持以下虚拟机管理程序:
• KVM/QEMU Linux管理程序
• Linux和Solaris主机上的Xen虚拟机管理程序
• LXC Linux容器系统
• OpenVZ Linux容器系统
• 用户模式Linux半虚拟化内核
• VirtualBox虚拟机管理程序
• VMware ESX和GSX虚拟机管理程序
• VMware Workstation和Player虚拟机管理程序
• Microsoft Hyper-V管理程序
• IBM PowerVM虚拟机管理程序
• Parallels虚拟机管理程序
• Bhyve管理程序
libvirt充当一个透明层,从用户那里接收命令,根据基础虚拟化技术对其进行修改,然后在虚拟机管理程序上执行它们。这意味着,如果您知道如何使用基于libvirt的管理工具,则应该能够管理前面的虚拟机管理程序集,而无需单独了解它们。您可以选择任何虚拟化管理技术。他们都使用libvirt作为他们的后端基础架构管理层,即使前端工具看起来有所不同。例如oVirt,Red Hat Enterprise Virtualization(RHEV),OpenStack,Eucalyptus等。本书全部关于KVM libvirt及其工具。
在下图中,我们将总结所有事物的连接方式:
Libvirt将考虑存储,网络和虚拟硬件要求,以启动虚拟机以及VM生命周期管理。
这是使用libvirt启动VM的容易程度。在这里,我们使用 virsh启动一个名为TestVM的VM 。# virsh start TestVM
virsh 是与libvirt服务交互的前端命令行,而 virt-manager 是其GUI前端。稍后,您将在书中进一步了解这些工具。
在后端,您可以看到libvirt 通过一系列选项启动了qemu进程 :
# qemu-system-x86_64 -machine accel=kvm -name TestVM -S -machine pc-i440fx-1.6,accel=kvm,usb=off -m 4000 -realtime mlock=off -smp
2,sockets=2,cores=1,threads=1 -uuid 39ac4786-1eca-1092-034c-edb6f93d291c -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/TestVM.monitor,server,nowait -mon chardev=charmonitor,id=mo nitor,mode=control -rtc base=utc -no-shutdown -device piix3-usb-uhci,id= usb,bus=pci.0,addr=0x1.0x2 -drive file=/dev/vms/TestVM,if=none,id=drivevirtio-disk0,format=raw,cache=none,aio=native -device virtio-blk-pc i,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtiodisk0,bootindex=2 -netdev tap,fd=27,id=hostnet0,vhost=on,vhostfd=28 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:a5:cd:61,bu s=pci.0,addr=0x3,bootindex=1 -chardev pty,id=charserial0 -device isa-se rial,chardev=charserial0,id=serial0 -device usb-tablet,id=input0 -vnc 127.0.0.1:2 -device cirrus-vga,id=video0,bus=pci.0,addr=0x2 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5
在介绍libvirt时,我们故意避免提及libvirt的许多功能。这样做是为了使概念更清晰,并专注于libvirt的关键功能。当您浏览各章时,将向您介绍这些功能。
现在,您已经熟悉了使用基于KVM的虚拟化所需的关键组件。在学习如何设置环境之前,我们应该 先看一下系统要求。
主机系统要求
虚拟机需要分配一定数量的CPU,内存和存储。这意味着您计划在该特定主机上运行的虚拟机的数量决定了KVM虚拟机管理程序的硬件要求。
让我们从最低要求开始,在KVM上启动两个简单的虚拟机,每个虚拟机具有756 MB的RAM:
• 具有虚拟化扩展功能的Intel或AMD 64位CPU,适用于Intel的VT-x和适用于AMD的AMD-V。
• 2 GB RAM。
• 安装Linux OS后,KVM虚拟机管理程序上有8 GB的可用磁盘空间。
• 100 Mbps网络。
对于本书中的示例,我们正在使用Fedora21。但是,您可以*使用任何具有KVM和libvirt支持的Linux发行版(Ubuntu,Debian,CentOS等)。我们假设您已经使用所有基本配置(包括网络连接)安装了Linux或Linux发行版。
为您的环境确定正确的系统要求
这是一个非常重要的阶段,我们需要正确处理。拥有正确的系统配置是从虚拟机获得类似本机性能的关键。让我们从CPU开始。
物理CPU
具有虚拟化扩展功能的Intel或AMD 64位CPU,适用于Intel的VT-x和适用于AMD的AMD-V。
要确定您的CPU是否支持虚拟化扩展,可以检查以下标志:
# grep --color -Ew 'svm|vmx|lm' /proc/cpuinfo
所述svm标志意味着CPU有AMD-V ,vmx标志意味着CPU具有VT-X ,和lm是指64位的支持。
如果您的CPU支持虚拟化扩展,则您的系统可能已准备好托管KVM虚拟机。您还将注意到,无需其他配置即可自动加载适当的KVM模块。要验证是否已加载模块,请使用以下命令:
# lsmod | grep kvm
如果系统是AMD,则将看到kvm_amd而不是kvm_intel。
如果看不到前面的CPU标志,或者未加载所有KVM模块,但是确定系统支持虚拟化扩展,请尝试以下故障排除步骤:
1. 重新启动系统,然后进入BIOS。
2. 转到CPU的高级选项。启用英特尔虚拟化技术 或虚拟化扩展。对于AMD,默认情况下应启用它。确切的单词可能会有所不同,具体取决于您的BIOS。
3. 重新启动机器。
4. 现在,您应该看到已加载KVM模块。如果仍然看不到它们已加载,请尝试手动加载它们。
# modprobe kvm kvm_intel 或 modprobe kvm kvm_amd
5. 如果您能够手动加载它们,但是它们仍然不起作用,那么是时候让您的硬件供应商参与进来了,或者在相应的Intel或AMD产品页面上仔细检查处理器详细信息。
除了虚拟化扩展,您可能需要在BIOS中启用Intel VT-d或AMD IOMMU(AMD-Vi)。这些是将PCI设备直接分配给虚拟机所必需的,例如,将虚拟机管理程序中的物理网络接口卡(NIC)分配给虚拟机;我们将在接下来的章节中详细介绍这一点。
CPU核心
如果计划运行服务器级虚拟机,则 建议每个vCPU 一个内核。在计算内核时,请勿计算 英特尔CPU上的超线程内核,而仅计算实际内核。当然,您可以过量使用可用的vCPU数量,而不是实际使用的内核数量,但这会降低性能。
如果您打算运行台式机级虚拟机或CPU占用较少的虚拟机,则可以放心使用CPU,因为性能在这里处于次要位置,并且每个虚拟机管理程序对VM密度的优先级更改要比性能更多。
过量使用意味着分配的虚拟资源比可用的物理资源更多。
对于可以在虚拟机管理程序上运行的VM数量没有明确的定义。这完全取决于虚拟机内部的工作负载类型以及可承受的性能下降幅度。如果所有VM都运行CPU密集型任务,那么过量使用vCPU是个坏主意。
使用lscpu 命令查看您的CPU拓扑。
物理内存
您可以使用一个简单的经验法则来确定物理节点所需的内存量:将您计划分配给虚拟机的所有内存加起来,并为管理程序本身添加额外的2 GB RAM。
如果您计划运行内存密集型工作负载,则这是预期的配置。
与CPU类似,KVM也支持内存过量使用。这意味着您可以为虚拟机分配比虚拟机管理程序实际更多的内存,而存在内存不足的风险。通常,这种类型的分配是针对桌面类虚拟机或测试虚拟机完成的。
您可以使用以下公式来查找 虚拟机有多少可用RAM :
• 对于内存最大为64 GB的系统:
RAM-2 GB =虚拟机可用的RAM量,以GB为单位
• 对于内存超过64 GB的系统:
RAM-(2 GiB + .5 *(RAM/64))=虚拟机可用的RAM量,以GB为单位
我们将在添加到虚拟机管理程序的每64 GB中添加500 MiB +强制2 GB。使用此公式可以大致了解虚拟机可用的内存量。在某些工作负载中,即使我们的公式表明您可能需要为具有1 TB RAM的系统上的虚拟机管理程序软件保留10 GB的空间,虚拟机管理程序也可能不需要超过5 GB的RAM空间。
存储
在考虑虚拟机管理程序的存储空间时,您需要考虑操作系统安装,SWAP和虚拟机磁盘使用情况所需的空间。
建议多少SWAP空间?
确定所需的理想SWAP空间量有点复杂。如果您不打算进行任何内存过量使用,则可以对oVirt节点使用以下建议,oVirt节点是专用于运行 VM的KVM虚拟机管理程序:
• 2 GB的交换空间,用于具有4 GB或更少RAM的系统
• 4 GB的交换空间,用于具有4 GB到16 GB RAM的系统
• 8 GB交换空间, 用于具有16 GB到64 GB RAM的系统
• 16 GB的交换空间, 用于具有64 GB到256 GB RAM的系统
如果计划进行内存过量使用,则需要添加其他交换空间。如果过量使用率为.5(即比可用物理RAM高出50%),则需要使用以下公式确定 SWAP空间:
(RAM x 0.5)+ OS的SWAP =过量使用所需的SWAP空间
例如,如果您的系统具有32 GB的RAM,并且您打算使用.5过量使用比率,则所需的SWAP空间为(32 * .5)+ 8 = 24 GB。
虚拟磁盘可以作为文件存储在本地文件系统存储(ext3,ext4,xfs等)或共享文件存储(NFS,GlusterFS等)中。也可以从块设备(例如LVM,本地分区磁盘,iSCSI磁盘,光纤通道,FCoE等)创建虚拟磁盘。简而言之,您应该能够将虚拟机管理程序看到的任何块设备连接到VM。正如您现在已经猜到的,该空间取决于VM需要多少磁盘空间或其中安装的应用程序。在存储中,您也可以执行过量使用的方式,类似于我们在CPU和内存方面的解释,但是对于执行大量I/O操作的虚拟机,不建议这样做。过量使用的虚拟磁盘称为精简配置磁盘。
有关CPU,内存和存储过量使用的进一步说明将在后面介绍虚拟机性能调整的章节中给出。
网络
建议使用一个带宽至少为1 GBps的NIC,以使 网络平稳运行,但同样,它完全取决于您如何配置 虚拟网络基础结构以及网络要求如何根据 各种情况而变化。
建议使用Linux绑定技术将多个网络接口绑定到一个通道中,并在其之上构建虚拟机网络基础结构。这将有助于增加带宽并提供冗余。
有几种绑定模式,但并非所有模式都支持构建虚拟网络基础结构。仅支持模式1(主动备份),模式2(异或),模式4(802.3ad/LACP)和模式5(balance-tlb)。其余的粘合模式不合适。强烈建议您在模式1和模式4中保持稳定。
搭建环境
本节将指导您完成安装虚拟化软件包的过程,从libvirt服务开始,并验证系统已准备就绪,可以使用KVM虚拟化技术托管虚拟机。
我们假设您已经准备好了Linux系统,该系统已加载图形用户界面并可以通过Internet连接访问默认的Fedora yum存储库,通过该默认存储库可以下载所需的KVM虚拟化软件包。我们还假定在服务器的BIOS中启用了虚拟化技术(VT)功能。
要验证系统上是否启用了默认的yum存储库,请使用yum repolist命令。此命令列出了系统上定义的yum存储库:
在输出中查找名为Linux-X86-64的存储库。您可以在这里找到对所有KVM虚拟化软件包的访问。
安装虚拟化软件包
这是将Linux服务器或工作站系统 转换为虚拟化主机的第一步。实际上,这是一件非常容易的事情。作为root用户,您只需要执行yum install <packages>命令,其中<packages>是用空格分隔的软件包名称列表。
在Linux系统上设置虚拟化环境所需的最低软件包为libvirt,qemu-kvm和virt-manager。
因此,您应该使用以下yum命令:
# yum install qemu-kvm libvirt virt-install virt-manager virt-install -y
与前面的软件包一起安装了许多依赖软件包,但是您不必担心它们是什么或记住它们的名称,yum命令将自动检测依赖关系并为您解决。
该百胜groupinstall方法也可用于安装用于设置KVM虚拟化环境所必需的和可选包:
# yum groupinstall "virtualization" -y
它将安装guestfs-browser,libguestfs-tools,python-libguestfs,virttop软件包以及核心组件,例如libvirt和qemu-kvm。
这是yum groupinfo“虚拟化”的输出,供您参考:
# yum groupinfo "virtualization"
Group: Virtualization
Group-Id: virtualization Description: These packages provide a virtualization environment.
Mandatory Packages:
+virt-install Default Packages: libvirt-daemon-config-network libvirt-daemon-kvm qemu-kvm +virt-manager
+virt-viewer Optional Packages: guestfs-browser libguestfs-tools python-libguestfs virt-top
目前,我们建议您使用yum install命令仅安装核心软件包,以免造成混淆。在后面的章节中,将通过示例和安装步骤彻底解释可用于KVM虚拟化的可选实用程序。
启动libvirt服务
安装KVM虚拟化软件包后,您应该做的第一件事是启动libvirt服务。一旦启动libvirt服务,它将暴露出丰富的
应用程序可编程接口(API)与qemu-kvm二进制文件进行交互。诸如virsh和virt-manager之类的客户端使用此API与qemu-kvm进行对话,以进行虚拟机生命周期管理。要启用和启动服务,请运行以下命令:
# systemctl enable libvirtd && systemctl start libvirtd
使用libvirtd --version命令找出正在使用的libvirt版本。
验证并了解您系统的虚拟化功能
在创建虚拟机之前,非常重要的一点是验证系统并确保它满足成为KVM虚拟主机的所有先决条件,并了解其虚拟功能是什么。
了解此信息将帮助您计划可以在系统上托管的虚拟机的数量及其配置。有两个重要的命令可帮助验证KVM的系统配置。让我们从virt-host-validate开始:
• virt-host-validate:以root用户身份执行此命令将对KVM功能执行完整性检查,以验证是否已将主机配置为使用KVM虚拟化运行libvirt虚拟机管理程序驱动程序的适当方式。
例如:TestSys1具有KVM虚拟化所需的所有必需软件包,但缺少硬件虚拟化支持。在这种情况下,它将打印出以下内容:
[email protected]'TestSys1 ~]#virt-host-validate
QEMU:检查硬件虚拟化 :警告(仅提供可用的仿真CPU,性能将受到极大限制)QEMU:检查设备/dev/vhost-net :通过
QEMU:检查设备/dev/net/tun :通过
LXC:检查Linux> = 2.6.26 :通过
• 此输出清楚地表明,系统上未启用硬件虚拟化,仅存在“ qemu”支持,与qemu-kvm相比,这非常慢。
硬件虚拟化支持可帮助KVM(qemu-kvm)虚拟机直接访问物理CPU,并使其达到接近本机的性能。独立的qemu不提供硬件支持。
现在,让我们看看在执行virt-host-validate命令验证KVM虚拟化系统时还检查了哪些其他参数:
• /dev/kvm:KVM驱动程序在主机上创建/dev/kvm字符设备, 以促进对虚拟机的直接硬件访问。没有 此设备意味着,尽管在BIOS中启用了虚拟机,但虚拟机将无法访问物理硬件,这将大大降低虚拟机的性能。
• /dev/vhost-net:vhost-net驱动程序在主机上创建/dev/vhost-net字符设备。此字符设备用作配置vhost-net实例的接口。没有此设备会大大降低虚拟机的网络性能。
• /dev/net/tun:这是另一个字符专用设备,用于创建tun/tap设备,以促进虚拟机的网络连接。在以后的章节中将对tun/tap设备进行详细说明。现在,只需了解拥有角色设备对于KVM虚拟化正常工作很重要。
在系统上创建虚拟机之前,请始终确保virt-host-validate通过所有完整性检查。您将在验证所有参数的系统上看到以下输出:
[[email protected] ~]# virt-host-validate
QEMU:检查硬件虚拟化 :通过
QEMU:检查设备/dev/kvm :通过
QEMU:检查设备/dev/vhost-net :通过
QEMU:检查设备/dev/net/tun :通过
LXC:检查Linux> = 2.6.26 :通过
[root @ kvmHOST〜]#
第二个命令是virsh。virsh(虚拟化外壳程序)是一个命令行界面,用于管理Linux系统上的VM和虚拟机管理程序。它使用libvirt管理API,并且可以替代图形化的virt-manager和基于Web的泡菜项目。该的virsh命令下各种分类隔离。以下是virsh命令的一些重要分类:
• 客户机管理命令(例如start,stop)
• 客户机监视命令(例如memstat,cpustat)
• 主机和虚拟机监控程序命令(例如功能,nodeinfo)
• 虚拟网络命令(例如net-list,net-define)
• 存储管理命令(例如pool-list,pool-define)
• 快照命令(create-snapshot-as)
要了解有关virsh的更多信息,建议您阅读virsh的主页。virsh是一个非常有据可查的命令。
#man virsh来访问virsh命令的手册页。
在本章中引入virsh命令的原因是因为virsh可以显示有关主机功能的许多信息,例如主机CPU拓扑,可用于虚拟机的内存等。让我们看一下virsh nodeinfo命令的输出,它将为我们提供物理节点的系统资源信息:#virsh nodeinfo
CPU型号: x86_64
CPU: 4
CPU频率: 2534 MHz
CPU插槽: 1
每个插槽的核心数: 2
每个核心线程数: 2
NUMA个单元: 1个
内存大小: 7967796 KiB
您必须是root用户才能运行virsh命令。
在virsh nodeinfo输出中,您可以看到系统硬件体系结构, CPU拓扑,内存大小等。显然,也可以使用标准Linux命令来收集相同的信息,但是您将必须运行多个命令。从硬件资源的意义上讲,您可以使用此信息来确定这是否适合创建适合您的虚拟机的主机。
另一个重要的命令是#virsh domcapabilities。所述的virsh domcapabilities命令显示描述相对于所述主机和libvirt的版本QEMU的KVM的能力的XML文档。了解仿真器的功能非常有用。它将帮助您确定可与虚拟机一起使用的虚拟磁盘的类型,可分配的vCPU的最大数量,等等。
硬件配置实例
让我们看一些常见的硬件配置;virsh命令的domcapabilities选项将显示主机功能。您可以解析输出以找到可以提供给虚拟机的特定硬件配置的确切支持值。以下是可以提供给VM 的最大vcpu :
[[email protected] ~]# virsh domcapabilities | grep -i max
<vcpu max='255'/>
[[email protected] ~]#
根据输出,在此主机上最多可以为 虚拟机定义255个vcpus :
[[email protected] ~]# virsh domcapabilities | grep diskDevice -A 5
<enum name='diskDevice'>
<value>disk</value>
<value>cdrom</value>
<value>floppy</value>
<value>lun</value>
</enum>
[[email protected] ~]#
根据输出,disk,cdrom,floppy和lun类型的设备可以与此主机上的虚拟机一起使用。
此命令公开了许多物理节点的管理程序功能。解释所有这些功能超出了本书的范围,因此您可能想尝试在自己的环境中运行此命令以查看其报告。另外,最好将其链接到确定的在线资源。因此, 我们建议您在系统上运行命令并了解其功能。
除libvirt和qemu-kvm软件包外,我们还在系统上安装了virt-manager软件包。如前所述,virt-manager是用于 管理本地或远程管理程序的GUI工具。现在,在完成本章之前,我们只想向您展示如何启动virt-manager并将其连接到本地KVM虚拟机管理程序:
1. 首先,确保libvirtd服务处于运行状态,并且virt-hostvalidate命令通过了所有检查。
2. 然后,从菜单 | 导航到应用程序。系统 工具 | 然后单击“ 虚拟 机 管理器”。
3. 单击virt-manager后, 应打开连接到本地管理程序(qemu-kvm)的Virtual Machine Manager图形工具,如以下屏幕快照所示:
4. 如果无法搜索并连接到本地虚拟机管理程序,请单击“ 文件”菜单,然后打开“ 添加连接”对话框并填写连接详细信息:
应该从下拉列表中将前面的管理程序项设置为QEMU/KVM,然后可以单击Connect。而已; 它将通过libvirt将virt-manager连接到本地qemu-kvm虚拟机管理程序。如果要连接到远程管理程序,请选中“ 连接到远程主机”并填写详细信息。
如果您的virt-manager已成功连接到本地KVM虚拟机管理程序,则可以创建虚拟机了。如果连接失败,请检查/user-home /。cache/virt-manager/virt-manager.log日志文件。
摘要
在本章中,我们了解了KVM虚拟化以及libvirt管理工具。我们还了解了与KVM和libvirt相关的各种工具,以及使您的系统平稳运行的示例硬件配置。
在下一章中,您将通过示例了解有关virsh命令及其语法的更多信息。您还将学习如何使用virt-manager创建虚拟机。它还将更详细地说明virt-manager和virsh命令 ,并提供有关如何创建虚拟机的示例。