Hyper-Vで.vhdxが開けない・・・、チェックポイントを理解してなかった悲劇。
Hyper-VでUbuntuを仮想化して使ってました。
ある時、PCが壊れてしまいます。
開発データのバックアップを取っていなかったため、Ubuntu環境を取り戻す必要がありました。
別のPCにSSDを移植するも、運悪くそのPCもそのまま壊れてしまいました。
仕方なくさらに別のPCでSSDの中身を取り出します(1000円くらいでSSDをUSBから読み込むやつが売ってある)。
そしてHyper-Vの仮想マシンのファイル「.vhdx」を発見します。
その前に
この記事を書いている者はHyper-Vについてよく分かってません。
操作は自己責任でお願いします。
- 2世代、セキュアブート無しで話をすすめます。
- .vhdxのあるディレクトリはこんな感じになってました。
- これらのファイルをコピーし、別のディレクトリにバックアップします。
- 作業はそのバックアップに対して行うことにします。
Hyper-Vで.vhdxを起動する
これを別のPCのHyper-Vへ新たに追加します。
Hyper-Vから新規作成、仮想マシン、という順にあとは適当にすすんで、
「仮想ハードディスクの接続」のウィザードで「存続の仮想ハードディスクを使用する」から..vhdxを選びます。
なーぜか起動できない。
ファイルシステムとして覗いてみる
仕方ないので直接.vhdxの中身をファイルとして覗いてみます。
ちなみに「.vhdx」は左クリックから「マウント」でアクセスすることができます。
ただWindowsからLinuxのファイルシステムは見れないので「ex2fsd」とか使って。
中身は見れるものの、目的のファイルがありません。
複数あるユーザーの一部のディレクトリ(例えば/home/myuser)も見当たりません。
途方にくれます。
チェックポイントの罠
どうもチェックポイントという仕組みがあり、知らずのうちにそのチェックポイントを作ってしまっていたようです。
「.vhdx」の他に「.avhdx」という拡張子のファイルがそれです。
チェックポイントというのは差分のようです。
チェックポイントを作るにしたがって「.avhdx」が増えていきます。
今回は一つしか作成されてなかったので、それ前提ですすめます。
目的のデータが.vhdxになかったのは、チェックポイントのせいでその変更分が.avhdxのほうにあったからでした。
この時、「.vhdx」のほうが親、「.avhdx」のほうが子、と表現するよです。
親と子を結合すると復活できそうです。
親子結合! 起動出来ない・・・?
今回の例ではPCが壊れて、別PCからそのSSDを読み込んだため、.vhdxや.avhdx等のファイルのパスが変更します。
壊れたPCでのパスはドライブは「C:\」でしたが、別PCからマウントしたドライブからは「F:\」とボリュームが変更してしまいます。
どうやら子(.avhdx)は親のファイルのパスを保持しているようで、パスの変更等があるとエラーが出るようです。
- コマンドラインパラメータのいずれかに問題があります。??が見つからないか、??が有効なパスではありません
- プロパティ'MaxInternalSize'がクラス'Msvm_VirtualHardDiskSettingData'に存在しません
ようわからん事言ってますが、とりあえず親子関係を修復します。
まず先ほどのように新規で仮想マシンを作成(対象の.vhdxを存続の仮想ハードディスクとして)します。
次にその仮想マシンの「設定」から「SCSIコントローラ」にある「ハードドライブ」を選びます。
「仮想ハードディスク」から.avhdxっを選んで編集をクリック。
次へ。
次へ
親.vhdxを選択、IDの不一致を無視するを選んで、次へ。
念のため二度目言っておきますが、バックアップをとった場所でこの処理を行いました。
ウィザードが閉じたら、仮想マシンの設定で「適用」を忘れずにクリック。
.vhdxと.avhdxは結合します(容量が多いと時間が掛かります)。
もう一度仮想マシンを起動すると差分を含めた最近の仮想マシンが起動して
ればいいですね。