虚拟机的迁移技术为服务器的虚拟化提供简便的方法。目前流行的虚拟化产品 VMware,Xen,Hyper-V,KVM 都提供各自的迁移工具。其中 Linux 平台上开源的虚拟化工具 KVM 发展迅速,基于 KVM 的虚拟机的迁移特性也日趋完善。本文全面介绍 KVM 虚拟机在不同的应用环境下的静态迁移(离线迁移)和动态迁移(在线迁移),并且在最新发布的 Suse Linux Enterprise Edition 11 SP1 上分别演示如何应用 libvirt/virt-manager 图形化工具和基于命令行的 qemu-kvm 工具进行迁移操作。
V2V 虚拟机的迁移是指在 VMM(Virtual Machine Monitor)上运行的虚拟机系统,能够被转移到其他物理主机上的 VMM 上运行。VMM 对硬件资源进行抽象和隔离,屏蔽了底层硬件细节。而迁移技术的出现,使得操作系统能在不同的主机之间动态的转移,进一步解除软,硬件资源之间的相关性。本系列的第一篇文章“虚拟机迁移技术漫谈”中,介绍了 V2V 迁移的三种方式,本文将更加详细的说明三种方式的不同和实现方法。
静态迁移
静态迁移:也叫做常规迁移、离线迁移(Offline Migration)。就是在虚拟机关机或暂停的情况下从一台物理机迁移到另一台物理机。因为虚拟机的文件系统建立在虚拟机镜像上面,所以在虚拟机关机的情况下,只需要简单的迁移虚拟机镜像和相应的配置文件到另外一台物理主机上;如果需要保存虚拟机迁移之前的状态,在迁移之前将虚拟机暂停,然后拷
贝状态至目的主机,最后在目的主机重建虚拟机状态,恢复执行。这种方式的迁移过程需要显式的停止虚拟机的运行。从用户角度看,有明确的一段停机时间,虚拟机上的服务不可用。这种迁移方式简单易行,适用于对服务可用性要求不严格的场合。
共享存储的动态迁移
动态迁移(Live Migration):也叫在线迁移(Online Migration)。就是在保证虚拟机上服务正常运行的同时,将一个虚拟机系统从一个物理主机移动到另一个物理主机的过程。该过程不会对最终用户造成明显的影响,从而使得管理员能够在不影响用户正常使用的情况下,对物理服务器进行离线维修或者升级。与静态迁移不同的是,为了保证迁移过程中虚拟机服务的可用,迁移过程仅有非常短暂的停机时间。迁移的前面阶段,服务在源主机的虚拟机上运行,当迁移进行到一定阶段,目的主机已经具备了运行虚拟机系统的必须资源,经过一个非常短暂的切换,源主机将控制权转移到目的主机,虚拟机系统在目的主机上继续运行。对于虚拟机服务本身而言,由于切换的时间非常短暂,用户感觉不到服务的中断,因而迁移过程对用户是透明的。动态迁移适用于对虚拟机服务可用性要求很高的场合。
目前主流的动态迁移工具,VMware 的 VMotion,Citrix 的 XenMotion,他们都依赖于物理机之间采用 SAN(storage area network)或 NAS(network-attached storage)之类的集中式共享外存设备,因而在迁移时只需要进行虚拟机系统内存执行状态的迁移,从而获得较好的迁移性能。
如图 1 中所示的动态迁移,为了缩短迁移时间和服务中断时间,源主机和目的主机共享了 SAN 存储。这样,动态迁移只需要考虑虚拟机系统内存执行状态的迁移,从而获得较好的性能。
本地存储的动态迁移
动态迁移基于共享存储设备,为的是加速迁移的过程,尽量减少宕机时间。但是在某些情况下需要进行基于本地存储的虚拟机的动态迁移,这就需要存储块动态迁移技术,简称块迁移。
为了拓宽动态迁移技术的应用范围,有必要实现一个包括虚拟机外存迁移在内的全系统动态迁移方案。使得在采用分散式本地存储的计算机集群环境下,仍然能够利用迁移技术转移虚拟机环境,并且保证迁移过程中虚拟机系统服务的可用性。
相比较基于共享存储的动态迁移,数据块动态迁移的需要同时迁移虚拟机磁盘镜像和虚拟机系统内存状态,延长了迁移时间,在迁移性能上打了折扣。
准确来说,KVM 仅仅是 Linux 内核的一个模块。管理和创建完整的 KVM 虚拟机,需要更多的辅助工具。
以上这些就是 Linux 系统上 KVM 虚拟化技术的大致架构了。本文正是演示了如何使用这些工具实现了 KVM 虚拟机的迁移操作。
本文中的 KVM 虚拟机软件基于 Novell 公司的 Suse Linux Enterprise Server 11 Service Pack 1 发行版。SLES11 SP1 发布于 2010 年 5 月 19 日,基于 Linux 内核 2.6.32.12,包含了 kvm-0.12.3,libvirt-0.7.6,virt-manager-0.8.4,全面支持 KVM 虚拟机。本文中的物理服务器和外部共享存储配置如下表:
迁移虚拟机之前,我们需要创建虚拟机。创建虚拟机可以使用 QEMU-KVM 命令或者通过 virt-manager 图形化管理工具。
静态迁移由于允许中断虚拟机的运行,所以相对简单。首先在源主机上关闭虚拟机,然后移动虚拟机的存储镜像和配置文件到目的主机,最后在目的主机上启动虚拟机,恢复服务。根据虚拟机镜像存储方式的不同,静态迁移的实现方法稍有不同。
如果源主机和目的主机都能够访问虚拟机的镜像,则只需要迁移虚拟机配置文件。比如在本例中的 SLES11 SP1 系统,virt-manager 管理的虚拟机配置文件在 /etc/libvirt/qemu/”your vm name.xml”。拷贝 XML 配置文件到目的主机的相同目录后,进行适当的修改,比如:与源主机相关的文件或路径等。无论你何时在 /etc/libvirt/qemu/ 中修改了虚拟机的 XML 文件,必须重新运行 define 命令,以激活新的虚拟机配置文件。
1
|
# virsh define /etc/libvirt/qemu/”your vm name.xml”
|
本地存储是指虚拟机的文件系统建立在本地硬盘上,可以是文件或者磁盘分区。
1
|
dd if=/dev/VolGroup00/lv001 of=lv001.img bs=1M
|
静态迁移虚拟的过程中,虚拟机系统处于关机状态,这样虚拟机关机前的运行状态不会保留。如果希望保留迁移前的系统状态,并且在迁移后能够恢复,需要对虚拟机做快照备份或者以休眠的方式关闭系统,详细内容和实现方法将在本系列文章的第五部分介绍。
本文前面“V2V 迁移方式的分类”小节中介绍过,跟据虚拟机连接存储方式的不同,动态迁移分为基于共享存储的动态迁移和基于本地存储的存储块迁移。本小节实现了目前使用最广泛的基于共享存储的动态迁移。实现这种实时迁移的条件之一就是把虚拟机存储文件存放在公共的存储空间。因此需要设定一个共享存储空间,让源主机和目的主机都能够连接到共享存储空间上的虚拟媒体文件,包括虚拟磁盘、虚拟光盘和虚拟软盘。否则,即使迁移完成以后,也会因为无法连接虚拟设备,导致无法启动迁移后的虚拟机。
动态迁移实际上是把虚拟机的配置封装在一个文件中,然后通过高速网络,把虚拟机配置和内存运行状态从一台物理机迅速传送到另外一台物理机上,期间虚拟机一直保持运行状态。现有技术条件下,大多虚拟机软件如 VMware、Hyper-V、Xen 进行动态迁移都需要共享存储的支持。典型的共享存储包括 NFS 和 SMB/CIFS 协议的网络文件系统,或者通过 iSCSI 连接到 SAN 网络。选用哪一种网络文件系统,需要根据具体情况而定。本文的实验采用了 NFS 文件系统作为源主机和目的主机之间的共享存储。
1
2
3
4
5
6
7
8
9
10
11
|
修改 /etc/exports 文件,添加
/home/image *(rw,sync,no_root_squash)
rw:可读写的权限;
ro:只读的权限;
no_root_squash:登入到 NFS 主机的用户如果是 ROOT 用户,他就拥有 ROOT 权限,此参数很不安全,建议不要使用。
sync:资料同步写入存储器中。
async:资料会先暂时存放在内存中,不会直接写入硬盘。
重新启动 nfsserver 服务
# service nfsserver restart
|
virt-manager 是基于 libvirt 的图像化虚拟机管理软件,请注意不同的发行版上 virt-manager 的版本可能不同,图形界面和操作方法也可能不同。本文使用了 SLES11 SP1 发行版上的 virt-manager-0.8.4。
首先在源主机和目的主机上添加共享存储。这里以源主机为例,目的主机做相同的配置。
源主机上创建基于共享存储的 KVM 虚拟机。
连接远程物理主机上的 VMM。这里以源主机为例,目的主机做相同的配置。
从源主机动态迁移 KVM 虚拟机到目的主机。
从 qemu-kvm-0.12.2 版本,引入了 Block Migration (块迁移)的特性。上一小节“基于共享存储的动态迁移”中,为了实现动态迁移,源主机和目的主机需要连接共享存储服务。有了块迁移技术以后,可以在动态迁移过程中,把虚拟磁盘文件从源主机迁移至目的主机。QEMU-KVM 有了这个特性以后,共享存储不再是动态迁移的必要条件,从而降低了动态迁移的难度,扩大了动态迁移的应用范围。SLES11 SP1 集成了 kvm-0.12.3,支持块迁移特性。但是 SLES11 SP1 上的 libvirt-0.7.6、virt-manager-0.8.4 暂时没有引入块迁移的功能。所以本文下面的块迁移实验仅基于 QEMU-KVM 的命令行模式。
块迁移过程中,虚拟机只使用本地存储,因此物理环境非常简单。只需要源主机和目的主机通过以太网连接,如”图 2. 本地存储的动态迁移示意图”所示。
QEMU 的控制终端和迁移命令
QEMU 控制终端的开启,可以在 QEMQ-KVM 的命令中加参数“-monitor”。
QEMU-KVM 提供了的“-incoming”参数在指定的端口监听迁移数据。目的主机上需要此参数接收来自源主机的迁移数据。
1
2
3
4
5
|
(qemu) help migrate
migrate [-d] [-b] [-i] uri -- migrate to URI (using -d to not wait for completion)
-b for migration without shared storage with full copy of disk
-i for migration without shared storage with incremental copy of disk
(base image shared between src and destination)
|
在源主机上创建和启动虚拟机。
1
|
victory3:~ # qemu-img create -f qcow2 /var/lib/kvm/images/sles11.1ga/disk0.qcow2 10G
|
1
2
3
4
5
6
7
8
|
victory3:~ # /usr/bin/qemu-kvm -enable-kvm -m 512 -smp 4 -name sles11.1ga
-monitor stdio -boot c -drive file=/var/lib/kvm/images/sles11.1ga/disk0.qcow2,
if=none,id=drive-virtio-disk0,boot=on -device virtio-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 -device ide-drive,bus=ide.1,
unit=0,drive=drive-ide0-1-0,id=ide0-1-0 -device virtio-net-pci,vlan=0,
id=net0,mac=52:54:00:13:08:96 -net tap -vnc 127.0.0.1:3
|
1
2
3
4
5
6
7
|
victory3:~ # /usr/bin/qemu-kvm -enable-kvm -m 512 -smp 4 -name sles11.1ga
-monitor stdio -boot c -drive file=/var/lib/kvm/images/sles11.1ga/disk0.qcow2,
if=none,id=drive-virtio-disk0,boot=on -device virtio-blk-pci,bus=pci.0,addr=0x4,
drive=drive-virtio-disk0,id=virtio-disk0 -drive if=none,media=cdrom,
id=drive-ide0-1-0 -device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,
id=ide0-1-0 -device virtio-net-pci,vlan=0,id=net0,mac=52:54:00:13:08:96
-net tap -vnc 127.0.0.1:3
|
在目的主机上创建和启动虚拟机。
1
2
|
victory4:~ # qemu-img create -f qcow2 dest.img 20G
Formatting 'dest.img', fmt=qcow2 size=21474836480 encryption=off cluster_size=0
|
1
2
3
4
5
6
7
8
9
|
victory4:~ # /usr/bin/qemu-kvm -enable-kvm -m 512 -smp 4 -name sles11.1ga
-monitor stdio -boot c -drive file=/root/dest.img,if=none,id=drive-virtio-disk0,
boot=on -device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,
id=virtio-disk0 -drive if=none,media=cdrom,id=drive-ide0-1-0 -device ide-drive,
bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 -device virtio-net-pci,vlan=0,
id=net0,mac=52:54:00:13:08:96 -net tap -vnc 127.0.0.1:8 -incoming tcp:0:8888
QEMU 0.12.3 monitor - type 'help' for more information
(qemu) info status
VM status: paused
|
迁移源主机上的虚拟机到目的主机。
1
2
3
4
5
|
(qemu) migrate -d -b tcp:victory4:8888
-d 可以在迁移的过程中查询迁移状态,否则只能在迁移结束后查询。
-b 迁移虚拟机存储文件
tcp:ivctory4:8888 数据迁移的协议、目的主机和端口。协议和端口必须和目的主机上虚拟机的 -incoming 参数一致。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
源主机 QEMU 控制台显示正在迁移的数据
(qemu) info migrate
Migration status: active
transferred ram: 52 kbytes
remaining ram: 541004 kbytes
total ram: 541056 kbytes
transferred disk: 2600960 kbytes
remaining disk: 5787648 kbytes
total disk: 8388608 kbytes
目的主机 QEMU 控制台显示迁移完成的百分比
(qemu) Receiving block device images
Completed 28 %
|
本文实现了在 Suse Linux Enterprise Server 11 SP1 发行版上 KVM 虚拟机的静态迁移和动态迁移,特别是基于数据块的动态迁移,使虚拟机的资源配置更加灵活。在其他支持 KVM 的 Linux 发行版上如 Ubuntu、Fedora 也可以完成类似的迁移操作。KVM 虚拟机在不断的增强和完善中,开源社区和 Linux 的系统集成商也在开发各种各样的基于 KVM 的管理工具,将来的 KVM 迁移工具会在性能,功能,可操作性和自动化程度上大大增强。