KVM 虚拟机在物理主机之间迁移的实现Word文档下载推荐.docx
《KVM 虚拟机在物理主机之间迁移的实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《KVM 虚拟机在物理主机之间迁移的实现Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
动态迁移基于共享存储设备,为的是加速迁移的过程,尽量减少宕机时间。
但是在某些情况下需要进行基于本地存储的虚拟机的动态迁移,这就需要存储块动态迁移技术,简称块迁移。
∙比如某些服务器没有使用SAN存储,而且迁移的频率很小,虚拟机上的服务对迁移时间的要求不严格,则可以使用存储块动态迁移技术;
另一方面,SAN存储的价格比较高,尽管SAN存储能够提高迁移性能和系统的稳定性,对于中小企业仅仅为了加快迁移速度而配置昂贵的SAN存储,性价比不高。
∙在集中式共享外部存储的环境下,基于共享存储的动态迁移技术无疑能够工作得很好。
但是,考虑到目前一些计算机集群并没有采用共享式外存,而是各自独立拥有本地外存的物理主机构成。
基于共享存储的迁移技术在这种场合下受到限制,虚拟机迁移到目的主机后,不能访问其原有的外存设备,或者需要源主机为其外存访问提供支持。
为了拓宽动态迁移技术的应用范围,有必要实现一个包括虚拟机外存迁移在内的全系统动态迁移方案。
使得在采用分散式本地存储的计算机集群环境下,仍然能够利用迁移技术转移虚拟机环境,并且保证迁移过程中虚拟机系统服务的可用性。
图2.本地存储的动态迁移示意图
相比较基于共享存储的动态迁移,数据块动态迁移的需要同时迁移虚拟机磁盘镜像和虚拟机系统内存状态,延长了迁移时间,在迁移性能上打了折扣。
KVM虚拟机的管理工具
准确来说,KVM仅仅是Linux内核的一个模块。
管理和创建完整的KVM虚拟机,需要更多的辅助工具。
∙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的关系。
∙Libvirt、virsh、virt-manager:
尽管QEMU-KVM工具可以创建和管理KVM虚拟机,RedHat为KVM开发了更多的辅助工具,比如libvirt、libguestfs等。
原因是QEMU工具效率不高,不易于使用。
Libvirt是一套提供了多种语言接口的API,为各种虚拟化工具提供一套方便、可靠的编程接口,不仅支持KVM,而且支持Xen等其他虚拟机。
使用libvirt,你只需要通过libvirt提供的函数连接到KVM或Xen宿主机,便可以用同样的命令控制不同的虚拟机了。
Libvirt不仅提供了API,还自带一套基于文本的管理虚拟机的命令——virsh,你可以通过使用virsh命令来使用libvirt的全部功能。
但最终用户更渴望的是图形用户界面,这就是virt-manager。
他是一套用python编写的虚拟机管理图形界面,用户可以通过它直观地操作不同的虚拟机。
Virt-manager就是利用libvirt的API实现的。
以上这些就是Linux系统上KVM虚拟化技术的大致架构了。
本文正是演示了如何使用这些工具实现了KVM虚拟机的迁移操作。
本文的实验环境介绍
本文中的KVM虚拟机软件基于Novell公司的SuseLinuxEnterpriseServer11ServicePack1发行版。
SLES11SP1发布于2010年5月19日,基于Linux内核2.6.32.12,包含了kvm-0.12.3,libvirt-0.7.6,virt-manager-0.8.4,全面支持KVM虚拟机。
本文中的物理服务器和外部共享存储配置如下表:
表1.硬件配置
物理主机
硬件配置
HostOS
HostName
IPAddress
源主机
SourceHost
Xeon(R)E5506x4core
MEM:
10GB
SLES11SP1
vicorty3
192.168.0.73
目的主机
DestinationHost
Xeon(R)E5506x8core
18GB
victory4
192.168.0.74
NFSServer
Pentium(R)Dx2core
2G
server17
192.168.0.17
创建KVM虚拟机
迁移虚拟机之前,我们需要创建虚拟机。
创建虚拟机可以使用QEMU-KVM命令或者通过virt-manager图形化管理工具。
∙QEMU-KVM创建虚拟机镜像文件:
见本文的参考资源“KVM虚拟机在IBMSystemx上应用”。
∙virt-manager创建虚拟机:
参考virt-manager帮助手册。
KVM虚拟机静态迁移
静态迁移由于允许中断虚拟机的运行,所以相对简单。
首先在源主机上关闭虚拟机,然后移动虚拟机的存储镜像和配置文件到目的主机,最后在目的主机上启动虚拟机,恢复服务。
根据虚拟机镜像存储方式的不同,静态迁移的实现方法稍有不同。
虚拟机之间使用共享存储
如果源主机和目的主机都能够访问虚拟机的镜像,则只需要迁移虚拟机配置文件。
比如在本例中的SLES11SP1系统,virt-manager管理的虚拟机配置文件在/etc/libvirt/qemu/”yourvmname.xml”。
拷贝XML配置文件到目的主机的相同目录后,进行适当的修改,比如:
与源主机相关的文件或路径等。
无论你何时在/etc/libvirt/qemu/中修改了虚拟机的XML文件,必须重新运行define命令,以激活新的虚拟机配置文件。
清单1.激活虚拟机配置文件
#virshdefine/etc/libvirt/qemu/”yourvmname.xml”
虚拟机镜像使用本地存储
本地存储是指虚拟机的文件系统建立在本地硬盘上,可以是文件或者磁盘分区。
∙本地文件存储:
如果虚拟机是基于镜像文件,直接从源主机拷贝镜像文件和XML配置文件到目的主机中,然后对XML进行适当的修改并激活。
∙本地磁盘分区:
如果虚拟机使用了磁盘分区(物理分区或者逻辑分区)为存储设备,首先用dump工具把磁盘分区转换成镜像文件再拷贝到目的主机。
在目的主机恢复虚拟机时,把镜像文件恢复到目的主机的磁盘分区中去。
对于虚拟机系统使用了多个磁盘分区的,需要每个分区单独dump成镜像文件。
例如使用“/dev/VolGroup00/lv001”LVM逻辑卷作为存储设备,可以使用下面的命令输出成镜像文件:
清单2.转换逻辑卷为镜像文件
ddif=/dev/VolGroup00/lv001of=lv001.imgbs=1M
保存虚拟机的运行状态
静态迁移虚拟的过程中,虚拟机系统处于关机状态,这样虚拟机关机前的运行状态不会保留。
如果希望保留迁移前的系统状态,并且在迁移后能够恢复,需要对虚拟机做快照备份或者以休眠的方式关闭系统,详细内容和实现方法将在本系列文章的第五部分介绍。
基于共享存储的动态迁移
本文前面“V2V迁移方式的分类”小节中介绍过,跟据虚拟机连接存储方式的不同,动态迁移分为基于共享存储的动态迁移和基于本地存储的存储块迁移。
本小节实现了目前使用最广泛的基于共享存储的动态迁移。
实现这种实时迁移的条件之一就是把虚拟机存储文件存放在公共的存储空间。
因此需要设定一个共享存储空间,让源主机和目的主机都能够连接到共享存储空间上的虚拟媒体文件,包括虚拟磁盘、虚拟光盘和虚拟软盘。
否则,即使迁移完成以后,也会因为无法连接虚拟设备,导致无法启动迁移后的虚拟机。
设置实验环境
动态迁移实际上是把虚拟机的配置封装在一个文件中,然后通过高速网络,把虚拟机配置和内存运行状态从一台物理机迅速传送到另外一台物理机上,期间虚拟机一直保持运行状态。
现有技术条件下,大多虚拟机软件如VMware、Hyper-V、Xen进行动态迁移都需要共享存储的支持。
典型的共享存储包括NFS和SMB/CIFS协议的网络文件系统,或者通过iSCSI连接到SAN网络。
选用哪一种网络文件系统,需要根据具体情况而定。
本文的实验采用了NFS文件系统作为源主机和目的主机之间的共享存储。
图3.共享存储的动态迁移实验配置图
1确保网络连接正确,源主机、目的主机和NFS服务器之间可以互相访问。
1确保源主机和目的主机上的VMM运行正常。
1设置NFS服务器的共享目录。
本文的NFS服务器也安装了SLES11SP1操作系统。
清单3.配置NFS服务
修改/etc/exports文件,添加
/home/image*(rw,sync,no_root_squash)
rw:
可读写的权限;
ro:
只读的权限;
no_root_squash:
登入到NFS主机的用户如果是ROOT用户,他就拥有ROOT权限,此参数很不安全,建议不要使用。
sync:
资料同步写入存储器中。
async:
资料会先暂时存放在内存中,不会直接写入硬盘。
重新启动nfsserver服务
#servicenfsserverrestart
使用virt-manager进行动态迁移
virt-manager是基于libvirt的图像化虚拟机管理软件,请注意不同的发行版上virt-manager的版本可能不同,图形界面和操作方法也可能不同。
本文使用了SLES11SP1发行版上的virt-manager-0.8.4。
首先在源主机和目的主机上添加共享存储。
这里以源主机为例,目的主机做相同的配置。
∙添加NFS存储池到源主机和目的主机的vit-manager中。
点击Editmenu->
HostDetails->
Storagetab。
图4.存储池配置图
∙添加一个新的存储池。
点击左下角的“+”号,弹出一个新的窗口。
输入以下参数:
∙Name:
存储池的名字。
∙Type:
选择netfs:
NetworkExportedDirectory。
因为本文使用了NFS作为共享存储协议。
图5.添加共享存储池
∙点击“Forward”后,输入以下参数:
∙TargetPath:
共享存储在本地的映射目录。
本文中这个目录在源主机和目的主机上必须一致。
∙Format:
选择存储类型。
这里必须是nfs。
∙HostName:
输入共享存储服务器,也就是NFS服务器的IP地址或hostname。
∙SourcePath:
NFS服务器上输出的共享目录。
图6.存储池设置
∙点击”Finish”后,共享存储添加成功。
此时在物理机上查看Linux系统的文件系统列表,可以看到共享存储映射的目录。
源主机上创建基于共享存储的KVM虚拟机。
∙选择共享存储池,点击”NewVolume”创建新的存储卷。
∙输入存储卷参数。
本例为虚拟机创建了大小为10G,格式为qcow2的存储卷。
图7.添加存储卷
∙在这个共享存储卷上创建虚拟机。
本文创建了一个基于Window2008R2系统的虚拟机。
创建虚拟机的具体步骤见本文前面“创建KVM虚拟机“小节。
连接远程物理主机上的VMM。
∙在源主机上打开virt-manager应用程序,连接localhost本机虚拟机列表。
点击File->
AddConnection,弹出添加连接窗口,输入以下各项:
∙Hypervisor:
选择QEMU。
∙Connection:
选择连接方式。
本文选择SSH连接。
∙Hostname:
输入将要连接的主机名或IP地址,这里填写目的主机名victory4。
图8.添加远程VMM连接
∙点击Connect,输入SSH连接的密码后,将显示源主机和目的主机上的虚拟机列表。
图9.管理远程VMM
从源主机动态迁移KVM虚拟机到目的主机。
∙在源主机上启动虚拟机Windwos2008R2。
∙在虚拟机中,开启实时网络服务(用来验证迁移过程中服务的可用性)。
∙开启远程连接服务remoteaccess,在其他主机上远程连接此虚拟机。
∙开启网络实时服务。
例如打开浏览器并且播放一个实时网络视频。
∙准备动态迁移,确保所有的虚拟存储设备此时是共享的,包括ISO和CDROM。
∙在源主机的virt-manager窗口中,右键点击等待迁移的虚拟机,选择“Migrate”。
oNewhost:
选择目的主机的hostname。
oAddress:
填入目的主机的IP地址。
oPortandBandwith:
指定连接目的主机的端口和传输带宽,本文中没有设定,使用默认设置。
∙
图10.虚拟机迁移设置
∙点击“Migrate”和“Yes”开始动态迁移虚拟机。
图11.虚拟机迁移进度
∙动态迁移的时间与网络带宽、物理主机的性能和虚拟机的配置相关。
本实验中的网络连接基于100Mbps的以太网,整个迁移过程大约耗时150秒。
使用RDC(RemoteDesktopConnection)远程连接虚拟机在迁移过程中没有中断;
虚拟机中播放的实时网络视频基本流畅,停顿的时间很短,只有1秒左右。
如果采用1000Mbps的以太网或者光纤网络,迁移时间将会大大减少,而虚拟机服务停顿的时间几乎可以忽略不计。
∙迁移完成后,目的主机的VMM中自动创建了一个同名的Windows2008R2虚拟机,并且继续提供远程连接服务和播放在线视频。
源主机上的虚拟机变为暂停状态,不再提供服务。
至此,动态迁移胜利完成。
基于数据块的动态迁移
从qemu-kvm-0.12.2版本,引入了BlockMigration(块迁移)的特性。
上一小节“基于共享存储的动态迁移”中,为了实现动态迁移,源主机和目的主机需要连接共享存储服务。
有了块迁移技术以后,可以在动态迁移过程中,把虚拟磁盘文件从源主机迁移至目的主机。
QEMU-KVM有了这个特性以后,共享存储不再是动态迁移的必要条件,从而降低了动态迁移的难度,扩大了动态迁移的应用范围。
SLES11SP1集成了kvm-0.12.3,支持块迁移特性。
但是SLES11SP1上的libvirt-0.7.6、virt-manager-0.8.4暂时没有引入块迁移的功能。
所以本文下面的块迁移实验仅基于QEMU-KVM的命令行模式。
块迁移过程中,虚拟机只使用本地存储,因此物理环境非常简单。
只需要源主机和目的主机通过以太网连接,如”图2.本地存储的动态迁移示意图”所示。
QEMU的控制终端和迁移命令
QEMU控制终端的开启,可以在QEMQ-KVM的命令中加参数“-monitor”。
∙-monitorstdio:
输出到文本控制台。
∙-monitorvc:
输出到图形控制台。
∙图形控制台和虚拟机VNC窗口的切换命令是:
oCtrl+Alt+1:
VNCwindow
oCtrl+Alt+2:
monitorconsole
oCtrl+Alt+3:
serial0console
oCtrl+Alt+4:
parallel0console
QEMU-KVM提供了的“-incoming”参数在指定的端口监听迁移数据。
目的主机上需要此参数接收来自源主机的迁移数据。
清单4.迁移相关的QEMU命令
(qemu)helpmigrate
migrate[-d][-b][-i]uri--migratetoURI(using-dtonotwaitforcompletion)
-bformigrationwithoutsharedstoragewithfullcopyofdisk
-iformigrationwithoutsharedstoragewithincrementalcopyofdisk
(baseimagesharedbetweensrcanddestination)
使用QEMU-KVM进行数据块动态迁移
在源主机上创建和启动虚拟机。
在本地磁盘上创建虚拟机镜像文件。
本文创建了大小为10G,qcow2格式的本地镜像文件。
清单5.源主机上创建虚拟机
victory3:
~#qemu-imgcreate-fqcow2/var/lib/kvm/images/sles11.1ga/disk0.qcow210G
在镜像文件上安装虚拟机。
本文在虚拟机中安装了SLES11SP1系统。
清单6.源主机上安装虚拟机
victory3:
~#/usr/bin/qemu-kvm-enable-kvm-m512-smp4-namesles11.1ga
-monitorstdio-bootc-drivefile=/var/lib/kvm/images/sles11.1ga/disk0.qcow2,
if=none,id=drive-virtio-disk0,boot=on-devicevirtio-blk-pci,bus=pci.0,
addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0-drive
file=/media/83/software/Distro/SLES-11-SP1-DVD-x86_64-GM-DVD1.iso,
if=none,media=cdrom,id=drive-ide0-1-0-deviceide-drive,bus=ide.1,
unit=0,drive=drive-ide0-1-0,id=ide0-1-0-devicevirtio-net-pci,vlan=0,
id=net0,mac=52:
54:
00:
13:
08:
96-nettap-vnc127.0.0.1:
3
虚拟机安装完毕后,以下列命令启动虚拟机。
添加了“-monitorstdio”是为了开启文本控制台;
去掉了虚拟光驱中的ISO文件是为了保证迁移时,源主机和目的主机上虚拟设备的一致性。
如果你在目的主机的相同路径下存在相同名字的ISO文件,则可以在迁移时保留ISO文件参数。
清单7.源主机上启动虚拟机
if=none,id=drive-virtio-disk0,boot=on-devicevirtio-blk-pci,bus=pci.0,addr=0x4,
drive=drive-virtio-disk0,id=virtio-disk0-driveif=none,media=cdrom,
id=drive-ide0-1-0-deviceide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,
id=ide0-1-0-devicevirtio-net-pc