在Vmware ESXi 主机上关闭无响应的虚拟机电源或者重新启动

  • 在 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


 

警告:请按顺序执行本文各节及各步骤中的操作。请勿跳过其中的某节或某步骤,因为每个步骤可能都会对虚拟机产生影响。

关闭虚拟机的电源

要确定是否必须使用命令行,请尝试关闭虚拟机电源:

  1. 将 VMware Infrastructure/vSphere Client 连接到 vCenter Server。右键单击虚拟机,然后单击关闭电源
  2. 将 vSphere Client 直接连接到 ESX 主机。右键单击虚拟机,然后单击关闭电源

    如果此方法不起作用,则必须使用命令行方法。

确定该虚拟机的状态

  1. 确定正在运行虚拟机的主机。在 vSphere Client 页面中查看时,该虚拟机的摘要选项卡上提供了此信息。
  2. 使用 SSH 客户端以 root 身份登录 ESX 主机。
  3. 运行以下命令以验证虚拟机是否正在此主机上运行:

    # vmware-cmd -l

    此命令的输出会返回在 ESX 主机上运行的每个虚拟机的完整路径。验证是否已列出该虚拟机并记录在此过程中使用的完整路径。例如:

    # /vmfs/volumes/<UUID>/<VMDIR>/<VMNAME>.vmx
     
  4. 运行以下命令以确定 ESX 主机认为该虚拟机将运行的状态:

    # vmware-cmd <path.vmx> getstate

    如果此命令的输出为 getstate() = on,则 vCenter Server 可能无法与主机正确通信。必须解决此问题才能完成关闭过程。

    如果此命令的输出为 getstate() = off,则 ESX 主机可能无法确定是否仍在运行虚拟机。本文提供了解决此问题的其他帮助。

 

使用 vmware-cmd 命令关闭虚拟机电源

警告:如果要收集虚拟机日志以帮助进行故障排除,请勿执行本部分中的步骤。

此过程使用 ESX 命令行工具并尝试正常关闭虚拟机电源。如果虚拟机进程正在正确运行且可以访问虚拟机,则此过程会起作用。如果不成功,则虚拟机过程可能未在正确运行,并且可能需要进一步进行故障排除。

  1. 从 ESX 主机的服务控制台运行以下命令:

    vmware-cmd <path.vmx> stop

    注意:<path.vmx> 是配置文件的完整路径,由上一部分所确定。要验证是否已停止,请运行以下命令:

    # vmware-cmd <path.vmx> getstate
     
  2. 从 ESX 主机的服务控制台运行以下命令:

    # vmware-cmd <path.vmx> stop hard

    注意:<path.vmx> 是配置文件的完整路径,由上一部分所确定。要验证是否已停止,请运行以下命令:

    # vmware-cmd <path.vmx> getstate
     
  3. 如果虚拟机仍无法访问,则继续下一部分。

 

在使用 vm-support 脚本收集诊断信息时关闭虚拟机电源

如果要调查问题的原因,请使用此过程。此命令会尝试在收集诊断信息时关闭虚拟机电源。请按顺序执行这些步骤,因为它们是按错误执行对系统造成的潜在影响大小的顺序列出的。

首先执行这些步骤:

  1. 使用以下命令确定虚拟机的域 ID:

    # vm-support -x
     

  2. 在主机的根目录下使用以下命令终止该 World_ID 的虚拟机:


    # vm-support -X <world_ID>

    可能需要花费 30 分钟以上的时间才能终止该虚拟机。请耐心等待以免发生损坏。

    注意:此命令使用多种不同方法来停止虚拟机。在尝试每种方法时,该命令都会等待预定的一段时间。通过向 vm-support 命令添加 -d0 开关可将超时值配置为 0。
     

    如果之前的步骤失败,请针对 ESX 3.x 主机执行以下步骤:
     

    1. 使用以下命令列出所有正在运行的虚拟机以查找受影响的虚拟机的 VMID:

      # cat /proc/vmware/vm/*/names
       
    2. 使用以下命令确定主域 ID:

      # cat /proc/vmware/vm/####/cpu/status | less
       

    3. 使用箭头键滚动至右侧直至出现组字段。显示类似于:

      Group
      vm.####
       

    4. 运行以下命令以关闭具有组 ID 的虚拟机:

      # /usr/lib/vmware/bin/vmkload_app -k 9 ####

如果之前的步骤失败,请针对 ESX 4.x 主机执行以下步骤:
 

  1. 使用以下命令列出所有正在运行的虚拟机以查找受影响的虚拟机的 vmxCartelID:

    # /usr/lib/vmware/bin/vmdumper -l
     
  2. 滚动列表直至出现您的虚拟机名称。显示的输出类似于以下内容:

    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=####
     

  3. 运行以下命令以关闭具有组 vmxCartelID 的虚拟机:

    # /usr/lib/vmware/bin/vmkload_app -k 9 ####

 

使用 ESX 命令行终止虚拟机

如果使用本文中的步骤无法关闭虚拟机电源,则很可能虚拟机对其进程失去控制。必须在命令行手动终止进程。

警告:此过程可能会给 ESX 主机带来危险。如果您未能识别出正确的进程 ID (PID),并因此而终止了错误的进程,则可能会产生意料不到的结果。如果您不熟悉这些过程,请联系 VMware 技术支持并打开 Service Request。在创建 SR 时请参考本文。
 

  1. 要确定该虚拟机进程是否正在 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 进程,则可能虚拟机已对该进程失去控制,并且必须手动停止。
     
  2. 要结束该进程,请运行以下命令:

    # kill <PID>
     
  3. 等待 30 秒后再次检查该进程。
  4. 如果该进程未终止,请运行以下命令:

    # kill -9 <PID>
     
  5. 等待 30 秒后再次检查该进程。
  6. 如果可以,可能需要将虚拟机迁移到其他主机,并尝试从该主机发出终止指令。
  7. 如果该进程未终止,则可能需要重新引导 ESX 主机才能清除该进程。这是最后一个不得已的选择,只有在本文之前的步骤均不成功时才应尝试此步骤。

https://kb.vmware.com/s/article/1004340?lang=zh_cn

标签
菜单分类