読者です 読者をやめる 読者になる 読者になる

きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

外付けUSB HDDからVHDブートその2

昨日の続きとまとめ。

とりあえずのところ、USB接続のHDD上に配置したVHDファイルからWindow 7をVHDブートして常用(?)出来る状態にすることに成功したので、メモしておきます。わりと殴り書き風味。
#……そのうち、もっときれいに書き直したい……なぁ。

上手くいかない原因とか

USBドライブに配置したVHDファイルからVHDブートしようとしても、内蔵HDDに配置したのと同じようにやっても上手くいかない。途中でSTOPエラーが出る。
これはWindows 7が外付けUSB機器からのブートに対応していない為、USBドライブから起動される事を前提としたドライバの読み込みを行わないから。


AHCIの機器でブートする場合の情報は長沢さんのblog( http://blogs.msdn.com/tomohn/archive/2009/09/18/vhd-vpc-creates-vhd-native-boot-3.aspx )等で紹介されているし、RAIDの機器の場合はid:Yamaki さんのエントリ( http://d.hatena.ne.jp/Yamaki/20091021/1256112167 ) で紹介されているが、USBに対しても同様のことが言えるらしい。

解決策?

同じように調べてみると、起動時にUSB機器のドライバをブートデバイスとして読み込むには、レジストリの以下のエントリに対して、それぞれの値を設定してやれば良いようだ。

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbehci]
"Start"=dword:00000000
"Group"="Boot Bus Extender"

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbhub]
"Start"=dword:00000000
"Group"="Boot Bus Extender"

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbohci]
"Start"=dword:00000000
"Group"="Boot Bus Extender"

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR]
"Start"=dword:00000000
"Group"="Boot Bus Extender"

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbuhci]
"Start"=dword:00000000
"Group"="Boot Bus Extender"


試しに、Vitual PC上でWidnows 7をインストールし、上記のレジストリ操作を行ったイメージをUSB機器に配置、VHDマウントで起動してみたところ、とりあえず上手く起動した。


が。

それだけでは未解決

しかし、その後リブートしてみたところ、また起動しなくなってしまった。再度Virtual PCで起動してみたところ、レジストリが元の通りに書き換わっていた。

どのタイミングで書き換わるのかは不明だが、一度起動すると再びこの値が元に戻る(ブートデバイスとしては機能しないように戻る)ようだ。


ということは、とりあえずこの値を書き換えられないようにしてやるか、もしくは再度書き換えなおしてやれば問題を解決する事が出来ように思える。

毎回手動で書き戻すのはさすがにアレなので、スタートアップにレジストリを書き戻すバッチファイルでも仕込もう……かと思ったが、書き戻っているタイミングが不明だからスタートアップのタイミングで書き換えて間に合うか解らないし、UACに引っかかるだろうし美味しくなさげ。

真の(?)解決方法発見

どうしたものかと思案していたら、以下を発見。
http://www.911cd.net/forums//index.php?showtopic=22473

これは素敵。


これ(UsbBootWatcher)が何をするものかざっくり説明すると、
『自分がUSBデバイスからブートしていると認識したら、起動中に上記のレジストリを良い感じに書き換えてUSBからブート出きるようにしてくれるサービス』
というもの。


ということで、Windows7がインストールされたVHDを一度Virtual PCで起動して上記のページに従ってUsbBootWatcherをインストール、その後そのイメージでVHDブートすると……動いた!!
何度かリブートしても問題なく動いているようなので、これで問題ないっぽいです。

その他注意点?

そのた気がついたUSB HDDからVHDブートする際に気がついた点を、ついでにいくつかメモしておきます。

  1. USB HDDに格納されているVHDファイルをWindowsブートマネージャが認識し損なうことがある
    たぶん、環境による。おそらく起動のタイミングの問題。うちの環境だと、電源投入時は今のところ再現率100%。一度起動したWindowsで再起動したり、エラーとなった画面でctrl+alt+delで再起動した場合は問題なく認識(これも現状、再現率100%)。これは、BIOSの設定でPOST時のWAITを弄ってやれば解決しそう。
  2. 最初、ページファイルが作成されない
    これも環境によるかもしれません。起動すると、ページファイルが作られていない。VHDブートの場合、ページファイルは仮想ファイル内ではなく実パーティション内に直接作られるのだが、以下の二点が重なったためか作成されていなかった。
    (1) 内蔵HDDがマウントされていなかった
    (2)そもそもUSB HDDにはページファイルが作成できない
    とりあえずディスクの管理より内蔵HDDを手動でマウントし、そこに作ってやると、以降リブートした後でもちゃんとそこにページファイルが作られている模様。

実用性は?

ちなみに、ATOM330のマシンでUSB 2.0で接続したアイオーデータ製の540GBのHDDにWindows 7 UltimateがインストールされたVHDVHDブートしてみているのですが、『ブートマネージャで対象のエントリを選択してから起動して自動ログインして操作できるようになる』までで、1分半ほどでした。


パフォーマンス的には、目的にもよるかもしれませんが、とりあえずは使えそう。


内蔵HDDの容量が乏しいけどVHDブートで評価したい、なんと時にはとりあえず使える手かもしれません。