uefi-dualboot
update 2020-12-01


環境

Win10
fedora




マルチHDD環境
fedora-uefi からWindows-uefi を起動する
※fedoraはHDD1(/dev/sda)WindowsはHDD2(/dev /sdb)にインストールしているものとする。

dual-1.png
WindowsデバイスのEFIパーティションを確認する。
# gdisk -l /dev/sdb

EFIパーティションを確認したらパーティションのUUIDを確認する
# blkid /dev/sdb2

※UUIDは grub2-probe --target=fs_uuid コマンドで知ることができる。
※bootmgfw.efi が/dev/sdb2 にあり、mount /dev/sdb2 /mytemp でマウントされているものとする。
# grub2-probe --target=fs_uuid /mytemp/EFI/Microsoft/Boot/bootmgfw.efi

※hdX, gptY といった hints_string を確認するには次のようにする。
# grub2-probe --target=hints_string /mytemp/EFI/Microsoft/Boot/bootmgfw.efi

確認したUUIDを --set=root XXXXX の部分にUUIDのみを記述する。
ダブルクオテーション(" ")は不要。

menuentry "Win10" -class win10 {
        insmod part_gpt
        insmod fat
        insmod search_fs_uuid
        insmod chain
        search --fs-uuid --no-floppy --set=root XXXXX
        chainloader (${root})/efi/Microsoft/Boot/bootmgfw.efi
}

