uefi
update 2016-12-29

UEFI (Unified Extensible Firmware Interface)

従来のBIOSに代わるPCの基本的なソフトウェア。
UEFIおよびsecure bootが可能なためには下記の条件を満たしていることが必要である。


UEFI ブート

UEFI対応OSの起動プロセスは・・・
UEFI対応OSでは、従来のMBR(マスターブートレコード)を利用せず、
EFIパーティションにあるブートマネージャーに直接アクセスして起動する。

(1) システム電源オン。
POST(Power On Self Test)処理が行われる。
(2) マザーボードのUEFI ファームウェアがロードされる。
(3) ファームウェアは FAT32でフォーマットされたパーティションの EFI フォルダ内に efi アプリケーションがあることを確認する。
ファームウェアはUEFIブートマネージャ を読込み、どのディスクのパーティションから UEFI アプリケーションを起動するかを決める。
たとえば「Windows Boot Manager」とか「UEFI:DVD」とか「UEFI:USB Stick」などを起動する。
(4) ファームウェアは、FAT32 でフォーマットされた UEFI システムパーティション(ESP: EFI System Partition)にある UEFI アプリケーションを起動する。
(5) UEFI アプリケーションは、設定された他のアプリケーションやカーネルやRAMディスク(initramfs、initrd) を起動する。

たとえばWindowsの場合は次のようになる。

UEFIブートマネージャとは bcdedit /enum firmware の {fwbootmgr} のことである。
{fwbootmgr} は {bootmgr} ( Windows Boot Manager )を実行する。
「Windows Boot Manager」は「Windows ブート マネージャー」の「descriptionが Windows Boot Manager」のことであり、
device は partition=\Device\HarddiskVolume2 のようになっている。( つまり partition=C を指定している)
path は \EFI\Microsoft\Boot\bootmgfw.efi になっている。
(bootmgfw.efiはUEFIブート用ファイル。bootx64.efiとリネームして\efi\boot\bootx64.efiに置いてUEFIブートに使う)
「Windows ブート マネージャー」のWindows ブート ローダーには「deviceはpartition=C: 」 「pathは\windows\system32\winload.efi」のようになっているので、カーネル \windows\system32\ntoskrnl.exeを起動することになる。

Windows起動プロセスは次のようになる。
uefi_boot.jpg



UEFI ブートの例

※下記の「ブート デバイス メニュー」とは、いわゆるUEFI設定ユーティリティ画面(従来のBIOS設定ユーティリティ)のことである。

(1) BootableデバイスをPCにセットしておく。
たとえば、DVD、USBフラッシュドライブ、内蔵(または外付け)ハードドライブなどである。

(2) PC起動してブート デバイス メニューを開くキー(たとえばDelキー)を押す。
UEFIモード対応のマザーボードでは、各bootデバイスの\efi\boot\bootx64.efiファイルを自動的に判断して、bootデバイス を表示してくれる。
bootデバイス表示を照会すると、「UEFI DVD/CD Drive」コマンド、「UEFI USB Drive」コマンドのようになっている。
※それぞれのコマンドは同じデバイスとメディアを使用するが、ファームウェアを読み込むときのファームウェアモード(UEFIモード、BIOSモード)が 異なる。

(3) UEFIブートアプリを開始する方法は下記の3通りの方法がある。

方法[1]
ブート デバイス メニューで、ファームウェア モードとデバイスの両方を識別するコマンドを選択する。
たとえば「UEFI DVD/CD Drive」コマンド、「UEFI USB Drive」コマンドのようになっている。

方法[2]
ブート デバイス メニューに、「Boot override」とか「Boot from file」、「Boot manager」 などのブート ファイルを選択するコマンドがある場合は、このコマンドを選択する。
そしてブート ファイルの場所(たとえば ブートデバイス\EFI\BOOT\BOOTX64.EFI)を参照する。

方法[3]
内部シェル(Shell.efiなど)を使ってブート ファイルを手動で起動する。
UEFI internal shell、Shell.efi など、シェルまたはコマンド プロンプトを起動するコマンドを選択する。
UEFIシェル(またはコマンド プロンプト)が起動したら、Windowsシステムドライブ、またはインストール用DVD、Windows PE メディアがあるドライブを選択する。
ドライブ名は、fs0: fs1: fs2: などのようになっている。
たとえば、次のようにコマンドを入力してドライブを指定する。
Shell> fs0:
そして、次のようにUEFI ブートアプリを開始する。
fs0:> \efi\boot\bootx64.efi
以上のようにしてUEFIブートアプリを開始すれば、
ファームウェアは、BIOS 固有または UEFI 固有のブート情報を使って、Windowsシステム、 またはインストール用DVD、Windows PE を起動する。


