Home > Windows にまつわる e.t.c.

VHD boot


VHD boot って何?

VHD boot 環境の作り方

VHD の作成

ブートメニューへの組み込み

システム予約領域のドライブレターを削除する

インストールアカウントを削除する

ディスクの管理で容量可変のVHDを作る

VHD boot って何?

Windows Server 2008 R2 と Windows7(Ultimate/Enterprise) では VHD boot と呼ばれる機能が追加されました。この VHD boot とは、XP mode や Hyper-V の仮想化技術で使われている仮想マシンが使用する仮想ディスク(VHD/Virtual Hard Disc)を通常のローカルディスクと同様に扱って、物理マシンの起動ディスクに VHD を使うって代物です。

VHD boot を使うと、複数の OS 環境を切り替えて起動する「マルチブート」を簡単に作ることができます。マルチブート自体は目新しいものではありませんが、従来の手法でクリーンなOS環境にしようとすると、OS別にパーティションを分けたり、複数のハードディスクを使ったりする必要がありましたが、VHD boot では、.vhd ファイルをハードディスクに見立てるのでこのような面倒なことはありません。 大き目なハードディスクが1本あれば、お手軽にマルチブート環境を作ることができます。
更に .vhd はファイルなので、ベースとなる .vhd をコピーして起動環境を簡単に複製/バックアップすることも可能です。

VHD boot で起動した OS は物理マシン上で動いているので、ドメイン参加や Hyper-V / Virtual PC / XP mode も普通に動きますし、VHD boot のオーバーヘッドは全くと言っていいほど無い(ベンチマークで測ればオーバーヘッドはあるかもですが、体感上は全くありません)ので、常用環境として使用しても全く問題ありません。Hyper-V や XP mode を使うには、ハードウェアの仮想化アシストが必須ですが、VHD boot をするだけならこれらは必要ありません。
今これを書いている OS は VHD boot した Windows 7 Ultimate x64 で、ライティングやネットワークゲームをする常用環境として使っています。ちなみに、このマシンに物理的にインストールしている OS は、Windows Server 2008 R2 です。
こうしておくと、別の VHD 環境が欲しいときに Windows Server 2008 R2 で起動して、VHD を作ったらすぐに VHD boot で目的の OS 環境で起動することができるので便利が良いです。

テスト環境が必要だけど、仮想環境上ではなく物理マシン上でテストする必要があるとか、クリーン環境と色々ツールを入れた環境を切り替えて使いたいとか、1台の PC で環境を切り替えて使いたい場合は重宝します。
常用環境を VHD boot にしておけば、使っている環境に何かしらの問題が起きてもコピーしておいた .vhd で簡単に再構築できますし、ハードディスクの入れ替えをする時も簡単です。新しい PC に入れ替える時は、 sysprep して .vhd を持って行けば、高確率で今使っている環境をそのまま移植出来ます。

良い事づくめの VHD boot ですが、いくつか制限もあります

VHD boot は、VHD を HBA デバイスとして扱っているようなので、VHD 用の HBA ドライバが存在しない XP/Vista は VHD boot ができません。僕は試していませんが、Windows 7 の ブートパーティションと、Vista の  OS パーティションを組み合わせれば、ベースを Vista にして Windows 7 を VHD boot 出来そうな気もします。

まぁ、どうでも良い事ですが... コンピュータの評価を起動すると、VHD boot を検出してエクスペリエンスインデックスの計測が中断されます(ディスク評価だけスキップしてくれればいいと思うんですけどね)。PC のエクスペリエンスインデックス値を知りたいのであれば物理インストールする必要があります。

VHD boot だとエクスペリエンスインデックスが計測できない

これ以外にも、バックアップに制限が出るなどの若干の制限があるようですし、僕が知らない制限があるかもしれません。

「容量可変」の VHD で VHD boot 環境を構築する事はできますが、運用環境として VHD boot するのなら、ディスクパーフォーマンズ良い「容量固定」が勧めです。

Hyper-V で容量可変の VHD を作ると、環境によっては BSoD になる事があります。そのような場合はディスクの管理で容量可変 VHD を作るを参照してください。
空き容量が足りない環境に容量可変の VHD boot を構築すると、Stop 0x136 BSoD になってしまいます。(KB2020922/VHD からのネイティブ ブートを実行しようとすると"stop 0x00000136"のエラー)

 

VHD boot 環境の作り方

VHD boot 用の VHD は、Hyper-V で作ります。VHD は Virtual PC でも作れますし、Virtual PC で作った VHD で VHD boot する事も可能です。ただし、Virtual PC は x86 ゲスト OS しかサポートしていないので、x64の環境を作ることができません。

Hyper-V で Windows 7 の 容量固定 VHD を作るの場合は、ざっとこんな手順になります。

  1. 固定容量 VHD を作成

  2. 固定容量 VHD を使って仮想マシン作成

  3. 仮想マシンに Windows 7 をインストール

  4. 必要アプリケーションのインストール

  5. sysprep

  6. 仮想マシン削除

  7. bcdedit でブートメニューに登録

 

