0%

使用Libvirt进行虚拟机在线迁移

前言

《虚拟机在线迁移实验》一文中提到,迁移过程中的downtime不合理,但是没有找到原因。

本文,我们来使用Libvirt进行虚拟机在线迁移,如果downtime在毫秒级,那么说明问题出在OpenStack上。参考An analysis of the performance of live migration in Openstack的评论部分,可以发现有人遇到的同样的问题,downtime远大于1s。作者的猜测是libvirt的设置引起的,也可能是由于迁移后网络适应速度较慢造成的。

实验环境

参考《使用Libvirt创建虚拟机》一文,在node0和node1两个节点上安装libvirt和qemu,IP分别为192.168.56.200和192.168.56.201。

NFS

要想进行虚拟机的迁移,首先迁出主机(node0)和迁入主机(node1)存放虚拟机磁盘的目录结构要相同。参考OpenStack中共享存储的虚拟机在线迁移的NFS部分,进行NFS配置。

1、在node0安装nfs服务端
apt install nfs-kernel-server

2、编写配置文件
vim /etc/exports
添加如下内容:

1
2
# qemu
/opt/qemu *(rw,sync,no_root_squash)

3、重启nfs服务
service nfs-kernel-server restart

4、在node1安装nfs客户端
apt-get install nfs-common

5、查看共享信息
showmount -e 192.168.56.200

6、挂载nfs目录

1
2
3
mkdir /opt/qemu
mount -t nfs 192.168.56.200:/opt/qemu /opt/qemu
chmod -R 777 /opt/qemu

libvirt端口配置

1、测试连接
virsh -c qemu+tcp://node1/system
提示:

1
2
error: failed to connect to the hypervisor
error: unable to connect to server at 'node1:16509': Connection refused

2、在node0和node1调整libvirt的配置
vim /etc/libvirt/libvirtd.conf,如下修改:

1
2
3
4
5
6
7
8
9
10
# line 22, uncomment
listen_tls = 0
# line 33, uncomment
listen_tcp = 1
# line 45, uncomment
tcp_port = "16509"
# line 55, uncomment and change
listen_addr = "0.0.0.0"
# line 163, uncomment and change
auth_tcp = "none"

3、重启libvirt
service libvirtd restart

4、查看libvirt服务
netstat -anpt | grep libvirt
理论上应该看到监听16509,但是没有。

5、修改libvirt-bin.conf配置(可选)
vim /etc/init/libvirt-bin.conf,如下修改:

1
2
# line 11, add -l
env libvirtd_opts="-d -l"

6、重启libvirt-bin(可选)
service libvirt-bin restart
依然没有监听16509端口。

vim /etc/init/libvirt-bin.conf,如下修改:

1
2
# line 58, add -l
exec /usr/sbin/libvirtd $libvirtd_opts -l

重启libvirt-bin依然无效。

7、还原libvirt-bin.conf,修改libvirt-bin
vim /etc/default/libvirt-bin,如下修改:

1
2
# line 8, uncomment and change
libvirtd_opts="-d -l"

重启libvirt-bin,发现端口监听成功。

8、再次测试连接
virsh -c qemu+tcp://node1/system

连接成功,nice。

免密登录

虚拟机迁移,可以使用普通用户,也可以使用root用户。
如果是普通用户进行迁移,那么在输入迁移命令后,需要输入node1中普通用户的密码。
如果是root用户进行迁移,那么在输入迁移命令后,同样需要输入node1中root用户的密码。但是,root用户并没有启用密码登录,所以,需要给root用户设置免密登录。

1、在node0上创建密钥对
ssh-keygen
所有的提示按enter键即可,完成后在home目录执行ll .ssh,即可看到创建好的id_rsa和id_rsa.pub文件。

2、把公钥拷贝到所有客户机中
ssh-copy-id -i .ssh/id_rsa.pub -p 22 voidking@node1

3、在node1中使用root用户执行
cp -r /home/voidking/.ssh ~

同样的,也给node1添加免密登录node0。

虚拟机迁移

参考kvm虚拟机迁移,进行虚拟机动态迁移。

1、在node0查看虚拟机
virsh list

2、虚拟机迁移
virsh migrate --live --verbose cirros qemu+ssh://node1/system tcp://node1 --unsafe

其中node1可以换成root@node1

后记

本来打算在《Libvirt虚拟机网络配置》一文中配置好网络,使得node0可以访问到node1中的实例,node1可以访问到node0中的实例。但是,配置失败了。所以,就无法测试虚拟机迁移的停机时间了。如果之后解决了桥接的问题,就再来更新。

书签

KVM 虚拟机在物理主机之间迁移的实现

  • 本文作者: 好好学习的郝
  • 本文链接: https://www.voidking.com/dev-libvirt-vm-live-migration/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!源站会及时更新知识点及修正错误,阅读体验也更好。欢迎分享,欢迎收藏~