EFI shell の作成
※USBメモリにEFI shell を作成する

(1) USBメモリをFAT32でformatする(EFI ShellはNTFSでは使えない)

(2) Shell_Full.efi をダウンロードする(2020-11-10現在)
https://github.com/tianocore/edk2-archive/blob/master/EdkShellBinPkg/FullShell/X64/Shell_Full.efi
「Download」ボタンをクリックするとShell_Full.efiファイルダウンロード画面が開く。

(3) Shell_Full.efiをUSBメモリにコピーする。
Shell_Full.efi をshellx64.efi とファイル名変更する。
以上で作成終了。

(4) 作成したUSBメモリをPCに挿してPC起動。
起動するとUSBメモリのshellx64.efi を判定してUSBメモリはUEFIデバイスとして認識されている。
"Launch Shell from device"とか
"Launch EFI Shell from File System device"という項目を選択する。(「画像1」 参照)
実行するとshellx64.efiがloadされ、Shellプロンプトが表示される。
"Shell >"
※ls、dir、cd 、mkdir、map、ver、exit(BIOSに戻る) コマンドなどが使用できる。(詳細はreference参照)

map コマンドでドライブ一覧(fs0、fs1・・・)を表示する。
下図の場合は HardDisk ,Remobable HardDisk(USBメモリ)が認識されている
HardDiskは fs0 であり、GPT形式のパーティションの2番目にEFIファイルがあることがわかる。( \efi\boot\bootx64.efi のことである)
つまり、EFIShellで bootx64.efi を実行すればWindowsシステムが起動することになる。
Remobable HardDiskは fs1 であり、MBR形式のパーティションの1番目にEFIファイルがあることがわかる。(shellx64.efi のことである)

uefi_map.jpg

(5) 使用例:入力は小文字、大文字でもいい。(「画像2」 参照)
※日本語キーボードでは次のように入力する
コロン「 : 」は「 Shift + ; 」、バックスラッシュ「 \ 」は右大かっこ「 ] 」(「かな」の「む」)
fs0: fs1: fs2: はWindowsシステムドライブ、またはインストール用DVD、Windows PE メディアのあるドライブ(デバイス)のことである。

ドライブを指定する。
Shell> fs0:

lsコマンド(またはdirコマンド)で \efi\boot\bootx64.efiが存在することを確認しておく。
fs0:に存在しない場合はfs1: または fs2: を確認する。

cd コマンドで bootx64.efi のあるフォルダに移動する。
fs0:\> cd \efi\boot

UEFI ブートアプリ bootx64.efi を実行するとWindowsシステムが起動する。
fs0:\EFI\BOOT> bootx64.efi

※フルpathで \efi\boot\bootx64.efi のように実行すると「コマンドが認識されない」というエラーになる場合は、上記のようにフォルダを移動して実行すればいい。

「画像1」
Boot OverrideとはBIOSを終了して、選択したメニューのデバイスから直接bootさせるものである。
つまり、boot優先順での設定とは関係なくbootデバイスを指定するものである。
例えば「Windows Boot Manager」を選択して実行すれば「Windows Boot Manager」のあるデバイスから起動する。
※USBメモリ:JetFlashがUEFIデバイスとして認識されているが、UEFI Shellが存在するだけでboot機能は無いので、選択してもbootできない。
したがって「Launch Shell from device」を選択して「画像2」のようにbootファイルを指定してbootする。

efi1.jpg

「画像2」
efi2.jpg


UEFI bootloader の修復

Windows

UEFIシステムが起動できなくなった場合は(システム修復ツールの「スタートアップ修復」でも起動しない場合)次のように修復を行なう。
作業内容は、diskpart にてUEFI/GPTディスクのvolumeにドライブレターを割り付けて、該当ドライブに bcdbootコマンドでブート情報を作成するものである。
※ここでは disk 0 がbootデバイスであるものとする。
diskpart ( diskpartを起動する)
DISKPART> list disk
DISKPART> select disk 0
DISKPART> list volume
# fat32のsystem partition を探す。(ここでは volume 2 であるものとする)
DISKPART> select volume 2
# ドライブレターを付ける
DISKPART> assign letter=b: (ドライブレターの削除は removeコマンド)
DISKPART> exit ( diskaprtを終了させる)

