虚拟机在线迁移总结
虚拟机迁移是个很古⽼的技术,没有什么可讲的,我之所以写,是因为我太笨了,留着以后作纪念的。
1
迁移虚拟机的⽅式有两种:⼀种是动态迁移,⼀种是静态迁移。
静态迁移
静态迁移:也叫做常规迁移、离线迁移(OfflineMigration)。就是在虚拟机关机或暂停的情况下从⼀台物理机迁移到另⼀台物理机。因为虚拟机的⽂件系统建⽴在虚拟机镜像上⾯,所以在虚拟机关机的情况下,只需要简单的迁移虚拟机镜像和相应的配置⽂件到另外⼀台物理主机上;如果需要保存虚拟机迁移之前的状态,在迁移之前将虚拟机暂停,然后拷贝状态⾄⽬的主机,最后在⽬的主机重建虚拟机状态,恢复执⾏。这种⽅式的迁移过程需要显式的停⽌虚拟机的运⾏。从⽤户⾓度看,有明确的⼀段停机时间,虚拟机上的服务不可⽤。这种迁移⽅式简单易⾏,适⽤于对服务可⽤性要求不严格的场合。
动态迁移
动态迁移(Live Migration):也叫在线迁移(Online Migration)。就是在保证虚拟机上服务正常运⾏的
同时,将⼀个虚拟机系统从⼀个物理主机移动到另⼀个物理主机的过程。该过程不会对最终⽤户造成明显的影响,从⽽使得管理员能够在不影响⽤户正常使⽤的情况下,对物理服务器进⾏离线维修或者升级。与静态迁移不同的是,为了保证迁移过程中虚拟机服务的可⽤,迁移过程仅有⾮常短暂的停机时间。迁移的前⾯阶段,服务在源主机的虚拟机上运⾏,当迁移进⾏到⼀定阶段,⽬的主机已经具备了运⾏虚拟机系统的必须资源,经过⼀个⾮常短暂的切换,源主机将控制权转移到⽬的主机,虚拟机系统在⽬的主机上继续运⾏。对于虚拟机服务本⾝⽽⾔,由于切换的时间⾮常短暂,⽤户感觉不到服务的中断,因⽽迁移过程对⽤户是透明的。动态迁移适⽤于对虚拟机服务可⽤性要求很⾼的场合。
动态迁移需要将原有的虚拟机镜像放在采⽤ SAN(storage area network)或 NAS(network-attached storage)之类的集中式共享外存设备,这样迁移的时候,不是迁移整个硬盘镜象,⽽是迁移内存的信息.所以迁移起来,速度⽐较快,停顿时间少。
动态迁移实际上是把虚拟机的配置封装在⼀个⽂件中,然后通过⾼速⽹络,把虚拟机配置和内存运⾏状态从⼀台物理机迅速传送到另外⼀台物理机上,期间虚拟机⼀直保持运⾏状态。现有技术条件下,⼤多虚拟机软件如 VMware、Hyper-V、Xen 进⾏动态迁移都需要共享存储的⽀持。典型的共享存储包括 NFS 和 SMB/CIFS 协议的⽹络⽂件系统,或者通过 iSCSI 连接到 SAN ⽹络。选⽤哪⼀种⽹络⽂件系统,需要根据具体情况⽽定。
2
在源宿主机A和⽬标机B,进⾏操作,⾸先建⽴NFS共享⽂件存储的⽂件夹。
2.1:安装NFS àyum install nfs*
2.2:启动NFSàservice nfs start
2.3:配置NFSàvi  /etc/exports
/opt/test 100.1.8.*(rw,sync,no_root_squash)
/opt/test 为要共享的⽂件夹
ro:共享⽬录只读;
rw:共享⽬录可读可写;
all_squash:所有访问⽤户都映射为匿名⽤户或⽤户组;
no_all_squash(默认):访问⽤户先与本机⽤户匹配,匹配失败后再映射为匿名⽤户或⽤户组;
root_squash(默认):将来访的root⽤户映射为匿名⽤户或⽤户组;
no_root_squash:来访的root⽤户保持root帐号权限;
anonuid=<UID>:指定匿名访问⽤户的本地⽤户UID,默认为nfsnobody(65534);
anongid=<GID>:指定匿名访问⽤户的本地⽤户组GID,默认为nfsnobody(65534);
secure(默认):限制客户端只能从⼩于1024的tcp/ip端⼝连接服务器;
insecure:允许客户端从⼤于1024的tcp/ip端⼝连接服务器;
sync:将数据同步写⼊内存缓冲区与磁盘中,效率低,但可以保证数据的⼀致性;
async:将数据先保存在内存缓冲区中,必要时才写⼊磁盘;
wdelay(默认):检查是否有相关的写操作,如果有则将这些写操作⼀起执⾏,这样可以提⾼效率;不重启nfs服务应⽤更新,相关选项如下:
-a 全部挂载或卸载 /etc/exports中的内容
-r 重新读取/etc/exports 中的信息,并同步更新/etc/exports、/var/lib/nfs/xtab
-u 卸载单⼀⽬录(和-a⼀起使⽤为卸载所有/etc/exports⽂件中的⽬录)
-v 在export的时候,将详细的信息输出到屏幕上。
no_wdelay:若有写操作则⽴即执⾏,应与sync配合使⽤;
subtree_check(默认):若输出⽬录是⼀个⼦⽬录,则nfs服务器将检查其⽗⽬录的权限;
no_subtree_check :即使输出⽬录是⼀个⼦⽬录,nfs服务器也不检查其⽗⽬录的权限,这样可以提⾼效率
2.4:不重启NFS时:exportfs  -rv:
-a 全部挂载或卸载 /etc/exports中的内容
-r 重新读取/etc/exports 中的信息,并同步更新/etc/exports、/var/lib/nfs/xtab
-u 卸载单⼀⽬录(和-a⼀起使⽤为卸载所有/etc/exports⽂件中的⽬录)
-v 在export的时候,将详细的信息输出到屏幕上。
2.5:检查共享⽬录情况
showmount -e #查询本机nfs共享⽬录情况
showmount -e 源宿主机IP #查询⽬标机和宿主机的nfs共享⽬录情况
2.6:挂载⽬录:
mount –t nfs IP(共享⽬录):/NFS共享⽬录/ /共享⽬录
2.7:起动虚拟机
启动宿主机/usr/libexec/qemu-kvm–had  /共享⽬录/XXX.img  ………
启动⽬标机/usr/libexec/qemu-kvm–had  /共享⽬录/XXX.img –incomingtcp:0:8888
注意:(1)NFS 挂载⽬录必须⼀致(2)“-incomingtcp:0:8888”参数表⽰在 6666 端⼝建⽴⼀个 TCP socket 连接⽤于接收来⾃源主机的动态迁移的内容,其中 0 表⽰运⾏来⾃任何主机的连接。“-incoming“使 qemu-kvm 进程进⼊到监听模式,⽽不是真正以命令⾏中的⽂件运⾏客户机。
(3)在源宿主机的客户机的 QEMUmonitor 中,使⽤命令 ” migrate tcp:宿主机IP:6666" 即可进⼊动态迁移的流程。
1,挂载nfs出现问题
当去mount远程的nfs服务器,出现问题了.
mount.nfs: access denied by server whilemounting 211.87.***.53:/mnt/nfs
解决:原来发现,在/etc/exports中,没有将/mnt/nfs添加进去,只能将⾥⾯有的⽂件夹才能mount到本机来.
可以先umoutn /mnt/nfs ,然后在mount看看能否成功
2.出现Permission denied
暂时未知
3.迁移需要FQDN
解决:ssh进⼊到dest host机器,运⾏hostname domain 就好了.其中domian是⼀个域名.将接下来就可以进⾏迁移了.
⼀、虚拟机备份
使⽤save/restore⽅法
备份:
virsh save --bypass-cache vm_test/opt/vmtest_save –running
将vm_test的当前状态保存到/opt/vm2_save⽂件中
-runing: 参数表⽰下次restore回来的时候能够⾃动启动vm_test
这个命令会导致vm_test被关闭
还原:
virsh restore /opt/vm2_save --bypass-cache--running
⼆、虚拟机在线迁移(基于NFS共享存储)(带快照)
快照的查看、创建、删除
(qemu) info snapshots
(qemu) delvm snapshots_name
(qemu) savevm snapshots_name
带快照的迁移命令:
Qemu:
源宿主机上启动虚拟机:
# qemu-system-x86_64 –hda /挂载⽬录/XXX.img –m 1024 –monitorstdio –net nic –net tap,ifname=tap0,script=no,downscript=no –vnc :3
⽬标机上启动虚拟机:
# qemu-system-x86_64 –hda /挂载⽬录/XXX.img –m 1024 –monitorstdio –net nic –net tap,ifname=tap0,script=no,downscript=no –vnc :3 –incomingtcp:0:8888
在宿主机的qemu monitor下使⽤命令,迁移虚拟机到⽬标机
(qemu) migrate –d tcp:⽬标机IP:8888
Virsh:
# virsh start vmtest
# virsh migrate --live GuestNameDestinationURI
GuestName指虚拟机名称,DestinationURI:⽬的主机的URI。
举例:# virsh  migrate --live vmtestqemu+ssh://192.168.1.1/system
迁移的要求是:需要⽬的主机和源主机有相同的环境,包括hypervisor
三、查看虚拟机迁移进度
虚拟机安装vim命令
在宿主机qemu monitor下查看虚拟机迁移情况:
(qemu)info migrate(查看虚拟机迁移信息)
(qemu)info status(查看虚拟机状态)
四、虚拟机存储热迁移(不跨主机)
1.虚拟机yt运⾏时,执⾏镜像操作:
virsh qemu-monitor-command --hmp  yt  ’info block’ (查询虚拟机的块设备)
virsh qemu-monitor-command --hmp yt  'drive_mirror -fdrive-ide0-0-0(block_device) /data/test/yt-mirror.img'
查看完成状态:
virsh qemu-monitor-command --hmp yt 'infoblock-jobs'
3.当mirror-img的⼤⼩与原⼤⼩相同时,执⾏complete操作:
virsh qemu-monitor-command --hmp yt'block_job_complete  drive-ide0-0-0'
4.查看block-jobs,已经没有活动的job:
virsh qemu-monitor-command --hmp yt  'info block-jobs'
5.执⾏如下命令,查看block的信息,yt的系统镜像已经指向yt-mirror.img镜像。
virsh qemu-monitor-command --hmp yt  'info block'
6.查看虚拟机镜像⽂件及mirro⽣成⽂件⼤⼩
ll /data/test/
7.连接虚拟机yt,进⼊后执⾏⼀个dd写⼊操作:
dd if=/dev/sda  of=test.img bs=1MB count=512
8.查看虚拟机镜像⽂件及mirro⽣成⽂件:
ll /data/test/
可以看到,虚拟机yt的原系统镜像⼤⼩没有发⽣变化,但mirror镜像⼤⼩增加了512MB,既block_job_complete操作实际上切换了vm的系统镜像,可以实现虚拟机的在线存储迁移,并且block_job_complete操作,可以连续切换系统镜像。
五、虚拟机存储冷迁移(不跨主机)
1.虚拟机yt挂起不关闭,执⾏镜像操作:
virsh suspend yt
virsh qemu-monitor-command --hmp yt  'drive_mirror -f drive-ide0-0-0  /data/test/yt-mirror.img'
2.查看完成状态:
virsh qemu-monitor-command --hmp yt 'infoblock-jobs'
3.当mirror-img的⼤⼩与原⼤⼩相同时,执⾏complete操作:
virsh qemu-monitor-command --hmp yt'block_job_complete  drive-ide0-0-0'
4.查看block-jobs,已经没有活动的job:
virsh qemu-monitor-command --hmp yt  'info block-jobs'
5.执⾏如下命令,查看block的信息,yt的系统镜像已经指向yt-mirror.img镜像。
virsh qemu-monitor-command --hmp yt  'info block'
6.启动虚拟机
virsh qemu-monitor-command --hmp yt  'c'
7.查看虚拟机镜像⽂件及mirro⽣成⽂件⼤⼩
ll /data/test/
8.连接虚拟机yt,进⼊后执⾏⼀个dd写⼊操作:
dd if=/dev/sda  of=test.img bs=1MB count=512
9.查看虚拟机镜像⽂件及mirro⽣成⽂件:
ll /data/test/
可以看到,虚拟机yt的原系统镜像⼤⼩没有发⽣变化,但mirror镜像⼤⼩增加了512MB,既block_job_complete操作实际上切换了vm的系统镜像,可以实现虚拟机的存储冷迁移。
在虚拟机关闭的状态下,直接复制虚拟机镜像,然后更改虚拟机磁盘路径在重启虚拟机。
六、虚拟机磁盘热添加
虚拟机添加硬盘有两种⽅法:
1、通过virsh attach-disk命令添加⼀块硬盘到系统中,即时⽣效。(热添加)
2、通过修改虚拟机配置⽂件进⾏添加,永久⽣效。(冷添加)
⽅法⼀、通过virsh attach-disk命令添加硬盘
⾸先在客户机中看看在未添加新硬盘系统的分区情况。
从上图我们可以看到⽬前系统中只有⼀块硬盘sda,⽽且被分成2个分区,其中sda1为系统启动分区。
下⾯开始添加硬盘:
先使⽤ qemu-img添加⼀块新的硬盘
qemu-img create -f qcow2 testdisk.img 20G
现在开始使⽤virsh attach-disk命令把新硬盘添加到虚拟机上。
virsh attach-disk ytvm testdisk.img vda
通过virsh attach-disk添加硬盘时,只能是虚拟机运⾏时才能添加,⽽且是即时⽣效的。然后,对vda进⾏格式化,
#4 /dev/vda
接下来,新建⼀个⽬录⽤来挂载新的硬盘
#mkdir /test
#mount /dev/vda /test
最后,将该挂载添加到开机启动中
#blkid /dev/vda          //获取硬盘的UUID
/dev/vdb: UUID="19fc1d1d-7891-4e22-99ef-ea3e08a61840"TYPE="ext4"
#vim /etc/fstab            //添加开机加载,在最后⼀⾏加⼊
UUID=19fc1d1d-7891-4e22-99ef-ea3e08a61840/test ext4 defaults        1 2
使⽤virsh detach-disk ytvm --target vda 也可以卸载。(注意修改/etc/fstab⾥⾯的内容,不然会影响虚拟机的启动)
七、虚拟机磁盘冷添加
直接在配置⽂件中</disk>这之后,添加如下的代码
<disk type='file' device='disk'>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。