基于本地存储的kvm虚拟机在线迁移

kvm虚拟机迁移分为4种
(1)热迁移基于共享存储
(2)热迁移基于本地存储
(3)冷迁移基于共享存储
(4)冷迁移基于本地存储

这里介绍的是基于本地存储的热迁移

动态块迁移版本要求
qemu版本要求  大于或等于0.12.1(centos6.7或以上都没问题)
rpm -qa|grep qemu
qemu-kvm-0.12.1.2-2.491.el6_8.1.x86_64
qemu-kvm-tools-0.12.1.2-2.491.el6_8.1.x86_64

目标宿主机:192.168.1.24  机器名:CQ-KVM01
源宿主机:192.168.1.26   机器名:CQ-KVM02
迁移使用tcp认证方式
kvm虚拟机名称,是一台跑nginx的虚拟机:CQ-NGINX01

1、配置libvirtd服务 源宿主机和目标宿主机都要执行
vi /etc/libvirt/libvirtd.conf
listen_tls = 0   
listen_tcp = 1
tcp_port = "16509"
listen_addr = "0.0.0.0"
auth_tcp = "none"
mdns_adv = 0

解释
listen_tls:关闭tls,默认是开启的
listen_tcp :开启tcp认证
tcp_port:tcp端口配置,默认端口是16509
auth_tcp:配置是否开启口令认证,默认不开启
mdns_adv:是否开启mdns组播,默认关闭

sed -i 's/^#listen_tls = 0/listen_tls = 0/' /etc/libvirt/libvirtd.conf
sed -i 's/^#listen_tcp = 1/listen_tcp = 1/' /etc/libvirt/libvirtd.conf
sed -i 's/^#tcp_port = \"16509\"/tcp_port = \"16509\"/' /etc/libvirt/libvirtd.conf
sed -i 's/^#listen_addr = \"192.168.0.1\"/listen_addr = \"0.0.0.0\"/' /etc/libvirt/libvirtd.conf
sed -i 's/^#auth_tcp = \"sasl\"/auth_tcp = \"none\"/' /etc/libvirt/libvirtd.conf
sed -i 's/^#mdns_adv = 1/mdns_adv = 0/' /etc/libvirt/libvirtd.conf

cat libvirtd.conf |grep -iE "listen_tls"
cat libvirtd.conf |grep -iE "listen_tcp"
cat libvirtd.conf |grep -iE "tcp_port"
cat libvirtd.conf |grep -iE "listen_addr"
cat libvirtd.conf |grep -iE "auth_tcp"
cat libvirtd.conf |grep -iE "mdns_adv"

2、配置libvirtd监听方式,无论是tcp,ssh,tls认证方式都需要配置 , 源宿主机和目标宿主机都要执行
vi /etc/sysconfig/libvirtd
LIBVIRTD_ARGS="--listen"

3、编辑/etc/libvirt/qemu.conf文件  源宿主机和目标宿主机都要执行
vi /etc/libvirt/qemu.conf
vnc_listen = "0.0.0.0"

解释
vnc_listen:使虚拟机带外VNC默认监听.0.0.0.0

4、重启libvirtd服务,使配置生效,  源宿主机和目标宿主机都要执行
/etc/init.d/libvirtd restart

5、检查端口和进程,libvirtd是否监听16509端口,  源宿主机和目标宿主机都要执行
netstat -lntp | grep libvirtd
tcp        0      0 0.0.0.0:16509               0.0.0.0:*                   LISTEN      48825/libvirtd

修改iptables脚本,放行16509端口和49152端口
#ACCESS kvm
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 5900:5909 -j ACCEPT
iptables -A INPUT -p tcp --dport 16509 -j ACCEPT
iptables -A INPUT -p tcp --dport 49152 -j ACCEPT

6、在源宿主机和目标宿主机加上IP和主机的解析
#24机器上
echo "192.168.1.26 CQ-KVM02"  >> /etc/hosts

#26机器上
echo "192.168.1.24 CQ-KVM01"  >> /etc/hosts

