(初稿)
********公司
2014年1月20日
KVM虚拟机创建、管理及迁移技术
1 虚拟化技术
虚拟化(Virtualization)技术最早出现在 20 世纪 60 年代的 IBM 大型机系统,在70年代的 System 370 系列中逐渐流行起来,这些机器通过一种叫虚拟机监控器(Virtual Machine Monitor,VMM)的程序在物理硬件之上生成许多可以运行操作系统软件的虚拟机(Virtual Machine)实例。随着近年来多核系统、集群、网格以及云计算的广泛部署,虚拟化技术在商业应用上的优势日益体现,它不仅降低了 IT 成本,而且还增强了系统安全性和可靠性。
虚拟化是一个广义的术语,对于不同的人来说可能意味着不同的东西,这要取决他们所处的环境。在计算机科学领域中,虚拟化通常是指计算元件在虚拟的基础上而不是真实的基础上运行,代表着对计算资源的抽象,是一个为了简化管理、优化资源的解决方案。虚拟化技术可以扩大硬件的容量,简化软件的重新配置过程,可以把有限的固定的资源根据用户的不同需求进行重新规划以达到资源的最大利用率。CPU的虚拟化技术可以单CPU模拟多CPU并行,允许一个平台同时运行多个操作系统,并且应用程序都可以在相互的空间内运行而互不影响,从而显著提高计算机的工作效率。
1.1 服务器虚拟化
服务器虚拟化就是将服务器物理资源抽象成逻辑资源,让一台服务器变成几台甚至上百台相互隔离的虚拟服务器,我们不再受限于物理上的界限,而是让CPU、内存、磁盘、I/O等硬件变成可以动态管理的“资源池”,从而提高资源的利用率,简化系统管理,实现服务器整合,让IT对业务的变化更具适应力。图1中所示为服务器虚拟化及迁移示意图。
图 1 服务器虚拟化及迁移示意图
1.2 虚拟化的分类
虚拟化技术主要分为以下几个大类:
a)平台虚拟化(Platform Virtualization):针对计算机和操作系统的虚拟化;
b)资源虚拟化(Resource Virtualization):针对特定的系统资源的虚拟化,比如CPU、内存、存储、网络资源等;
c)应用程序虚拟化(Application Virtualization),包括仿真、模拟、解释技术等。
我们通常所说的虚拟化主要是指平台虚拟化技术,通过使用控制程序(Control Program,也被称为 Virtual Machine Monitor或Hypervisor)隐藏特定计算平台的实际物理特性,为用户提供抽象的、统一的、模拟的计算环境(称为虚拟机)。 虚拟机中运行的操作系统被称为客户机操作系统(Guest OS),运行虚拟机监控器的操作系统被称为主机操作系统(Host OS),当然某些虚拟机监控器可以脱离操作系统直接运行在硬件之上(如 VMWARE 的 ESX 产品),运行虚拟机的真实系统我们称之为主机系统。
1.3 虚拟机迁移
虚拟机迁移技术为服务器虚拟化提供了便捷的方法。目前流行的虚拟化工具如 VMware,Xen,HyperV,KVM 都提供了各自的迁移组件。迁移服务器可以为用户节省管理资金、维护费用和升级费用。以前的 x86 服务器,体积比较“庞大”;而现在的服务器,体积已经比以前小了许多,迁移技术使得用户可以用一台服务器来同时替代以前的许多台服务器,这样就节省了用户大量的机房空间。
另外,虚拟机中的服务器有着统一的“虚拟硬件资源”,不像以前的服务器有着许多不同的硬件资源(如主板芯片组不同,网卡不同,硬盘,RAID 卡,显卡不同)。迁移后的服务器,不仅可以在一个统一的界面中进行管理,而且通过某些虚拟机软件,如 VMware 提供的高可用性工具,在这些服务器因为各种故障停机时,可以自动切换到网络中另外相同的虚拟服务器中,从而达到不中断业务的目的。总之,虚拟机迁移的优势在于简化系统维护管理、 提高系统负载均衡、优化系统电源管理、增强系统错误容忍度以及增强系统抗毁伤能力。
1.3.1 虚拟机迁移性能指标
一个优秀的迁移工具,目标是最小化整体迁移的时间和停机时间,并且将迁移对于被迁移主机上运行服务的性能造成的影响降至最低。当然,这几个因素互相影响,实施者需要根据迁移针对的应用的需求在其中进行衡量,选用合适的迁移工具。虚拟机迁移的性能指标包括以下三个方面:
a)对应用程序的性能影响:迁移对于被迁移主机上运行服务性能的的影响程度;
b)停机时间:迁移过程中,源主机、目的主机同时不可用的时间;
c)整体迁移时间:从源主机开始迁移到迁移结束的时间。
1.3.2 虚拟机迁移方式
虚拟机迁移有三种方式:P2V(物理机到虚拟机的迁移Physical-to-Virtual),V2V(虚拟机到虚拟机的迁移Virtual-to-Virtual),V2P(虚拟机到物理机的迁移Virtual-to-Physical)。
1.3.2.1 P2V迁移
P2V 指迁移物理服务器上的操作系统及其上的应用软件和数据到 VMM(Virtual Machine Monitor)管理的虚拟服务器中。这种迁移方式,主要是使用各种工具软件,把物理服务器上的系统状态和数据“镜像”到 VMM 提供的虚拟机中,并且在虚拟机中“替换”物理服务器的存储硬件与网卡驱动程序。只要在虚拟服务器中安装好相应的驱动程序并且设置与原来服务器相同的地址 (如 TCP/IP 地址等),在重启虚拟机服务器后,虚拟服务器即可以替代物理服务器进行工作。P2V迁移方式分为热迁移、半自动迁移和手动迁移三种。
随着 P2V 技术的发展,VMware vCenter Converter 和 Microsoft Hyper-V 已经能够提供热迁移功能,避免宕机。目前,P2V 热迁移仅在 Windows 物理服务器可用,未来将添加对 Linux 的支持。
半自动迁移是指利用专业工具辅助 P2V 的迁移,把某些手动环节进行自动化。如利用RedHat 的开源工具 virt-p2v,Microsoft Virtual Server Migration Toolkit 等工具将物理机的磁盘数据转换成虚拟机格式。
手动迁移是指用户手动完成所有迁移操作,需要用户对物理机系统和虚拟机环境非常了解。首先,关闭原有的物理机上的服务和操作系统,并且从其他媒质上启动一个新的系统;再把物理机系统的磁盘做成虚拟机镜像文件,如有多个磁盘则需要做多个镜像,并且拷贝镜像到虚拟主机上;最后,为虚拟机创建虚拟设备,加载镜像文件启动虚拟机,调整系统设置,并开启服务。
1.3.2.2 V2V迁移
V2V 迁移是在虚拟机之间移动操作系统和数据,照顾主机级别的差异和处理不同的虚拟硬件。虚拟机从一个物理机上的 VMM 迁移到另一个物理机的 VMM,这两个 VMM 的类型可以相同,也可以不同,如 VMware 迁移到 KVM, KVM 迁移到 KVM。可以通过多种方式将虚拟机从一个 VM Host 系统移动到另一个 VM Host 系统。V2V迁移方式分为离线迁移、在线迁移两种。
离线迁移(offline migration)也叫做常规迁移、静态迁移。在迁移之前需要将虚拟机暂停,如果使用共享存储,则只拷贝系统状态至目的主机,最后在目的主机重建虚拟机状态, 恢复执行;如果使用本地存储,则需要同时拷贝虚拟机镜像和状态到目的主机。采用这种方式的迁移需要显示地停止虚拟机的运行,从用户角度看,有明确的一段服务不可用的时间,这种迁移方式简单易行,适用于对服务可用性要求不严格的场合。
在线迁移(online migration)也称为实时迁移(live migration),它是指在保证虚拟机上服务正常运行的同时,虚拟机在不同的物理主机之间进行迁移,其逻辑步骤与离线迁移几乎完全一致。不同的是,为了保证迁移过程中虚拟机服务的可用,迁移过程仅有非常短暂的停机时间。迁移的前面阶段,服务在源主机运行,当迁移进行到一定阶段,目的主机已经具备了运行系统的必须资源,经过一个非常短暂的切换,源主机将控制权转移到目的主机,服务在目的主机上继续运行。对于服务本身而言,由于切换的时间非常短暂,用户感觉不到服务的中断,因而迁移过程对用户是透明的,在线迁移适用于对服务可用性要求很高的场景。目前主流的在线迁移工具,如 VMware 的 VMotion、XEN 的 xenMotion、libvirt/virt-manager 图形化工具,都要求物理机之间采用 SAN(storage area network), NAS(network-attached storage)之类的集中式共享外存设备,因而在迁移时只需要考虑操作系统内存执行状态的迁移,从而获得较好的迁移性能。
1.3.2.3 V2P迁移
V2P 指把一个操作系统、应用程序和数据从一个虚拟机中迁移到物理机的主硬盘上,是 P2V 的逆操作,它可以同时迁移虚拟机系统到一台或多台物理机上。尽管虚拟化的基本需求是整合物理机到虚拟机中,但这并不是虚拟化的唯一的应用,比如有时虚拟机上的应用程序的问题需要在物理机上验证,以排除虚拟环境带来的影响。先配置好虚拟机,然后运用硬盘克隆工具如赛门铁克的 Save & Restore (Ghost)复制数据至工作站硬件,最后在物理机上运行。
1.4 KVM虚拟机迁移工具
虚拟机的迁移技术为服务器的虚拟化提供简便的方法,目前流行的虚拟化产品 VMware,Xen,Hyper-V,KVM 都提供各自的迁移工具。其中 Linux 平台上开源的虚拟化工具 KVM 发展迅速,基于 KVM 的虚拟机迁移特性也日趋完善。本文全面介绍如何在Ubuntu 12.04 LTS 系统上安装KVM 虚拟机和所需的开源软件,以及虚拟机静态迁移和动态迁移的特性,最后给出了应用 libvirt/virt-manager 图形化管理工具进行动态迁移的演示结果。
1.4.1 KVM虚拟机管理工具
KVM(Kernel-based Virtual Machine)是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。准确来说,KVM 仅仅是 Linux 内核的一个模块,因此,创建和管理完整的 KVM 虚拟机,需要更多的辅助工具来支撑。
1.4.1.1 QEMU-KVM工具
在Linux系统中,首先我们可以用modprobe系统工具去加载KVM模块,如果用RPM安装KVM软件包,系统会在启动时自动加载模块。只有加载了该模块后,才能进一步通过其他工具创建虚拟机,但仅有KVM 模块是远远不够的,因为用户无法直接控制内核模块去做事情,还必须有一个用户空间的工具。对于KVM的开发者来说,可以选择已经成型的开源虚拟化软件QEMU作为用户空间的工具。QEMU是一个强大的虚拟化软件,它可以虚拟不同的CPU构架,比如说在x86的CPU上虚拟一个Power的CPU,并利用它编译出可运行在 Power 上的程序。KVM 使用了 QEMU 的基于 x86 的部分,并稍加改造,形成可控制 KVM 内核模块的用户空间工具 QEMU-KVM。因此,Linux发行版中分为kernel部分的KVM内核模块和QEMU-KVM工具,这就是 KVM 和 QEMU 的关系。
1.4.1.2 Libvirt工具
尽管 QEMU-KVM 工具可以创建和管理 KVM 虚拟机,但由于QEMU 工具效率不高且不易于使用,RedHat公司 为 KVM 开发了更多的辅助工具,比如 libvirt、libguestfs 等。libvirt 是一套提供了多种语言接口的 API,为各种虚拟化工具提供一套方便、可靠的编程接口,不仅支持 KVM,而且支持 Xen 等其他虚拟机。使用 libvirt,我们只需要通过 libvirt 提供的函数连接到 KVM 或 Xen 宿主机,便可以用同样的命令来控制不同的虚拟机。libvirt 不仅提供了 API,还自带一套基于文本的管理虚拟机的命令—— virsh(虚拟化的交互式终端),我们可以通过使用 virsh 命令来使用 libvirt 的全部功能。
1.4.1.3 Virt-manager工具
随着虚拟化的引入,物理主机得以摆脱单一实例操作系统的禁锢,用户可以通过多个操作系统用作虚拟机来有效地复用我们的主机。但是,一个主机上的操作系统越密集,就越会增加管理需求。这种管理问题的一个解决方案是 Virtual Machine Manager,或称为 virt-manager。
virt-manager由 Red Hat 公司使用 Python 语言开发的虚拟机管理图形界面,用于控制虚拟机的生命周期,包括虚拟机资源配给、网络管理,统计数据收集和报告,以及提供对虚拟机本身的简单图形访问。vvirt-manager 就是利用 libvirt 的 API 实现的,它除了提供对虚拟机的管理功能之外,virt-manager 还通过一个嵌入式虚拟网络计算 (VNC) 客户端查看器为 Guest 虚拟机提供一个完整图形控制台。
virt-manager作为一个应用程序套件,它包括了一组常见的虚拟化管理工具。这些工具在表1中列出,包括虚拟机构造、克隆、映像制作和查看等功能。
表 1 虚拟化管理应用程序
应用程序 | 描述 |
virt-manager | 虚拟机桌面管理工具 |
virt-install | 虚拟机配给工具 |
virt-clone | 虚拟机映像克隆工具 |
virt-image | 从一个XML描述符构造虚拟机 |
virt-viewer | 虚拟机图形控制台 |
virsh | Virsh Guest域的交互式终端 |
图 2 包含 QEMU 的 virt-manager 堆栈的简单示意图
1.4.1.4 NFS工具
NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许一个系统在网络上与他人共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。应用NFS至少有以下两个主要部分:一台服务器和一台(或者更多)客户机,客户机远程访问存放在服务器上的数据。
1. 5 KVM虚拟机软件安装
安装KVM虚拟机所需软件如下:SSH、NFS、Qemu、libvirt、virt-manager。首先,在实验室子网的各台linux计算机的/etc/hosts文件里添加机器名和相应的IP地址,如图3中所示:
图 3 hosts主机列表
可以用# hostname 机器名 命令来修改机器名。
1.5.1 安装SSH
SSH为 Secure Shell的缩写,是建立在应用层和传输层基础上的安全协议,它是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。
在Ubuntu 12.04中安装SSH的命令如下:
# sudo apt-get install ssh
输入以下命令关闭防火墙:
# sudo ufw disabled
1.5.2 安装NFS
NFS的原理是通过网络将远程主机共享的文件系统挂载到本机,Ubuntu 12.04上默认是没有安装NFS服务器的,首先需要安装NFS服务程序:
在Ubuntu 12.04中安装NFS的命令如下:
# sudo apt-get install nfs-kernel-server
安装nfs-kernel-server时,apt会自动安装nfs-common和portmap,这样,宿主机就相当于NFS Server。
打开/etc/exports文件,在末尾加入:
/home/kevin *(rw,sync,no_root_squash)
注:nfs允许挂载的目录及权限在文件/etc/exports中进行定义,各字段含义如下:
/home/kevin:要共享的目录
* :允许所有的网段访问
rw :读写权限
sync:资料同步写入内在和硬盘
no_root_squash:nfs客户端共享目录使用者权限
保存,退出。修改完成之后输入:# exportfs –rv 来使配置文件生效。
重启服务:
#sudo /etc/init.d/portmap restart <---重启portmap
图 4 重新启动portmap服务
#sudo /etc/init.d/nfs-kernel-server restart <---重启nfs服务
图 5 重新启动NFS服务
#showmount -e <---显示本机共享目录
图 6 显示本机共享目录
可以在本机上进行挂载测试:
#sudo mount -t nfs localhost:/var/lib/libvirt/images/nfs_share /nfstest91
注:localhost为本机linux的IP地址
这样就把共享目录挂载到了/nfstest91目录,取消挂载命令为:
#sudo umount /nfstest91
1.5.3 安装qemu
首先,下载开源虚拟化软件qemu的安装包(qemu-1.7.0.tar.bz2),切换到root管理员权限(#sudo -s):
输入命令:#tar -jxvf qemu-1.7.0.tar.bz2 /home/mnclab,将安装文件解压缩到当前目录。
输入命令:#mv qemu-1.7.0 /usr/local/qemu,将解压缩包移动到文件夹目录/usr/local/qemu下。
安装以下依赖软件,其中uml-utilities、bridge-utils用于给kvm搭建网桥。
#sudo apt-get install libzip-dev libsdl1.2-dev uml-utilities dh-autoreconf bridge-utils
cd 进入/usr/local/qemu/qemu-1.7.0目录,输入以下命令完成软件配置:
#./configure --prefix=/usr --localstatedir=/var –sysconfdir=/etc
输入#make 命令完成软件编译,输入#make install 命令完成软件安装。
注意:如果在#configure时提示缺少LIBVIRT_PRIVATE 0.9.8文件,此时需要安装以下软件包:#sudo apt-get install libyajl-dev,此时继续#configure,则可执行成功。
如果在#make编译时提示在/usr/bin目录下缺少aclocal-1.13、automake-1.13、automake、automake-1.9文件,此时需要安装以下软件包:automake-1.13.3-1.1ubuntu2-all.deb,双击该软件包,系统会自动安装,此时继续#make,则可执行成功。
1.5.4 安装libvirt
首先,下载开源虚拟化软件libvirt的安装包(libvirt-1.1.4.tar.gz),切换到root管理员权限(#sudo -s):
输入命令:#tar -zxvf libvirt-1.1.4.tar.gz /home/mnclab,将安装文件解压缩到当前目录。
输入命令:#mv libvirt-1.1.4 /usr/local/qemu,将解压缩包移动到文件夹目录/usr/local/libvirt下。
安装以下依赖软件:
#sudo apt-get install libxml2-dev libgnutls-dev libdevmapper-dev python-dev libnl-dev libpciaccess-dev build-essential
cd 进入/usr/local/libvirt/libvirt-1.1.4目录,输入以下命令完成软件配置:
#./configure --prefix=/usr --localstatedir=/var –sysconfdir=/etc
输入#make 命令完成软件编译,输入#make install 命令完成软件安装。
注意:如果在#configure时提示缺少LIBVIRT_PRIVATE 0.9.8文件,此时需要安装以下软件包:#sudo apt-get install libyajl-dev,此时继续#configure,则可执行成功。
如果在#make编译时提示在/usr/bin目录下缺少aclocal-1.13、automake-1.13、automake、automake-1.9文件,此时需要安装以下软件包:automake-1.13.3-1.1ubuntu2-all.deb,双击该软件包,系统会自动安装,此时继续#make,则可执行成功。
输入#virsh version命令查看软件是否安装成功,安装成功会显示以下版本:
图 7 软件安装成功版本号
1.5.4.1 配置libvirt
libvirt安装成功后,要想启用libvirt来管理本地和远程计算机,还需要修改一些配置文件。
cd进入/etc/libvirt目录,打开qemu.conf文件修改默认的用户名和组名,(qemu.conf文件默认的用户名和组名是nobody),修改用户名:usrer=mnclab,组名:group=libvirt。
输入以下命令新建libvirt用户组:
#groupadd libvirt
输入以下命令将某一用户加入libvirt用户组:
#gpasswd –a usre libvirt
对于通过#gpasswd –a usre libvirt命令加入到libvirt组的任何用户,必须通过以下命令更新用户组,:
#newgrp libvirt
cd进入/etc/libvirt目录,打开libvirtd.conf文件修改默认的组名、端口号及读写权限配置等,如下所示:
●mdsn_adv=0
●unix_sock_group = "libvirt"
●unix_sock_ro_perms = "0777"
●unix_sock_rw_perms = "0770"
●auth_unix_ro = "none"
●auth_unix_rw = "none
配置完成后,输入以下命令重启libvirt-bin服务:
#sudo service libvirt-bin restart
1.5.4.2 配置polkit
polkit工具包是一个应用程序级定义和处理策略,它是一个集中决策过程对无的应用程序授予访问操作的框架。
cd进入/var/lib/polkit-1/localauthority/10-vendor.d目录,打开org.libvirt.unix.
manage.pkla文件,将其中的内容删除,保留空文件。
cd进入/etc/polkit-1/localauthority/50-local.d目录,输入以下命令新建文件:
#sudo touch 50-org.ubuntu-libvirt-remote.access.pkla,该文件名称可以任意确定,但必须以一个2位数字开头,以.pkla后缀结尾。
打开文件并输入以下内容:
●[libvirt Management Access]
●Identity=unix-group:libvirt
●Action=org.libvirt.unix.manage
●ResultAny=yes
●ResultInactive=yes
●ResultActive=yes
如果存在多个组,则输入以下内容:
●[libvirt Management Access]
●Identity=unix-group:group_name1;unix-group:group_name2;unix-group:group_name3
●Action=org.libvirt.unix.manage
●ResultAny=yes
●ResultInactive=yes
●ResultActive=yes
cd进入/etc/polkit-1目录,输入以下命令新建文件夹:
#sudo mkdir rules.d
如果允许一个非root用户在libvirt组中来管理虚拟机,需要创建以下文件。
cd进入/etc/polkit-1/rules.d目录,输入以下命令在rules.d文件夹中新建文件:
#sudo touch 50-org.libvirt.unix.manage.rules
打开文件并输入以下内容:
polkit.addRule(function(action, subject) {
if (action.id == "org.libvirt.unix.manage" &&
subject.isInGroup("libvirt")) {
return polkit.Result.YES;
}
});
以上代码表示:如果某个本地或者远程请求的ID为org.libvirt.unix.manage,并且所在的组为libvirt,则赋予polkit权限。
1.5.4.3 配置bridge桥接网络
虚拟机安装完成后,需要为其设置网络接口,以便虚拟机和主机网络、虚拟机之间的网络通信。事实上,如果要在安装虚拟机时使用网络通信,需要提前设置虚拟机的网络连接方式。
KVM 虚拟机网络连接有以下两种方式:
用户网络(User Networking):让虚拟机访问主机、互联网或本地网络上的资源的简单方法,但是不能从网络或其他的虚拟机访问该虚拟机。这种网络连接方式称为NAT方式,适用于桌面主机的虚拟化。通过NAT网络连接方式,不能实现虚拟机和子网中的任何机器能够互相通信,虚拟机IP与主机IP不在同一子网络中。
虚拟网桥(Virtual Bridge):这种方式要比用户网络复杂,但通过成功设置虚拟网桥,可以让虚拟机与互联网、虚拟机与主机以及虚拟机之间的通信变得很容易。这种网络连接方式称为Bridge方式,适用于服务器主机虚拟化。通过Bridge虚拟网桥的网络连接方式,可以实现虚拟机和子网中的任何机器能够互相通信,使虚拟机成为子网中具有IP地址的主机。
桥接网络(也叫物理设备共享)被用作把一个物理设备复制到一台虚拟机,网桥多用作高级设置,特别是主机多个网络接口的情况。如图8中所示,网桥的基本原理就是在主机网卡上创建一个桥接接口br0,以实现主机物理网卡与虚拟网络接口之间的数据传输。
图 8 在主机中搭建bridge桥接网络示意图
Bridge方式适用于服务器主机虚拟化,其配置方式如下:
编辑修改网络设备脚本文件,增加网桥设备br0
图 9 增加网桥设备端口br0
上述配置新增加了网络设备br0,并将虚拟网卡配置在“192.168.4.*”网段,子网掩码为:255.255.255.0,网关为:192.168.4.253。
编辑修改网络设备脚本文件,修改网卡设备eth0
图 10 修改网卡设备端口eth0
上述配置修改了网卡设备eth0,并指定桥接接口为“br0”,主机网卡硬件地址(MAC地址)为:a4:1f:72:8a:86:fa。
搭建桥接网络成功后重启网络服务
图 11 重启网络服务
重启网络服务后验证桥接接口是否创建成功
图 12 验证桥接接口
从图12中可以看到桥接接口br0已经处于运行状态,桥接的网卡为eth0,虚拟机桥接网络搭建成功。
1.5.5 安装virt-manager
对于 ubuntu,要安装 virt-manager 包可使用以下命令:
#sudo apt-get install virt-manager
apt 命令安装的 virt-manager 应用程序套件使用大约 22MB 的磁盘空间。作为安装的一部分,libvirt 守护程序应在运行。启动libvirt守护进程的命令如下:
#sudo libvirtd -d
要进行验证,可使用以下命令:
#ps aux | grep libvirtd
该命令应显示 libvirtd 进程正在运行,结果如下所示:
图 13 查询libvirtd 守护进程
注:命令#sudo libvirtd -d使用 -d 选项是让 libvirtd 以守护程序的形式运行。libvirtd 作为守护程序,它允许从 virt-manager 应用程序连接到虚拟机管理程序并通过它们连接到它们托管的虚拟机。
要确认 virt-manager 包是否已经安装,以及了解 virt-manager 文件的位置,可使用 which 命令:
#which virt-manager
virt-manager 的位置也是套件中其他应用程序 (virt-install, virt-image等)的主目录,安装成功后,就可以使用 virt-manager 创建虚拟机并进行监视。
1.6 KVM虚拟机迁移实验
1.6.1 实验环境介绍
本次实验共由四台计算机组成,主机操作系统均是ubuntu 12.04,本实验中的物理服务器和外部共享存储硬件配置如下表:
表2 硬件配置
物理主机 | 硬件配置 | 主机操作系统 | 主机名称 | IP地址 |
源主机 | CPU 4核 内存2GB | Linux ubuntu 12.04 LTS | mnclab-liusipei | 192.168.4.91 |
目的主机 | CPU 4核 内存2GB | Linux ubuntu 12.04 LTS | mnclab-lilin | 192.168.4.97 |
目的主机 | CPU 4核 内存2GB | Linux ubuntu 12.04 LTS | mnclab-lenovo3 | 192.168.4.117 |
NFS Server | CPU 4核 内存2GB | Linux ubuntu 12.04 LTS | mnclab-shiyulong | 192.168.4.83 |
静态迁移由于允许中断虚拟机的运行,所以相对简单。首先在源主机上关闭虚拟机,然后移动虚拟机的存储镜像和配置文件到目的主机,最后在目的主机上启动虚拟机,恢复服务。
如果源主机和目的主机都能够访问虚拟机的镜像,则只需要迁移虚拟机配置文件。对于ubuntu12.04系统,virt-manager 管理的虚拟机配置文件保存在 /etc/libvirt/qemu/”your vm name.xml”中。拷贝 XML 配置文件到目的主机的相同目录后,进行适当的修改,比如:与源主机相关的文件或路径等。无论你何时在 /etc/libvirt/qemu/ 中修改了虚拟机的 XML 文件,必须重新运行 define 命令,以激活新的虚拟机配置文件。
#virsh define /etc/libvirt/qemu/”your vm name.xml”
1.6.3 KVM虚拟机动态迁移
动态迁移实际上是把虚拟机的配置封装在一个文件中,然后通过高速网络,把虚拟机配置和内存运行状态从一台物理机迅速传送到另外一台物理机上, 而在这期间虚拟机一直保持运行状态。在现有技术条件下,大多虚拟机软件如 VMware、Hyper-V、Xen 进行动态迁移都需要共享存储的支持。典型的共享存储包括 NFS 和 SMB/CIFS 协议的网络文件系统,或者通过 iSCSI 连接到 SAN 。SAN(Storage Area Network,存储区域网络)是一种高速网络或子网络,提供在计算机与存储系统之间的数据传输。选用哪一种网络文件系统,需要根据具体情况而定,本实验采用了 NFS网络文件系统作为源主机和目的主机之间的共享存储。图8中所示为基于共享存储的动态迁移实验网络配置图。
图 14 基于共享存储的动态迁移实验网络配置图
在配置共享存储网络的过程中需要注意以下情况:
a)确保网络连接正确,源主机、目的主机和 NFS 服务器之间可以互相访问;
b)确保源主机和目的主机上的 VMM 运行正常;
c)设置 NFS 服务器的共享目录,在/etc/exports文件中进行配置,参照1.5.2节。
1.6.3.1 创建共享存储池和存储卷
首先在源主机和目的主机上添加共享存储,这里以源主机为例,目的主机做相同的配置。
添加 NFS 存储池到源主机和目的主机的 vit-manager 中。点击 Edit menu->Host Details->Storage tab。
图 15 服务器端NFS存储目录
添加一个新的存储池。点击左下角的“+”号,弹出一个新的窗口。输入以下参数:
●Name:存储池的名字;
●type:选择 netfs:Network Exported Directory。因为本实验使用了 NFS 作为共享存储协议。
图 16 在源主机上添加共享存储池第一步
点击“Forward”后,输入以下参数:
●Target Path:共享存储在本地的映射目录。本文中这个目录在源主机和目的主机上必须一致;
●Format:选择存储类型。这里必须选择 nfs;
●Host Name:输入共享存储服务器,也就是 NFS 服务器的 IP 地址或 hostname;
●Source Path:NFS 服务器上输出的共享目录。
图 17 在源主机上添加共享存储池第二步
点击“Finish”后,共享存储添加成功。
图 18 创建存储池过程
此时在物理机上查看 Linux 系统的文件系统列表,可以看到共享存储映射的目录nfs_share,如图15中所示。
点击新建卷按钮,即可以在新创建的共享存储池中创建KVM虚拟机存储卷,下图中所示为虚拟机创建了名称为mnclab91,大小为 15G,格式为 raw的虚拟机镜像存储卷。
图 19 新建虚拟机镜像存储卷
接下来在新创建的虚拟机镜像存储卷中创建KVM虚拟机。
1.6.3.2 创建KVM虚拟机
首先,在创建虚拟机之前,输入以下命令查看主机CPU是否支持虚拟化:
#egrep '(vmx|svm)' --color=always /proc/cpuinfo
输出下图中所示结果则表示主机CPU支持虚拟化。
图 20 查看CPU是否支持虚拟化
要开始虚拟机创建过程,使用 sudo 以 root 用户权限启动 virt-manager:
#sudo virt-manager
1)打开 virt-manager 窗口,可通过该窗口连接到本地 QEMU 虚拟机管理程序(通过右键单击 localhost (QEMU),然后单击 Connect 来完成)。如果有更多虚拟机管理程序可用,可以通过 libvirt API 程序来连接。其登陆界面如下所示:
图 21 虚拟机管理器登陆界面
2)当连接到本地 QEMU 虚拟机管理程序时,单击 Create Virtual Machine 图标,这将启动 VM Construction Wizard。
3)将此虚拟机命名为 ubuntu-kvm91,并从本地 ISO镜像来安装虚拟机操作系统。
图 22 新建虚拟机第一步
4)单击 Forward 后,定义虚拟机的安装文件并为操作系统选择一个类型。在本实验中,指定的 ISO 文件是:ubuntu-12.04LTS-amd.iso,从操作系统类型列表中选择 Linux,然后从版本列表中选择 Ubuntu 12.04 LTS (Preclse Pangolin)。
图23 新建虚拟机第二步
5)定义虚拟机的执行环境。为此虚拟机分配 1GB 内存和2个 CPU内核。这些选择需要根据主机的硬件配置来定,内存大小和CPU应适合虚拟机同时也必须满足主机需求。
图 24 新建虚拟机第三步
6)定义虚拟机的存储环境。在本实验中,请求 virt-manager 创建虚拟磁盘,并动态调整它的大小(最高 15 GB)。管理的或者其他现有存储这一选项的含义是:将在现有存储池的存储卷中安装虚拟机,QEMU会给虚拟机分配存储空间。
图 25 新建虚拟机第四步
7)作为最后一步,virt-manager 提供了该虚拟机目前为止的摘要信息,包括:操作系统类型及安装方式、可用CPU内核数目、虚拟机存储空间及位置、虚拟机网络配置(可以选择默认值—NAT方式或者桥接—bridge方式)、虚拟化类型及架构,本实验选择x86-为虚拟机架构。
图 26 新建虚拟机第五步
8)当单击 Finish 时,启动虚拟机的过程就会开始。它首先引导一个 CD-ROM(或操作系统安装映像),这使得虚拟机能够安装该 Linux,当安装完成时,重新启动(这会自动断开 CD-ROM)之后就会看到一个正常运行的虚拟机。
图 27 运行ubuntu 12.04操作系统的虚拟机
9)注意,此窗口只提供了虚拟机的视图,并允许主机与它交互。关闭此窗口后,虚拟机仍会继续在后台运行 (可在 virt-manager 窗口查看到)。
图 28 virt-manager后台监控状态
1.6.3.3 KVM虚拟机动态迁移
动态迁移是指在保证虚拟机上服务正常运行的同时,虚拟机在不同的物理主机之间进行迁移。在迁移的前面阶段,服务在源主机运行,当迁移进行到一定阶段,目的主机已经具备了运行系统的必须资源,此时经过一个非常短暂的切换,源主机将控制权转移到目的主机,服务在目的主机上继续运行。对于服务本身而言,由于切换的时间非常短暂,用户感觉不到服务的中断,因而迁移过程对用户是透明的,在线迁移适用于对服务可用性要求很高的场景。
首先,连接远程物理主机上的虚拟机,这里以源主机为例,目的主机做相同的配置。
在源主机上打开 virt-manager 应用程序,连接 localhost 本机虚拟机列表。点击 File->Add Connection,弹出添加连接窗口,输入以下各项:
●Hypervisor:选择 QEMU;
●Connection:选择连接方式 ,本实验选择 TCP 连接;
●Username:输入将要连接的主机用户名;
●Hostname:输入将要连接的主机名或 IP 地址,这里填写目的主机名 192.1.68.4.117。
图 29 远程连接物理机
首先,连接远程物理主机上的虚拟机,这里以源主机为例,目的主机做相同的配置。
点击 Connect,virt-manager将显示源主机和目的主机上的虚拟机列表,如下图所示:
图 30 管理远程虚拟机
从源主机动态迁移 KVM 虚拟机到目的主机。
●在源主机上启动虚拟机ubuntu-kvm91;
●开启远程连接服务 remote access,在其他主机上远程连接此虚拟机;
●开启网络实时服务,例如打开浏览器并且播放一个实时网络视频;
●准备动态迁移,确保所有的虚拟存储设备此时是共享的,包括 ISO 和 CDROM;
●在源主机的 virt-manager 窗口中,右键点击等待迁移的虚拟机,选择“Migrate ”;
✧Name:被迁移的虚拟机名称;
✧Old host:原始主机的hostname;
✧New host:选择目的主机的 hostname;
✧Address:填入目的主机的 IP 地址;
✧Port and Bandwith:指定连接目的主机的端口和传输带宽,本实验中没有设定,使用默认设置。
图 31 虚拟机迁移设置
点击“Migrate”和“Yes”开始动态迁移虚拟机。
图 32 虚拟机动态迁移
●左上角的图形界面中显示源主机和目的主机中的虚拟机运行状态,左下角的图形界面中显示虚拟机迁移的进度,右下角的图形界面中显示被迁移虚拟机的实时网络视频播放情况;
●动态迁移的时间与网络带宽、物理主机的性能和虚拟机的配置相关。本实验中的网络连接基于 1Gbps 的以太网,根据虚拟机所占的磁盘镜像和动态内存情况,整个迁移过程大约耗时 10-30秒。使用virt-manager远程连接虚拟机在迁移过程中没有中断,虚拟机中播放的实时网络视频基本流畅,停顿的时间很短,只有 1 秒左右;
●迁移完成后,目的主机的 VMM 中自动创建了一个同名的ubuntu-kvm91虚拟机,并且继续提供远程连接服务和在线视频播放。源主机上的虚拟机变为关闭状态,目的主机上虚拟机启用,此时,虚拟机动态迁移成功。下载本文