VHD の作成

まずは、Hyper-V 上で固定容量 VHD を作ります。固定容量の VHD は後でサイズ変更ができないので、サイズをよく考えて作らないと後で泣く事になります。

VHD 作成

 

容量固定を選択

VHD ができたら、作成した VHD を使って新しく仮想マシンを作成し、Windows 7 をインストールし、必要なアプリケーションをセットアップします。
Windows Update も済ませておくと、後が楽ですね。

準備ができたら、sysprep をかけます。sysprep をすると、SID がクリアされるだけではなく、PnP が走ってデバイスドライバをセットしなおすので、仮想環境と物理環境ハードウェア構成が異なって BSoD にる予防策にもなります。
sysprep は「C:\Windows\System32\sysprep\sysprep.exe」にあります。

一般化を指定してシャットダウン

ここまで準備ができたら、Hyper-V で間違って起動しないように仮想マシンを削除します。仮想マシンを削除しても .vhd は削除されないので、適当なフォルダに移動すれば VHD 作成は完了です。

 

ブートメニューへの組み込み

ブートメニューへの組み込みは bcdedit コマンドを使います。
GUID は、/copy の時に表示される GUID です。

bcdedit /copy {current} /d "メニュー表記"
bcdedit /set <GUID> device vhd=[ドライブレター:]\<ディレクトリ>\<VHDファイル名>
bcdedit /set <GUID> osdevice vhd=[ドライブレター:]\<ディレクトリ>\<VHDファイル名>
bcdedit /set <GUID> detecthal on 

ブートメニューへの組み込み

 

ブートメニューへの組み込みが完了すると、ブート時に OS 選択ができるようになります。

ブートメニューで OS 選択

 

bcdedit コマンドでもメンテナンス出来ますが、削除とデフォルト OS の変更であれば msconfig.exe でもメンテナンスが出きます。

msconfig.exeでメンテナンスができる

 

余談ですが、こんな PowerShell スクリプト書いていると楽だったりします(MVP が伝授するスクリプト作成のヒントとコツにも紹介されました)

param ( $Menu, $Path )

if( $Menu -eq $null -or $Path -eq $null){
    Write-Output "Usage:"
    Write-Output " vhdboot.ps1 `"Boot menu`" VHD-FullPath"
    exit
}

if(Test-Path $Path){
    $Output = bcdedit /copy `{current`} /d "$Menu" | Out-String
    $Output = $Output -split " "
    $GUID = $Output[1]
    $Drive = Split-Path $Path -Qualifier
    $File = Split-Path $Path -noQualifier
    bcdedit /set $GUID device vhd=`[$Drive`]$File
    bcdedit /set $GUID osdevice vhd=`[$Drive`]$File
    bcdedit /set $GUID detecthal on
}
else{
    Write-Output "$Path not found"
}

 

 

システム予約領域のドライブレターを削除する

ちょっとした Tips です。

VHD boot した OS から見ると、.vhd が格納されている物理ディスクも通常のディスクとして見えます。これはこれで良いのですが、ブートパーティション(システムで予約済み)にもドライブレターが割り当てられているので、なんかの間違いでブートパーティションを壊してしまうかもしれません。
そんな時は、ブートパーティションのドライブレターを消しておきましょう。

ドライブレターが割りあたっているブートパーティションのドライブ名を変更

 

ドライブレターを削除

 

インストールアカウントを削除する

これも Tips です。

Windows Server 2008 R2 を sysprep すると、Administrator のパスワードがリセットされるので別段問題は無いのですが、Windows 7 では Administrator をインストールアカウントにできないので、インストール用のアカウントを別に作成することになります。
困った事に sysprep してもインストール時に作成したアカウントが残ってしまい、再度インストールする時に別のインストールアカウントを作ることになってしまいます。
これを嫌うのであれば、sysprep 前にインストールに使用したアカウントを削除します。(削除時にさんざん警告が出ますけど ^^;)
更に、シャットダウン後に sysprep 済みの VHD をマウントしてプロファイルフォルダを削除してしまえばクリーンな環境にすることができます。

sysprep をする前にインストールアカウントを削除

 

sysprep した VHD をマウント

 

インストールアカウントのプロファイルを削除

 

ディスクの管理で容量可変のVHDを作る

Hyper-V で容量可変 VHD を作った場合、環境によっては BSoD になる事があります。そのような時は、ディスクの管理を使って容量可変 VHD を作るとうまくいく場合がありす。

VHD の作成

 

容量可変を指定

 

VHD を作成すると、自動的にマウントされます。出来たばかりの VHD は初期化されていないので、ここで初期化しておきましょう。容量固定の VHD を作った場合は初期化しなくても問題ありませんが、容量可変の VHD を初期化しないと、容量固定サイズで作成したのと同じサイズになってしまい、容量可変にしたメリットなくなってしまいます。

ディスクの初期化

 

VHDの切断

 

VHD を切断したら、Hyper-V で環境を作れば OK です。

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.