7、在源宿主机连接目标宿主机的libvirtd并查看虚拟机信息
virsh -c qemu+tcp://root@192.168.1.26:16509/system
virsh -c qemu+tcp://root@192.168.1.24:16509/system

8、在目标宿主机创建同样大小的镜像文件,路径、名称也要一样
要加上preallocation=metadata,否则使用virt-install命令安装完成后虚拟机磁盘镜像会变为raw格式
qemu-img create -f qcow2  -o preallocation=metadata  /data/kvmimg/CQ-NGINX01.qcow2 100G

9、迁移 ,192.168.1.26为目标宿主机的内网IP,tcp认证方式,迁移时间有点长需要开一个screen窗口,不需要cd 到镜像文件所在目录
screen -S migratekvm
virsh migrate --live --copy-storage-all --unsafe --persistent  CQ-NGINX01  qemu+tcp://root@192.168.1.26:16509/system

10、在目标宿主机执行,会显示paused状态 即是suspended状态
watch virsh list --all

11、在目标宿主机执行,显示迁移进度
tailf /var/log/libvirt/qemu/CQ-NGINX01.log

12、在目标宿主机执行,镜像文件目录为/data/kvmimg/,显示虚拟机镜像的大小,会看到虚拟机镜像会不断增大表示数据已经在迁移过来
注意创建镜像文件的时候要使用preallocation=metadata
cd /data/kvmimg/
watch du -h *

13、虚拟机迁移完成后,源宿主机为关机状态,目标宿主机变为running状态
virsh list --all #源宿主机
virsh list --all #目标宿主机

14、源宿主机删除xml配置文件
virsh destroy CQ-NGINX01
virsh undefine CQ-NGINX01

注意:
迁移过程中ping会有卡顿,有时会丢几个包,如果虚拟机中有部署数据库,应用程序最好有重连机制

回迁方法
建议不要删除源宿主机上的镜像文件,保留镜像文件
#在目标宿主机上执行 ,回迁到源宿主机
virsh dumpxml CQ-NGINX01  >~/CQ-NGINX01.xml
virsh migrate --live --copy-storage-all --unsafe --persistent CQ-NGINX01  qemu+tcp://root@192.168.1.24:16509/system

注意:
源宿主机和目标宿主机最好要保持硬件一致 ,这样迁移和回迁出问题的几率才能降到最低!
迁移速度和成功率和网络有很大关系,宿主机的网络尽量是万兆或千兆多网卡绑定,可以提高迁移速度和成功率

#限制迁移速度 为600M/s
virsh migrate-setspeed  CQ-NGINX01  600


