2015年7月24日金曜日

Windowsのバックアップと復元にはDismを使う

500GBクラスのSSDが2万円を割り込んだら買おうと思って価格.comとかを見ていたら、500GBには少し満たないけれど480GBのものが2万円を割り込んでいたの思わず購入しました。


もうすぐWindows10が出るので、そのテスト用にもひとつ確保したかったので。

実際には、このPCで使っていた256GBのSSDをテスト用にして、今回買った新しいSSDへ換装しました。その際、ディスクのクローンにはEASE US todo backupとかParagonとかは使わないで、最近知ったMicrosoft純正のDismを使って引っ越しました。このDism、なかなかの"神"ツールだと思います。bcdedit、diskpartあたりと組み合わせて使えば、クローンはもちろん、リカバリイメージ/バックアップイメージからの復旧も自由自在です。

DismはWindows8上からも使えますが、それではSSD/HDDの引っ越しはできないので、Windows PE環境を用意します。単純にWindowsのインストールディスクでよさそうですが、DVDからの起動は遅いですから、そのWindowsのインストールディスクをUSBメモリにコピーしてBIOS/UEFIブートに対応したものを使用して、USBメモリからブートできるようにして作業しました。

まずは、元となった256GBのSSDのイメージ化です。Windows PEでブートしたら、dismでWindowsのあるドライブを丸ごと.wimファイルにイメージ化します。

dism /capture-image /imagefile:イメージファイル名.wim /compress:max /capturedir:(目的のWindowsのあるドライブ名):

Windows PEでブートするとCドライブが目的のWindowsシステムとなっているとは限らないので、diskpartなどで予め調べておきます。また、Windows PE環境はRAM DISK上で動作していて、その総容量が32MByteとか非常に小さいので、テンポラリフォルダの容量もかなり小さいです。dismを使うと、「エラー80 ファイルが有ります」というような謎のエラーが出ることがありますが、これは単にテンポラリ容量の不足が原因なので、dismを使う前にset TMP=?:\temp [ENTER] set TEMP=?:\temp [ENTER] のようにして、テンポラリフォルダを十分容量のある別ドライブ上に設定しておきます。

これで現在使っている環境が丸ごとwimファイルに落とせたので、心置きなく作業ができます。

SSDを新しく買ったSanDISKのものと交換します。まだ、パーティションも切っていないまっさらの状態ですが、USBメモリでブートできるWindows PE環境と、先ほど作ったwimイメージファイルがあれば元のWindows環境に戻るので、この段階で換装してしまいます。

Windows PEでブートしたら、SSDのパーティションとフォーマットをします。

diskpartを起動して、以下の操作でSSDに対してパーティションを切りました。

[GPTへの変更]
 convert gpt

[予約パーティションの作成 - 必須ではないが一応作成しておく]
 create part msr size=128

[システムパーティション(EFIパーティション)の作成]
 create part efi size=100
 format quick fs=fat32 label="EFI"
  assign letter=s

[Windows用のパーティションの作成]
  create part pri size=任意
  format quick fs=ntfs label="Windows 8"
  assign letter=c

次に、UEFIブート用のコードをBCDをsドライブにコピーします。
これはUEFIブート時のブートマネージャとBCDを設定するものなので、とりあえずは適当なもので済ませました。今回は、Windows PE起動に使ったUSBメモリに入っていた\efiディレクトリを丸ごとsドライブにコピーしました。

  robocopy (USBメモリのドライブ名):\ s:\ /S /E /SL /J /COPYALL

BCDの調整が必要ですが、先にwimイメージを展開します。

  dism /apply-image /imagefile:(wimイメージファイル名) /index:1 /applydir:c:\

