虚拟机迁移分为动态迁移和静态迁移
静态迁移:是指在虚拟机关闭或暂停的情况下,将源宿主机上虚拟机的磁盘文件和配置文件拷贝到目标宿主机上。这种方式需要显式的停止虚拟机运行,对服务可用性要求高的需求不合适。
动态迁移:无需拷贝虚拟机配置文件和磁盘文件,但是需要迁移的主机之间有相同的目录结构放置虚拟机磁盘文件,可以通过多种方式实现,本例采用基于共享存储动态迁移,通过NFS(Network File System网络文件系统)来实现。
源宿主机:Ubuntu16.04操作系统,下文中以“节点1”表示,NFS挂载目录/home/kvm。
目标宿主机:Ubuntu16.04操作系统,下文中以“节点2”表示,NFS挂载目录/home/kvm。
基于QEMU的动态迁移虚拟机镜像文件为ubuntu14.04.img。
NFS服务器:Ubuntu16.04操作系统,服务目录为/mnt/nfs/。
在VMware中,虚拟机–>管理–>克隆。
注意: 在实验中,源宿主机为节点1,克隆的机器作为目标宿主机,为节点2。
如果节点1是NAT模式,不用修改网络。互相ping对方ip地址,保证两节点网络的连通。
如果节点1是网桥模式,需要修改节点2中的IP地址,修改为和节点1同一网段的IP。只需修改IP即可,其他不用改动,
root@ubuntu:~# vim /etc/network/interfaces
root@ubuntu:~# /etc/init.d/networking restart
[ ok ] Restarting networking (via systemctl): networking.service.
(1) KVM虚拟机动态迁移无需拷贝虚拟机配置文件和磁盘文件,但是需要迁移的主机之间有相同的目录结构放置虚拟机磁盘文件(本例为“/home/kvm”
目录),这里的动态迁移是基于共享存储动态迁移,通过NFS来实现,需要QEMU 0.12.2以上版本支持。可以使用“qemu-img --help|grep version
”来查看安装的QEMU的版本号。
qemu-img --help|grep version
(2) 在节点2上安装NFS服务器。使用命令“sudo apt-get install nfs-kernel-server nfs-common
”下载安装NFS
kernel-server相当于server端
common是client端
apt-get install nfs-kernel-server nfs-common
(3) 在节点2上配置NFS服务器,将NFS服务器上的“/mnt/nfs
”目录设为服务目录。首先使用命令“sudo mkdir /mnt/nfs
”创建该目录,然后使用命令“sudo chmod 777 /mnt/nfs
”修改该目录权限,修改后在“/mnt”目录使用“ll -d /mnt/nfs
”命令查看
root@ubuntu:/home/kvm# mkdir /mnt/nfs
root@ubuntu:/home/kvm# chmod 777 /mnt/nfs/
root@ubuntu:/home/kvm# ll -d /mnt/nfs/
drwxrwxrwx 2 root root 4096 Jun 14 02:11 /mnt/nfs//
(4) 在节点2上,使用vim打开修改“/etc/exports
”文件添加共享目录,在该文件最后添加“/mnt/nfs *(rw,sync,no_subtree_check,no_root_squash)
”一行即可。
/mnt/nfs *(rw,sync,no_subtree_check,no_root_squash)
/mnt/nfs
表示要设置的共享目录,
*
表示允许所有的网段访问,也可以使用具体的IP。
rw
表示挂载此目录的客户端对该共享目录具有读写权限。
sync
表示资料同步写入内存和硬盘。
no_root_squash
:root用户具有对根目录的完全管理访问权限。
no_subtree_check
:不检查父目录的权限。修改完毕后保存退出。
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
/mnt/nfs *(rw,sync,no_subtree_check,no_root_squash)
(5) 在节点2上,“/etc/exports
”文件修改后,使用命令“sudo exportfs –r
”刷新。然后启动NFS服务,命令如下:
sudo /etc/init.d/rpcbind restart
sudo /etc/init.d/nfs-kernel-server restart
root@ubuntu:/home/kvm# sudo /etc/init.d/rpcbind restart
[ ok ] Restarting rpcbind (via systemctl): rpcbind.service.
root@ubuntu:/home/kvm# sudo /etc/init.d/nfs-kernel-server restart
[ ok ] Restarting nfs-kernel-server (via systemctl): nfs-kernel-server.service.
root@ubuntu:/home/kvm#
(6) 在节点2上,NFS服务启动后,使用命令“showmount –e 192.168.70.139
”查看NFS的共享目录,
192.168.70.139
为节点2的IP地址,
showmount
命令 用于查询NFS服务器的相关信息,
-e
显示输出目录列表。
showmount –e 192.168.70.139
xyc@ubuntu:~$ showmount -e 192.168.70.139
Export list for 192.168.70.139:
/mnt/nfs *
(7) 在节点2上,将虚拟机的虚拟磁盘文件ubuntu14.04.img
拷贝到NFS服务器(还在节点2)的共享目录“/mnt/nfs
”下。
(8) 在节点1上使用命令“sudo apt-get install nfs-common
”下载安装NFS client端。
(9) 分别在节点1和节点2上执行以下操作:
mkdir /home/kvm
”创建“kvm”目录mount –t nfs 192.168.70.139:/mnt/nfs /home/kvm –o rw
”进行挂载。
192.168.70.139
”为节点2的IP地址,也是NFS服务器的IP地址。df -h
”命令,可以看到挂载位置为“/home/kvm
”,
cd /home/kvm
”目录,可以看到ubuntu14.04.img镜像文件。root@ubuntu:/mnt# mkdir /home/kvm
root@ubuntu:/mnt# mount -t nfs 192.168.70.139:/mnt/nfs /home/kvm -o rw
root@ubuntu:/mnt# ls /home/kvm/
ubuntu14.04.img
(10) 挂载完成后两节点的“/home/kvm
”都有相同的虚拟机磁盘文件ubuntu14.04.img。
(1) 在节点1上,使用命令“qemu-system-x86_64 -hda /home/kvm/ubuntu14.04.img -m 512 -smp 1 -vnc :1 -monitor stdio
”启动虚拟机,
ubuntu14.04
为前面实验制作的镜像文件,
-monitor stdio
表示可以进入QEMU监控器,以便接下来执行迁移命令
root@ubuntu:/# qemu-system-x86_64 -hda /home/kvm/ubuntu14.04.img -m 512 -smp 1 -vnc :1 -monitor stdio
QEMU 2.5.0 monitor - type 'help' for more information
(qemu) warning: TCG doesn't support requested feature: CPUID.01H:ECX.vmx [bit 5]
(qemu)
(2) 打开vncviewer,连接节点1上的QEMU虚拟机
(3) 在该虚拟机中运行“top
”命令
top命令 可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。使用top命令以便在动态迁移的时候检查它是否仍然在继续进行
(4) 在节点2上,使用命令“qemu-system-x86_64 -hda /home/kvm/ubuntu14.04.img -m 512 -smp 1 -vnc :1 -incoming tcp:0:6666
”启动一个虚拟机,该虚拟机并没有真实启动,只是用于等待接收动态迁移过来的内存内容
qemu-system-x86_64 -hda /home/kvm/ubuntu14.04.img -m 512 -smp 1 -vnc :1 -incoming tcp:0:6666
注意:在节点2上,NFS挂载目录必须与源主机上保持一致;启动客户机命令也需一致,但是需要增加-incoming 选项。
“-incoming tcp:0:6666
” 这个参数表示在6666 端口建立一个tcp socket 连接用于接收来自于源宿主机的动态迁移的内容,
“0”
表示允许来自任何主机的连接。
“-incoming”
表示使QEMU进程进入到迁移监听(migration-listen)模式,而不是真正以命令行中的镜像文件运行客户机。
(5) 在节点1上,在源宿主机的qemu monitor命令行中输入
“migrate tcp:192.168.70.139:6666
”迁移虚拟机,进入动态迁移的流程
“192.168.70.139”
是目标宿主机IP,TCP协议和6666端口与目标宿主机上命令行的-incoming 参数保持一致。
migrate tcp:192.168.70.139:6666
(6) 在“migrate
”命令从开始到执行完成,大约十秒钟,在执行完成后迁移成功。迁移后在节点2上,也就是目标宿主机上,之前处于迁移监听状态的虚拟机开始运行,在该虚拟机中可以查看到,原来在节点1上运行的虚拟机上执行的top命令在迁移后仍在继续运行。使用vncviewer查看节点2上的虚拟机,在节点2上迁移后的虚拟机“top”命令仍在执行。
(7) 节点1上的虚拟机“top”命令执行已停止,动态迁移虚拟机成功。