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

时间:2023-01-22 16:00:43

基于本地存储的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. jQuery弹出提示信息简洁版(自动消失)

    之前看了有一些现成的blockUI.Boxy.tipswindow等的jQuery弹出层插件,可是我的要求并不高,只需要在保存后弹出提示信息即可,至于复杂点的弹出层-可以编辑的,我是直接用bootst ...

  2. js中各种跨域问题实战小结(一)

    什么是跨域?为什么要实现跨域呢? 这是因为JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.也就是说只能访问同一个域中的资源.我觉得这就有必要了解下javascript中的同源策略 ...

  3. Bias and Variance

    以下内容参考 cousera 吴恩达 机器学习课程 1. Bias 和 Variance 的定义 Bias and Variance 对于改进算法具有很大的帮助作用,在bias和Variance的指引 ...

  4. 人工神经网络(ANN)

    参考资料:http://www.cnblogs.com/subconscious/p/5058741.html 从函数上来看,神经网络是回归方程的级联叠加,用来逼近目标函数的,本质是一种模拟特征与目标 ...

  5. 闹钟类app构想

    NABC--闹钟app N:我们打算针对那些易健忘的人来制作一款闹钟功能的记事本,具来说服务的对象有很多:有健忘的人,还有情侣,北漂的人及其父母(...),常年见不到亲人(双方),后期我们若提前完成基 ...

  6. linux内核书籍

    1, 关于操作系统理论的最初级的知识.不需要通读并理解<操作系统概念><现代操作系统>等巨著,但总要知道分时(time-shared)和实时(real-time)的区别是什么, ...

  7. Selenium 自动化验收测试

    Web 应用程序的验收测试常常涉及一些手工任务,例如打开一个浏览器,并执行一个测试用例中所描述的操作.但是手工执行的任务容易出现操作人员人为的错误,也比较费时间.因此,尽可能将这些任务自动化,以消除人 ...

  8. 个人-GIT使用方法

    团队开发中,遵循一个合理.清晰的Git使用流程,是非常重要的. 1.Git库中由三部分组成        Git 仓库就是那个.git 目录,其中存放的是我们所提交的文档索引内容,Git 可基于文档索 ...

  9. kubernets kubevirt 分析

    目前kubevirt提供虚机管理的功能. kill, delete, shutdown, migration 等. VMI是virtual machine interface的缩写. SyncVMI, ...

  10. Linux 编译安装R语言

    一.安装依赖包 yum install -y gcc gcc-gfortran glibc-headers readline-devel libXt-devel gcc-c++ xz-devel.x8 ...