# b:\EFI\Microsoft\Boot\ に移って作業する(このフォルダにBCDストアがある)
cd /d b:\EFI\Microsoft\Boot\
ren BCD BCD.bak (念のためバックアップのためBCDをrenameする。この作業は必須ではない)
bootrec /fixboot (システム パーティションに新しいブート セクターを書込む)
※--- Windowsが起動している状態では下記の作業だけ行なえばいい。
# BCDストアを作成する。(/f ALL はUEFI firmware/NVRAMも含めてBIOS設定をupdateする指示である)
bcdboot c:\Windows /l ja-JP /s b: /f ALL
※bcdboot c:\Windows /l ja-JP だけでもいい。
# 以上でブート情報は書き換えられる。
PC再起動して正常に動作することを確認する。
上記でも正しく起動しない場合はブートマネージャの設定が適切ではないことが考えられる。
bcdedit でブートローダを照会して、{default} のエントリを確認してみる。
---
※win7での修復例(インストールDVD起動にてコマンドプロンプトで作業する)
bootrec /rebuildbcd
bootrec /fixmbr
bootrec /fixboot
これでPC再起動しても正常に起動できない場合はdiskpartで作業する
diskpart
select disk 0
list volume //CD/DVDのドライブを確認(ここではF:とする)
F:
cd boot //bootフォルダに移る
dir //bootsectファイルがあることを確認
bootsect /nt60 SYS /mbr
再起動してwin7がブートするかどうか確認
---
※win8での修復例(インストールDVD起動にてコマンドプロンプトで作業する)
diskpart
select disk 0
list vol //volume確認(FAT32の領域がUEFI volumeである。ここではvol 2であるものとする)
sel vol 2
assign letter=G: //ドライブレターを割り当てる
exit
bootrecのあるフォルダに移る
cd /d G:\EFI\Microsoft\Boot\ //bootフォルダに移る
または
cd /d G:\Boot\
または
cd /d G:\ESD\Windows\EFI\Microsoft\Boot\

bootrec /fixboot
BCD ブート構成情報を作り直すのでバックアップする
ren BCD BCD.bak
Bcdboot C:\Windows /l ja-jp /s x: /f ALL
bootrec /rebuildbcd
exit
PC再起動してwin8がブートできることを確認する。


fedora(Linux)

efibootmgr コマンドでBoot Managerを作成し直す。
※ 詳しくは efibootmgr --help を参照。(NVRAMについて、boot順、新規追加、削除などの操作ができる)

efibootmgr とは UEFI Firmware Boot Manager の設定を操作するツールである。
UEFIブート環境の rescue モードで efibootmgrを使用する。(BIOSモードではefibootmgrは使えない)
ブートローダファイルは /boot/efi/EFI/fedora/grubx64.efi であるものとする。

efibootmgr コマンドではデバイスを「 sdX 」(Xは a、b・・・となる)で指定し、パーティションを「 -p N 」(-p はPartition 、 N はpartition番号)で指定する。
したがって /boot/efi/EFI/fedora/grubx64.efi は「/boot/efi」 と 「/EFI/fedora/grubx64.efi 」に分けて指定する。
※ /boot/efi はESP(EFI System Partition)というUEFIシステムが在るパーティションである。

「/boot/efi」の部分はUEFI システムパーティションのマウントポイントであるので、デバイスパスは /dev/sdXY である。
例えば UEFI システムパーティションが /dev/sda1 である場合は、X=a Y=1 である。(/dev/sda2 ならば X=a Y=2 である)
「/EFI/fedora/grubx64.efi 」の部分は ファイルのパスである。

マウントポイントが /boot/efi だとして 実際の UEFI システムパーティション( /dev/sdXY)のデバイスパスを調べるには、
# findmnt /boot/efi を実行すれば次のように表示されるので確認できる。
/boot/efi /dev/sdXY vfat (実際には /boot/efi /dev/sda1 vfat のように表示される)

