开源虚拟化——KVM的构建
秦学东
深圳大学图书馆 深圳 518060
摘要

介绍开源虚拟化软件KVM在深圳大学图书馆中的优化以及在实施过程中遇到的问题和解决方法。该结构不但能提升整个虚拟化系统的性能,而且具备在此基础上搭建高可用服务器的优点。

关键词: 开源虚拟化; KVM; 高可用服务器
中图分类号:TP393
The Building of Open Source Virtualization——KVM
Qin Xuedong
Shenzhen University Library, Shenzhen 518060, China
Abstract

This paper introduces the optimization of the open source virtual machine software KVM in Shenzhen University Library,and proposes problems and solutions during this practice. And this structure could not only improve the performance of virtualized systems,but also have the merit to build a highly-availability server.

Keyword: Open source virtualization; Kernel-based virtual machine; High-availability server

硬件资源不能充分利用,以及能源、人力、管理成本的不断上升等一系列问题的出现,使得虚拟化产品应运而生。由于商业虚拟化软件价格高昂,使得很多图书馆无法承担。KVM[ 1]作为一款免费开源的虚拟化软件,无论从性能、架构上都具备极大的优势。本文分析虚拟化应用存在的瓶颈,然后介绍深圳大学图书馆KVM应用中针对每一种瓶颈的优化方法,指出具体实施过程中遇到的问题并提出解决方法。

1 虚拟化应用的瓶颈

虚拟化技术是将一台高性能的物理设备虚拟成在逻辑上独立的多台设备,而这些逻辑上独立的虚拟机用来单独提供不同的应用,这样不仅能增加应用的稳定性,也可以提高硬件资源的利用率。但是由于虚拟机数量不断增多、不同应用和不同数据块的特性差异、不同时间段访问量不同的情况的存在,一些瓶颈也随之产生,主要表现为以下三个方面:

(1)物理服务器:当没有足够的CPU RAM空间的时候,系统将启动向磁盘的交换,消耗更多有限的CPU资源。

(2)存储I/O:每一台虚拟机本身都存放在物理服务器磁盘中,每台虚拟机的每一种业务都是通过数据的形式提供,而读取这些数据要消耗掉大量的I/O。服务提供越多、读写越频繁,对物理服务器出口的要求越高。

(3)网络:在虚拟化应用中,所有虚拟机网络出口最终都是物理设备的网卡。因此每增加一台虚拟机,物理网卡的负荷就会随之增加。

2 KVM的特点

KVM(Kernel-based Virtual Machine)充分利用了Linux Kernel已有的特性,例如新硬件的支持、内存的管理、资源的调度等。在功能上具有其他虚拟化软件所具有的功能,比如实时迁移、界面管理、虚拟机克隆及快照支持等;可以对虚拟机的CPU、内存等进行在线扩容;具有功能强大且丰富的命令行管理方式。

(1)灵活性:由于其开源的特性,即所有接口全部开放,决定了可以对其进行必要的二次开发,以满足不同的应用需求,并且在应用过程中根据需求的变化可随时改变策略。

(2)经济性:用最小的投入满足最大的需求。从图书馆的经费方面考虑,相比商业化软件来说,应用KVM省去了购买软件的经费,但对开发和管理人员的技术需求也相应提高。

(3)管理性:相对于其他虚拟化系统, KVM虚拟机在物理服务器中是以进程的形式存在,也就是说,每一台虚拟机在其宿主机中就是一个进程,避免了由于单台虚拟机占用物理资源过高而使物理服务器瘫痪的可能。

KVM最大的优点是灵活性,部署时可以最大程度地适应现有架构或完全构建一套全新的适合自我架构需求的系统。

3 KVM在深圳大学图书馆的应用

KVM所使用的方法是通过简单地加载内核模块而将 Linux 内核转换为一个系统管理程序。这个内核模块导出了一个名为 /dev/kvm 的设备,它可以启用内核的客户模式(除了传统的内核模式和用户模式)。有了 /dev/kvm 设备,虚拟机(Virtual Machine, VM)使自己的地址空间独立于内核或运行的任何其他 VM 的地址空间。设备树(/dev)中的设备对于所有用户空间进程来说都是通用的。但是每个打开 /dev/kvm 的进程看到的是不同的映射(为了支持 VM 间的隔离)。KVM支持全虚拟化。在 KVM 模型中,每一个虚拟机都是一个由 Linux 调度程序管理的标准进程。KVM 虚拟化原理如图1所示:

KVM由两部分组成:

(1)管理虚拟硬件的设备驱动, 该驱动使用字符串设备/dev/kvm作为管理接口。

(2)模拟PC硬件的用户空间组件, 这是一个稍做修改的Qemu进程[ 2]

3.1 深圳大学图书馆的KVM环境搭建

