免责声明:本文为 Investigating virtual machine file locks on ESXi/ESX (10051) 的翻译版本。尽管我们会不断努力为本文提供最佳翻译版本,但本地化的内容可能会过时。有关最新内容,请参见英文版本。
无法添加磁盘 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)
cat 或
vi
)查看或打开 .vmx
文件时报告类似于以下内容的错误:cat:无法打开“[虚拟机名称].vmx”:参数无效
(cat:can't open '[name of vm].vmx':Invalid argument)
文件锁定的目的
注意:有关在升级到 VMware ESXi 5.5 Patch 5 之后查找锁定所有者的详细信息,请参见 在 VMware ESXi 5.5 P05 中查找 VMFS 数据存储上的 VMDK 或文件的锁定所有者 (2125544)。
VMNAME.vswp
DISKNAME-flat.vmdk
DISKNAME-ITERATION-delta.vmdk
VMNAME.vmx
VMNAME.vmxf
vmware.log
初始快速测试
要使关键虚拟机运行,请执行以下操作:
要确定锁定的文件,请尝试打开虚拟机电源。在打开电源过程中,可能会显示错误后有错误信息写入虚拟机日志。该错误和日志条目确定了虚拟机和文件:
vmware.log
文件:root
身份登录 ESXi 主机。 # vim-cmd vmsvc/getallvms
.vmx
文件中的数据存储和位置。您会看到类似于以下内容的输出:[datastore] VMDIR/VMNAME.vmx
# cd /vmfs/volumes/datastore/VMDIR
vmware.log
文件的内容。在该文件末尾,查找标示出受影响文件的错误消息。# vmkfstools -D /vmfs/volumes/UUID/VMDIR/LOCKEDFILE.xxx
.vmdk
文件的主机的 MAC 地址都会包括在此输出中。要查找此信息,可以查看 /var/log/messages
。owner
一词后显示的是 MAC 地址。在此示例中,无效 ESXi 主机的管理 vmkernel 接口的 MAC 地址为 xx:xx:xx:xx:xx:xx。登录服务器之后,可分析保持锁定的进程。# cd /tmp
# vm-support -x
Available worlds to debug:
wid=world_id name_of_VM_with_locked_file
# vm-support -X world_id
world_id
为含锁定文件的虚拟机的域 ID。esxcli
命令行实用程序来列出当前正在主机上运行的虚拟机列表。.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。# esxcli vm process kill --type=soft --world-id=1268395
# vmkvsitools lsof | grep Virtual_Machine_Name
11773 vmx 12 46 /vmfs/volumes/Datastore_Name/VirtualMachineName/ VirtualMachineName-flat.vmdk
ps | grep Virtual_Machine_name
kill -9 PID
kill -6 PID
或 kill -11 PID
命令。esxtop
中的 k
命令向正在运行的虚拟机进程发送信号并终止该进程。在 ESXi 控制台上,进入技术支持模式并以 root
用户身份登录。有关详细信息,请参见 Tech Support Mode for Emergency Support (1003677)。esxtop
命令运行 esxtop
实用程序。 root
用户身份运行以下命令:
# vim-cmd vmsvc/getallvms
vmid
。请记录此信息,因为在 ESXi 服务器上此过程的其余部分将需要此信息。
# vim-cmd vmsvc/power.getstate vmid
备份设备可能会锁定虚拟磁盘。首先,确保当前并未执行备份。通过 VMware vSphere Client 或 vSphere Web Client,从备份设备的“编辑设置”卸载虚拟磁盘。有关详细信息,请参见 Unable to delete the virtual machine snapshot due to locked files (2017072)。
touch
实用程序用于更新特定文件或目录的访问权限和时间戳修改。同样,该命令可用于测试 VMFS 文件系统中的文件和目录锁定机制,对于锁定的文件,此过程预计会失败。虽然还可以使用如 head -c 0 等的其他命令,但使用 touch
是首选方法,因为它对资源的更改最少。touch
命令。该命令在持有文件锁定的主机上会成功,在其他所有主机上则会失败。之后可以调查该主机上的哪个进程在锁定文件。# touch filename
touch *
命令会对当前目录中的所有文件执行相关操作。touch *
命令会产生以下结果:touch *
命令成功,则该命令会成功更改日期/时间戳,并验证文件可以并且已经锁定(然后解锁)。此时,重试虚拟机的打开电源操作来查看是否成功。 touch *
命令失败,并显示 device or resource busy
消息,则表明某个进程正对文件或目录保持锁定。这种情况可能出现在具有该文件访问权限的任一 ESXi/ESX 主机中,但不会在保持锁定的主机上。如果报告该消息,则继续下一部分。 .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)。.lck
文件。VMFS 卷的锁定机制是在卷上的 VMFS 元数据中进行处理。.vmdk
文件上的锁定会导致虚拟机无法启动。但是,由于虚拟机磁盘文件可进行配置,让任何虚拟机使用,因此文件可能会由当前正在运行的其他虚拟机锁定。# egrep -i DISKNAME.vmdk /vmfs/volumes/*/*/*.vmx
.vmx
配置文件中查找特定磁盘名称。将会为每个正在运行但尚未注册到此 ESX 主机的虚拟机显示 Device or resource busy
消息。必须在基础架构中的每个 ESX/ESXi 主机上运行此命令,或专门在对包含虚拟机文件的存储具有访问权限的主机上运行此命令。 .vmdk
文件附加到其自身。在这种情况下,如果备份失败和/或主机关闭,备份虚拟机可能仍会附加其他虚拟机的 .vmdk
文件。如果出现这种情况,通常会先打开其他虚拟机电源,这样,随后在备份虚拟机尝试打开电源时就会产生文件锁定状况。使用备份解决方案虚拟机上的编辑设置进行检查,查看该虚拟机是否附加了属于其他虚拟机的磁盘。如果有,则关闭备份虚拟机电源,选择相应的磁盘并选择移除,把该磁盘从虚拟机中移除。.vmdk
文件未由其他虚拟机使用,请确认没有任何 VMkernel 进程在锁定文件。操作时,请按上面部分中所述查找文件锁定并将其移除。如果可以确定主机但无法标识是哪个特定的 VMkernel 子进程 ID 导致了问题,则必须重新引导服务器以清除锁定。vmkfstools -D
命令确定了服务器,lsof
实用程序(仅限 ESX)未显示任何异常进程,并且其他虚拟机没有锁定文件。.vmx
文件中指向两个磁盘。从虚拟机中移除其中一个磁盘,然后再次尝试打开电源。