このとき注意すべきは、上にも書いたようにテンポラリフォルダの設定です。dism実行中に、上に書いたエラーや、「ディスクの容量が足りません」的なエラーがでた場合は、先に環境変数TMP/TEMPを適切に変更しておきます。
また、イメージの展開先ドライブ名は必ず”Cドライブ”とします。別のドライブ名にイメージを展開してもWindowsは起動できるのですが、dismは展開するときにジャンクションをそのドライブ名で設定してしまいます。Windowsは通常Cドライブで起動するので、ジャンクションの参照先がCドライブ以外になっていると見えなくなってしまいます。特に"ユーザー"フォルダ配下ではジャンクションが多数設定されているので、それらが全滅してしまいます。

あとは、s:\efi\microsoft\boot\BCDの内容を調整するだけです。
{default}エントリのdevice値、osdevice値が正しいパーティションを指していないようであれば、先ほど展開したWindowsのあるパーティションを指すように設定します。
また、同じく{default}エントリのpath値は、UEFIブートであれば、\windows\system32\boot\winload.efiに設定します。
他の値は、ちゃんと起動できているシステムのBCD値を真似ておけば、だいたいOKでした。

とりあえず、これだけでほぼ元のWindows環境が新しいSSDに移行出来て、ブート出来る状態になりました。
あとは、必要に応じて、Windows回復環境用のパーティション作成・イメージ展開・BCD設定をするなどしておけば完璧ですが、今回のようにUSBメモリブートでWindows PE環境が起動できれば、WIMイメージの展開からブート設定までひと通りのことができるので、敢えてWindows回復環境までは作りこみませんでした。

余談ですが、dismコマンド自体は仮想ディスクイメージファイル(VHD)に対して使える場合と使えない場合があるそうですが、マウントされた仮想ディスクには物理ディスクと同様に使えるようなので、Windows8のシステムバックアップイメージの復元にも使えそうです。このシステムバックアップの復元はエラーが出ることが多く、その原因も不明で解決できないのですが、dismコマンドでマウントされた仮想ディスクをwimイメージ化できるので、上と同じ要領でWindowsシステムを復元できそうです。



(2016年8月23日追記)

最後の「BCDの調整」は、bcdbootを使うと簡単ですね。
そこまでの操作で、SドライブはEFIブート関係のファイルが、Cドライブはwimファイルから展開したWindowsシステムパーティションのイメージが書き込まれている状態ですから、その状態で、
bcdboot c:\windows /l ja-JP /s s: 

などと入力すると、BCDが壊れていても、Windowが起動できるようにBCDを調整してくれるようです。

余談ですが、この方法を応用すると、回復パーティションにあるリカバリイメージを手動で展開してブートできることを確認しました。
回復パーティションにあるリカバリイメージは、通常PCメーカが設定する各種のファイルで構成されていますが、手元にあるPCで調査した限りではすべてのPCでwimファイル、または、分割wimファイルであるswmファイルを、dismがまたはそれ相当の機能でイメージ展開しているだけのようです。ですので、回復パーティションから最低限wim/swmファイルだけでも取り出して別のHDDなどに保存しておけば、いざというときにはdism+bcdbootを使ってリカバリできる可能性があります。上記の手順で、最低限EFIパーティションとWindows用パーティションを作って、イメージ展開し、bcdbootでブート環境を整えれば、少なくともUEFIブート環境ではリカバリ状態でブートできるのではないかと。

wimファイルの代わりに、複数のswmファイルとしてリカバリイメージが存在するならば、イメージの展開方法として、

dism /Apply-Image /ImageFile:install.swm /SWMFile:install*.swm /index:1 /ApplyDir:c:\

を代わりに使うだけです。
実際、以前作成したdynabook R73用のリカバリDVDから、上記のinstall*.swmファイルを全部取り出して、上のdismコマンドでイメージ展開したら、リカバリできました。
別のデスクトップPC(DELLのVostro 270s)では、メーカが用意してあるリカバリプログラムを実行しても何故かエラーが出て全然リカバリできなくてイライラした(リカバリできない回復イメージに何の意味がある?)のですが、この方法ならすんなり元の状態に戻せました。

0 件のコメント:

コメントを投稿