在线迁移问题汇总
(如果ssh的端口不是默认22,可以写为 qemu+ssh://target:port/system)
Question 1:
error: internal error hostname on destination resolved to localhost, but migration requires an FQDN
解决办法很简单,因为默认情况下hostname 是 localhost,我们需要把目标的hostname修改一下,临时的也可以。
#hostname target

Question 2:
error: internal error Attempt to migrate guest to the same host 00020003-0004-0005-0006-000700080009
这个在mail list 中有大牛说是服务器提供商的问题,
你可以用#dmidecode -s system-uuid 查看一下这个ID,理论上是#virsh sysinfo | grep uuid 及# virsh capabilities | grep uuid
这三个ID是一样的。(之前看论坛里发的解决方法是需要下载一个dmidecode 命令的文件去替换系统的,达到修改的目的,不过我只是修改了libvirt的配置文件就可以了,可能是版本的问题)
我们修改一下libvirtd的配置文件
#sed -i "/#host_uuid/ahost_uuid = \"`uuidgen`\"" /etc/libvirt/libvirtd.conf
重启一下libvirtd 服务
# /etc/init.d/libvirtd restart
然后再查看一下
# virsh capabilities | grep uuid

Question 3:
error: unable to set user and group to '107:107' on '/image/vmtest/disk.img': No such file or directory
如果顺利进入到这步的话,就很简单了,没有directory 直接创建一个就可以,没有disk.img 直接create一个
注:创建的磁盘应该和源虚拟机的磁盘是一样的大小(更大应该是可以)和格式(raw还是qcow2)

qemu-img create /image/vmtest/disk.img +sizeG

Question 4:
error: Unable to resolve address 'target' service '49155': Name or service not known
《《Name or service not known》》在/etc/hosts 添加解析的ip和target的域名即可

Question 5:
virsh migrate --live --copy-storage-all --unsafe --persistent CQ-NGINX01  qemu+tcp://root@192.168.1.24:16509/system
error: Unable to read from monitor: Connection reset by peer

可能目标宿主机和源宿主机内存不够
建议:目标宿主机和源宿主机上都关闭一些不必要的虚拟机把内存腾出来
也可以清空cache把内存腾出来
#清除cache 首先执行sync命令
sync
echo 3 > /proc/sys/vm/drop_caches


基于TCP认证方式的迁移(需要输入用户名和密码)

步骤跟上面大致相同,只是有些步骤需要做相应变更

1、配置libvirtd服务 源宿主机和目标宿主机都要执行,auth_tcp使用sasl认证方式
vi /etc/libvirt/libvirtd.conf
auth_tcp = "sasl"
sed -i 's/^#auth_tcp = \"sasl\"/auth_tcp = \"sasl\"/' /etc/libvirt/libvirtd.conf

2、创建libvirt管理用户virtadmin
saslpasswd2 -a libvirt virtadmin
Password:
Again (for verification):

用户名:virtadmin
密码:xxxxxxx

可以使用sasldblistuser2命令查看创建了那些用户:
sasldblistusers2 -f /etc/libvirt/passwd.db

7、在源宿主机连接目标宿主机的libvirtd并查看虚拟机信息,会询问用户和密码,输入saslpasswd2命令创建的用户virtadmin和密码即可
virsh -c qemu+tcp://root@192.168.1.26:16509/system
Please enter your authentication name: virtadmin
Please enter your password:
Welcome to virsh, the virtualization interactive terminal.

9、迁移 ,192.168.1.26为目标宿主机的内网IP,tcp认证方式,迁移时间有点长需要开一个screen窗口,不需要cd 到镜像文件所在目录,
同样输入saslpasswd2 命令创建的用户virtadmin和密码即可
screen -S migratekvm
virsh migrate --live --copy-storage-all --unsafe --persistent CQ-NGINX01 qemu+tcp://root@192.168.1.26:16509/system
Please enter your authentication name: virtadmin
Please enter your password:

基于本地存储的kvm虚拟机在线迁移的更多相关文章

  1. 基于NFS共享存储实现KVM虚拟机动态迁移

    基于NFS共享存储实现KVM虚拟机动态迁移 一:配置环境 二:安装相关的依赖包 三:实现NFS共享存储 四:KVM机配置相同的步骤 五:安装KVM01安装虚拟机 六:实现迁移  实验初始配置:所有主机 ...

  2. 虚拟机在 OpenStack 里没有共享存储条件下的在线迁移

    虚拟机在 OpenStack 里没有共享存储条件下的在线迁移 本文尝试回答与 Live migration 相关的几个问题:Live migration 是什么?为什么要做 Live migratio ...

  3. kvm虚拟机动态迁移

    相比KVM虚拟机静态迁移中需要拷贝虚拟机虚拟磁盘文件,kvm虚拟机动态迁移无需拷贝虚拟磁盘文件,但是需要迁移到的虚拟主机之间需要有相同的目录结构虚拟机磁盘文件,本文这部分内容通过nfs来实现,当然也可 ...

  4. Kvm04 kvm虚拟机热迁移,可视化管理

    目录 1.kvm虚拟机热迁移 1). 冷迁移 修改配置文件,将定义的格式raw,改成qcow2格式! 修改完成,重启服务 2).热迁移 2.Virt-manager管理Kvm虚拟机 1.kvm虚拟机热 ...

  5. kvm虚拟机热迁移

    一.热迁移描述: 相比KVM虚拟机冷迁移中需要拷贝虚拟机虚拟磁盘文件,kvm虚拟机热迁移无需拷贝虚拟磁盘文件,但是需要迁移到的宿主机之间需要有相同的目录结构虚拟机磁盘文件,也就是共享存储,本文这部分内 ...

  6. 【转载】基于Linux命令行KVM虚拟机的安装配置与基本使用

    基于Linux命令行KVM虚拟机的安装配置与基本使用 https://alex0227.github.io/2018/06/06/%E5%9F%BA%E4%BA%8ELinux%E5%91%BD%E4 ...

  7. 虚拟机在 OpenStack 里没有共享存储条件下的在线迁移[转]

    原文链接:http://www.ibm.com/developerworks/cn/cloud/library/1508_wangyx_openstacklivemigrate/ 迁移(Migrati ...

  8. kvm虚拟机静态迁移

    1.静态迁移就是虚拟机在关机状态下,拷贝虚拟机虚拟磁盘文件与配置文件到目标虚拟主机中,实现的迁移. (1)虚拟主机各自使用本地存储存放虚拟机磁盘文件 本文实现基于本地磁盘存储虚拟机磁盘文件的迁移方式, ...

  9. 基于Linux命令行KVM虚拟机的安装配置与基本使用

    背景 由于生产环境的服务器并不会安装桌面环境,简单操作的图形化安装也不适合批量部署安装.因此,我还是更倾向于在命令下安装配置KVM虚拟机.结合了一些资料和个人使用的状况,我大致列出了一些基本和常用的使 ...