安装KVM需要Intel VT-x或AMD-V CPU支持虚拟化,运行#egrep′(vmx|svm)′/proc/cpuinfo(见图2),查看CPU是否支持虚拟化(单CPU模拟多CPU并行), vmx代表Intel 处理器, svm代表AMD 处理器,如果输出信息显示vmx或svm关键词则表示此CPU支持虚拟化,并需要在BIOS中打开CPU的虚拟化功能。

图2 验证虚拟化

支持KVM的Linux操作系统内核版本需2.6.20以上。下面介绍深圳大学图书馆基于CentOS5.5[ 3] Linux操作系统中KVM环境安装。该版本系统有两个内核,一个是Xen内核,另一个是带有KVM模块的内核,此内核支持KVM全虚拟化。在操作系统安装完成以后修改/boot/grub/grub.conf(见图3)文件并重启操作系统,系统开始运行带有kvm、kvm_intel模块的内核。

KVM虚拟化应用中必须运行的软件有用户空间模拟器qemu-kvm、桥接客户机网络的工具包bridge-utils。此版本操作系统还带有一个虚拟机监控程序Libvirt[ 4],它是一套开源的支持Linux下主流虚拟化工具的C函数库, 是一个软件集合,这些软件包括一个API库、一个Daemon(Libvirtd)和一个命令行工具virsh(管理和配置虚拟机)、virt-manager(界面工具)。

3.2 物理服务器优化

根据分析可知:物理服务器的瓶颈主要来自于CPU,如何避免这种情况的发生是虚拟化应用的一个关键。有如下两种解决方法:

(1)升级RAM或者CPU一般就可以解决CPU/RAM瓶颈。但是,此方法可能会面临一些限制,例如不能增加超过主板所能支持的更多RAM或者处理速度更快的CPU。

(2)裸设备[ 5]磁盘:裸设备是一种特殊类型的块设备文件,允许以直接访问硬盘的方式访问一个存储设备,而不经过操作系统的高速缓存和缓冲器。根据裸设备的这种特性,可以将虚拟机本身以块的形式安装在裸设备中。KVM支持两种安装方式:图形化安装[ 6]和命令行安装。通过命令行安装虚拟机的方式介绍裸设备在KVM中的使用,如图4所示:

图4 虚拟机安装

图4从CD-ROM安装一台名称为“linux5”,内存为512MB,网络为桥接方式的虚拟机。该虚拟机以Block形式存放在/dev/sdb设备中(注意:在生产环境中--file参数要使用设备的唯一识别地址),未指定的参数采用默认安装方式,通过VNC客户端进入操作系统安装界面。virt-install的其他参数说明参考 virt-install-help。图4中各参数说明如下:

--name 新的虚拟机的名称

--network 网络连接方式

--ram 挂载内存大小

--file 磁盘设备

--cdrom 安装的CDROM的ISO文件

3.3 网络优化

目前,服务器上通常配置的都是1GB速率的网卡,而一台运行有几十台虚拟机的物理服务器,且如果虚拟机是存放在NAS或ISCSI形式的存储中,1GB速率的网卡显然无法满足需求。

Linux操作系统一般都支持双网卡的绑定,通过将两张物理网卡绑定成一张逻辑网卡,实现链路的冗余以及流量的负载。

深圳大学图书馆中,每台物理服务器配置有4块网卡,将每两张网卡进行绑定,形成两张逻辑网卡。配置两张逻辑网卡各作为一个单独的bridge(br0,br1),虚拟机平均分配br0和br1。

在KVM中,还可以对网络进行更深一步的优化, KVM支持三种网卡设备:RTL8139、E1000和半虚拟化VirtIO[ 7]。经过测试,VirtIO设备的性能可以大大接近物理网卡设备的性能。具体的方法是:为虚拟机添加VirtIO半虚拟化网卡设备;在虚拟机中安装半虚拟化驱动。

3.4 I/O优化

每一台运行着的虚拟机本身都存放在物理服务器磁盘中,而事实上合理的做法是将它们存放在挂载在物理服务器下的存储中,这样不仅提高了虚拟机系统文件的安全性,而且也能极大地提高虚拟机操作系统的运行速度。

KVM虚拟机支持的磁盘类型包括IDE、SCSI和VirtIO。深圳大学图书馆采用的是VirtIO方式,此类型磁盘设备可以使虚拟机存储的I/O接近物理磁盘性能。VirtIO必须在虚拟机处于在线状态下添加,它也是实施高可用服务器的必要条件。操作方法如下:

#virsh attach-disk demoname /dev/sd* vd* --附加存储

#virsh detach-disk demoname vd* --删除存储

设备附加成功后,需在虚拟机安装相应的半虚拟化驱动程序。此种方式通过配合其他脚本可以实现高可用虚拟服务器[ 8]。Linux虚拟机挂载VirtIO磁盘需在虚拟机中加载apicphp模块。

4 KVM应用存在的问题
4.1 磁盘设备地址

