なんとか解決する事が出来ました。
USBで実現する前提として、結論から先に書くと
BIOSはgrubとlinux16モジュールとwimbootの構成で起動させる事が出来ます。
こちらはubuntuの環境で行ったので、Linuxの環境として・・・
先ず、grubをBIOS用としてインストール(USBメモリーマウント先 → /mnt)
grub-install --target=i386-pc --boot-directory=/mnt/ /dev/(USBデバイス)(エラーが出る場合は--forceをつける)
完了したら/mnt/boot/grubとディレクトリが出来ているので
/mnt/boot/grub/grub.cfg
を作成します。
あとは設定情報を書きます。
WindowsPE 32bit版
そして、仮に32bitがx86ディレクトリにある場合
menuentry 'WindowsPE 32bit' --class windows --class os {
insmod linux16
linux16 /wimboot
initrd16
newc:bootmgr:/x86/bootmgr
newc:bcd:/x86/Boot/BCD
newc:segmono_boot.ttf:/x86/Boot/Fonts/segmono_boot.ttf
newc:segoe_slboot.ttf:/x86/Boot/Fonts/segoe_slboot.ttf
newc:segoen_slboot.ttf:/x86/Boot/Fonts/segoen_slboot.ttf
newc:wgl4_boot.ttf:/x86/Boot/Fonts/wgl4_boot.ttf
newc:boot.sdi:/x86/Boot/boot.sdi
newc:boot.wim:/x86/sources/boot.wim
}
wimbootはWindowsをブートさせるためのモジュールです。
こちらから入手できます。
http://ipxe.org/wimboot
同じ要領で64bitの場合x64のディレクトリに入ってるとすると
x86の部分をx64に変更するだけです。
VirtualBoxで実行するにはPAEとAPICを有効にしておく必要があります。
続いてUEFIですが・・・
UEFI版のgrubからはWindowsを起動する方法がchainloaderしかありません。
先ず、WindowsPEが最低限動く環境を確かめます。
/EFI/BOOT/bootx64.efi
/EFI/Microsoft/Boot/BCD
/boot/boot.sdi
/boot/resources/bootres.dll
/sources/boot.wim
この5つのファイルが必須となります。
ただ、/EFI/BOOT/bootx64.efiは他のブートローダーのEFIファームと被ります
なのでwinpe64.efi等に名前を変更します。
代わりにgrubのUEFIファームを設置します。
/EFI/BOOT/grub.cfg
に同じようにgrubブートメニュー用の設定情報ファイルを作成し保存します。
ここから32bitを例として作業を進めます。
/x86/EFI/Microsoft/Boot/BCD
をWindowsに持ってきて編集します。
これはコマンドプロンプトでbcdeditを使って・・・(32bitがx86ディレクトリに入ってる場合)
bcdedit /store (BCDの場所) /set {default} t {default} device ramdisk=[boot]\x86\sources\boot.wim,{GUID}
同様に
bcdedit /store (BCDの場所) /set {default} t {default} osdevice ramdisk=[boot]\x86\sources\boot.wim,{GUID}
書き換えたら元の場所・・・
/x86/EFI/Microsoft/Boot/
に戻します。
さて・・・ここからが問題です・・・。
というのも現状用意されているUEFIファームやモジュールではUSBからのWindowsPE32/64bitのマルチブートは出来ません。
という事で自力でUEFIファームを作ります。
幸いedkIIというUEFIファーム開発環境が提供されています。
これを使い以下のような処理をするUEFIファームを作成します。
/x86/boot/boot.sdi → /boot/boot.sdi (コピー)
/x86/boot/resources/bootres.dll → /boot/resources/bootred.dll (コピー)
/x86/EFI/Microsoft/BCD(先程の修正版BCD) → /EFI/Microsoft/Boot/BCD (コピー)
コードは事情により公開する事ができません・・・すみません・・・
そして例としてstart32.efiという名前でビルドします。
場所はルートに置くとします。
grub.cfgの方に以下のように書きます。
chainloader /start32.efi;boot;chainloader /EFI/BOOT/winpe32.efi;boot
内容としては
start32.efiで起動に必要なファイルコピー作業を
そしてwinpe32.efiでPE自体を起動させるわけです。
sources/boot.wimの処理は必要ありません。
BCDでソースファイルの場所を変更しているためです。
Googleで検索して出てくるような
loopback(isoをマウント出来るモジュール)
linux、linux16は使えません。
linuxefiが必要になります。
ただし、wimbootもUEFI環境では使えないため、実質としてlinuxefiモジュールも意味がないわけです。
ここ注意してください、わたしはよくわからずにやっていてかなりの時間を消費してしまいました・・・。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。