uefi
update 2016-12-29

UEFI (Unified Extensible Firmware Interface)

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


UEFI ブート

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

たとえばWindowsの場合は次のようになる。
ブートアプリケーションとはWindowsブートマネージャー、Windowsブートローダーを意味する。
UEFIブートマネージャの「Windows Boot Manager」を実行する。
「Windows Boot Manager」は「Windows ブート マネージャー」の「descriptionが Windows Boot Manager」のことであり、
「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\system32ntoskrnl.exeを起動することになる。



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」 などのブート ファイルを選択するコマンドがある場合は、このコマンドを選択する。
そしてブート ファイルの場所を(たとえば USBDevice01\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 をダウンロードする
https://github.com/tianocore/edk2/tree/master/EdkShellBinPkg/FullShell
ページのX64をクリックするとShell_Full.efiファイルがある。
Shell_Full.efiをクリックすると
https://github.com/tianocore/edk2/blob/master/EdkShellBinPkg/FullShell/X64/Shell_Full.efi
のページが開くので「View Raw」へのリンクをクリックするとShell_Full.efiファイルのダウンロードが開く。
または
https://github.com/tianocore/edk2/blob/master/EdkShellBinPkg/FullShell/X64/Shell_Full.efi?raw=true
を指定すれば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 >"
※dir、cd 、mkdir、map、ver、exitコマンドなどが使用できる。(詳細はreference参照)
map -r (reset オプション)でドライブ一覧(fs0、fs1・・・)を表示確認できる。

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

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

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設定画面)

UEFI 対応していることをあらわしている。
bios1.jpg

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

CSM パラメータ選択 ( Compatibility Suport Module )
bios3.jpg

UEFI と LegacyなBIOSのブート方法を設定できる。
bios4.jpg

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

end of list