4.4. 使用 virsh 进行实时 KVM 迁移
可以使用 virsh 命令将客户机虚拟机迁移到另一台主机物理机器。migrate 命令接受以下格式的参数:
# virsh migrate --live GuestName DestinationURL
请注意,如果不需要实时迁移,可以删除
--live
选项。其它选项在 第 4.4.2 节 “virsh migrate 命令的其它选项” 中列出。
GuestName
参数代表您要迁移的客户机虚拟机的名称。
DestinationURL
参数是目标主机物理机器的连接 URL。目标系统必须运行与 Red Hat Enterprise Linux 相同的版本,它使用相同的虚拟机监控程序,且在 libvirt 正在运行。
注意
用于正常迁移和对等迁移的
DestinationURL
参数有不同的语义:
- 常规迁移:
DestinationURL
是目标主机物理机器的 URL,如源客户机虚拟机中看到。 - peer-to-peer migration:
DestinationURL
是目标主机物理机器的 URL,如源主机物理机器所示。
输入完该命令后,会提示您输入目标系统的 root 密码。
重要
在源服务器上的
/etc/hosts
文件中,需要有目标主机物理机器的条目才能成功迁移。在此文件中输入目标主机物理机器的 IP 地址和主机名,如下例所示,替换您的目标主机物理机器的 IP 地址和主机名:
10.0.0.20 host2.example.com
示例:使用 virsh 进行实时迁移
本例从 host1.example.com
迁移到 host2.example.com
。更改您的环境的主机物理机器名称。本例迁移一个名为 guest1-rhel6-64
的虚拟机。
这个示例假设您已完全配置共享存储并满足所有先决条件(在此列出: 迁移要求)。
验证客户机虚拟机正在运行
从源系统host1.example.com
,验证guest1-rhel6-64
是否正在运行:[root@host1 ~]# virsh list Id Name State ---------------------------------- 10 guest1-rhel6-64 running
迁移客户机虚拟机
执行以下命令,将 guest 虚拟机实时迁移到目的地host2.example.com
。在目标 URL 的末尾附加/system
,以告知 libvirt 您需要完全访问。# virsh migrate --live
guest1-rhel6-64 qemu+ssh://host2.example.com/system
输入完该命令后,系统将提示您输入目标系统的 root 密码。Wait
根据负载和客户机虚拟机的大小,迁移可能需要一些时间。virsh 仅报告错误.在完全迁移前,客户机虚拟机将继续在源主机物理机器中运行。注意在迁移过程中,完成百分比指示符数可能会在进程完成前减少多次。这是因为重新计算整个进度造成的,因为需要再次复制迁移后更改的源内存页面。因此,此行为是预期的,并不代表迁移中的任何问题。验证客户机虚拟机已到达目标主机
从目标系统host2.example.com
,验证guest1-rhel6-64
是否正在运行:[root@host2 ~]# virsh list Id Name State ---------------------------------- 10 guest1-rhel6-64 running
实时迁移现已完成。
注意
libvirt 支持各种网络方法,包括 TLS/SSL、UNIX 套接字、SSH 和未加密 TCP。有关使用其它方法的详情,请参考 第 5 章 客户机的远程管理。
注意
无法使用 virsh migrate 命令迁移非运行 guest 虚拟机。要迁移非运行的客户机虚拟机,应使用以下脚本:
virsh dumpxml Guest1 > Guest1.xml virsh -c qemu+ssh://<target-system-FQDN> define Guest1.xml virsh undefine Guest1
4.4.1. 使用 virsh 进行迁移的额外提示
每次迁移在单独的命令 shell 中运行时,可以执行多个并发实时迁移。但是,这要小心谨慎,并且应谨慎地进行计算,因为每个迁移实例各自使用一个 MAX_CLIENT(源和目标)。由于默认设置为 20,在不更改设置的情况下运行 10 个实例。如果您需要更改设置,请参阅 过程 4.1, “Configuring libvirtd.conf” 过程。
- 打开 libvirtd.conf 文件,如 过程 4.1, “Configuring libvirtd.conf” 所述。
- 查找处理控制部分。
################################################################# # # Processing controls # # The maximum number of concurrent client connections to allow # over all sockets combined. #max_clients = 20 # The minimum limit sets the number of workers to start up # initially. If the number of active clients exceeds this, # then more threads are spawned, upto max_workers limit. # Typically you'd want max_workers to equal maximum number # of clients allowed #min_workers = 5 #max_workers = 20 # The number of priority workers. If all workers from above # pool will stuck, some calls marked as high priority # (notably domainDestroy) can be executed in this pool. #prio_workers = 5 # Total global limit on concurrent RPC calls. Should be # at least as large as max_workers. Beyond this, RPC requests # will be read into memory and queued. This directly impact # memory usage, currently each request requires 256 KB of # memory. So by default upto 5 MB of memory is used # # XXX this isn't actually enforced yet, only the per-client # limit is used so far #max_requests = 20 # Limit on concurrent requests from a single client # connection. To avoid one client monopolizing the server # this should be a small fraction of the global max_requests # and max_workers parameter #max_client_requests = 5 #################################################################
- 更改
max_clients
和max_workers
参数设置。建议两个参数中的数字都是相同的。max_clients
将每迁移(每个一侧)使用 2 个客户端(每个一侧),在目标执行阶段,并在完成阶段的 0 个 worker 中使用 1 个 worker。max_workers
重要max_clients
和max_workers
参数设置适用于所有向 libvirtd 服务的连接的客户机虚拟机。这意味着,使用同一客户机虚拟机的任何用户,并同时执行迁移将保留至max_clients
和max_workers
参数设置中设置的限值。这就是为什么在执行并发实时迁移前需要仔细考虑最大值。 - 保存文件并重启该服务。注意有些情况下,迁移连接会丢弃,因为已启动但尚未进行身份验证的 ssh 会话太多。默认情况下,
sshd
允许任何时候都允许 10 个会话处于"预先身份验证的状态"。此设置由 sshd 配置文件中的MaxStartups
参数控制(在此位置:/etc/ssh/sshd_config
),这可能需要进行一些调整。应谨慎调整这个参数,因为限制会被实施以防止 DoS 攻击(一般使用资源)。将此值设置为高时,将满足其用途。要更改此参数,请编辑文件/etc/ssh/sshd_config
,从 MaxStartups 行的开头删除 #,并将10
(默认值)改为一个更高的数字。记住保存文件并重新启动sshd
服务。如需更多信息,请参阅sshd_config
man page。