调查 ESXi/ESX 上的虚拟机文件锁定
search cancel

调查 ESXi/ESX 上的虚拟机文件锁定

book

Article ID: 329226

calendar_today

Updated On:

Products

VMware vCenter Server VMware vSphere ESXi

Issue/Introduction

Symptoms:

免责声明:本文为 Investigating virtual machine file locks on ESXi/ESX (10051) 的翻译版本。尽管我们会不断努力为本文提供最佳翻译版本,但本地化的内容可能会过时。有关最新内容,请参见英文版本。



    • 打开虚拟机电源失败。
    • 无法打开虚拟机电源。
    • 将现有虚拟机磁盘 (VMDK) 添加到已打开电源的虚拟机失败
    • 显示错误:

      无法添加磁盘 scsi0:1。无法打开 scsi0:1 的电源
      (Failed to add disk scsi0:1. Failed to power on scsi0:1)


    • 打开虚拟机电源时,出现下列错误之一:

      • 无法打开交换文件 (Unable to open Swap File)
      • 文件已锁定,无法访问 (Unable to access a file since it is locked)
      • 文件 <filename> 已锁定,无法访问 (Unable to access a file <filename> since it is locked)
      • 无法访问虚拟机配置 (Unable to access Virtual machine configuration)

    • /var/log/vmkernel 日志文件中,您会看到类似以下内容的条目:

      WARNING:World:VM xxxx:xxx:Failed to open swap file <path>:Lock was not free
      WARNING:World:VM xxxx:xxx:Failed to initialize swap file <path>


    • 打开虚拟机控制台时,可能会收到以下错误:

      连接到 <path><virtual machine>.vmx 时出错,因为该 VMX 未启动
      (Error connecting to <path><virtual machine>.vmx because the VMX is not started)


    • 打开虚拟机电源导致打开电源任务始终停留在 95%。
    • 从模板部署虚拟机后无法打开其电源。
    • 虚拟机报告 vCenter Server 和 ESXi/ESX 主机控制台的电源状态存在冲突。
    • 尝试通过文本编辑器(例如 cat 或 vi)查看或打开 .vmx 文件时报告类似于以下内容的错误:

      cat:无法打开“[虚拟机名称].vmx”:参数无效
      (cat:can't open '[name of vm].vmx':Invalid argument)


    Environment

    VMware ESXi 4.0.x Embedded
    VMware ESXi 3.5.x Installable
    VMware ESXi 3.5.x Embedded
    VMware vSphere ESXi 6.5
    VMware ESXi 4.0.x Installable
    VMware vCenter Server 5.5.x
    VMware vSphere ESXi 5.5
    VMware vSphere ESXi 5.0
    VMware vSphere ESXi 5.1
    VMware vCenter Server 6.0.x
    VMware ESXi 4.1.x Embedded
    VMware vCenter Server 5.0.x
    VMware vSphere ESXi 6.0
    VMware vCenter Server 4.0.x
    VMware vCenter Server 6.5.x
    VMware vCenter Server 5.1.x
    VMware ESXi 4.1.x Installable
    VMware vCenter Server 4.1.x

    Resolution

    文件锁定的目的

    注意:有关在升级到 VMware ESXi 5.5 Patch 5 之后查找锁定所有者的详细信息,请参见 在 VMware ESXi 5.5 P05 中查找 VMFS 数据存储上的 VMDK 或文件的锁定所有者 (2125544)

    为了防止并行更改关键虚拟机文件和文件系统,ESXi/ESX 主机对这些文件建立了锁定。在某些情况下,当关闭虚拟机电源后,这些锁定可能不会解除。文件锁定后,服务器将无法访问这些文件,并且将无法打开虚拟机的电源。

    如下虚拟机文件会在运行时期间锁定:
    • VMNAME.vswp
    • DISKNAME-flat.vmdk
    • DISKNAME-ITERATION-delta.vmdk
    • VMNAME.vmx
    • VMNAME.vmxf
    • vmware.log

    初始快速测试

    要使关键虚拟机运行,请执行以下操作:

    1. 将虚拟机迁移至已知上次在其上运行的主机,并尝试打开电源。
    2. 如果不成功,请继续尝试在群集中的其他主机上打开虚拟机的电源。
      如果遇到持有文件锁定的主机,当相应文件锁定有效时,应该可以打开虚拟机电源。
    3. 如果仍无法打开虚拟机电源,请继续执行以下步骤来调查更多详细信息。
    要标识和释放文件上的锁定,请执行以下与您 ESXi 版本相关的步骤。
    </u>

    ESXi 故障排除步骤

    确定锁定的文件

    要确定锁定的文件,请尝试打开虚拟机电源。在打开电源过程中,可能会显示错误后有错误信息写入虚拟机日志。该错误和日志条目确定了虚拟机和文件:

    1. 如果适用,打开 vSphere 或 VMware Infrastructure (VI)Client 并将其连接到对应的 ESXi 主机、VirtualCenter Server 或者 vCenter Server 主机名或 IP 地址。
    2. 找到受影响的虚拟机,并尝试打开其电源。
    3. 打开虚拟机的远程控制台窗口。
    4. 如果虚拟机无法开机,远程控制台屏幕上会显示一条包含受影响文件名称的错误消息。
      注意:如果错误未显示,请继续执行以下步骤来查看虚拟机的 vmware.log 文件:

      1. 使用 SSH 客户端以 root 身份登录 ESXi 主机。
      2. 确认已在服务器上注册虚拟机,并运行以下命令获取虚拟机的完整路径:

        # vim-cmd vmsvc/getallvms

        输出会返回已在 ESXi 主机上注册的虚拟机列表。每行都包含虚拟机 .vmx 文件中的数据存储和位置。您会看到类似于以下内容的输出:

        [datastore] VMDIR/VMNAME.vmx

        确定该列表上是否有受影响的虚拟机。如果未列出,说明该虚拟机未在此 ESXi 主机上注册。通常在其上注册虚拟机的主机持有该锁定。确保已连接至正确的主机,然后再继续操作。

      3. 移至虚拟机目录:

        # cd /vmfs/volumes/datastore/VMDIR

      4. 使用文本查看器读取 vmware.log 文件的内容。在该文件末尾,查找标示出受影响文件的错误消息。

    找到锁定并将其移除

    虚拟机可以在主机之间移动,正因如此,虚拟机当前在其中注册的主机可能不是保持文件锁定的主机。必须由拥有锁定的 ESX/ESXi 主机来释放锁定。此主机由主管理 vmkernel 接口的 MAC 地址标识。

    注意:文件遭到锁定还可能是因为备份程序在备份虚拟机期间一直在锁定文件而导致的。如果备份存在任何问题,都可能会导致无法正确将锁定解除。在某些情况下,可能需要禁用备份应用程序或重新引导备份服务器来清除挂起的备份。

    此锁定可能由任何连接到同一存储的主机的 VMkernel 所保持。

    先确定 VMkernel 在锁定文件的服务器。

    要确定该服务器,请执行以下操作:
    1. 通过运行以下命令报告锁定持有者的 MAC 地址(NFS 卷上除外):

      # vmkfstools -D /vmfs/volumes/UUID/VMDIR/LOCKEDFILE.xxx

      注意:在所有通常锁定的虚拟机文件(如 Solution Section 开头所列)中运行此命令以确保确认所有锁定的文件。

    2. 对于 ESXi 4.1 之前的服务器,上述命令会把其输出写入系统日志。自 ESXi 4.1 起,输出还会显示在屏幕上。任何正在锁定 .vmdk 文件的主机的 MAC 地址都会包括在此输出中。要查找此信息,可以查看 /var/log/messages

      查找类似于以下内容的行:

      Hostname vmkernel:17:00:38:46.977 cpu1:1033)Lock [type 10c00001 offset 13058048 v 20, hb offset 3499520
      Hostname vmkernel:gen 532, mode 1, owner xxxxxxxx-xxxxxxxx-xxxx-xxxxxxxxxxxx mtime xxxxxxxxxx]
      Hostname vmkernel:17:00:38:46.977 cpu1:1033)Addr <4, 136, 2>, gen 19, links 1, type reg, flags 0x0, uid 0, gid 0, mode 600
      Hostname vmkernel:17:00:38:46.977 cpu1:1033)len 297795584, nb 142 tbz 0, zla 1, bs 2097152
      Hostname vmkernel:17:00:38:46.977 cpu1:1033)FS3:132: <END supp167-w2k3-VC-a3112729.vswp>

      第二行(以粗体显示)owner 一词后显示的是 MAC 地址。在此示例中,无效 ESXi 主机的管理 vmkernel 接口的 MAC 地址为 xx:xx:xx:xx:xx:xx。登录服务器之后,可分析保持锁定的进程。

      ESXi 4.0 U3、4.1 U1 或更高版本提供了一个新字段,可确定只读锁定所有者或多写入器锁定所有者。

      您会看到类似以下内容的输出:

      [root@test-esx1 testvm]# vmkfstools -D test-000008-delta.vmdk
      Lock [type 10c00001 offset 45842432 v 33232, hb offset 4116480
      gen 2397, mode 2, owner 00000000-00000000-0000- 000000000000mtime 5436998]<-------------- MAC address of lock owner
      RO Owner[0]HB offset 3293184 xxxxxxxx-xxxxxxxx-xxxx- xxxxxxxxxxxx <------------------------------ MAC address of read-only lock owner
      Addr <4, 80, 160>, gen 33179, links 1, type reg, flags 0, uid 0, gid 0, mode 100600
      len 738242560, nb 353 tbz 0, cow 0, zla 3, bs 2097152

      • 如果“vmkfstools -D test-000008-delta.vmdk”命令在顶部字段中未返回有效的 MAC 地址(返回的全是 )。请检查该字段下面的字段(其下的 RO Owner 行),查看对文件拥有只读/多写入器锁定的 MAC 地址。在前述示例中,导致问题的 MAC 地址为:xx:xx:xx:xx:xx:xx
      • 在某些情况下,这有可能是NFS 锁定或者是可以使用或读取 VMFS 文件系统的其他系统或产品生成的锁定。文件由 VMkernel 子项或 cartel 域锁定,必须重新引导正在运行该进程/域的导致问题的主机才能清除该锁定。
      • 找出锁定文件的主机或备份工具(拥有该 MAC 的计算机)后,关闭其电源或停止导致锁定的服务,然后在运行虚拟机的主机上重新启动管理代理以解除锁定。

    3. 要确定 MAC 地址是否与当前登录的主机相对应,请参见 Identifying the ESX Service Console MAC address (1001167)。如果不对应,则必须与拥有此虚拟机文件访问权限的每个主机建立控制台或 SSH 连接。
    4. 确定持有该锁定的主机后,从该主机取消虚拟机注册。

      注意:如果在 vCenter Server 的主机清单中未找到该虚拟机,请打开直接指向 ESXi 主机的 vSphere 或 VI Client 连接。检查清单中是否存在标记为未知虚拟机的任何条目。如果找到了未知虚拟机,则从清单中移除。

    5. 从清单中成功移除虚拟机后,将其注册到持有锁定的主机,然后尝试打开该虚拟机电源。可能需要将 DRS 设置为手动,以确保在正确的主机上打开虚拟机电源。

      如果虚拟机仍无法打开电源,请在登录到导致问题的主机后完成以下步骤。

      注意:如果已确定文件上的 VMkernel 锁定,请跳过本部分其余内容并转到本文的进一步故障排除的步骤部分。

    6. 检查虚拟机是否仍拥有为其分配的域 ID:

      对于 ESXi 4.x,请在所有 ESXi 主机上运行以下命令:

      # cd /tmp
      # vm-support -x


      您会看到类似以下内容的输出:

      Available worlds to debug:
      wid=world_id name_of_VM_with_locked_file


      如果相关虚拟机仍在 ESXi 4.x 主机上运行,请终止该虚拟机。这会释放文件上的锁定。要终止虚拟机,请运行以下命令:

      # vm-support -X world_id

      其中 world_id 为含锁定文件的虚拟机的域 ID。

      注意:此命令需要花费 5 到 10 分钟才能完成。看到是否可包括虚拟机的屏幕截图消息时,请回答;对于所有后续问题,请回答

      在停止进程后,可以打开虚拟机电源或访问文件/资源。

      对于 ESXi 5.x 和更高版本,可以在本地或远程使用 esxcli 命令行实用程序来列出当前正在主机上运行的虚拟机列表。

      使用以下命令列出所有正在运行的虚拟机,包括虚拟机的域 ID、Cartel ID、显示名称和 .vmx 配置文件路径:

      # esxcli vm process list

      您会看到类似以下内容的输出:

      VirtualMachineName
      World ID:1268395
      Process ID:0
      VMX Cartel ID:1264298
      UUID:ab cd ef ...
      Display Name:VirtualMachineName
      Config File:/path/VirtualMachineName.vmx


      这里列出了两个域。第一个域编号(在此示例中为 1268395)为 vCPU 0 的虚拟机监控器 (VMM)。第二个域编号(在此示例中为 1264298)为虚拟机 Cartel ID。

      如果相关虚拟机仍在 ESXi 5.x 及更高版本主机上运行,请终止该虚拟机。这会释放文件上的锁定。要终止虚拟机,请运行以下命令:

      # esxcli vm process kill --type=soft --world-id=1268395

      有关其他信息,请参见 Mapping a virtual machine world number to a virtual machine name (1001101)

    7. 在 ESXi 4.1/5.x/6.x 中,要查找虚拟机锁定文件的所有者,请运行以下命令:

      # vmkvsitools lsof | grep Virtual_Machine_Name

      您会看到类似以下内容的输出:

      11773 vmx 12 46 /vmfs/volumes/Datastore_Name/VirtualMachineName/ VirtualMachineName-flat.vmdk

      然后可以运行以下命令来获取虚拟机进程的 PID:

      ps | grep Virtual_Machine_name

      可以使用以下命令终止进程:

      kill -9 PID

      要在终止正在运行(但挂起且无响应)的虚拟机后生成核心转储,请使用 kill -6 PIDkill -11 PID 命令。

      注意:在 ESXi 4.1、ESXi 5.x 和 ESXi 6.x 中,可以使用 esxtop 中的 k 命令向正在运行的虚拟机进程发送信号并终止该进程。在 ESXi 控制台上,进入技术支持模式并以 root 用户身份登录。有关详细信息,请参见 Tech Support Mode for Emergency Support (1003677)

      1. 使用 esxtop 命令运行 esxtop 实用程序。
      2. c 以切换到 CPU 资源利用率屏幕。
      3. Shift+f 以显示字段列表。
      4. c 以添加 Learder World ID 列。
      5. 通过目标虚拟机的名称和 Learder World ID (LWID) 来确定目标虚拟机。
      6. k
      7. 在 World to kill 提示符中,键入从步骤 6 得到的 Learder World ID,然后按 Enter
      8. 等待 30 秒后验证该进程是否已不再列出。

    确定文件是否正在由正在运行的虚拟机使用

    如果文件正在由运行的虚拟机访问,则无法强夺或移除该锁定。可能持有该锁定的主机正在运行虚拟机且变得无响应,或者另一台正在运行的虚拟机在尝试打开电源前错误地将磁盘添加到了其配置中。

    要确定虚拟机进程是否正在运行,请执行以下操作:

    1. 确定是否已在主机上注册虚拟机,为此请以 root 用户身份运行以下命令:

      # vim-cmd vmsvc/getallvms


      注意:输出内容会列出每个已注册虚拟机的 vmid。请记录此信息,因为在 ESXi 服务器上此过程的其余部分将需要此信息。

    2. 评估虚拟机当前在主机上的状态,运行以下命令:

      # vim-cmd vmsvc/power.getstate vmid


    3. 要停止虚拟机进程,请参见 Powering off an unresponsive virtual machine on an ESX host (1004340)
    </u>

    进一步的故障排除步骤</u>

    确保备份设备未锁定虚拟磁盘

    备份设备可能会锁定虚拟磁盘。首先,确保当前并未执行备份。通过 VMware vSphere Client 或 vSphere Web Client,从备份设备的“编辑设置”卸载虚拟磁盘。有关详细信息,请参见 Unable to delete the virtual machine snapshot due to locked files (2017072)

    使用 touch 实用程序来确定文件是否已锁定

    touch 实用程序用于更新特定文件或目录的访问权限和时间戳修改。同样,该命令可用于测试 VMFS 文件系统中的文件和目录锁定机制,对于锁定的文件,此过程预计会失败。虽然还可以使用如 head -c 0 等的其他命令,但使用 touch 是首选方法,因为它对资源的更改最少。

    注意:必须在群集中的每台主机上运行 touch 命令。该命令在持有文件锁定的主机上会成功,在其他所有主机上则会失败。之后可以调查该主机上的哪个进程在锁定文件。

    要测试文件或目录锁定功能,请运行以下命令:

    # touch filename

    注意:执行 touch * 命令会对当前目录中的所有文件执行相关操作。

    touch * 命令会产生以下结果:
    • 如果 touch * 命令成功,则该命令会成功更改日期/时间戳,并验证文件可以并且已经锁定(然后解锁)。此时,重试虚拟机的打开电源操作来查看是否成功。
    • 如果 touch * 命令失败,并显示 device or resource busy 消息,则表明某个进程正对文件或目录保持锁定。这种情况可能出现在具有该文件访问权限的任一 ESXi/ESX 主机中,但不会在保持锁定的主机上。如果报告该消息,则继续下一部分。
    • 如果报告其他错误消息,则可能表明与 VMFS 上的文件或目录锁定相关的元数据可能无效或损坏。如果是这种情况,请收集 ESXi/ESX 主机诊断信息并提交支持请求。有关详细信息,请参见 Collecting diagnostic information for VMware products (1008524)How to Submit a Support Request

    移除 .lck 文件(仅限 NFS)

    虚拟机上的文件可通过 NFS 存储锁定。通过文件名末尾以 .lck-####(其中 ####fileid 字段从锁定文件的 GETATTR 请求返回的值)表示的文件便可确定。这是 NFS 文件锁定,并且仅当使用 ls -la 命令时才会列出,因为它是隐藏文件(在 5.x 之前的 ESX/ESXi 版本中)。有关详细信息,请参见 Powering on a virtual machine on NFS or trying to remove an NFS Datastore fails with errors "Unable to access a file since it is locked" or "Resource is in use" (1012685)
    有关 NFS 文件锁定的详细信息,请参见 VMware NFS Best Practices Whitepaper

    警告:仅当虚拟机未运行时,才能安全地移除这些文件。

    注意:VMFS 卷没有 .lck 文件。VMFS 卷的锁定机制是在卷上的 VMFS 元数据中进行处理。

    确定 .vmdk 文件是否正在由其他虚拟机使用

    .vmdk 文件上的锁定会导致虚拟机无法启动。但是,由于虚拟机磁盘文件可进行配置,让任何虚拟机使用,因此文件可能会由当前正在运行的其他虚拟机锁定。

    要确定虚拟机磁盘文件是否配置为在多个虚拟机上使用,请运行以下命令:

    # egrep -i DISKNAME.vmdk /vmfs/volumes/*/*/*.vmx

    注意
    • 此命令会尝试在 ESX/ESXi 主机可见的虚拟机的所有 .vmx 配置文件中查找特定磁盘名称。将会为每个正在运行但尚未注册到此 ESX 主机的虚拟机显示 Device or resource busy 消息。必须在基础架构中的每个 ESX/ESXi 主机上运行此命令,或专门在对包含虚拟机文件的存储具有访问权限的主机上运行此命令。
    • 如果配置了任何其他虚拟机使用该磁盘,请确定这些虚拟机当前是否正在运行。关闭使用磁盘文件的其他虚拟机的电源可释放锁定。必须先确定哪些虚拟机应该具有文件的所有权,然后重新配置虚拟机以防止再次发生此错误。
    • 在操作过程中,许多虚拟机备份解决方案会将虚拟机的 .vmdk 文件附加到其自身。在这种情况下,如果备份失败和/或主机关闭,备份虚拟机可能仍会附加其他虚拟机的 .vmdk 文件。如果出现这种情况,通常会先打开其他虚拟机电源,这样,随后在备份虚拟机尝试打开电源时就会产生文件锁定状况。使用备份解决方案虚拟机上的编辑设置进行检查,查看该虚拟机是否附加了属于其他虚拟机的磁盘。如果有,则关闭备份虚拟机电源,选择相应的磁盘并选择移除,把该磁盘从虚拟机中移除。

      警告:请勿删除磁盘中的文件。
    如果 .vmdk 文件未由其他虚拟机使用,请确认没有任何 VMkernel 进程在锁定文件。操作时,请按上面部分中所述查找文件锁定并将其移除。如果可以确定主机但无法标识是哪个特定的 VMkernel 子进程 ID 导致了问题,则必须重新引导服务器以清除锁定。

    注意:还可以尝试把虚拟机迁移到其他主机后再打开电源。如果该 ESX 主机拥有虚拟机的锁定,则会允许您打开其电源。

    重新引导锁定文件的 ESX/ESXi 主机

    到此阶段为止,您已对确认保持所需文件锁定的 VMkernel 进程进行了调查,但仍有未确定的子进程保持该锁定。在之前的步骤中,您已通过 vmkfstools -D 命令确定了服务器,lsof 实用程序(仅限 ESX)未显示任何异常进程,并且其他虚拟机没有锁定文件。

    此时应重新启动服务器以允许再次打开虚拟机电源。

    注意:如果希望通过 VMware 技术支持的分析更进一步调查相关问题,请在重新引导之前收集诊断信息。

    使用以下步骤从服务器迁移虚拟机并重新启动服务器:
    1. 将所有虚拟机从主机迁移或 vMotion 到备用主机。
    2. 如果已撤出虚拟机,请将主机置于维护模式下并重新引导主机。
    注意:如果只有一个 ESX/ESXi 主机或无法执行 vMotion 或迁移虚拟机,则必须在重新引导之前调度受影响虚拟机的停机时间。重新引导主机后,再次启动受影响的虚拟机。


    检查虚拟机配置文件 (.vmx) 的完整性

    有关检查虚拟机配置文件完整性的详细信息,请参见 Verifying ESX/ESXi virtual machine file integrity (1003743)

    注意:如果虚拟机未打开电源,则可能会在 .vmx 文件中指向两个磁盘。从虚拟机中移除其中一个磁盘,然后再次尝试打开电源。

    注意:如需了解相关信息,请参见 Cannot power on a virtual machine because the virtual disk cannot be opened (1004232)


    开启支持请求

    如果完成本文中的步骤后问题仍然存在,请执行以下操作:


    Additional Information

    Investigating virtual machine file locks on ESXi
    在 VMware ESXi 5.5 P05 及更高级版本中查找 VMFS 数据存储上的 VMDK 或文件的锁定所有者