質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

1回答

8642閲覧

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

t.o.free

総合スコア7

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2016/10/12 14:33

編集2022/01/12 10:55

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イメージからのブートが出来るという話があったので
試しています。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

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

投稿2016/11/26 09:25

t.o.free

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問