先日、VisualStudioのWebアプリ開発中に、設定ミスから C:\inetpub 以下のファイルをほぼ全て消してしまいました。幸い、週次で「バックアップと復元(Windows7)」でのシステムイメージバックアップを取っていたのでそこから復元しようと試みたのですが、意外に苦戦してしまったのでメモとして手順を残しておきます。
1. Windowsだけでは取り出せない
まず最初に考えたのが、「バックアップと復元(Windows7)」で作成される .vhdx ファイルを、コントロールパネルの「コンピューターの管理」から「ディスクの管理」でマウントすることでした。
しかし、マウント自体はできるものの、エクスプローラーから内容を確認できません。ドライブ文字を割り当てるコンテキストメニューも無効になっています。調べてみたところ、どうもシステムパーティション(Cドライブや起動パーティション、回復パーティションなど)はマウントしてもエクスプローラーからアクセスできないようです。
そこでさらに調査を進めた結果、仮想環境でWindows以外のOSを立ち上げ、そこにマウントするのが唯一の方法だという結論に至りました。
2. 回復用にHyper-VにUbuntu Serverをインストール
そこで、たまたま構築済みだったHyper-V環境に、「軽くて情報が多いディストリビューション」という理由でUbuntu Serverをインストールしました。手順についてはQiitaにも多くの記事があるため、ここでは割愛します。
なお、Hyper-V以外でも.vhdxをディスクとしてマウントできる仮想化ソフトウェア(VirtualBoxやVMWareなど)であれば問題ないはずです。検証はしていませんが、Homeエディションをお使いの方はそちらを試してみてください。
apt update を済ませた後、以下のパッケージをインストールしておきましょう。
sudo apt install qemu-utils nbd-client
sudo apt install openssh-server
3. ホスト側のWindowsにWinSCPをインストール
仮想環境のUbuntu Serverからファイルを取得する手段として、ホスト側のWindowsにWinSCPをインストールしました。こちらもインストール自体の手順は割愛します。
注意点としては、rootユーザーでは(デフォルトでは)SSH接続できないため、Ubuntu ServerにSSH接続用のユーザー(例:sftpuser)を作成しておく必要がある事です。
Ubuntu Server側で ip a を実行すれば仮想環境側のIPアドレスが取得できるので、上記ユーザー名とパスワードを用いてWinSCPで接続できることを確認しておきましょう。接続できない場合、SSHサービスが動作しているかを確認してください。
sudo systemctl status ssh
「active (running)」と表示されない場合、以下のコマンドでSSHサービスを有効化し、起動します。
sudo systemctl enable ssh
sudo systemctl start ssh
4. Ubuntu Serverに.vhdxを接続
一旦Ubuntu Serverをシャットダウンし、Hyper-Vの設定で「バックアップと復元(Windows7)」で作成された.vhdxファイルをもう一つのディスクとして接続します。
左ペインから「SCSIコントローラー」を選択し、「ハードドライブ」を選択した後に「追加」ボタンを押すと、(最初にUbuntu Serverをインストールしたドライブとは別に)もう一つハードドライブが追加されます。おそらくデフォルトで「仮想ハードディスク」が選択されているはずですので、「参照」ボタンを押して上記の.vhdxファイルを指定してください。
5. Ubuntu Serverからドライブをマウント
再度、Ubuntu Serverを起動します。qemu-utilsとnbd-clientをインストールしていれば、自動的に.vhdx内のパーティションを認識するはずです。まずは以下のコマンドでパーティションの一覧を表示させます。
sudo fdisk -l
通常は /dev/sdb として.vhdxファイル(仮想ドライブ)が認識され、その中のパーティションが /dev/sdb1、/dev/sdb2…として表示されているはずです。容量と順番などから、Cドライブがどれかを判断してください。
以後、/dev/sdb2をCドライブであると仮定します。以下のコマンドでCドライブを読み取り専用としてマウントします。
sudo mkdir /mnt/vhdx_backup
sudo mount -o ro /dev/sdb2 /mnt/vhdx_backup
としてCドライブをマウントしたら、ls /mnt/vhdx_backup で内容を確認します。
ls /mnt/vhdx_backup
※ファイル名やディレクトリ名によっては、シングルクォーテーションで囲まれていたり、記号が付加されている場合もあります。
6. 必要なファイルをコピー
必要なディレクトリやファイルを見つけたら、/tmp あたりにコピー用のディレクトリを作成し、そちらにコピーします。
sudo cp -r /mnt/vhdx_backup/foobar/baz/gandom/quux /tmp/
そのままではWinSCPからアクセスできないので、コピーしたディレクトリのパーミッションを変更するのを忘れないでください。
sudo chmod -R 755 /tmp/quux
これでWinSCPを用いて、ファイルをホスト側のWindowsにコピーできます。
7. 最後に
作業の最中は「システムイメージバックアップからファイルを取り出すためだけにこんなに手間がかかるのか」と思いましたが、元々この機能はWindowsをそっくりそのままバックアップ時点の状態に戻すことが目的ですから、あまり文句は言えませんね。
ともあれ、本来の仕様とは異なる使い方であることは明らかですので、改めて断るまでもないとは思いますが、くれぐれも自己責任でお試しください。
なお、残念ながらこの手順ではファイルやディレクトリのタイムスタンプは失われてしまいます。その点も予めご承知おきください。
