- 在 ESX 主机上关闭虚拟机电源。
- 虚拟机无响应,且无法停止或终止。
- 无法访问或解锁虚拟机上的文件。
-
在关闭虚拟机后,vCenter Server 显示虚拟机已启动且正在运行。
-
不指示虚拟机已关闭。
-
无法在虚拟机中编辑属性。
- 会显示以下错误中的一个或多个:
- Soap error 999. The operation is not allowed in current state.
- The attempted operation cannot be performed in the current state (Powered Off).
- The request refers to an object that no longer exists or has never existed
Purpose
本文提供了关闭(如果需要)或停止无响应的虚拟机的正确顺序。
注意:本文仅涉及 ESX,并不适用于 ESXi。有关 ESXi 主机的信息,请参见 Powering off a virtual machine on an ESXi host (1014165)。
Resolution
警告:请按顺序执行本文各节及各步骤中的操作。请勿跳过其中的某节或某步骤,因为每个步骤可能都会对虚拟机产生影响。
关闭虚拟机的电源
要确定是否必须使用命令行,请尝试关闭虚拟机电源:
- 将 VMware Infrastructure/vSphere Client 连接到 vCenter Server。右键单击虚拟机,然后单击关闭电源。
- 将 vSphere Client 直接连接到 ESX 主机。右键单击虚拟机,然后单击关闭电源。
如果此方法不起作用,则必须使用命令行方法。
确定该虚拟机的状态
- 确定正在运行虚拟机的主机。在 vSphere Client 页面中查看时,该虚拟机的摘要选项卡上提供了此信息。
- 使用 SSH 客户端以 root 身份登录 ESX 主机。
- 运行以下命令以验证虚拟机是否正在此主机上运行:
# vmware-cmd -l
此命令的输出会返回在 ESX 主机上运行的每个虚拟机的完整路径。验证是否已列出该虚拟机并记录在此过程中使用的完整路径。例如:
# /vmfs/volumes/<UUID>/<VMDIR>/<VMNAME>.vmx
- 运行以下命令以确定 ESX 主机认为该虚拟机将运行的状态:
# vmware-cmd <path.vmx> getstate
如果此命令的输出为 getstate() = on,则 vCenter Server 可能无法与主机正确通信。必须解决此问题才能完成关闭过程。
如果此命令的输出为 getstate() = off,则 ESX 主机可能无法确定是否仍在运行虚拟机。本文提供了解决此问题的其他帮助。
使用 vmware-cmd 命令关闭虚拟机电源
警告:如果要收集虚拟机日志以帮助进行故障排除,请勿执行本部分中的步骤。
此过程使用 ESX 命令行工具并尝试正常关闭虚拟机电源。如果虚拟机进程正在正确运行且可以访问虚拟机,则此过程会起作用。如果不成功,则虚拟机过程可能未在正确运行,并且可能需要进一步进行故障排除。
- 从 ESX 主机的服务控制台运行以下命令:
vmware-cmd <path.vmx> stop
注意:<path.vmx> 是配置文件的完整路径,由上一部分所确定。要验证是否已停止,请运行以下命令:
# vmware-cmd <path.vmx> getstate
- 从 ESX 主机的服务控制台运行以下命令:
# vmware-cmd <path.vmx> stop hard
注意:<path.vmx> 是配置文件的完整路径,由上一部分所确定。要验证是否已停止,请运行以下命令:
# vmware-cmd <path.vmx> getstate
- 如果虚拟机仍无法访问,则继续下一部分。
在使用 vm-support 脚本收集诊断信息时关闭虚拟机电源
如果要调查问题的原因,请使用此过程。此命令会尝试在收集诊断信息时关闭虚拟机电源。请按顺序执行这些步骤,因为它们是按错误执行对系统造成的潜在影响大小的顺序列出的。
首先执行这些步骤:
-
使用以下命令确定虚拟机的域 ID:
# vm-support -x
-
在主机的根目录下使用以下命令终止该 World_ID 的虚拟机:
# vm-support -X <world_ID>
可能需要花费 30 分钟以上的时间才能终止该虚拟机。请耐心等待以免发生损坏。
注意:此命令使用多种不同方法来停止虚拟机。在尝试每种方法时,该命令都会等待预定的一段时间。通过向 vm-support 命令添加 -d0 开关可将超时值配置为 0。
如果之前的步骤失败,请针对 ESX 3.x 主机执行以下步骤:
- 使用以下命令列出所有正在运行的虚拟机以查找受影响的虚拟机的 VMID:
# cat /proc/vmware/vm/*/names
-
使用以下命令确定主域 ID:
# cat /proc/vmware/vm/####/cpu/status | less
-
使用箭头键滚动至右侧直至出现组字段。显示类似于:
Group
vm.####
-
运行以下命令以关闭具有组 ID 的虚拟机:
# /usr/lib/vmware/bin/vmkload_app -k 9 ####
- 使用以下命令列出所有正在运行的虚拟机以查找受影响的虚拟机的 VMID:
如果之前的步骤失败,请针对 ESX 4.x 主机执行以下步骤:
- 使用以下命令列出所有正在运行的虚拟机以查找受影响的虚拟机的 vmxCartelID:
# /usr/lib/vmware/bin/vmdumper -l
滚动列表直至出现您的虚拟机名称。显示的输出类似于以下内容:
vmid=5151 pid=-1 cfgFile="/vmfs/volumes/4a16a48a-d807aa7e-e674-001e4ffc52e9/mdineeen_test/vm_test.vmx" uuid="56 4d a6 db 0a e2 e5 3e-a9 2b 31 4b 69 29 15 19" displayName="vm_test" vmxCartelID=####
运行以下命令以关闭具有组 vmxCartelID 的虚拟机:
# /usr/lib/vmware/bin/vmkload_app -k 9 ####
使用 ESX 命令行终止虚拟机
如果使用本文中的步骤无法关闭虚拟机电源,则很可能虚拟机对其进程失去控制。必须在命令行手动终止进程。
警告:此过程可能会给 ESX 主机带来危险。如果您未能识别出正确的进程 ID (PID),并因此而终止了错误的进程,则可能会产生意料不到的结果。如果您不熟悉这些过程,请联系 VMware 技术支持并打开 Service Request。在创建 SR 时请参考本文。
- 要确定该虚拟机进程是否正在 ESX 主机上运行,请运行以下命令:
# ps auxwww | grep -i <VMNAME>.vmx
如果 .vmx 进程正在运行,则此命令的输出显示类似于以下内容:
root 3093 0.0 0.3 2016 860 ?S< Jul30 0:17 /usr/lib/vmware/bin/vmkload_app /usr/lib/vmware/bin/vmware-vmx -ssched.group=host/user -# name=VMware ESX Server;version=3.5.0;licensename=VMware ESX Server;licenseversion=2.0 build-158874; -@ pipe=/tmp/vmhsdaemon-0/vmx569228e44baf49d1; /vmfs/volumes/49392e30-162037d0-17c6-001f29e9abec/<VMDIR>/<VMNAME>.vmx
此进程的进程 ID (PID) 以粗体显示。在此示例中,PID 为 3093。请记下此编号以便在以下步骤中使用。
警告:请确保您识别的是特定于您尝试修复的虚拟机的行。如果对该虚拟机以外的虚拟机继续执行此过程,则可能会导致其他虚拟机停机。
如果已列出 .vmx 进程,则可能虚拟机已对该进程失去控制,并且必须手动停止。
- 要结束该进程,请运行以下命令:
# kill <PID>
- 等待 30 秒后再次检查该进程。
- 如果该进程未终止,请运行以下命令:
# kill -9 <PID>
- 等待 30 秒后再次检查该进程。
- 如果可以,可能需要将虚拟机迁移到其他主机,并尝试从该主机发出终止指令。
- 如果该进程未终止,则可能需要重新引导 ESX 主机才能清除该进程。这是最后一个不得已的选择,只有在本文之前的步骤均不成功时才应尝试此步骤。
https://kb.vmware.com/s/article/1004340?lang=zh_cn