随机推荐

  1. npm 私有模块的管理使用

    你可以使用 NPM 命令行工具来管理你在 NPM 仓库的私有模块代码,这使得在项目中使用公共模块变的更加方便. 开始前的工作 你需要一个 2.7.0 以上版本的 npm ,并且需要有一个可以登陆 np ...

  2. ImageView缩放选项

    ImageView.ScaleType 将图片边界缩放到所在view边界时的缩放选项. Options for scaling the bounds of an image to the bounds ...

  3. 为什么 NaN 不等于自身?

    NaN 即Not a Number , 不是一个数字, 那么NaN到底是什么呢? 话说在JavaScript中,有6大数据类型,分别包括string,number,boolean,undefined, ...

  4. 46张PPT讲述JVM体系结构、GC算法和调优

    本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传可供下载 ...

  5. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

  6. jQuery学习之路(5)- 简单的表单应用

    ▓▓▓▓▓▓ 大致介绍 接下来的这几个博客是对前面所学知识的一个简单的应用,来加深理解 ▓▓▓▓▓▓ 单行文本框 只介绍一个简单的样式:获取和失去焦点改变样式 基本结构: <form actio ...

  7. UWP开发必备:常用数据列表控件汇总比较

    今天是想通过实例将UWP开发常用的数据列表做汇总比较,作为以后项目开发参考.UWP开发必备知识点总结请参照[UWP开发必备以及常用知识点总结]. 本次主要讨论以下控件: GridView:用于显示数据 ...

  8. 调用微信退款接口或发红包接口时出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法

    我总结了一下出现证书无法加载的原因有以下三个 1.证书密码不正确,微信证书密码就是商户号 解决办法:请检查证书密码是不是和商户号一致 2.IIS设置错误,未加载用户配置文件 解决办法:找到网站使用的应 ...

  9. Consul-template的简单应用:配置中心,服务发现与健康监测

    简介 Consul-template是Consul的一个方扩展工具,通过监听Consul中的数据可以动态修改一些配置文件,大家比较热衷于应用在Nginx,HAProxy上动态配置健康状态下的客户端反向 ...

  10. SQLServer 各版本区别

    SQLServer 2012 新特性 通过AlwaysOn实现各种高可用级别 通过列存储索引技术实现超快速的查询,其中星型链接查询及相似查询的性能提升幅度可高达100倍,同时支持超快速的全文查询 通过 ...