2011/09/26

VMM2008R2 > オフライン P2V の謎のエラー (3140)

System Center Virtual Machine Manager (SCVMM) 2008 R2 の P2V (Physical to Virtual) 変換の謎のエラー (3140) の、私なりの調査報告です。

このエラー (3140) ですが、オフライン P2V 変換で発生することがあります。それも、何の説明もなく。これ以外のエラーの場合は、原因や推奨される操作を教えてくれるのに (本当にそれで解決できるかは別ですが)、 エラー (3140) だけはとっても不親切。
さまざまな環境で P2V 変換を試していたら、Windows 7 や Windows Server 2008 R2 がインストールされた PC で、Windows 7 や Windows Server 2008 R2 、あるいは Windows 7 や Windows Server 2008 R2 とデュアル ブート環境のレガシー Windows に対して、オフライン P2V を実行した場合に発生することまではすぐにわかりました。結論から先に言うと、システム ボリュームが 100 MB くらいのサイズの小さなボリュームの場合に発生します。オンライン P2V では発生することはありません。

オフライン P2V が正常に実行できる PC (C: ドライブ 1パーティション構成の PC) で、オフライン P2V の Windows PE 環境をちょいと覗いてみました。すぐに、C:\SCVMMsources と C:\scvmm_boot というフォルダーが作成されているのに気が付きます。

C:\SCVMMsources には、boot.wim ファイルがあります。これが、起動中の Windows PE のイメージだと想像できます。サイズは約 112 MB。もうわかりました?



C:\scvmm_boot には、Windows Boot Manager (bootmgr) や BCD ストア (C:\scvmm_boo\bcd) が入っています。これが、PC のオリジナルのブートローダー (ntldr や bootmgr) の代わりに、Windows PE に使われているようです。bcdedit /store C:\scvmm_boo\bcd で中身を確認すると、ramdisk=[boot]\SCVMMsources\boot.wim から起動するように構成されています。ちなみに、OS の起動環境は、Windows PE で最初に起動したときに、自動起動される P2V エージェントによってすぐに元通り (ntldr や bootmgr) に戻されるみたいです。



続いて、エラー (3140) が発生した PC の %windir% を覗いてみましょう。VMM サーバーが ADMIN$ 共有経由で $svcmm_boot.exe (約 7 MB) と $scvmm_boot.wim (約 112 MB) を送り込んできています。$svcmm_boot.exe が、システム ボリュームに scvmm_boot を展開するためのもの、$scvmm_boot.wim が SCVMMsources\boot.wim のソースです。


Windows 7 や Windows Server 2008 R2 では、標準のインストールでシステム ボリューム (ブート ローダーのあるボリューム) とブート ボリューム (Windows フォルダーのあるボリューム) が分けれれてインストールされます。システム ボリュームは、ドライブ文字なしの 100MB のアクティブ パーティションで、ここに bootmgr や boot フォルダーが置かれます。サイズが 100 MB なので、SCVMMsources\boot.wim を配置することができません。100 MB のシステム ボリュームにドライブ文字を割り当てて中身を見ると、中身が空の SCVMMsources フォルダーが作成されているのがわかります。SCVMMsources\boot.wim と Windows PE のブート構成をシステム ボリュームに展開するのに失敗したことが、エラー (3140) の原因というわけです。



エラー (3140) が発生する PC を、どうしてもオフライン P2V で変換したいという場合は、 C: ドライブをアクティブ パーティションとしてマークし、システム ボリュームの内容を C: ドライブにコピーしてください。OS 起動中はできないので、Windows 7 や Windows Server 2008 R2 のインストール DVD で起動し、[Shift]+[F10]キーを押してコマンドプロンプトを開いて、次の操作をします。

diskpart
list disk (ブート ボリュームのあるディスクのディスク番号を確認します)
select disk 0 (ディスクを選択します。ディスク番号 0 の場合)
list partition (ブート ボリュームのパーティション番号を確認します)

select partition 2 (ブート ボリュームのパーティションを選択します。パーティション 2 の場合)
active (ブート ボリュームをアクティブとしてマークします)
exit (diskpart を終了します)


システム ボリュームからブート環境をブート ボリュームにコピーします。Windows PE 環境ではドライブ文字がずれることがあるので注意してください。例えば、OS 起動時の C: ドライブが、Windows PE 環境では D: ドライブに、100 MB のシステム ボリュームが C: ドライブに割り当てられます。以下のコマンドラインも、その状況で実行する場合です。


xcopy C:\bootmgr D:\ /h
mkdir C:\boot
xcopy C:\boot D:\boot\
attrib +r +h +s D:\boot



Windows のインストーラーを中止して、PC を再起動します。この PC に対して、オフライン P2V を実行すると、今度はエラー (3140) は発生せず、成功するはずです。オフライン P2V を実行中にエクスプローラー C: ドライブを覗いていると、Windows PE で動するために PC がシャットダウンされる直前に、SCVMMsources と scvmm_boot を確認できます。


ところで、先日公開された Windows 8 の Windows Developer Preview ですが、既定のシステム ボリュームのサイズが 350 MB に拡大されていました。もしかして、SCVMM の P2V のエラー (3140) への対応だったりして... なんて思いきや、空き領域は 113 MB しかないので、エラー (3140) 対策とは全く関係なかったみたいです。

0 件のコメント: