我在两台 Ubuntu PC 上分别安装了 KVM 并创建了一些虚拟机。每台 PC 上的所有虚拟机都应该能够互相看到,因此我无法使用 KVM 分配给它们的私有 IP,据我所知,这需要创建桥接才能使它们的 IP 相互可见。两台机器通过路由器相互连接。
现在我想将其中一个虚拟机从一侧迁移到另一侧。但最初定义的 IP 地址应保持不变。在这些条件下是否可以进行实时迁移?如果不行,或者您知道其他更好的方法,请提供建议。
答案1
实时迁移是将正在运行的虚拟机 (VM) 从一台物理服务器迁移到另一台物理服务器的过程,同时不会中断虚拟机对用户的可用性。VM 实时迁移的目标是能够在 VM 上执行维护或升级,而不会让虚拟机的任何用户在迁移过程中遇到停机时间。实时迁移也称为无缝实时迁移,因为在迁移过程中最终用户不会遇到明显的停机时间。
要求:
- 支持硬件虚拟化。
- 使用同一制造商的处理器。例如,全部使用 AMD 或全部使用 Intel。
- 属于同一个 Active Directory 域,或者属于相互信任的域。
- 必须将虚拟机配置为使用虚拟硬盘或虚拟光纤通道磁盘(无物理磁盘)。
概述:
发生实时迁移设置。在实时迁移设置阶段,源服务器与目标服务器建立连接。此连接将虚拟机配置数据传输到目标服务器。在目标服务器上设置骨架虚拟机,并为目标虚拟机分配内存。
内存页面从源节点传输到目标节点。在实时迁移的第二阶段,分配给迁移虚拟机的内存通过网络复制到目标服务器。此内存称为迁移虚拟机的“工作集”。内存页面为 4 KB。
已修改的页面被转移。实时迁移的第三阶段是内存复制过程,将“测试虚拟机”的剩余已修改内存页面复制到目标服务器。源服务器将虚拟机的 CPU 和设备状态转移到目标服务器。
存储控制权从源服务器移至目标服务器。在实时迁移的第四阶段,与“测试虚拟机”相关的存储(如任何虚拟硬盘文件或通过虚拟光纤通道适配器连接的物理存储)的控制权将转移到目标服务器。
虚拟机在目标服务器上上线。在实时迁移的第五阶段,目标服务器现在拥有“测试虚拟机”的最新工作集,以及对“测试虚拟机”使用的任何存储的访问权限。此时“测试虚拟机”恢复运行。
进行网络清理。在实时迁移的最后阶段,迁移的虚拟机在目标服务器上运行。此时,会向网络交换机发送一条消息。此消息使网络交换机获取迁移的虚拟机的新 MAC 地址,以便往返于“测试虚拟机”的网络流量可以使用正确的交换机端口。
以下变量可能会影响实时迁移速度:
• 要迁移的虚拟机上已修改页面的数量——已修改页面的数量越大,虚拟机保持迁移状态的时间越长。
• 源服务器和目标服务器之间的可用网络带宽。
• 源服务器和目标服务器的硬件配置。
• 源服务器和目标服务器上的负载。
• 服务器和共享存储之间的可用带宽(网络或光纤通道)。
脚步 :
创建 NFS 池存储:NFS 池是 OVP 主机提供的存储资源,供虚拟机用于存储目的。
1.1 设置 NFS 池目录。创建池目录。
# mkdir -p /export/x86-64-kvm-guest-pool
编辑 /etc/exports 以添加相应的导出行。
# cat /etc/exports /export/x86-64-kvm-guest-pool *(rw,no_subtree_check,insecure,no_root_squash)
告诉 NFS 服务器重新加载导出配置文件。
# exportfs –a
1.2 连接到 QEMU 虚拟机管理程序。
# virsh connect qemu:///system
1.3 加载 NFS 池的配置文件。
在加载配置文件之前,建议您验证 POOL_HOST 变量是否包含完全限定名称,而不是 localhost 等本地名称。使用完全限定名称可让虚拟机找到所需的存储资源,即使它们在不同的 OVP 主机之间迁移。
# cat xmlDir/x86-64-kvm-guest-pool.xml <pool type="netfs"> <name>x86-64-kvm-guest-pool</name> <source> <host name='HOST_NAME'/> <dir path='/export/x86-64-kvm-guest-pool/'/> </source> <target> <path>/export/images/</path> </target> </pool> # virsh pool-define xmlDir/x86-64-kvm-guest-pool.xml
注意:使用默认值生成所有示例文件。
# libvirt-xml-examples # ls x86-64-kvm-guest-glusterfs-qcow2.xml x86-64-kvm-guest-local-qcow2.xml x86-64-kvm-guest-nfs-qcow2.xml x86-64-kvm-guest-pool x86-64-kvm-guest-glusterfs-raw.xml x86-64-kvm-guest-local-raw.xml x86-64-kvm-guest-nfs-raw.xml x86-64-kvm-guest-pool.xml
1.4 启动存储池
# virsh pool-start x86-64-kvm-guest-pool
注意:virsh 是用于管理客户虚拟机和虚拟机管理程序的命令行界面工具。virsh 命令行工具基于 libvirt 管理 API 构建,可作为 qemu-kvm 命令和图形 virt-manager 应用程序的替代方案。
1.5 在 x86-64-kvm-guest-pool 存储池上创建存储卷。
# virsh vol-create-as x86-64-kvm-guest-pool x86-64-kvm-guest-vda.raw 10G --format raw
在源服务器上启动虚拟机。
2.1 创建 Linux Bridge 以连接到虚拟机
brctl addbr <BRIDGE_NAME> ifconfig <INTERFACE_NAME> 0.0.0.0 promisc up brctl addif <BRIDGE_NAME> <INTERFACE_NAME> ifconfig <BRIDGE_NAME> <BRIDGE_IP> up
2.2 编辑虚拟机配置文件。
# cp x86-64-kvm-guest-nfs-raw.xml <NAME_FOR_CONF_FILE>.xml #vim <NAME_FOR_CONF_FILE>.xml <domain type='kvm'> <name>L2_VM2</name> -name for VM ……… <cpu mode='custom' match='exact'> <model fallback='allow'>Conroe</model> <topology sockets='1' cores='3' threads='1'/> - assign vcpus to VM </cpu> …….. <devices> <emulator>/usr/bin/kvm</emulator> <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='….*iso' startupPolicy='optional'> - mention ISO file </source> <target dev='hdc' bus='ide'/> <readonly/> <serial></serial> <boot order='1'/> <alias name='ide0-1-0'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk>
…….. --.在此处分配 1.5 节中创建的 VDA 存储 …….. - 为 2.1 节中创建的桥接器分配名称 - 对于每个虚拟机都是唯一的
2.3 启动虚拟机。
2.3.1 连接到 qemu 虚拟机管理程序。
# virsh connect qemu:///system
2.3.2 加载虚拟机配置文件。
#virsh define xmlDir/x86-64-kvm-guest-nfs-raw.xml - created in section 2.2
2.3.3 启动虚拟机。
这是虚拟机首次启动以加载安装程序的映像。安装客户机映像。
#virsh start VM_NAME
验证虚拟机是否正在运行。#virsh list Id Name State ---------------------------------------------------- 8 x86-64-kvm-guest running 可以使用 vnc 会话访问虚拟机的 GUI:- vnc 端口 5900。
2.4.4 操作系统安装成功后,编辑虚拟机配置文件。
<devices> <emulator>/usr/bin/kvm</emulator> <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='….*iso' startupPolicy='optional'> - remove ISO file name . </source> <target dev='hdc' bus='ide'/> <readonly/> <serial></serial> <boot order='1'/> <alias name='ide0-1-0'/>
按照2.3节中提到的步骤启动虚拟机。
正在迁移虚拟机。
本练习假设虚拟机 x86-64-kvm-guest 在 OVP 节点 SOURCE_HOST 上运行,并将实时迁移到 OVP 节点 TARGET_HOST。在继续本节之前,请验证两台机器是否可以相互访问。
3.1 在 TARGET_HOST 上创建与第 2.1 节中创建的同名桥。
3.2 在 TARGET_HOST 上启用共享 NFS 池。
# scp xmlDir/x86-64-kvm-guest-pool.xml root@TARGET_HOST_IP:xmlDir.
按照 Target_HOST 上的 1.3 和 1.4 节进行操作。
3.3 在 SOURCE_HOST 上开始迁移。
# virsh migrate --live \ --p2p \ // interface name used for migration --verbose \ --x86-64-kvm-guest \ qemu+tcp://TARGET_HOST/system
验证迁移是否成功。在 TARGET_HOST 上运行命令。
#virsh list Id Name State ---------------------------------------------------- 8 x86-64-kvm-guest running