efibootmgr
efibootmgr は、 UEFI ブートエントリを管理するためのツールです。
これは、 ブートローダ では ありません 。ブートマネージャとして動作するのはシステムの EFI ファームウェアそれ自体です。 efibootmgr は、これを操作するためのツールです。 efibootmgr を用いることで、ブートエントリを作成したり順序を変えたり削除したりすることが可能になります。
インストール
カーネル
CONFIG_EFIVAR_FS サポートを有効化する必要があります。
efivarfs を EFI ランタイムサービス抜きで使用することはできません。もしこれがデフォルトで無効化されている場合 (
CONFIG_EFI_DISABLE_RUNTIME=y
)、
カーネルコマンドラインオプション
efi=runtime
によって有効化することもできます。
Emerge
sys-boot/efibootmgr には USE フラグがありませんから、ただ単にインストールすればよいです:
root
#
emerge --ask sys-boot/efibootmgr
設定
EFI 変数
efibootmgr が正しく動作するには、 EFI 変数ファイルシステムにアクセス可能になっていなければなりません。そのためには、システムが(ファームウェア(BIOS)の MBR モードではなく)EFI モードでブートされている必要があります。そうでないと EFI 変数へのアクセス自体が不可能です。システムが MBR モードになっていたら、再起動して、システムのファームウェアに EFI モードで起動するように指示する必要があります。大概は、ファームウェアの設定オプションを変えたり、システムのブートメニューで EFI ブートエントリを選んだりすることで解決します。
システムが EFI モードにあるとき、マウント済みの efivarfs が存在するか調べるには、以下のコマンドを実行してください:
root
#
mount | grep efivars
efivarfs on /sys/firmware/efi/efivars type efivarfs (ro,relatime)
これは sysfs init スクリプトで読み込み専用 (ro) としてマウントされているので、以下のコマンドを使用して、手動で読み書き可能 (rw) として再マウントする必要があります:
root
#
mount -o remount,rw -t efivarfs efivarfs /sys/firmware/efi/efivars
前提条件
EFI システムパーティション (ESP) が存在しない場合は作成する必要があります。 EFI システムパーティション を参照してください。
使い方
ブートエントリの一覧表示
古いバージョンの
efibootmgr
を使用している場合は、オプション
--verbose
または
-v
が必要です:
root
#
efibootmgr
BootCurrent: 0002 Timeout: 3 seconds BootOrder: 0003,0003,0002,0000,0004 Boot0000* CD/DVD Drive BIOS(3,0,00) Boot0001* Hard Drive BIOS(2,0,00) Boot0002* Gentoo HD(1,800,61800,6d98f360-cb3e-4727-8fed-5ce0c040365d)File(\EFI\boot\bootx64.efi) Boot0003* Hard Drive BIOS(2,0,00)P0: ST1500DM003-9YN16G
ブートエントリを作成する
EFI のブートエントリを作成するには、 efibootmgr に対していくつかのオプションを与えます:
-
--createまたは-c新しいエントリの作成; -
--partまたは-pEFI システムパーティション のあるパーティション番号; -
--diskまたは-dEFI システムパーティションのあるディスク名; -
--labelまたは-Lブートエントリに使用したいラベル名; -
--loaderまたは-lブートする EFI イメージの置いてあるパス
EFI イメージのパスでは、 / (スラッシュ)ではなく \ (バックスラッシュ)を使用しなければなりません 。
くわえて、ESP が既に他の OS によって作成済の場合は、 /efi/ EFI とは異なる名前が付いている場合があります。ESP が他の OS によって作成済の場合、EFI ブートエントリは、 /efi の後に続くこのディレクトリ名で始めてください。
どのようにして UEFI エントリを作成すればよいか、以下にいくつかの例を示します。もしフォルダ構造が以下のようになっていれば:
root
#
tree /efi/ -L 3
/efi/
└── EFI
├── Grub
│ └── grubx64.efi
└── Gentoo
└── bzImage.efi
ローダのパスは以下のようになるでしょう:
root
#
efibootmgr -c -L "Grub" -l '\EFI\Grub\grubx64.efi'
root
#
efibootmgr -c -L "Gentoo" -l '\EFI\Gentoo\bzImage.efi'
例えば:
root
#
efibootmgr -c -d /dev/sda -p 2 -L "Gentoo" -l '\efi\boot\bootx64.efi'
すべての UEFI 実装で
サポートされているとは限りません
[1]
が、
--unicode
や
-u
カーネルコマンドラインパラメータを追加するには、以下を実行します:
root
#
efibootmgr -c -d /dev/sda -p 2 -L "Gentoo" -l '\efi\boot\bootx64.efi' -u 'root=/dev/sda3 initrd=\efi\boot\initramfs.img quiet'
dm-crypt モジュールの initrd の例については、 efibootmgr を参照してください。
初期 ramdisk システムについては、 Why make your own を参照してください。
必要に応じて、追加のカーネルをインストールして UEFI ファームウェアに登録しておくことができます。これは、より多くのカーネルをテストしたい場合やもう一つのオペレーションシステムとデュアルブートしたい場合に特に便利です。これらは通常、システムの初期化中の適切な時にキーボードのホットキーを押した後にブート選択ダイアログに表示されます。最後に追加したエントリが常に最も高いブート優先度を得るので、これがデフォルトになります。ホットキーの組み合わせがわからなければ、コンピューターの製造業者の公式ドキュメントを探してみてください。通常、この情報を探すのは難しいことではありません。
ブートエントリを削除する
エントリを削除するにはまず、そのエントリのID番号を見つけなければなりません。
例えば Gentoo のエントリが前記のようであれば(
Boot0002
がID であれば)、
efibootmgr
に対して
--bootnum
または
-b
でID番号を指定し
--delete-bootnum
または
-B
でエントリの削除を命令します。
root
#
efibootmgr -b 2 -B
リムーバブルメディア
リムーバブルメディア上の EFI ブートローダや、 EFI System Partition あるいは ESP 上のリムーバブルメディアブートパスを使用しているブートローダーはブートエントリとして構成されません。つまり、これらについては efibootmgr は必要ありません。詳細については ESP 上のリムーバブルメディアブートパス を参照してください。
削除
Unmerge
root
#
emerge --ask --depclean --verbose sys-boot/efibootmgr
関連項目
- Alternative 2: efibootmgr Gentoo ハンドブックの記事
- EFI stub — EFI スタブカーネル、つまり、UEFI から直接実行可能なカーネルについて記載します。
- Efivarfs — ユーザが (U)EFI 変数を作成、削除、および変更できるようにする、Linux カーネル 内のファイルシステム
- Initramfs - make your own — build an initramfs which does not contain kernel modules.
- REFInd — rEFIt からフォークした後継の EFI および UEFI プラットフォーム向けブートマネージャ
参照
- ↑ 少なくとも Dell EFI ファームウェアでは、カーネル 5.10 で回避策が実装されました: https://lkml.org/lkml/2020/9/18/228