VMMigration借助virsh实现管理主机上远程控制虚拟机在两台采用本地存储方式的物理机上进行在线迁移的需求。
VMMigration由vmmigration和vmmigration-agent两部分组成,分别用于部署在管理机和受控物理机上。
- 代理:Agent,主要负责接收控制器发来的指令(封装在json格式的消息中),解析并在本地执行相关的命令,部署在需要迁移的源、目的物理机上
- 控制器:Controller,主要负责发送指令,和接收代理执行指令的结果
- 管理机:用于管理物理机的机器,除了需要迁移的源、目的物理机外的第三台机器
- vmmigration.py:控制器命令,部署在管理机上,根据输入的参数,向代理发送消息指示其进行虚拟机迁移,调用controller.py
- vmmigration-agent.py:代理命令,分别部署在需要迁移的源、目的物理机上,监听控制器发来的消息并在本地执行命令,调用agent.py
- controller.py:控制器类,定义消息的发送、接收、处理。调用udpmodule.py
- agent.py:代理类,定义消息的发送、接收、处理。调用udpmodule.py
- constant.py:常量定义,包括指令、虚拟机磁盘文件路径、合法IP地址列表、Agent和Controller的监听端口
- udpmodule.py:UDP发送、接收的实现
- ControllerIPAddr.txt:合法控制器的IP地址,被Agent.py使用
- AgentIPAddr.txt:合法的代理IP地址,被Controller.py使用
- 必装
- ssh:scp和virsh需要依赖ssh服务
- scp:用于拷贝虚拟机磁盘文件
- virsh:用于迁移虚拟机
- 可选
- virt-manager:虚拟机管理可视化界面,方便观察迁移的过程
- ssh免密码访问:需要迁移的物理机之间需要设置ssh免密码访问,如源物理机需要能够ssh免密码访问目的物理机
- 目录提权:虚拟机磁盘文件、配置文件所在的目录以及文件需要有读写权限,一般KVM虚拟机磁盘文件所在目录:
/var/lib/libvirt/images/
,虚拟机配置文件所在目录:/etc/libvirt/qemu
- 设置合法IP地址:需要在ControllerIPAddr.txt和AgentIPAddr.txt中设置IP地址
- vmmigration命令
python vmmigration.py <src_host_ip> <dst_host_ip> <dst_host_username> <vm_name> <vm_disk_file_path> <vm_conf_file_path>
- src_host_ip:源物理机IP地址
- dst_host_ip:目的物理机IP地址
- dst_host_username:目的物理机用户名
- vm_name:虚拟机名
- vm_disk_file:虚拟机磁盘文件路径
- vm_conf_file:虚拟机配置文件路径
- vmmigration-agent命令
python vmmigration-agent.py
假设需要将虚拟机VM1从kvm-node1在线迁移至kvm-node2,测试环境如下所示:
名称 主机名 IP地址 操作系统
源物理机 kvm-node1 192.168.111.130 ubuntu-16.04.4-desktop
目的物理机 kvm-node2 192.168.111.132 ubuntu-16.04.4-desktop
虚拟机 VM1 192.168.122.18 ubuntu-16.04.3-server
管理机 BOSS 192.168.111.1 win7
在管理机、源物理机、目的物理机上安装好ssh服务(ssh-server、ssh-client),scp命令,virsh命令
- 在源、目的物理机上配置存放虚拟机磁盘文件的目录权限
chmod -R 777 /var/lib/libvirt
- 在目的物理机上配置存放虚拟机配置文件的目录权限
chmod -R 777 /etc/libvirt/qemu
- 在ControllerIPAddr.txt添加控制器IP地址
- 在AgentIPAddr.txt添加代理IP地址
virt-manager
或者使用
virsh list
若显示虚拟机VM1处于"running"状态,说明正在运行
python vmmigration-agent.py
python vmmigration.py 192.168.111.130 192.168.111.132 kvm VM1 /var/lib/libvirt/images/node.qcow2 /etc/libvirt/qemu/VM1.xml
在源物理机上,可通过virt-manager看见VM1已经关闭
在目的物理机上,可通过virt-manager看见VM1已经运行