2011/09/07

Disk2vhd のあまーい罠

Windows Sysinternals の Disk2vhd を、いろんな記事や書籍で紹介してきましたが、Disk2vhd を使用して物理マシンを Hyper-V 仮想マシンに P2V 変換するというのは、これまで実際にやっていませんでした。実際にやってみると、[Prepare for use in Virtual PC]オプションがちょっとおせっかいなことに。統合サービスのインストールで「HAL アップグレード要求」が無限ループになってしまったという方、よかったら読んでください。

Disk2vhd で P2V を実行するには、変換元の物理マシンの OS 上で、Disk2vhd を実行し、ローカル ディスクを VHD ファイルにします。できた VHD を Hyper-V の仮想マシンに接続して、仮想マシンを起動し、Hyper-V 統合サービスをインストールすれば変換成功です。

ですが、Windows XP や Windows Server 2003 を Disk2vhd で変換した場合、仮想マシンのゲスト OS に Hyper-V 統合サービスをインストールしようとしても、「HAL アップグレード要求」が再起動するたびに繰り返し出てきて、インストールが完了しない状況になることがあります。

原因は、Disk2vhd の実行時に ディスク イメージを VHD に変換し、[Prepare for use in Virtual PC]オプションを有効にしたこと。このオプションを有効にすると、HAL が「ACPI (Advanced Configuration and Power Interface) PC」に置きかえられるので、Virtual PC の仮想マシン環境で HAL の不一致による起動不能トラブルを回避できます。Virtual PC と Hyper-V の仮想マシンは互換性があるため、Hyper-V の仮想マシンにする場合も、このオプションが使えます。

さて、Hyper-V 統合サービスは、インストール時に HAL の入れ替えを要求する場合があります。Windows XP や Windows Server 2003 の場合は、「ACPI ユニプロセッサ PC」 (halaacpi.dll) または「ACPI マルチプロセッサ PC」(halmacpi.dll)が前提なので、現在の %windir%\system32\hal.dll が別の HAL の場合は仮想プロセッサ数に応じてどちらかに入れ替えます。

Disk2vhd で [Prepare for use in Virtual PC]オプションを有効にした場合、VHD 内のゲスト OS の HAL は「ACPI (Advanced Configuration and Power Interface) PC」(halacpi.dll)に置き換えられますが、実は %windir%\system32\hal.dllを直接入れ替えるのではなく、boot.ini ファイルに「Disk2vhd OS名」という起動エントリを追加して、VHD 内にコピーした halacpi.dll を使用して起動するようにしています (/HAL=halacpi.dll)。ですから、Hyper-V 統合サービスのインストーラーが HAL (%windir%\system32\hal.dll) を入れ替えても、OS が起動するたびに「ACPI (Advanced Configuration and Power Interface) PC」(halacpi.dll) で起動してしまうため、「HAL アップグレード要求」が無限に繰り返されるわけです。

「HAL アップグレード要求」の無限ループを回避するには、いったんキャンセルして、システムのプロパティで OS の既定の起動エントリを元通りに戻します。それから、Hyper-V 統合サービスをインストールすれば、最初の「HAL アップグレード要求」で HAL の入れ替えが正しく行われ、再起動後、Hyper-V 統合サービスのインストールが続行されます。

では、Disk2vhd を実行時に [Prepare for use in Virtual PC]オプションを使用しなければいいんじゃないの、と思うかもしれません。物理マシンが ACPI 対応 HAL で動作している場合はそれでも OK です。Hyper-V 統合サービスのインストールで入れ替わるので。ただ、別の HAL (PC ベンダーが提供する HAL など) の場合、仮想マシンを起動できないことがあるかもしれません。そんなとき、仮想マシンの初回起動を確実にパスするために、[Prepare for use in Virtual PC]オプションの使用は有効だと思います。

0 件のコメント: