虚拟机在线迁移总结

虚拟机迁移是个很古老的技术,没有什么可讲的,我之所以写,是因为我太笨了,留着以后作纪念的。

1      迁移的类型

迁移虚拟机的方式有两种:一种是动态迁移,一种是静态迁移。

静态迁移

静态迁移:也叫做常规迁移、离线迁移(OfflineMigration)。就是在虚拟机关机或暂停的情况下从一台物理机迁移到另一台物理机。因为虚拟机的文件系统建立在虚拟机镜像上面,所以在虚拟机关机的情况下,只需要简单的迁移虚拟机镜像和相应的配置文件到另外一台物理主机上;如果需要保存虚拟机迁移之前的状态,在迁移之前将虚拟机暂停,然后拷贝状态至目的主机,最后在目的主机重建虚拟机状态,恢复执行。这种方式的迁移过程需要显式的停止虚拟机的运行。从用户角度看,有明确的一段停机时间,虚拟机上的服务不可用。这种迁移方式简单易行,适用于对服务可用性要求不严格的场合。

动态迁移

动态迁移(Live Migration):也叫在线迁移(Online Migration)。就是在保证虚拟机上服务正常运行的同时,将一个虚拟机系统从一个物理主机移动到另一个物理主机的过程。该过程不会对最终用户造成明显的影响,从而使得管理员能够在不影响用户正常使用的情况下,对物理服务器进行离线维修或者升级。与静态迁移不同的是,为了保证迁移过程中虚拟机服务的可用,迁移过程仅有非常短暂的停机时间。迁移的前面阶段,服务在源主机的虚拟机上运行,当迁移进行到一定阶段,目的主机已经具备了运行虚拟机系统的必须资源,经过一个非常短暂的切换,源主机将控制权转移到目的主机,虚拟机系统在目的主机上继续运行。对于虚拟机服务本身而言,由于切换的时间非常短暂,用户感觉不到服务的中断,因而迁移过程对用户是透明的。动态迁移适用于对虚拟机服务可用性要求很高的场合。

动态迁移需要将原有的虚拟机镜像放在采用 SAN(storage area network)或 NAS(network-attached storage)之类的集中式共享外存设备,这样迁移的时候,不是迁移整个硬盘镜象,而是迁移内存的信息.所以迁移起来,速度比较快,停顿时间少。

动态迁移实际上是把虚拟机的配置封装在一个文件中,然后通过高速网络,把虚拟机配置和内存运行状态从一台物理机迅速传送到另外一台物理机上,期间虚拟机一直保持运行状态。现有技术条件下,大多虚拟机软件如 VMware、Hyper-V、Xen 进行动态迁移都需要共享存储的支持。典型的共享存储包括 NFS 和 SMB/CIFS 协议的网络文件系统,或者通过 iSCSI 连接到 SAN 网络。选用哪一种网络文件系统,需要根据具体情况而定。

2      实验方式选择NFS

在源宿主机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

 

三、 查看虚拟机迁移进度

在宿主机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进行格式化,

#mkfs.ext4 /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'>

<driver name='qemu' type='qcow2'cache='none'/>

<source file='/testdisk.img'/>

<target dev='vda' bus='virtio'/>

</disk>

注意其中type表示硬盘的格式

file表示硬盘所在的路径

dev表示硬盘在系统中显示的硬盘名称

然后,对vda进行格式化,

#mkfs.ext4 /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 可以卸载。

posted @ 2018-04-11 10:50  活的潇洒80  阅读(1820)  评论(0编辑  收藏  举报