- 症状
QEMU 客户机代理失败,并显示这个错误消息:
# virsh migrate qemu qemu+tcp://192.168.122.12/system
error: Unable to resolve address name_of_host service '49155': Name or service not known
例如,如果目标主机名是 newyork
,则错误消息会显示如下:
# virsh migrate qemu qemu+tcp://192.168.122.12/system
error: Unable to resolve address 'newyork' service '49155': Name or service not known
但是,这个错误看上去有些奇怪,因为我们没有在任何位置使用 newyork
主机名。
- 正在调查
在迁移过程中,在目标主机上运行的 libvirtd 从地址和端口创建一个 URI,用于接收迁移数据并将其发回源主机上运行的 libvirtd。
在这种情况下,目标主机(192.168.122.12)
的名称被设置为 'newyork'。出于某种原因,在该主机上运行的虚拟机的 libvirtd 无法将名称解析为可以返回并仍然有用的 IP 地址。因此,它会在解析名称时返回 "newyork "主机名希望源 libvirtd 更加成功。如果 DNS 没有被正确配置,或者 /etc/hosts
具有与本地回环地址(127.0.0.1
)关联的主机名,则可能会出现此情况。
请注意,无法从连接到目标 libvirtd 的地址自动决定用于迁移数据的地址(例如,来自 qemu+tcp://192.168.122.12/system
)。这是因为,要与目标 libvirtd 通信,源 libvirtd 可能需要使用与 virsh (可能在独立计算机上运行)类型不同的网络基础架构。
- 解决方案
最佳解决方案是正确配置 DNS,以便涉及迁移的所有主机都可以解析所有主机名。
如果 DNS 无法配置为执行此操作,则可以手动将用于迁移的每个主机添加到每个主机上的 /etc/hosts
文件中。但是,在动态环境中让这类列表保持一致非常困难。
如果主机名不能被任何途径解析,virsh migrate 支持指定迁移主机:
# virsh migrate qemu qemu+tcp://192.168.122.12/system tcp://192.168.122.12
目的地 libvirtd 将采用 tcp://192.168.122.12
URI,并附加自动生成的端口号。如果这不是理想的情况(例如,由于防火墙配置),可在此命令中指定端口号:
# virsh migrate qemu qemu+tcp://192.168.122.12/system tcp://192.168.122.12:12345
另一种选择是使用隧道迁移。隧道的迁移不会为迁移数据创建单独的连接,而是通过用于连接目标 libvirtd 的连接(例如 qemu+tcp://192.168.122.12/system
):
# virsh migrate qemu qemu+tcp://192.168.122.12/system --p2p --tunnelled