我在一个池中拥有三台 XenServer 6.1 服务器。通常使用 HA,但目前在此操作中已关闭。
最近,我不得不按照以下指令销毁域来强制关闭虚拟机: http://support.citrix.com/article/CTX131421
只是我的命令行似乎没有 destroy_domain 命令。另一篇文章向我指出了完整路径 /opt/xensource/debug/xenops destroy_domain -domid x (http://gimpland.org/now/2013/01/citrix-xenserver-how-to-force-shutdown-virtual-machines/)
它成功了,我能够毫无问题地启动虚拟机。但我发现尝试将虚拟机迁移到池中的任何其他服务器时,大约 30-40 秒后,尝试通过 XenCenter 将虚拟机迁移到池中的另一台主机会产生以下错误:
Migrating VM 'Cleanup 7' from XenBlade5 to XenBlade 6:
Error: Internal error: file "xapi_xenops.ml", line 1740, characters 3-9: Assertion Failed.
VM 现已暂停。尝试恢复它(仍然在原始服务器上,因为它无法移动)会在服务器事件日志中产生以下错误:没有可用的服务器来完成指定的操作。
此外,XenCenter 会弹出一个对话框,提示“启动 VM 时出错”,并针对池中的每个服务器显示一条错误消息,提示“对象已被删除。VDI:OpaqueRef:NULL。服务器将无法恢复。
如果我强制关闭虚拟机,我可能会重新启动它。不幸的是,虚拟机仍然无法迁移,并产生上述相同的错误。
我在我们的一台生产 VM 服务器上发现了这个问题,但这些测试是在一次性 Windows 7 Enterprise VM 上进行的。生产 VM 是 CentOS,所以我认为我没有遇到任何特定于操作系统的问题。这似乎是我上面发出的 destroy_domain 命令的问题。
未使用 destroy_domain 关闭的其他虚拟机可以自由地进出该服务器。
我不是 XenServer 老手,因此非常感谢任何帮助、更正或澄清请求。非常感谢您的帮助!
答案1
从https://github.com/xapi-project/xen-api/blob/fe28d3e3254b1c9928dfb99d75e94e949504dcf7/ocaml/xapi/xapi_xenops.ml,看起来是 v6.1 E017 的源代码,有第 1739 行:
(* XXX: if the guest crashed or shutdown immediately then it may be offline now *)
assert (Db.VM.get_power_state ~__context ~self = (if paused then `Paused else `Running))
我不做 OCAML,也不是 XenServer 专家,但这个断言似乎在一个名为 的方法中start
,它似乎通过检查内部数据库中的电源状态来确保 VM 已启动。我猜是因为您已强制关闭 VM,所以它没有正确更新数据库。
也许第二个链接中的命令将清理数据库:
xe vm-reset-powerstate uuid=<UUID of VM> force=true
否则,您将必须仔细检查日志以查找此操作之前失败的操作,也许在/var/log/xensource.log
?