USB上でのWindowsPEの32bit版と64bit版のマルチブートが出来ません

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,582

t.o.free

score 5

USBメモリー上に、32bit版と64bit版
それぞれのWindowsPE5.1を設置し
UEFIからのマルチブートをさせたいのですが
なかなかうまく行きません。

起動したら、ブートメニューに移り
WindowsPE 32bit
WindowsPE 64bit
とそれぞれの選択肢が現れ、選択したバージョンのPEが起動する仕組みです。

ブートローダーにはgrub2を使っています。
USBメモリーのルートディレクトリには
x64とx86のディレクトリがあり
それぞれのWindowsPEがそこに入っています。
chainloaderでWindowsPEのbootx64.efi
bootia32.efiを呼び出し、起動させるわけですが
今のところBCDを修正したりして、起動ロゴ以降まで動かす事が出来ました。
ただ、それ以降のコマンドプロンプトが表示されず
青い画面(BSODではなく)で止まった状態です。
また、BCDも現在はUSBメモリールートのbootディレクトリに入っており、これもx64等に入れたいところなのですが・・・(32bitと64bitの両方を動かしたいため)

loopbackを使いisoからのブートを試みようとしたところ
memdisk及びwimbootは真っ黒な画面で最初は読み出しているのがわかるが
その後、止まり応答しなくなりました。
chainloaderでPEのbootx64.efiを呼び出すと
0xc0000428・・・セキュアブートは無効にしている筈ですが
署名が不正と言われて立ち上がらず
なんでもmemdiskやgrub経由のwimbootは64bitUEFIに対応してないので
チェインローダーから呼び出すしかないとの書き込みを見て
isoを展開し、x64ディレクトリに入れbootx64.efiを呼び出すしたところ
現状の状態となっています。
BCDを編集して調整すると

device = [boot]/x64/sources/boot.wim,GUID
path = /x64/windows/system32/winload.exe
osdevice = [boot]/x64/sources/boot.wim,GUID
systemroot = /x64/windows
この状態でWindowsの背景画像が表示されるまで
device = [boot]/x64/sources/boot.wim,GUID
path = /windows/system32/winload.exe
osdevice = [boot]/x64/sources/boot.wim,GUID
systemroot = /windows
この状態で、起動中に強制リブートがかかってしまいます。

追記
grub→ipxeからだとisoイメージからのブートが出来るという話があったので
試しています。

どのようにすればよいのでしょうか?
ご助言をよろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

なんとか解決する事が出来ました。
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モジュールも意味がないわけです。
ここ注意してください、わたしはよくわからずにやっていてかなりの時間を消費してしまいました・・・。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る