ファイル ロックの目的
クリティカルな仮想マシンやファイル システムへの同時変更を防ぐために、ESXi/ESX ホストはこれらのファイルに対してロックをかけます。特定の状況では、仮想マシンをパワーオフしても、これらのロックが解除されない場合があります。ロックされている間はサーバがファイルにアクセスできず、仮想マシンはパワーオンすることができません。
次の仮想マシン ファイルは実行中にロックされます。
VMNAME.vswp
DISKNAME-flat.vmdk
DISKNAME-ITERATION-delta.vmdk
VMNAME.vmx
VMNAME.vmxf
vmware.log
初期クイック テスト クリティカル仮想マシンを実行させるには:
- 仮想マシンをホストに移行し、パワーオンします。
- 失敗したら、クラスタ内の別のホスト上で、仮想マシンのパワーオンを続行します。
ファイルにロックをかけているホストをヒットすると、実行しているファイル ロックは有効であるため、仮想マシンはパワーオンするはずです。
- それでも仮想マシンをパワーオンできない場合は、次の手順に進み、さらに詳細を調べます。
ファイルのロックを特定して解除するには、使用するバージョンの ESXi に関連する次の手順を実行します。
ESXi のトラブルシューティング手順
ロックされているファイルを特定する
ロックされているファイルを特定するには、仮想マシンをパワーオンしてみます。パワーオンのプロセス中、エラーが表示されるか、仮想マシンのログに書き込まれる場合があります。エラーおよびログ エントリで、仮想マシンおよびファイルが特定されます。
- 該当する場合は、vSphere または VMware Infrastructure (VI) Client を開いて対応する ESXi ホスト、VirtualCenter Server、または vCenter Server ホスト名または IP アドレスに接続します。
- 該当する仮想マシンの場所を特定し、パワーオンしてみます。
- 仮想マシンの Remote Console ウィンドウを開きます。
- 仮想マシンをパワーオンできない場合は、該当するファイルの名前とともに、エラーが Remote Console の画面に表示されます。
注:エラーが表示されない場合は、次の手順に進み、仮想マシンの vmware.log
ファイルを確認します。
- SSH クライアントを使用して、ESXi ホストに
root
としてログインします。 - 仮想マシンがサーバに登録されていることを確認し、次のコマンドを実行して、仮想マシンのフル パスを入手します。
# vim-cmd vmsvc/getallvms
ESXi ホストに登録されている仮想マシンのリストが出力として返されます。各行には、データストアおよび仮想マシンの .vmx
ファイル内の場所が含まれます。
出力は次のようになります。
[datastore] VMDIR/VMNAME.vmx
該当する仮想マシンがこのリストに表示されていることを確認します。リストにない場合は、仮想マシンが ESXi ホストに登録されていません。仮想マシンの登録先ホストは、通常、ロックをかけています。続行する前に、適切なホストに接続していることを確認してください。
- 仮想マシンの、次のディレクトリに移動します。
# cd /vmfs/volumes/datastore/VMDIR
- テキスト ビューアを使用して、
vmware.log
ファイルの内容を読み取ります。ファイルの最後にある、該当ファイルを特定するエラー メッセージを探します。
ロックを特定して解除する
仮想マシンは、ホスト間で移動することができます。そのため、仮想マシンが現在登録されているホストは、ファイル ロックを維持しているホストではない場合があります。ロックは、ロックをかけている ESX/ESXi ホストによって解除される必要があります。このホストは、プライマリ管理 vmkernel インターフェイスの MAC アドレスで特定されます。
注:また、仮想マシンをバックアップしている間にファイルをロックしているバックアップ プログラムによってファイルのロックが発生することもあります。バックアップに問題があると、ロックが正しく解除されない場合があります。場合によっては、バックアップ アプリケーションを無効にしたり、バックアップ サーバを再起動したりして、バックアップのハングのクリアが必要となる場合があります。
このロックは、同じストレージに接続しているいずれかのホストの VMkernel が維持している場合があります。
VMkernel がファイルをロックしているサーバを特定するところから始めます。
サーバを特定するには、次の手順を実行します。
- 次のコマンドを実行し(NFS ボリューム上を除く)、ロックをかけているサーバの MAC アドレスを報告します。
# vmkfstools -D /vmfs/volumes/UUID/VMDIR/LOCKEDFILE.xxx
注:このコマンドを、一般的にロックされている仮想マシン ファイルすべてに対して実行し(「ソリューション」セクションのリストに記載されているように)、ロックされているファイルがすべて特定されたことを確認します。
- 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>
2 行目(太字)には、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-xxx-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 の子またはカルテル ワールドによってロックされており、プロセス/ワールドを実行している問題を引き起こしているホストは再起動してそれをクリアする必要があります。
- ファイルをロックしているホストまたはバックアップ ツール(MAC を所有するマシン)を特定したら、それをパワーオフするか、それを処理するサービスを停止し、次に仮想マシンを実行しているホスト上の管理エージェントを再起動して、ロックを解除します。
- 現在ログインしているホストに MAC アドレスが対応しているかどうかを特定するには、「Identifying the ESX Service Console MAC address (1001167)」を参照してください。対応していない場合は、この仮想マシンのファイルへのアクセス権を持つ各ホストへのコンソール接続または SSH 接続を確立する必要があります。
- ロックをかけているホストを特定したら、そのホストから仮想マシンを登録解除します。
注:vCenter Server のホスト インベントリに仮想マシンが見つからない場合は、ESXi ホストへの直接の vSphere または VI Client 接続を開きます。インベントリで、「不明な仮想マシン」というラベルのエントリがあるかどうかを確認します。見つかった場合は、不明な仮想マシンをインベントリから削除します。
- インベントリから正常に削除したら、ロックをかけているホストに仮想マシンを登録してから、パワーオンしてみます。DRS を [手動] に設定して、仮想マシンが正しいホスト上でパワーアップしていることの確認が必要となる場合があります。
まだ仮想マシンがパワーオンしていない場合は、問題を引き起こしているホストにログインするときに、次の手順を実行します。
注:ファイルへの VMkernel ロックをすでに特定している場合は、残りのセクションをスキップして、この記事のトラブルシューティングのさらなる手順のセクションに進んでください。
- 仮想マシンにまだワールド 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 以降の場合は、esxcli
コマンドライン ユーティリティをローカルまたはリモートで使用することにより、ホスト上で現在実行されている仮想マシンのリストを表示できます。
次のコマンドを使用して、ワールド ID、カルテル 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
2 つのワールドが一覧表示されます。最初のワールド番号(この例の 1268395
)は、vCPU 0 の仮想マシン モニタ (VMM) です。2 つ目のワールド番号(この例の 1264298
)は、仮想マシン カルテル 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)」を参照してください。
- 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 PID
または kill -11 PID
を使用します。
注:ESXi 4.1、ESXi 5.x、および ESXi 6.x では、esxtop
の k
コマンドを使用して、実行中の仮想マシン プロセスに信号を送信し、そのプロセスを強制終了することができます。ESXi コンソールで Tech Support モードにして、root
としてログインします。詳細については、「Tech Support Mode for Emergency Support (1003677)」を参照してください。
esxtop
コマンドを使用して、esxtop
ユーティリティを実行します。 - c キーを押して CPU リソース使用率画面に切り替えます。
- Shift + f キーを押してフィールドのリストを表示します。
- c キーを押してリーダー ワールド ID の列を追加します。
- 名前とリーダー ワールド ID (LWID) でターゲット仮想マシンを特定します。
- k キーを押します。
- World to kill プロンプトで、手順 6 のリーダー ワールド ID を入力し、Enter キーを押します。
- 30 秒待機し、プロセスがリストに表示されなくなったことを確認します。
実行中の仮想マシンによってファイルが使用されているかどうかを特定する
実行中の仮想マシンによってファイルがアクセスされている場合は、ロックを奪うまたは削除することができません。ロックをかけているホストが仮想マシンを実行し、応答しなくなるか、実行中の別の仮想マシンがパワーオンしようとする前に誤ってその構成に追加されたディスクを持つ可能性があります。
仮想マシン プロセスが実行中かどうかを特定するには、次の手順を実行します。
- 仮想マシンがホストに登録され、次のコマンドを
root
ユーザーとして実行しているかどうかを特定します。
# vim-cmd vmsvc/getallvms
注:出力には、登録されている各仮想マシンの vmid
が一覧表示されます。ESXi サーバでこの残りのプロセスに必要となるため、この情報を記録します。
- ホストでの仮想マシンの現在の状況を評価し、次のコマンドを実行します。
# vim-cmd vmsvc/power.getstate vmid
- 仮想マシン プロセスを停止するには、「Powering off an unresponsive virtual machine on an ESX host (1004340)」を参照してください。
トラブルシューティングのさらなる手順
ファイルをロックできるかどうかを特定するためにタッチ ユーティリティを使用するtouch
ユーティリティは、特定のファイルやディレクトリのアクセスまたは変更のタイム スタンプを更新するために設計されています。そのように、このコマンドは、ロックされているファイルに対するプロシージャが失敗すると想定される、VMFS ファイルシステムにおけるファイルおよびディレクトリのロック メカニズムのテストに使用することができます。
head -c 0 などのその他のコマンドも使用できますが、リソースに対する変更は最小限であるため、
touch
の使用が優先されます。
注:
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 file を削除する(NFS のみ)仮想マシン上のファイルは、NFS ストレージ経由でロックされる可能性があります。これは、ファイル名の最後にある
.lck-####
で示されるファイル(ここで
####
はロックされているファイルの
GETATTR 要求から返される
fileid フィールドの値)で特定することができます。これは NFS ファイル ロックであり、(5.x よりも前の ESX/ESXi では)隠しファイルであるため、
ls -la
コマンドを使用した場合にのみ一覧表示されます。詳細については、「
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 テクニカル サポートによる分析を通して問題をさらに調査する場合は、再起動する前に、診断情報を収集します。
次の手順を使用して、仮想マシンをサーバから移行し、再起動します。
- すべての仮想マシンを、ホストから別のホストに移行または vMotion します。
- 仮想マシンを退避したら、ホストをメンテナンス モードに切り替えて再起動します。
注:ESX/ESXi ホストが 1 台しかない場合、または vMotion を実行したり仮想マシンを移行したりすることができない場合は、再起動する前に、該当する仮想マシンのダウンタイムを計画する必要があります。ホストを再起動したら、該当する仮想マシンをもう一度起動します。
サポート リクエストをオープンする
この記事の手順を完了しても問題が解決しない場合は、次の手順を実行します。