- 无法在 ESXi 主机上关闭虚拟机电源。
- 虚拟机无响应,且无法强制关闭或停止。
- 无法访问或解锁虚拟机上的文件。
-
在关闭虚拟机后,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
本文提供了关闭或必要时强制启动无响应的虚拟机的步骤。
Resolution
如果从 vSphere Web Client 或 Host Client 关闭虚拟机电源不起作用,则必须使用命令行方法。
确定虚拟机的位置
确定虚拟机运行所在的主机。在 vCenter Web Client 中查看时,此信息在虚拟机的摘要选项卡中。有如下两种方法使用命令行关闭无响应的虚拟机电源:
警告:请按顺序执行本文各节及各步骤中的操作。
使用 ESXi 命令行
- 使用 SSH 以 root 身份登录到 ESXi。
- 通过运行以下命令获取所有已注册虚拟机的列表,由其 VMID 和显示名称标识:
vim-cmd vmsvc/getallvms
- 记下受影响的虚拟机 ID VMID
- 通过运行以下命令获取虚拟机当前的状态:
vim-cmd vmsvc/power.getstate VMID
- 通过运行以下命令检查受影响的虚拟机上是否有挂起的任务阻止了机器开机:
vim-cmd vmsvc/get.tasklist VMID
输出示例:
(ManagedObjectReference) [
'vim.Task:haTask-2-vim.VirtualMachine.createSnapshot-182550283',
'vim.Task:haTask-2-vim.VirtualMachine.consolidateDisks-182550274'
]
'vim.Task:haTask-2-vim.VirtualMachine.createSnapshot-182550283',
'vim.Task:haTask-2-vim.VirtualMachine.consolidateDisks-182550274'
]
- 运行 vim-cmd vimsvc/task_info task_id 命令查看任务的更多信息。
例如使用第 5 步中数据:
vim-cmd vimsvc/task_info haTask-2-vim.VirtualMachine.createSnapshot-182550283
vim-cmd vimsvc/task_info haTask-2-vim.VirtualMachine.createSnapshot-182550283
vim.TaskInfo) {
dynamicType = <unset>,
key = "haTask-2-vim.VirtualMachine.createSnapshot-182550283",
task = 'vim.Task:haTask-2-vim.VirtualMachine.createSnapshot-182550283',
description = (vmodl.LocalizableMessage) null,
name = "vim.VirtualMachine.createSnapshot",
descriptionId = "VirtualMachine.createSnapshot",
entity = 'vim.VirtualMachine:2',
entityName = "VMware vCenter Server Appliance5-1",
state = "running",
cancelled = false,
cancelable = false,
error = (vmodl.MethodFault) null,
result = <unset>,
progress = 50,
reason = (vim.TaskReasonUser) {
dynamicType = <unset>,
userName = "vpxuser",
},
queueTime = "2014-11-09T17:49:01.171933Z",
startTime = "2014-11-09T17:49:01.175521Z",
completeTime = <unset>,
eventChainId = 182550283,
changeTag = <unset>,
parentTaskKey = <unset>,
rootTaskKey = <unset>,
}
dynamicType = <unset>,
key = "haTask-2-vim.VirtualMachine.createSnapshot-182550283",
task = 'vim.Task:haTask-2-vim.VirtualMachine.createSnapshot-182550283',
description = (vmodl.LocalizableMessage) null,
name = "vim.VirtualMachine.createSnapshot",
descriptionId = "VirtualMachine.createSnapshot",
entity = 'vim.VirtualMachine:2',
entityName = "VMware vCenter Server Appliance5-1",
state = "running",
cancelled = false,
cancelable = false,
error = (vmodl.MethodFault) null,
result = <unset>,
progress = 50,
reason = (vim.TaskReasonUser) {
dynamicType = <unset>,
userName = "vpxuser",
},
queueTime = "2014-11-09T17:49:01.171933Z",
startTime = "2014-11-09T17:49:01.175521Z",
completeTime = <unset>,
eventChainId = 182550283,
changeTag = <unset>,
parentTaskKey = <unset>,
rootTaskKey = <unset>,
}
- 任务挂起,需要取消,使用如下命令:
vim-cmd vimsvc/task_cancel task_id
注意:并非所有任务都可以取消。例如在上面的示例中,可以看到快照任务的可取消标志设置为 false (cancelable = false)。
- 使用在步骤 3 中找到的 VMID 并运行以下命令关闭虚拟机:
vim-cmd vmsvc/power.shutdown VMID
注意:如果虚拟机无法关闭,请运行以下命令::
vim-cmd vmsvc/power.off VMID
注意:如果虚拟机无法关闭,请运行以下命令::
vim-cmd vmsvc/power.off VMID
使用 ESXi esxcli 命令
- 使用 SSH 以 root 身份登录到 ESXi。
- 通过运行以下命令获取正在运行的虚拟机列表,由其 World ID 和显示名称标识:
esxcli vm process list
- 记下无响应虚拟机的 World ID。例如,在第 3 步中,World ID 是 750434。
- 通过运行以下命令之一关闭列表中的虚拟机:
- esxcli vm process kill -t=soft -w=WorldID
- esxcli vm process kill -t=hard -w=WorldID
- esxcli vm process kill -t=force -w=WorldID
注意:这些命令提供了虚拟机强制停止的不同级别的:
- Soft 是最安全的
- Hard 是立即关闭
- Force 是最后的手段
https://kb.vmware.com/s/article/1004340?lang=zh_CN