vSphere Clientでは対応できない緊急事態
真夜中にDatastoreの使用率が98%に達し、ディスクファイルのロックによって仮想マシン(VM)が突然フリーズする。そのときvCenterの画面には、“An error occurred while communicating with the remote host”という曖昧なエラーメッセージが1行表示されるだけ——。このような状況を経験したことがある方なら、GUIを前にした無力感をよくご存じでしょう。Web GUIは日常的な設定作業には非常に便利ですが、深刻なディスク障害が発生したりvCenterとの接続が途切れたりした際には、安全にトラブルシューティングを行える唯一の手段がESXiのCLIとなります。
私が運用している8台のESXiホストクラスターでも、ストレージ関連のトラブルは決して珍しくありません。特によくあるのが、Thick Provisioningの誤割り当てによるストレージLUNの枯渇や、バックアップ処理後のスナップショットチェーン破損です。SSH経由で緊急対応を行う際、私が真っ先に使うツールこそがvmkfstoolsです。
VMDKディスク構造の解剖とvmkfstoolsの役割
vmkfstoolsは、VMkernel内で直接動作する低レベルなコマンドラインユーティリティです。vCenterの中間層を介さず、VMFSファイルシステムやブロックストレージデバイスを直接操作できます。
実際のVMDKディスクは何で構成されているのか?
Hyper-VやKVMに慣れている方は、.vmdkファイルを.vhdxや.qcow2のような単一のパッケージ化されたデータブロックだと思いがちです。しかし、ESXiのVMFSファイルシステム上では、仮想ディスクは2つの独立したファイルに分かれています。
- ディスクリプタファイル(
vm-name.vmdk): サイズが1 KB未満の非常に軽量なASCIIテキストファイルです。ディスクのジオメトリ情報(シリンダ、ヘッド、セクタ)、SCSI/NVMeアダプタタイプ、仮想ハードウェアバージョン、およびデータファイルへのポインタが格納されています。 - フラットファイル(
vm-name-flat.vmdk): OSのすべての実データを含むバイナリファイルです。Web GUI上では見やすさのために-flatサフィックスが自動的に非表示になりますが、CLIで操作すると、これら2つのファイルが明確に分かれていることがわかります。
通常のcpコマンドを使用してはいけない理由
ESXiを使い始めたばかりの人がやってしまいがちな危険な習慣として、cp disk1.vmdk disk2.vmdkコマンドを実行してしまうケースがあります。この操作は主に以下の2つの理由からエラーを引き起こしやすくなります。
- スパースファイル(Sparse file)の仕組みを認識しない: Linux標準の
cpコマンドは、100 GBのThinディスク(実使用量はわずか10 GB)を、Datastore上で100 GBすべての容量を物理的に消費するファイルに変換してしまいます。 - ファイルリンクの破損:
cpコマンドを実行すると、ディスクリプタファイルのみがコピーされて-flat.vmdkファイルが置き去りになったり、内部のポインタ情報が不整合を起こしたりします。
vmkfstoolsはブロック単位での読み書き機構を採用しているため、この問題を完全に回避できます。動的割り当てのプロパティを維持し、仮想ディスクの構造をそのまま保持します。
把握しておくべき3種類の仮想ディスク形式
vmkfstoolsを使用してディスクを作成または変換する際は、以下の3つの形式から選択します。
- thin: オンデマンドで容量を割り当てます。作成直後のVMDKファイルは数十MB程度しか消費せず、データの書き込みに応じて徐々に拡張されるため、ストレージ使用効率を最大化できます。
- zeroedthick(Lazy Zeroed): 作成時に割り当てられた全容量を即座に確保します。ただし、ESXiは仮想マシンが各ブロックに初めてデータを書き込む際にのみゼロ埋めを行います。
- eagerzeroedthick(Eager Zeroed): 作成時に全容量を確保し、すべてのブロックを即座にゼロ埋めします。作成には時間がかかりますが、最も安定したI/Oパフォーマンスを発揮します。Microsoft WSFCクラスタやVMware Fault Tolerance(FT)機能では必須の形式です。
vmkfstoolsの実践的な操作手順
事前準備:SSHの有効化と対象ディレクトリへの移動
デフォルトでは、セキュリティ確保のためESXiのSSHは無効化されています。ESXi Host Clientにアクセスし、管理 > サービスを開き、TSM-SSHを右クリックして起動を選択します。その後、PuTTYやターミナルを使用してrootアカウントでホストにSSH接続します。
Datastore上の対象仮想マシンが格納されているディレクトリに移動します。
# 既存のDatastore一覧を確認
cd /vmfs/volumes/
ls -l
# トラブルが発生している仮想マシンのディレクトリへ移動
cd /vmfs/volumes/datastore1/Database-Server/
ls -lh *.vmdk
1. ThickディスクをThinに変換して空き容量を回収する
これは現場で最も頻繁に対応するシナリオです。データベース用VMに誤って500 GBのThickディスクを割り当ててしまい、実データは80 GBしか使っていないのに、400 GB以上の空き容量がDatastore上でロックされてしまうケースです。まず、対象の仮想マシンをパワーオフ(Power Off)します。
# 構文: vmkfstools -i [コピー元ディスク] [コピー先ディスク] -d thin
vmkfstools -i Database-Server.vmdk Database-Server-Thin.vmdk -d thin
処理中は、Clone: 10% done.、Clone: 20% done.のように進行状況が段階的に表示されます。クローンが完了したら、VMの「設定の編集(Edit Settings)」画面を開き、ハードディスクの参照先を新しく作成されたDatabase-Server-Thin.vmdkファイルに変更します。これにより、Datastore上に即座に420 GBの空き容量が回収されます。
2. 数秒でディスク容量を拡張する(Extend Disk)
vCenterのローディング画面を待つことなく迅速にディスク容量を拡張したい場合は、-Xパラメータを使用すると即座に処理が完了します。
# ディスクの合計容量を150GBに拡張
vmkfstools -X 150G Database-Server.vmdk
ここで指定する150Gという数値は拡張後の総容量であり、追加する容量ではない点に注意してください。現在のディスクが100 GBで50 GBを追加したい場合、指定する値は150Gとなります。
eagerzeroedthick形式のディスクの場合は、拡張ブロックを事前にゼロ埋めフォーマットするためにフラグを追加します。
vmkfstools -X 150G -d eagerzeroedthick Database-Server.vmdk
3. コマンドラインからスタンドアロンの仮想ディスクを作成する
ファイルサーバー用のセカンダリディスクを事前に準備したり、データベース用のディスクグループをあらかじめ作成しておき、後からVMにアタッチしたい場合に役立ちます。
# LSI Logic SCSIコントローラーを使用する100GBのThinディスクを作成
vmkfstools -c 100G -d thin -a lsilogic DataDisk_01.vmdk
4. 誤って削除されたディスクリプタ(Descriptor)ファイルの復旧
仮想マシンディレクトリのクリーンアップ作業中に、管理者が誤ってDatabase-Server.vmdkファイルを削除してしまったとします。仮想マシンは起動しなくなり、“File not found”というエラーが発生します。幸いなことに、元のデータファイルであるDatabase-Server-flat.vmdkが無傷で残っていれば、以下の手順でディスクリプタを再構築できます。
まず、flatファイルの正確なバイトサイズを取得します。
ls -l Database-Server-flat.vmdk
# 出力例: 53687091200 バイト (50GB相当)
次に、vmkfstoolsを使用して、同じバイトサイズおよびアダプタタイプの一時ディスクを作成します。
vmkfstools -c 53687091200 -a lsilogic -d thin temp.vmdk
生成されたtemp.vmdkファイルをviエディタで開きます。
vi temp.vmdk
flatファイルの宣言行(セクタ数104857600は53687091200 / 512から自動計算された値)を探し、実際のflatファイル名に書き換えます。
# 元の行:
RW 104857600 VMFS "temp-flat.vmdk"
# 実際のflatファイル名に変更:
RW 104857600 VMFS "Database-Server-flat.vmdk"
ファイルを保存し、temp.vmdkを元のディスクリプタファイル名に変更して、不要になった一時flatファイルを削除します。
mv temp.vmdk Database-Server.vmdk
rm -f temp-flat.vmdk
vSphere Clientから仮想マシンを再起動します。OSおよびすべてのサービスが、データを1バイトも失うことなく正常に起動します。
5. スナップショットチェーンの整合性チェック
スナップショットの統合(Consolidate)や重要な仮想マシンのコピーを行う前に、処理の中断やエラーを防ぐためファイルリンクの整合性をチェックしておくことをおすすめします。
vmkfstools -e Database-Server.vmdk
ターミナルにDisk chain is consistentと返されれば、スナップショットチェーンとベースディスクの構造に問題はなく、安心して次のメンテナンス手順に進むことができます。
まとめ
vmkfstoolsを使いこなすことで、インフラのストレージ障害時にも常に主導権を握って対応できるようになります。-iによるクローン・変換、-Xによるディスク拡張、そしてディスクリプタの再構築といったテクニックは、VMware環境を管理するすべてのシステム管理者にとって必須のトラブルシューティングスキルです。Web GUIの曖昧なエラー表示に戸惑うことなく、SSHからの的確なコマンド操作でシステムを迅速に救出しましょう。

