基于 NFS 共享存储的 KVM Live Migration

先上一个 三台 CentOS7 虚拟机在 两台 Ubuntu 1904 KVM Host 上相互切换的截屏。 (使用的 terminal 是 Win7 上 Cygwin64 Mintty )

环境:
两台 Lenovo X220 笔记本 ( hostname 分别为 x220-01 和 x220-04 ) 安装了 Ubuntu 1904 ,分别安装 KVM 相关的软件(virt-manager 必须安装,否则 libvirtd 不会进入 systemd ,服务不会安装),KVM Host 上都安装并启用了 avahi-daemon ,我们无需修改 /etc/hosts 文件, 也无需记忆 IP 地址,就可以直接用 hostname.local 的方式存取 KVM Host。

Guest 都是 CentOS7 版本, 也都安装了 Avahi-daemon , 理由同上。 所有 guest 都采用 Bridge 方式, 内部配置静态地址。

libvirtd 配置成 tcp 方式,并且无需验证,如果用 ssh 存在名字解析问题,然后如果用 –p2p –tunnlled 需要 root key ,觉得麻烦和不安全,就用 tcp 了,如果 TCP 需要加密参见这篇文章:为 libvirtd 添加加密的 TCP 连接
配置 tcp 方式, 无非修改就是两个文件 /etc/default/libvirtd ,设置

libvirtd_opts=”-l”

另外就是修改 /etc/libvirt/libvirtd.conf

listen_tls = 0
listen_tcp = 1
mdns_adv = 1
mdns_name = "KVM on X220-04"
auth_tcp = "none"

然后重启 libvirtd 即可。

NFS 必须在某一台机器上配置好,因为之前就有跑 NFS在一台 Dell 的 PC 上,所以 NFS 的安装就略过不表了。 假定 磁盘路径在 /opt/kvm_disk 下,那么 NFS 服务器上, 修改 /etc/exports 文件后,运行 exportfs -arv 即可把路径 export 出去了,我的一行路径如下:
/opt/kvm_disks *(rw,async,nohide,insecure_locks,no_subtree_check,no_root_squash)

注意, 遇到权限以及其他 NFS 相关的问题, 请参考以上参数, 特别是 no_root_squash 之类的。

遇到网络问题, exportfs 挂住时,考虑运行:
echo > /var/lib/nfs/rmtab

然后在 HOST 上挂接就很简单了, mount.nfs4 nfs-server:/opt/kvm_disk /opt/kvm_disk

定义 storage pool 并定义成自动启动,非常重要!
就算主机最初没有 mount NFS 挂接点,如果 virsh pool-start 的话, 主机就会自动挂接指定的存储!

01 <pool type='netfs'>
02    <name>virtstore </name>
03     <source>
04        <host name='192.168.1.1'/>
05        <dir path='/virtstore'/>
06        <format type='nfs'/>
07     </source>
08     <target>
09        <path>/virtstore</path>
10        <permissions>
11           <mode>0755</mode>
12           <owner>-1</owner>
13           <group>-1</group>
14        </permissions>
15     </target>
16 </pool>

我自己的例子,根据以上修改以后生成一个 nfs-pool.xml 文件, 
# virsh pool-define nfs-pool.xml
# virsh pool-autostart nfspool
就可以看到下面的截屏了:


NFS Storage Pool 的完整操作流程(在每台 HOST 上都做好一样的定义):


在迁移的过程中, 会遇到错误,报告:

error: Unsafe migration:
  Migration may lead to data corruption
  if discs use cache! = none

这里就比较 tricky , 我们直接用 virsh edit vm-name 修改其中的 磁盘的 drive 那一行, 添加 cache=’none’ 是无效的。
<driver name='qemu' type='qcow2' cache='none'/>
解决的办法是 virsh dumpxml guest-domainname,修改 xml 文件,去掉 uuid 那一行, 重新从 xml 文件 create 虚拟机即可。

Redhat 的文档,详细描述了 迁移中遇到的一些问题,我也都遇到了, 所以前面已经提到,放弃 qemu+ssh,而简单粗暴的采用了无需认证的 tcp 方式(就好像你去访问一个 http 网页无需认证一样)。

以下就是把三台虚拟机 centos-0[6-8] 先后从 x220-01 迁移到 x220-04 Host 的命令:

$ T=x220-04.local;virsh list –all; for D in 06 07 08 ; do virsh migrate centos-$D qemu+tcp://$T/system tcp://$T; done; virsh list –all

在基于 NFS 存储的系统中,如果遇到需要重启 NFS 服务器,一定要先把KVM Host 上的 nfspool destroy 掉(这就要求先把虚拟机迁移到另外一个 nfspool 上),否则服务端会一直处于等待客户端停止挂接。

== 关于 NFS 客户端的问题,另外有一篇后来补充的文章:NFS 4 的挂接
不要让 KVM 中的 pool Auto-Start !!! 命令是
# virsh pool-autostart –disable poolname
=========================================================
lshw 是一个不错的检查服务器硬件的命令,利用 json 输出,可以做不太频繁的 CMDB 的服务器配置检查

本公司服务号二维码:



本公司技术文章订阅号二维码:

欢迎关注以上订阅号和服务号, 如果有技术和项目相关咨询, 也可以通过 QQ 号 8122093 添加个人微信。

作者: 甬洁网络

--移动互联网&物联网技术提供商