Linux内核对于磁盘设备的映射取决于三个顺序:磁盘驱动程序的加载;主机PCI插槽的监测;磁盘本身的监测。所以,在出现热插拔某些设备、重启等特殊情况下,实际磁盘在Linux下映射的设备文件可能由于这种“排队”的原因而发生改变,这样会出现虚拟机启动失败的情况,甚至导致数据丢失。为解决此问题,本文提供以下两种解决方法:

(1)UUID—通用唯一识别码

每一个LUN设备在/dev/disk/by-id目录下找到一个固定不变的以scsi开头的UUID标识编码(见图5)。而Linux文件系统的启动加载都是按照UUID来加载的,所以上层不会受到影响。

(2)udev方法

①获得裸设备的WWID。方法如下:

[root@centOS1 ~]#scsi_id -g -s /block/sdc

360022a110002303fe83684d100000046

②创建规则,注意文件名不可随意命名,详情见 man udev。方法如下:

[root@centOS1 ~]#vi /etc/udev/rules.d/20-names.rules

KERNEL=="sd*", BUS=="scsi", PROGRAM=="/sbin/scsi_id -g -u -s %p", RESULT=="360022a110002303fe83684d1 00000046", SYMLINK+="devicename%n"

4.2 物理服务器管理

在虚拟化系统中,一般会为网桥分配一个IP作为管理地址。深圳大学图书馆经过一年的运行发现,在系统运行过程中,总难以避免在访问高峰期对物理服务器进行一些数据操作,比如同步备份、上传下载数据等,而这些操作必定会占用大量的带宽。为了使这些操作不影响虚拟机访问速度,深圳大学图书馆采用“单独网卡+管理地址”的方式进行管理,这样不仅避免了这些数据经过网桥,而且也将业务地址和管理地址进行了分离,增加了网络稳定性。

5 深圳大学图书馆KVM应用结构

图6是深圳大学图书馆经过优化的KVM结构图,物理服务器配置有4张1GB业务网卡、1张管理网卡、1张高可用虚拟服务器心跳网卡[ 8]、2张8GB HBA卡,使用HUAWEI S5600 SAN存储。目前一台物理服务器最多运行有30台虚拟机,分别是视频、电子资源、Web应用等,经过将近一年的运行,物理服务器的CPU使用率平常在3%左右,访问高峰期达到12%左右,网络和存储I/O的使用率基本达到物理设备的85%以上。

图6 KVM优化结构图

6 结 语

本文介绍了深圳大学图书馆中的KVM环境搭建、性能优化和实际所遇问题的解决方案。KVM安装采用CentOS5.5集成的模块,这样配置简单方便,同时保证了系统的稳定性。虚拟机和物理服务器的网络共享使用Bridge方式。每台虚拟机在存储上是以Block的形式单独存放在一个裸设备中,提高了虚拟机操作系统的性能,也极大地提高了虚拟机操作系统的安全性。虚拟机网络和存储采用VirtIO架构,这种架构下的网络和存储设备都非常接近物理设备的性能。

此方案主要的特点是:可以通过结合第三方软件对虚拟机实施高可用,并且同时保留了它本身所具有的一切功能,比如迁移、虚拟机克隆等[ 6]

由于KVM是一款开源的软件,所以其具有灵活的部署与扩展特性。但是, KVM也存在一些不足之处,比如缺少高效的可视化管理平台、缺少技术支持等。随着版本不断的升级,这些不足将会得到一定改善。

The authors have declared that no competing interests exist.

作者已声明无竞争性利益关系。

参考文献
[1] KVM[EB/OL]. [2011-09-21]. http://www.linux-kvm.org/. [本文引用:1]
[2] 郭晋兵, 丛彬彬. KVM 虚拟机在IBM System x上应用[EB/OL]. (2010-09-20). [2011-09-22]. http://www.ibm.com/developerworks/cn/linux/l-cn-kvm/. [本文引用:1]
[3] CentOS[EB/OL]. [2011-09-22]. http://www.centos.org/. [本文引用:1]
[4] Libvirt[EB/OL]. [2011-09-22]. http://www.libvirt.org. [本文引用:1]
[5] Wikipedia. 裸设备[EB/OL]. (2010-10-13). [2011-09-22]. http://zh.wikipedia.org/wiki/%E8%A3%B8%E8%AE%BE%E5%A4%87. [本文引用:1]
[6] Virtualization Guide[EB/OL]. [2011-09-22]. http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5/html/Virtualization/index.html. [本文引用:2]
[7] Virtio-KVM[EB/OL]. [2011-09-22]. http://www.linux-kvm.org/page/Virtio. [本文引用:1]
[8] 秦学东, 陈大庆, 崔晓松. 基于开源虚拟化的高可用服务器架构[J]. 现代图书情报技术, 2011(6): 46-50. [本文引用:2]