ブートエントリを作成するには efibootmgr を使って以下のように実行する。
※デバイスパスは分けて指定しているので、ファイルパスは /EFI/fedora/grubx64.efi と指定する。(/boot/efi/EFI/fedora/grubx64.efi と指定してはいけない)
※ このパーティションはFAT32なので「/(スラッシュ)」ではなくて「\(バックスラッシュ)」で入力すること。
# efibootmgr -c -L "Fedora" -d /dev/sdX -p Y -l '\EFI\fedora\grubx64.efi'

デバイスパスが /dev/sda1 ならば
# efibootmgr -c -L "Fedora" -d /dev/sda -p 1 -l '\EFI\fedora\grubx64.efi' のようになる。
-c は create(新規作成)
-L はLabel (UEFI ブートメニューで表示されるメニューエントリの名前になる。任意の名前なのでシステムのbootには影響がない)
-d はdisk(デバイスのことである)
-p はpart(partition番号。ブートローダが存在する場所である)
-l はloader name (ブートローダのファイルパスである)
このパーティションはFAT32 ファイルシステムなので大文字・小文字を区別しない。
したがって '\EFI\fedora\grubx64.efi' は '\efi\fedora\grubx64.efi' と指定してもいい。

※日本語キーボードでのキーは次のようになる。
「 " 」は「Shift *」、 「 ' 」は「 : (コロン)」、「\(バックスラッシュ)」は「 ] (「む」)」
# efibootmgr -c -L "Fedora" -d /dev/sda -p 1 -l '\EFI\fedora\grubx64.efi' となる。

fedora EFIが壊れた場合の手作業でのEFI bootエントリの作成は次の通りである。
gdisk -l /dev/sda にてディスクのパーティションを確認しておく。
ここではUEFI システムパーティション番号は 1 であるものとする。
# modprobe efivars ( efivars インターフェイスを有効化)
# efibootmgr -c -L "Fedora" -d /dev/sda -p 1 -l '\EFI\fedora\grubx64.efi'

※efibootmgr の使用例
ブート順変更
efibootmgr -o 0003 // Boot0003 の順番(order)を最優先に設定。
エントリ Boot0003 を削除する。(NVRAMから削除する)
efibootmgr -b 0003 -B
エントリに追加。(NVRAMに追加する)
efibootmgr -c -L "Fedora" -d /dev/sda -p 1 -l '\EFI\fedora\grubx64.efi'

※partition 1をUSBメモリ(/dev/sdb)の/dev/sdb1にsave-sda1.imgファイルとしてsaveする例
mount /dev/sdb1 /mnt  ※ /dev/sdb1を /mntフォルダにマウント
dd if=/dev/sda1 of=/mnt/save-sda1.img bs=1M conv=noerror,sync  ※コピー
umount /mnt  ※アンマウント

元に戻す例
mount /dev/sdb1 /mnt  ※ /dev/sdb1を /mntフォルダにマウント
dd if=/mnt/save-sda1.img of=/dev/sda1 bs=1M conv=noerror,sync  ※コピー
umount /mnt  ※

fedoraのUEFIブート環境ではgrub2-installを実行してはいけない。
grub2-install はfedora-BIOSブートでのコマンドである。
grub2-install を実行すると/boot/grub2/grub.cfgを読込むようになるので、UEFIでのブートができなくなる。
fedoraのUEFIは/boot/grub2/grub.cfgを使用しない。(UEFIのgrub.cfgは/boot/efi/EFI/fedora/grub.cfg にある
誤って実行した場合は UEFI 環境にて(rescue-UEFI モードにて) efibootmgr コマンドでブートマネージャを作成して、grub.cfg を作成し直す。


UEFI/GPTディスクの例
※青いボリューム部分が fat32のUEFIシステムパーティションである。
disk.png
UEFIシステムパーティションの内容は次のようになっている。
※オンラインでは確認できないので,オフラインでドライブレターを付けてdirコマンドで確認する。
efi.png
※EFI partitionのファイルシステムはFAT32である。
※ドライブレターを付ける(assign)にはdiskpartで行なう。

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



UEFI セットアップ ユーティリティ(BIOS設定画面)

ブート優先デバイスの設定
bios2.jpg

Boot Overrideではブートデバイスを直接指定できる。( NVRAM の内容が表示されている)
Launch Shell from device では UEFI Shell を起動して ブートデバイスを指定できる。
bios5.jpg

end of list