「P2V(Physical to Virtual)」は、Microsoft Virtual ServerやHyper-Vの登場で“仮想化によるサーバ統合を進めよう”というのが流行った時代に用いられた、物理PC/サーバを仮想マシンに変換する方法です。現在でも、物理サーバのハードウェアの老朽化に対処するため、あるいはOSのサポート終了(EOS)対策としてクラウド化するためにP2Vのニーズはよくあるようです。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
P2V(Physical to Virtual)に対応したツールは、仮想化が普及し出だしたころ、仮想化テクノロジーを提供するベンダー各社から自社のテクノロジーに対応したツールが提供されてきました。Microsoftの製品としては、「System Center Virtual Machine Manager(SCVMM)」がありました(残念ながらSCVMM 2012 R2でP2V機能は廃止されました)。
「Azure Site Recovery」を利用したクラウドへのP2V移行は現在でも利用可能です。Windows Sysinternalsでは、稼働中のOS環境からディスクイメージを取得してVHD形式の仮想ハードディスクファイルに変換することができる「Disk2vhd(Disk2vhd.exe)」という無料のツールが提供されています。Disk2vhdは、最初のバージョン1.0が2009年10月にリリースされ、最新バージョンは2014年1月リリースの2.01です。
Disk2vhdが古いツールであり、積極的に更新されていないことはバージョン番号を見ても分かると思います。Disk2vhdは、「Windows Virtual PC」(「Windows 7」で動作)、「Microsoft Virtual Server」(「Windows Server 2003/2003 R2」で動作)、初期の「Hyper-V」(「Windows 8」「Windows Server 2012」以前のHyper-V)を想定したものです。
2013年12月にリリースされたバージョン2.0からVHDX形式と「ボリュームシャドウコピーサービス(VSS)」を使用しないオプション(今回の記事はこの後者のオプションがポイントになります)に対応し、イメージ取得対象の物理環境と移行先のHyper-V環境が広がりました。
具体的には、UEFI(Unified Extensible Firmware Interface)/GPT(GUID Partition Table)ベースのシステムからのイメージを取得し、最新のHyper-V(Windows 8.1/Server 2012 R2以降のHyper-V)の第2世代仮想マシンに移行することが可能になりました。
Disk2vhdの登場時に想定されていた移行元の物理環境は、BIOS(Basic Input/Output System)/MBR(Master Boot Record)ベースの32bit(x86)または64bit(x64)Windowsシステムが一般的でした。
BIOS/MBRベースのシステムを、Disk2vhdをはじめとするP2Vツールを利用して仮想化することは、移行元が「Windows XP」やWindows Server 2003/2003 R2でない限り、それほど難しくなかったと思います。
Windows XPやWindows Server 2003/2003 R2は「ハードウェア抽象化レイヤー(HAL)」をシステム変更に合わせて入れ替えなければならないことがあったため、その部分が移行を難しくすることはありましたが、この後のWindowsではHALが単一の「hal.dll」に一本化されているため、システム変更にWindowsが自動的に対応してくれます。
Windows 8/Server 2012以降は、UEFI/GPTベースの64bitシステムが増えてきました。そして、UEFI/GPTベース特有のパーティション構成をよく知らないで単純にP2Vで変換しても、起動できない仮想マシンが出来上がってしまいます。
例えば、UEFI/GPTベースのWindows Server 2012 R2でDisk2vhdを実行し、「Use Vhdx」と「Use Volume Shadow Copy」がチェックされた既定のオプションの状態で実行したとしましょう(画面1)。
出来上がったVHDXをHyper-VのUEFI/GPTベースの仮想マシンである「第2世代仮想マシン」を作成して接続し、起動すると、PXEブートを試みて失敗し、最終的に「Virtual Machine Boot Summary」の画面に“UEFI互換のファイルシステムが見つからない”という理由で起動できないはずです(画面2)。
P2V後の第2世代仮想マシンを起動できない原因は単純で、UEFI/GPTベースのシステムでWindowsを起動するために必要なブート環境が作成したVHD/VHDXに含まれないからです。
Windows Server 2012 R2を「Windowsセットアップ」に任せて新規インストールした場合、ディスクの先頭に300MBの「回復パーティション」、2番目に99MBの「EFIシステムパーティション」、3番目に128MBの「予約(Microsoft Reserved、MSR)パーティション」、そして最後の4番目に「OSパーティション(C:ドライブ)」が準備されます。3番目のMSRパーティションは「ディスクの管理」スナップインには表示されませんが、「DISKPART」コマンドで確認できます(画面3)。
画面1のDisk2vhd実行中の画面と比較してみてください。これでは、作成したVHD/VHDXには回復パーティション(\\?\Volume{....})とC:ドライブしか含まれません。Disk2vhdはパーティション構成をVHD/VHDX内に全て再現しますが、ブート構成を含む2番目のEFIシステムパーティションは空の状態です。
EFIシステムパーティションを含めてイメージを取得するには、コマンドプロンプト(管理者)で次のコマンドラインを実行し、EFIシステムパーティションにドライブ文字「S:」(または空いているドライブ文字)を割り当てます。
MOUNTVOL S: /S
次に、Disk2vhdを起動し、「Use Volume Shadow Copy」オプションをオフにした状態で、「回復パーティション」「OSディスク(C:ドライブ)」「EFIシステムパーティション(S:ドライブ)」をチェックして実行します(画面4)。
「Use Volume Shadow Copy」オプションをオフにするのは、EFIシステムパーティションのイメージはボリュームシャドウコピーサービスでは取得できないという制限があるからです。このオプションをオンのまま実行すると、「Error snapshotting volumes」というエラーで続行できません。
作成したVHD/VHDXファイルを第2世代仮想マシンに接続して起動すれば、Windowsが正常起動します(画面5)。
Windows 8/Server 2012以降のUEFI/GPTベースのシステムであれば、同様の方法でP2Vで第2世代仮想マシンに移行できるはずです。
なお、「Windows 10」「Windows Server 2016」以降の新規インストールで準備される既定のパーティション構成は、Windows 8.1/Server 2012 R2と同様ですが、推奨パーティション構成は変更されており(回復パーティションはディスクの最後へ)、プリインストールPCの場合は通常、推奨パーティション構成に従います。Windows 10の機能更新プログラムによるアップグレードで、パーティション構成が変更されることもあります。
また、UEFI/GPTベースのシステムのイメージをAzure仮想マシン上で使用する場合は、Disk2vhdでVHD形式を選択、作成して、「Hyper-Vマネージャー」や「Convert-VHD」コマンドレットで「容量固定VHD」に変換後、アップロードしてください。Azure仮想マシンにおける第2世代仮想マシンのサポートにはVHD形式以外にも制約(セキュアブートが使えないなど)があることにも注意してください。
万が一、Disk2vhdでVHD/VHDXを作成後に、移行元の物理環境を撤去、または再利用のためにフォーマットしてしまって、もう残っていないという場合は、別の方法で回復することができます。
それには、Windowsのインストール用ISOイメージから仮想マシンを起動し、「Windowsセットアップ」の画面が表示されたら[Shift]+[F10]キーを押してコマンドプロンプトのウィンドウを開きます。「Windowsセットアップ」の次の画面の「このコンピューターを修復」からコマンドプロンプトを開くことも可能ですが、[Shift]+[F10]キーを押す方が素早く開けます。
DISKPARTコマンドを実行して、OSディスクの2番目にあるEFIシステムパーティションにドライブ文字「S:」を割り当てると、ファイルシステムが存在しないことが分かるでしょう。
このパーティションをFAT32でフォーマットし、「bootrec」コマンドと「bcdboot」コマンドでブート環境を適切に設定すれば、起動可能な状態に回復できます(画面6)。
具体的には、コマンドプロンプトで以下のコマンドラインを実行します(ディスク0のパーティション2がEFIシステムパーティション用の空のパーティションで、現在、C:\WindowsにWindowsのインストールが存在する場合)。
diskpart DISKPART> list disk DISKPART> select disk 0 DISKPART> list partition DISKPART> select partition 2 DISKPART> format quick fs=fat32 label="System" DISKPART> assign letter S: DISKPART> exit s: bootrec /fixbot bcdboot C:\Windows /l ja-jp /s S: /f ALL wpeutil reboot
岩手県花巻市在住。Microsoft MVP:Cloud and Datacenter Management(2019-2020)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。Microsoft製品、テクノロジーを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。近著は『ITプロフェッショナル向けWindowsトラブル解決 コマンド&テクニック集』(日経BP社)。
Copyright © ITmedia, Inc. All Rights Reserved.