VMwareFusionを利用されてWindows環境を維持されている方も多いと思われる中、他のWEB情報にはなかった自分の経験談を一つ。
ちなみにVMwareFusionのversionは7ですが、あまりバージョンは関係なさそうな事象です。
気づいたらsnapshotの削除に失敗するようになっていた。
VMwareFusionには現在の仮想マシン環境をsnapshotという機能でバックアップする事が可能です。
しかし、ある日から間違って取ったsnapshotを削除しようとすると、"削除されたファイルをクリーンアップできません。入出力エラーです。"と表示される様になってしまいました。
しかしアプリ上見る限りsnapshotは消えています。動作も問題なし。
仮想マシンが実行中に突然、vmdkにアクセスできませんと異常終了する
上記と関係あるかわかりませんが、仮想マシン実行中にvmdkにアクセスできません、外部媒体のスイッチが入っている確認云々とエラーメッセージが出て落ちるようになってしまいました。
仮想マシンのパッケージファイルの中身を確認すると大量のvmdkファイル
動きが不安定なので調査開始です。
VMwareFusionでは仮想マシンのパッケージ(vmwarevm)の中に色々なファイルが作成されるのですが、その中身を見ていると
(仮想マシン名)−000001.vmdk
(仮想マシン名)-000002.vmdk
(仮想マシン名)-000003.vmdk....
と大量のvmdkファイルが。
snapshot毎に作られるファイルがそのまま残っているようです。しかし、これは取得したsnapshotが削除されれば消されるファイル。
明らかに今あるsnapshotより多い数です。
vmdkファイルの統合を進めるが...
VMwareのナレッジを使ってvmdkファイルの統合を進めます。
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2086712
1.自動で統合する:アプリ上からスナップショットを取って削除する
今回は、それが前段でうまく行っていないので次。
2.手動で統合
vmware-vdiskmanager コマンド ライン ユーティリティから実行。しかし、
Convert: 5% done.Failed to convert disk: One of the parameters supplied is invalid (0x3e80).
のエラーメッセージで処理中断。
3.各vmdkのエラーチェックをしてから、再度手動実行
”統合を開始する前に、仮想ディスク ファイル (.vmdk) で修復を実行することをお勧めします。”とあり、修復コマンドを叩いてから実行するも変わらず。
大量のvmdkファイルの中、どれかが壊れているのが原因
仕方がないので仮想マシンを作り直すか、とvmdkファイル達のバックアップをとっていたら、一部のファイルのコピーが失敗します。
cp: .....Windows 7.vmwarevm/Windows 7-000006.vmdk: Input/output error
どうやら、ファイルとしてはmac上壊れているが、VMware上ではなんとか動いてたみたい。それも解せないですが...
破損しているファイルをコピーする
動いてはいるので、macでも扱える形にファイルをリカバリーしたい所。
ここからはvmwareではなくOSベースの話になってきました。
なんとなくファイルイメージをそのままコピーするコマンドがある様な気がして検索。やっぱりヒット。
http://superuser.com/questions/458579/copying-many-files-without-stopping-on-errors-on-osx
ddコマンドを使えば行けそうです。
ddは(dataset definition)の略らしいですが、data destroyerでもあると怖い事が書いてあります。
パス指定は慎重にと。
sudo dd if=コピー元パス/windows7-000018.vmdk of=コピー先パス/windows7-000018.vmdk conv=noerror,sync
conv=noerror指定はエラーが出ても処理を続行、syncはエラー箇所をnullで埋めてファイルサイズを維持する。
両方必須です。
統合成功!
壊れているvmdkファイルをddでOSから取り扱えるファイルにコピーしなおして、リカバリー。
のち、パッケージ内の壊れているvmdkはリネームして、リカバリーしたvmdkファイルを配置しなおします。
あとは、"1.自動で統合する:アプリ上からスナップショットを取って削除する"を実行。
無事に大量のvmdkファイルは削除され、一つのvmdkへと統合されました。
ああ、長かった。