uefi
update
2016-12-29
UEFI (Unified
Extensible Firmware Interface)
従来のBIOSに代わるPCの基本的なソフトウェア。
- 2.2TBを超えるHDDを使用したbootが可能になる。
- boot速度改善。(シャットダウン時に保存された休止状態ファイ
ルからシステムを読み込むことで、高速に起動する)
- secure boot機能。(認証されたOSしか起動できなくなる)
※UEFIおよびsecure bootが可能なためには下記の条件を満たしていることが必要である。
- 64bit OSであること。
- UEFI 2.3.1 以降であること。
- 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 ブートの例
※下記の「ブート デバイス メニュー」とは、いわゆる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 のことである)
(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する。
「画像2」
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システムパーティションである。
UEFIシステムパーティションの内容は次のようになっている。
※オンラインでは確認できないので,オフラインでドライブレターを付けてdirコマンドで確認する。
※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設定画面)
ブート優先デバイスの設定
Boot Overrideではブートデバイスを直接指定できる。( NVRAM の内容が表示されている)
Launch Shell from device では UEFI Shell を起動して ブートデバイスを指定できる。
end of list