XPの物理PC実行環境を仮想マシンとして保存

サポート期限が迫ってきたWindowsXP搭載PCですが、Windows7や8への移行でPC自体の廃棄やOS換装で実行環境を捨て去ることになります。

個人ドキュメント等のデータや、時間の掛かりそうな過去のデータ類を整理するにあたって、旧PCの環境をそのまま仮想マシンとして残しておければ、安心してさっさとWindows7や8へ環境をシフトしてしまえるでしょう。

ただし、Windowsマシンは昨今に至っても、HDDを別PCへ乗せ換えて起動すると互換性のある環境でないと、ブルースクリーンに遭遇してセーフモードすら立ち上がりません。

これは主に起動時の最適化によるものですが…、まぁ詭弁でしょう。面倒事はサポートしたくなかったり、OS購入を促進したかったり等色々と勘ぐる事は出来ますが…、本題へ行きましょう。

仮想マシンはVMware(VM Player)を使用します。

抽出したHDDをマウントしてレジストリをハイブ読み込みで編集するための環境(理想はVMware上のXP)が必要になる場合があります。
ただし、抽出元のPCが問題なく稼働できるのであれば、抽出前にレジストリの修正を行えるのでこれは必要ありません。方法と理由はこの記事の最後の方へ記述しています。

破棄するWindowsXPのHDDイメージを抽出します。

起動中のOSのイメージ化は不可能なので、Linux系のLiveCDからの物理HDDをddコマンドでイメージ化するのがいいでしょう。
仮想マシンを起動させるPCのHDDを、ネットワーク上で共有してLinux上にマウントして抽出すればUSB HDD等を使わずに済ませることも出来ます。

> mkdir landisk  ; マウント用ディレクトリ
> mount //192.168.1.10/vmhdd landisk ; 別PCの共有をマウント
> cd landisk
> dd if=/dev/sda of=oldpc.img ; ddコマンドでイメージ作成
> cd ../
> umount landisk

抽出したイメージをvmdkへ変換します。

QEMU付属のqemu-img.exe等のユーティリティを使用してコンバートも出来ますが、せっかくddで抽出したrawイメージですので、rawイメージを使用するvmdkを作成すれば時間の節約になります。

# Disk DescriptorFile
version=1
CID=19454c09
parentCID=ffffffff
createType="monolithicFlat"

# Extent description
RW 117210240 FLAT "oldpc.img" 0

# The Disk Data Base
#DDB

ddb.virtualHWVersion = "4"
ddb.geometry.cylinders = "0"
ddb.geometry.heads = "0"
ddb.geometry.sectors = "0"
ddb.adapterType = "ide"
ddb.toolsVersion = "7394"

RW ~に続くのはセクター数で、下がHDDのジオメトリです。hdparmでパラメータを取得して計算してもいいですが、LiveCDだと入っていない場合があるので、ファイルサイズ÷512(小数点以下切り捨て)をセクター数、ジオメトリ設定を全て0としても差し支えありません。
ファイル形式はVMware4相当ですが、昨今のVMWareに読み込ませればvmdkファイルを変換することが出来ます。
2013-11-07_vmware_load_vmdk2013-11-07_vmware_load_vmdk_convert

レジストリ修正が不可能だった場合、これを仮想マシンで起動してもブルースクリーンになり起動できないのでひと手間加えます。

まずブルースクリーンの原因ですが、これはマイクロソフトのサポートで説明がなされています。
Windows XP のシステム ディスクを他のコンピューターに移動した後に STOP 0x0000007B エラーが表示される
http://support.microsoft.com/kb/314082/ja

原因

このエラーは、バックアップ コンピューターの大容量記憶域コントローラー ハードウェアのレジストリ エントリおよびドライバーが、Windows XP にインストールされていない場合に発生することがあります。 

IDE (Integrated Device Electronics) コントローラーを使用する場合、Intel、VIA、および Promise などの異なるチップ セットがいくつか存在します。各チップ セットは異なる PnP ID (プラグ アンド プレイ ID) を持ちます。

バックアップ コンピューターの大容量記憶域コントローラーの PnP ID 情報は、Windows XP によって正しいドライバーが初期化されるように、起動前にレジストリに存在する必要があります。

下の方にサポート外情報として、レジストリのHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet以下を編集する方法が載っています。
対処法として載っているレジストリ追加ファイルはOSが起動している間に実行するものです。
HDD抽出前にこれが実行できれば、ここでの手間は要らないのですが、トラブルにより既にPCが起動できない場合、別PCによるレジストリのハイブ編集をする事になります。
あらかじめ用意してあるVMwareのXPへ、抽出したHDDを追加して起動します。
HDDが認識されていることを確認したら[スタート]→[ファイル名を指定して実行]でregedit.exeを実行します。
ファイルメニューから[ハイブの読み込み]を選択して、レジストリイメージを読み込んで編集することが出来ます。
  2013-11-07_load_oldsys_hkey_local_machine
SYSTEMレジストリの実態はC:\Windows\System32\config\systemなので、これをHKEY_LOCAL_MACHINEのハイブとして読み込み編集します。
2013-11-07_load_oldsys_hive
ここではOLD_SYSとして読み込みました。
ハードウェアの環境情報はControlSet001とControleSet002に保存されていて、Windows実行時にはCurrentControleSetというキーにControleSet001の複製が作られて使用されます。
2013-11-07_hkey_local_machine_oldsys_hive
よって、先のマイクロソフトのサポートにあるレジストリキー群をこれに書き換えます。
スクリーンショットを見て、「おや?」と思った方は鋭いのですが、ControleSet006まで環境セットが存在します。msconfig等でカスタム化しているとControleSetが多数作られてしまうので、この場合は下2つがControleSet001と002に相当すると考えて下さい。
2013-11-07_Mergeide_reg_replace
こんな感じにメモ帳でさっくりと全置換します。
レジストリファイルをダブルクリックかインポートで流し込んだら、ハイブをアンロードしてレジストリイメージを書き出させます。
2013-11-07_unload_oldsys_hkey_local_machine
後は、このHDDで仮想マシンを実行すれば、通常モードはアクティベートしないとログイン後の作業は出来ませんが、セーフモードならば中のファイルなどを閲覧、修正することが出来ます。
ここまで来れば後は使う人次第でしょう。
FakeA50B-2013-11-07-14-06-04