(ヽ´ω`) < 助けてほしいマン

わからないことを助けてほしいマンが書くブログ

(ヽ'ω`) < VMware vSphereでVMを起動しようとすると" The file specified is not a virtual disk"でエラーになる

(ヽ'ω`) < The file specified is not a virtual disk

vSphereでVMのパワーオンをしようとすると、

The file specified is not a virtual disk

というエラーが表示され起動に失敗する。

(ヽ'ω`) < ***-flat.vmdkってなんだ?

嫌な汗が出るのを感じながら、深呼吸をしてもう一度パワーオン。

The file specified is not a virtual disk

(ヽ'ω`)

対象のVMが格納されているデータストアを見てみると、<マシン名>.vmdkではなく"<マシン名>-flat.vmdk"というファイルが存在している。

ファイルのサイズもディスクサイズと同じだし、どうもこれがディスク本体っぽい。まずは単純にリネームしてパワーオン。

The file specified is not a virtual disk

(ヽ'ω`)

(ヽ'ω`) < 震えが止まらん…

ということで、***-flat.vmdkファイルはディスクの内容そのものではないっぽい。

困った時の公式KBという事で、検索してみるとあっさり引っかかった。

VMware KB - Search Results

これによると、VMのディスクは.vmdkと-flat.vmdkという2つのファイルのペアで保存されており、.vmdkはdescriptorファイルで、テキストベースの1k程度のファイル。-flat.vmdkは、ディスクの中身を保持しているとのこと。

(ヽ'ω`) < で、どうしろと?

今回、上記のエラーメッセージは、このdescriptorファイルが消えてしまったことが原因だった。実際にデータストアのどこを探しても、ファイルが見つからない。

幸いディスクのデータはflatファイルに保管されているので、***.vmdkファイルを再作成すればOKとのこと。

***.vmdkファイルの再作成は以下の手順で行う。

  1. ESX(i)のコンソールに接続する
  2. flatファイルのサイズをバイト単位で確認する
  3. VMのSCSIコントローラタイプを確認する
  4. vmkfstoolsコマンドで仮のvmdkファイルを作成する
  5. 仮のvmdkファイルのうち、descriptorファイルをリネームして、元のVMのflatファイルとペアにする
  6. リネームしたdescriptorファイルの内容を編集する
  7. 仮のvmdkファイルのflatファイルを削除する
  8. おもむろに起動

ESX(i)のコンソールに接続する

ESXの場合はbashライクなシェルが用意されているが、ESXiはデフォルトではシェルは無効化されてる。

また、ESXiのバージョンによってSSHで接続するための方法が違うので、以下のKBを参考にSSHでの接続を有効化する。

VMwareのKBは下のSee Alsoに、日本語機械翻訳ページヘのリンクがある。英語が苦手ならばそちらを参照。

flatファイルのサイズをバイト単位で確認する

コンソールにログインできたら、対象のVMが格納されているディレクトリに移動する。

データストアは/vmfs/volumes/以下に列挙されているはず。

# cd /vmfs/volumes/datastore1
# cd hoge-vm
# ls -l hoge-vm-flat.vmdk
-rw------- 1 root root 4294967296 Oct 11 12:30 hoge-vm-flat.vmdk

ここで、ファイルのサイズ4294967296をメモしておく。

VMのSCSIコントローラタイプを確認する

同ディレクトリにある<マシン名>.vmxファイルの記述から、SCSIコントローラのタイプを調べる。

# grep -i "virtualDev" hoge-vm.vmx
scsi1.virtualDev = "lsilogic"

ここで、lsilogicをメモしておく。

vmkfstoolsコマンドで仮のvmdkファイルを作成する

VMwareのコンソールでvmkfstoolsというコマンドが用意されているので、カレントディレクトリをそのままで、以下の通り打ち込む。

# vmkfstools -c <メモしたファイルサイズ> -a <メモしたSCSIコントローラタイプ> -d thin temp.vmdk

ここで挙げた例では以下のとおり、

# vmkfstools -c 4294967296 -a lsilogic -d thin temp.vmdk

これで、カレントディレクトリにtemp.vmdkとtemp-flat.vmdkの2つのファイルが作成される。

仮のvmdkファイルのうち、descriptorファイルをリネームして、元のVMのflatファイルとペアにする

作成されたtemp.vmdkファイルは、復旧対象のhoge-vm-flat.vmdkに流用できる内容となっているので、temp.vmdkをhoge-vm.vmdkにリネームする。

# mv temp.vmdk hoge-vm.vmdk

リネームしたdescriptorファイルの内容を編集する

hoge-vm.vmdkファイルの中のExtent descriptionセクションのファイル名をtemp.vmdkからhoge-vm-flat.vmdkに変更する。

下記のようになっているはずなので、

# Extent description
RW 8388608 VMFS "temp-flat.vmdk" # <= このファイル名を変更

このようにファイル名のところを変更

# Extent description
RW 8388608 VMFS "hoge-vm-flat.vmdk"

元のディスクがThinプロビジョニング以外(Thickプロビジョニング)の場合は、以下の行を削除する。

ddb.thinProvisioned = "1"

仮のvmdkファイルのflatファイルを削除する

これで、元のflatファイル(hoge-vm-flat.vmdk)と仮に作成したvmdk(temp.vmdk)ファイルの対応付けが完了した。

仮に作成した方のflatファイル(temp-flat.vmdk)が不要となったので削除。

# rm temp-flat.vmdk

おもむろに起動

(ヽ'∀`)

(ヽ'ω`) < 結局これって何やってんの?

要点としては以下の2つ

  • vmkfstoolsを使ってhoge-vmのディスクと同じ容量・コントローラのディスクを新規に作成
  • 作成された新規ディスクのdescriptorファイルを編集して、復元対象のdescriptorファイルとして使用

descriptorファイルが何をどこまで管理しているかは不明だが、とりあえず単純なディスク構成であれば「同じサイズ」で「同じSCSIコントローラ」のディスクのものが流用できるということ。

(ヽ'ω`) < ディスクタイプがThickなんだけど、vmkfstoolsの-d thinオプションって必要?

vmkfstoolsを実行する際の-d thinオプションだが、これは復元対象のディスクのタイプにかかわらずつけておいたほうが良い。というのも、ディスクタイプがThinでない場合は、その時点でディスク容量分の領域が確保されてしまう。temp-flat.vmdkはすぐに削除されるので、こうしておけば、一時的にではあっても無駄な容量を使う必要はなくなる。

(ヽ'ω`) < 公式のKBだと動画もあるし別にこのエントリ必要なくない?

(ヽ'ω`) < すんません、コマンド例のところもぱくr引用してます