※UUID指定ではなく、次のようにデバイスを指定してもいい。
UEFI-GPTモードでは /dev/sda1 は (hd0,gpt1)、/dev/sda2 は (hd0,gpt2) のように(デバイス,gptパー ティション番号)を記述する。
set root= に指定する(デバイス,パーティション)は 実行する状態での(デバイス,gptパーティション番号)を指定することになる。
下記の例の set root=(hd0,gpt2) は set root='(hd0,gpt2)'  または set root='hd0,gpt2' と記述してもいい。
menuentry "Windows (hd0,gpt2)" {
    insmod part_gpt
    insmod chain
    set root=(hd0,gpt2)
    chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

grub2設定ファイルを更新する。
grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg

ブートメニュー例
bootmenu.png



マルチHDD環境
fedora-uefi とWindows-bios のブート切り替えを行なう。(BIOSベースのOSを起動する)

ブートマネージャから抜けると(Exitすると)、ブート優先順 2番目のデバイスが起動する。
UEFIベースのfedoraとBIOSベースのWindowsといった2台のHDD環境で次のような {exit} のみのブートエントリを作成して exit を実行すれば、優先順 2番目のOSを起動することになる
たとえば/dev/sdaにfedoraがあり、/dev/sdbにWindowsがあり、Windowsが2番目のboot順になっている環境 であるものとする。
grub.cfg にて menuentry "Windows-exit" -class win-exit {exit} を設定しておく。
これを利用すればfedora-uefi と Windows-bios のブート切り替えが可能になる。



マルチHDD環境
Windows10-uefi と Windows8-bios のブート切り替えを行なう。(BIOSベースのOSを起動する)
または
Windows10-uefi と Windows8-uefi のブート切り替えを行なう。(UEFIベースのOSを起動する)

※どちらの方法も2台のHDDが BIOSブートのマルチHDD環境で、別のHDDをブートする方法と同じである。
Windows10-uefi  にWindows8-bios のブートエントリ(またはWindows8-uefi のブートエントリ)を作成し、デュアルブート構成を作成するものとする。

bcdedit /copy {current} /d "Win-Legacy" 新規に
{GUID}が作成される。
uefiの場合は bcdedit /copy {current} /d "Win-UEFI"とする。
bcdedit /set {GUID} device partition=K: Win8の\Windowsフォルダのあるパーティションを指定する。(Win8のインストールしてある場所)
bcdedit /set {GUID} osdevice
partition=K: Win8の\Windowsフォルダのあるパーティションを指定する。(Win8のインストールしてある場所)
path は修正する必要はない。
再起動するとデュアルブートのブートマネージャが表示されるので、 uefi ベースと bios ベース(またはuefiベース)のブート切り替えができることになる。
※どちらを起動しても msinfo32の「BIOSモード」の表示はUEFIになっている。

UEFIベースのPCを起動した場合のブートマネージャは下記のようになっている。
※ブートマネージャでBIOSベースのデバイスのパーティションを指定して起動できるようになっている。
Windows ブート マネージャー
--------------------------------
identifier              {bootmgr}
device                  partition=\Device\HarddiskVolume6
path                    \EFI\Microsoft\Boot\bootmgfw.efi
description             Windows Boot Manager
locale                  ja-JP
inherit                 {globalsettings}
integrityservices       Enable
resumeobject            {e4adf817-8425-11e3-bb21-ee2c86b3e3ea}
displayorder            {current}
                        {e4adf819-8425-11e3-bb21-ee2c86b3e3ea}
toolsdisplayorder       {memdiag}
timeout                 30

Windows ブート ローダー
--------------------------------
identifier              {current}
device                  partition=C:
path                    \windows\system32\winload.efi
description             Windows 10
locale                  ja-JP
inherit                 {bootloadersettings}
integrityservices       Enable
isolatedcontext         Yes
allowedinmemorysettings 0x15000075
osdevice                partition=C:
systemroot              \windows
resumeobject            {e4adf812-8425-11e3-bb21-ee2c86b3e3ea}
nx                      OptIn
bootmenupolicy          Standard
detecthal               Yes

Windows ブート ローダー
--------------------------------
identifier              {e4adf819-8425-11e3-bb21-ee2c86b3e3ea}
device                  partition=K:
path                    \windows\system32\winload.efi ※pathはwinload.efi のままとなっている。
description             Win-legacy ※ uefiの場合はWin-UEFI
locale                  ja-JP
inherit                 {bootloadersettings}
integrityservices       Enable
isolatedcontext         Yes
allowedinmemorysettings 0x15000075
osdevice                partition=K:
systemroot              \windows
resumeobject            {e4adf812-8425-11e3-bb21-ee2c86b3e3ea}
nx                      OptIn
bootmenupolicy          Standard
detecthal               Yes



マルチHDD環境

Windows-uefi から fedora-uefi を起動する

方法1
Windows Boot Managerを fedora Boot Managerに置き換える。
※すでにfedora Boot Managerが動作しているので、他のBoot Managerをインストールしないですぐ実現できる。
※EFIブートのHDDとBIOSブートのHDDが存在しているデュアルブートにも対応できる。

※fedora環境で作業すると簡単に行なうことができる。
fedora EFI は /dev/sda1 パーティション、Windows EFI は /dev/sdb2 パーティションであるものとする。
dual-2.png
1.
/dev/sda1、/dev/sdb2をマウントする。
2.
/dev/sda1の\EFI\fedoraフォルダを丸ごと /dev/sdb2 の \EFI フォルダにコピーする。
これでfedoraのブート情報がWindows環境にコピーできたことになる。
3.
Windowsを起動して bcdedit コマンドで {bootmgr} を変更する。
bcdedit /set {bootmgr} path \EFI\fedora\grubx64.efi
bcdedit /set {bootmgr} description "fedora"
4.
PC再起動すると fedora Boot Managerが起動する。
5.
Windows Boot Managerに戻すには当初の状態に設定し直せばいい。
bcdedit /set {bootmgr} path \EFI\Microsoft\Boot\bootmgfw.efi
bcdedit /set {bootmgr} description "Windows Boot Manager"
PC再起動すれば"Windows Boot Manager"で起動する。

運用上の留意事項
この方法はfedoraのブート情報をWindows環境にコピーしただけなので、双方のBoot Managerが同期しているわけではない。
したがってfedoraのブート情報を更新した場合は(grub2-mkconfigでgrub.cfgを更新した場合)Windows環境にも コピーしておく必要がある。
別の使い方としては、同期していないことを利用してWindowsだけに適用するBoot Managerを作成する、ということもできる。

当初のWindows ブート マネージャーの状態
Windows ブート マネージャー
--------------------------------
identifier              {bootmgr}
device                  partition=\Device\HarddiskVolume2
path                    \EFI\Microsoft\Boot\bootmgfw.efi //この部分を\EFI \fedora\grubx64.efiに置き換える。  
description             Windows Boot Manager //fedoraに置き換える。
locale                  ja-JP
以下省略

fedora ブート マネージャー使用時の状態

Windows ブート マネージャー
--------------------------------
identifier              {bootmgr}
device                  partition=\Device\HarddiskVolume2
path                    \EFI\fedora\grubx64.efi
description             fedora
locale                  ja-JP
以下省略

方法2
Windows環境に rEFInd Boot Managerをインストールして使用する。
※ rEFIndは UEFI対応 Boot Managerである。(WindowsおよびFedoraともに対応している)
自動的にEFI環境を判定してEFI対応OSを起動できるようになる。(BIOS/MBRのOS起動には対応していない)

dual-3.png
The rEFInd Boot Manager
http://www.rodsbooks.com/refind/

ダウンロード
http://www.rodsbooks.com/refind/getting.html
A binary zip file をクリックしてrefind-bin-0.12.0.zipをダウンロード、展開。

インストール作業は Win10動作中の環境(オンライン)で行なう。
1.
コマンドプロンプト(管理者)実行。
2.
EFIシステムパーティション(/S オプション)をドライブ M にマウントするものとする。
※パラメータなしで mountvol とだけ実行すると現在のマウント状況を確認できる。
/S オプション:EFI システム パーティションを与えられたドライブにマウントする。
mountvol M: /S 
※ここでdir M:\ コマンドで確認すると次のようにマウントされている。
EFI システム パーティションが M:\ にマウントされている。
dir M:\ で見るとEFIフォルダ内のMicrosoft、Bootフォルダ、およびフォルダ内のファイルを確認することができる。
※mountポイントを削除するには mountvol M: /d
3.
rEFIndフォルダに移動して作業する。
※refindフォルダが D:\refind-bin-0.12.0フォルダ内にあるものとする。
cd /d D:\refind-bin-0.12.0
dirコマンドでサブフォルダ refind が照会できる。
4.
空のフォルダ(/E オプション)もコピーする
xcopy /E refind M:\EFI\refind\
5.
M: と入力してドライブ Mに移動する。
6.
cd \EFI\refind でフォルダに移動する
7.
del refind_ia32.efi で使用しないファイルを削除する。
8.
rd /s drivers_ia32 で サブフォルダも含めて(/s)削除する。
9.
ファイル名変更
rename refind.conf-sample refind.conf
10.
 ブートマネージャ作成
bcdedit /set {bootmgr} path \EFI\refind\refind_x64.efi
※bcdedit 情報(変更前および変更後)は下記参照
11.
descriptionを変更
bcdedit /set {bootmgr} description "rEFInd"
12.
この時点で再起動すれば、新しいbootプログラム rEFInd が起動する。
※エクスプローラやdiskpartのvolume表示では Mドライブはどこにも表示されず、何も変化が無い。
※{bootmgr}のpathとdescriptionが変更になっただけである。

元の"Windows Boot Manager"の状態に戻すには変更前の情報に戻せばいい。
bcdedit /set {bootmgr} path \EFI\Microsoft\Boot\bootmgfw.efi
bcdedit /set {bootmgr} description "Windows Boot Manager"
PC再起動すれば"Windows Boot Manager"で起動する。

再度"rEFInd"に切り替える場合は
bcdedit /set {bootmgr} path \EFI\refind\refind_x64.efi
bcdedit /set {bootmgr} description "rEFInd"
PC再起動すれば"rEFInd"で起動する。

rEFInd の環境
"rEFInd" boot managerはEFIシステムpartitionの
EFI\refindフォルダに作成されていて、\EFI\refind\refind_x64.efi や refind.confなどのファイルが在る。
※Windows EFI managerは \EFI\Microsoft\Boot\bootmgfw.efi である。

  refind.png

当初のWindows ブート マネージャーの状態
Windows ブート マネージャー
--------------------------------
identifier              {bootmgr}
device                  partition=\Device\HarddiskVolume2
path                    \EFI\Microsoft\Boot\bootmgfw.efi //この部分を\EFI \refind\refind_x64.efiに置き換える。  
description             Windows Boot Manager //rEFIndに置き換える。
locale                  ja-JP
以下省略

rEFInd ブート マネージャー使用時の状態

Windows ブート マネージャー
--------------------------------
identifier              {bootmgr}
device                  partition=\Device\HarddiskVolume2
path                    \EFI\refind\refind_x64.efi
description             rEFInd
locale                  ja-JP
以下省略



マルチHDD環境
電源スイッチでブート HDDを切り替えて起動する方法でのNVRAMブートマネージャ名変更。
※この方法は電源を切り替えたHDDだけを起動させる方法なのでデュアルブートではない。

独立してブート可能な複数のHDDのWindowsのUEFIブートマネージャ名は「Windows Boot Manager」となっている。
同じ名前なのでファームウェアにて識別が付かないので使いにくい。
HDDを取り外すとファームウェアが識別できない場合はシステムが起動できなくなるので、毎回ブートデバイスを選択することになる。
これを解消するにはbcdeditコマンドでブートマネージャの表示を変更すれば解りやすくなる。
ファームウェアも識別するので電源がオンになっているHDDが起動するようになる。

下記の作業はオンラインで(現在起動しているwindowsで)作業すればいい。(オフラインで作業する必要はない)
(1)bcdeditにて{bootmgr}エントリのdescriptionを次のように変更する。
bcdedit /set {bootmgr} description "Win10 Boot Manager"
bcdedit.jpg

(2)変更後のブートマネージャは次のようになる。
bootmgr.jpg

(3)ファームウェアのNVRAMの表示は次のようになる。
bios.jpg



シングルHDD環境

win10-uefi 環境にwin8-uefi をインストール
dual-4.png
「インストールの場所選択」時にOSインストール順が推奨順(OSバージョン順)ではないという、下記のアラームが表示される。
インストール用に選択されたディスクのパーティションが推奨 される順序になっていません。インストールを続行しますか?
構わずに進行すればインストールは正常に完了する。
PCを起動するとwin8ブートマネージャー(テキスト表示)のwin8、win10のデュアルメニューが表示される。

win10ブートマネージャー(グラフィカル表示)に変更するには、win10起動状態のコマンドプロンプト(管理者)で次のようにブート情報を 書き換える。
bcdboot c:\windows /l ja-JP
再起動するとwin10ブートマネージャーのwin10、win8のデュアルメニューが表示される。

Windows ブート マネージャー
--------------------------------
identifier              {bootmgr}
device                  partition=\Device\HarddiskVolume2
path                    \EFI\Microsoft\Boot\bootmgfw.efi  
description           Windows Boot Manager
locale                  ja-JP
以下省略



シングルHDD環境
win10-uefi 環境にfedora-uefi をインストール

インストール前のHDD
dual-5.png
インストール後はfedora Boot Manager で起動する。
fedoraは自動的に下記のようなメニューエントリ「Windows Boot Manager」を追加してくれるので「Windows Boot Manager」を選択すればWin10が起動する。

### BEGIN /etc/grub.d/30_os-prober ###
menuentry 'Windows Boot Manager' {
      chainloader /EFI/Microsoft/Boot/bootmgfw.efi
      boot
}
### END /etc/grub.d/30_os-prober ###

インストール後のHDD
dual-6.png

留意事項
この環境で安易に win10 ブートマネージャ(BCDストア)を再作成してはいけない。 ( 安易に bcdboot c:\windows /l ja-JP を実行してはいけない)
fedora-uefi ブートになった状態で win10-uefi ブートに戻すと fedora-uefi を起動できなくなる。
起動できなくなった場合は fedora-uefi をrescue モードで起動して efibootmgr  コマンドでfedoraブートマネジャで起動するように作成し直す。



シングルHDD環境
fedora-uefi 環境にwin10-uefi をインストール

インストール前のHDD
dual-7.png
Win10-uefi は fedora-uefi のブートを考慮しないので、インストール後はWin10-uefi だけしかブートできなくなる。
Win10-uefi のBoot Manager を書き換えて fedora-uefi を起動できるようにするとWin10-uefi が起動できなくなる。

インストール後のHDD
dual-8.png

この場合はrEFInd Boot Manager を使用して fedora-uefi 、Win10-uefi を起動できるようにすればいい。



シングルHDD環境
fedora-uefi 環境に別バージョンのfedoraX-uefi をインストール

インストール前のHDD
dual-9.png
あとからインストールするfedoraXのインストール時に 3つのパーティション( /Boot 、/boot/efi 、/ )を作成して、先にインストールしたfedoraとブートローダを区別できるように領域を分けてインストールするものとする。
※すでに存在する /boot/efi を使用すると \EFI\fedoraという名前が同じなので、grubx64.efi が上書きされてしまう。

インストール後のHDD
dual-10.png
あとからインストールしたfedoraXによってgrub.cfgが更新される。
以前にインストールした fedoraの menuentry が linuxefi 、initrdefi のように efi が指定されているかどうか grub.cfg を確認する。



シングルHDD環境
fedora-uefi 、openSUSE-uefi 、 ubuntu-uefi をイ ンストール

インストール時に自動まかせにしないで、カスタム設定で同じEFI パーティション使用するように指定した場合の例である。
dual-11.png



作業時のメモ

※EFI partitionのファイルシステムはFAT32である。
diskpart 使用時に EFI partitionをドライブ Bにマウントして照会するには、
diskpart //diskpartを起動
list volume //ボリューム情報を確認
select volume N // N はEFI volumeの番号
assign letter=b //ドライブレター B
// 解除はremove letter=b
exit
---partition を指定してもいい
diskpart //diskpartを起動
list partition //パーティションを確認
select partition N // N はEFI partitionの番号
assign letter=b //ドライブレター B
// 解除はremove letter=b
exit

end of list