「EFI ブートスタブ」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(1版 をインポートしました)
(同期)
 
(4人の利用者による、間の21版が非表示)
1行目: 1行目:
 
[[Category:ブートローダー]]
 
[[Category:ブートローダー]]
  +
[[de:EFISTUB]]
 
[[en:EFISTUB]]
 
[[en:EFISTUB]]
 
[[es:EFISTUB]]
 
[[es:EFISTUB]]
  +
[[fr:EFISTUB]]
  +
[[pt:EFISTUB]]
 
{{Related articles start}}
 
{{Related articles start}}
{{Related2|Arch Boot Process|Arch ブートプロセス}}
+
{{Related|Arch ブートプロセス}}
{{Related2|Boot Loaders|ブートローダー}}
+
{{Related|ブートローダー}}
{{Related2|Unified Extensible Firmware Interface|Unified Extensible Firmware Interface}}
+
{{Related|Unified Extensible Firmware Interface}}
 
{{Related articles end}}
 
{{Related articles end}}
  +
'''EFI boot stub''' (別名:'''EFI stub''') は、EFI 実行ファイルであるカーネルのことを指します。つまり、UEFI から直接起動できるカーネルのことです。
{{Warning|1=カーネルバージョンとマザーボードのモデルによっては EFISTUB の起動が失敗するというバグが報告されています。詳しくは [https://bugs.archlinux.org/task/33745] や [https://bbs.archlinux.org/viewtopic.php?id=156670] を見て下さい。}}
 
   
  +
歴史的に、この記事や [[Debian:EFIStub|Debian Wiki]] では、この用語を一語で表現 (EFISTUB または EFIStub) としていました。
Linux カーネル ({{Pkg|linux}}>=3.3) は {{ic|EFISTUB (EFI BOOT STUB)}} ブートをサポートしています。カーネル設定で {{ic|CONFIG_EFI_STUB=y}} を設定することで有効にすることができ、Arch Linux のカーネルではデフォルトで有効にされています (詳しくは [https://www.kernel.org/doc/Documentation/efi-stub.txt EFI Boot Stub] を参照してください)。
 
   
  +
Arch Linux のカーネルはデフォルトで EFI ブートスタブです。もし [[カーネル/伝統的なコンパイル方法#カーネルの設定|カーネルをコンパイル]] する場合は、{{ic|1=CONFIG_EFI_STUB=y}} を設定して有効化します。詳細については、[https://docs.kernel.org/admin-guide/efi-stub.html The EFI Boot Stub] を参照してください。
EFISTUB カーネルだけでは他のカーネルを起動することはできません。よってブートメニューエントリごとに EFISTUB カーネル + Initramfs のペアが必要です。このため、複数のカーネルを使う場合は、UEFI Boot Manager を使うことが推奨されています。
 
   
  +
続行する前に、[[EFI システムパーティション]] を用意し、[[EFI システムパーティション#パーティションのマウント|どのようにマウントするか選択]] する必要があります。
== EFISTUB の設定 ==
 
   
  +
{{Tip|
# [[Unified Extensible Firmware Interface#EFI System Partition|EFI System Partition]] を作成してください。
 
  +
* ESP(EFIシステムパーティション)を {{ic|/boot}} にマウントすれば、[[pacman]] が UEFI が読み取るカーネルを直接更新します。
# {{ic|/boot}} (推奨) かどこか他の好きなところに (他のディストロやツールは大抵 {{ic|/boot/efi}} を使っています) EFI System Partition をマウントしてください。以後このマウントポイントは {{ic|$esp}} として示します。
 
  +
* EFIブートスタブは [[ブートローダー]] を介して間接的に起動することも可能です:
  +
** 複数のUEFIブートマネージャーが追加のオプションを提供したり、UEFIブートプロセスを簡略化したりすることができます。
  +
** これは、[[カーネルパラメータ]] を試したり、複数のカーネルや OS を使用したりする場合、またはマザーボードの UEFI ブートメニューが使いにくい場合に特に有用です。
  +
** カーネルと initramfs が存在するパーティションのファイルシステムドライバーを持つブートマネージャー(例: [[rEFInd]])を使用すれば、これらを ESP の外に置くことが可能です。
  +
}}
   
  +
== EFISTUB の起動 ==
=== カーネルと initramfs を ESP にコピーする ===
 
   
  +
{{Note|カーネル EFI ブートスタブに渡される initramfs のパスは、EFI システムパーティション(ESP)のルートからの相対パスであり、EFI 規格に従ってバックスラッシュを使用する必要があります。例えば、initramfs が {{ic|''esp''/EFI/arch/initramfs-linux.img}} にある場合、対応する UEFI 形式の行は {{ic|1=initrd=\EFI\arch\initramfs-linux.img}} となります。以下の例では、すべてが {{ic|''esp''/}} 以下にあると仮定します。}}
{{Warning|この手順は EFISYS のマウントポイントとして {{ic|/boot}} を使って''いない''場合にのみ必要です。マウントポイントとして {{ic|/boot}} を選んだ時は、[[#EFISTUB の起動]] に進むことができます。}}
 
   
  +
=== UEFI を直接使う ===
# {{ic|$esp/EFI/arch/}} を作成してください
 
# 以下のファイルを移動元から移動先にコピーしてください
 
{| class="wikitable"
 
!ブートファイルの移動元
 
!UEFI の移動先
 
|-
 
| /boot/vmlinuz-linux
 
| $esp/EFI/arch/vmlinuz-arch.efi
 
|-
 
| /boot/initramfs-linux.img
 
| $esp/EFI/arch/initramfs-arch.img
 
|-
 
| /boot/initramfs-linux-fallback.img
 
| $esp/EFI/arch/initramfs-arch-fallback.img
 
|}
 
   
  +
UEFI は [[GRUB]] のような中間ブートローダを必要としないように設計されています。あなたのマザーボードに優れた UEFI 実装があれば、UEFI ブートエントリーにカーネルパラメータを埋め込んで、マザーボードが直接 Arch を起動させることができます。 [[efibootmgr]] や UEFI Shell v2 を使ってマザーボードのブートエントリーを変更することができます。
{{Warning|カーネルがアップデートされる度に EFISTUB カーネルを更新する必要があります。また、以下の方法のどれか一つを使うことで EFISTUB カーネルを自動で更新することができます:}}
 
   
  +
{{Note|1=<nowiki/>
==== systemd ====
 
  +
* 古い UEFI の実装は Linux カーネルとの互換性に問題がある場合があります。もしあなたの UEFI にバグフィックスが施された新しいバージョンがあるのなら、メーカー推奨のツールでフラッシュすることを検討してください。
  +
* NVRAM のブートエントリから EFI バイナリにコマンドラインパラメータを渡さないファームウェアもあります[https://bbs.archlinux.org/viewtopic.php?id=178154] この場合、カーネルとパラメータを [[Unified カーネルイメージ]] に統合して、できた ''.efi'' ファイルでブートエントリを作成することが可能です。
  +
}}
   
  +
==== efibootmgr ====
[[systemd|Systemd]] にはイベントトリガータスク機能があります。これで、パス上の変更を検知する能力を使って、{{ic|boot}} にある EFISTUB カーネルと initramfs のファイルが更新されたときにそれらを同期させることが可能です。
 
   
  +
カーネルをロードする ''efibootmgr'' を使用してブートエントリを作成するには:
{{Warning|mkinitcpio がカーネルスタブと initramfs を作成するのには時間がかかるので、以下の systemd サービスが新しいカーネルスタブと initramfs の代わりに古いものをコピーしてしまう可能性があります。このエラーの可能性を減らすために、(mkinitcpio によって最後に作成される) initramfs-linux-fallback.img が更新されたか確認する efistub のコピーサービスをバインドすると良いでしょう。}}
 
{{hc|/etc/systemd/system/efistub-update.path|<nowiki>
 
[Unit]
 
Description=Copy EFISTUB Kernel to UEFISYS Partition
 
   
  +
# efibootmgr --create --disk ''/dev/sdX'' --part ''Y'' --label "Arch Linux" --loader /vmlinuz-linux --unicode 'root=''block_device_identifier'' rw initrd=\initramfs-linux.img'
[Path]
 
PathChanged=/boot/initramfs-linux-fallback.img
 
   
  +
ここで、{{ic|''/dev/sdX''}} は ESP(EFI システムパーティション)が存在するドライブを、{{ic|''Y''}} はそのパーティション番号を指します。また、{{ic|1=root=}}のパラメーターにはLinuxのルートパーティションを指定します。
[Install]
 
WantedBy=multi-user.target
 
</nowiki>}}
 
   
  +
{{Note|サポートされているデバイス名の形式については [[カーネルパラメータ#パラメータ一覧|カーネルパラメータ]]、対応する値の取得方法については [[永続的なブロックデバイスの命名]]、および例については[[永続的なブロックデバイスの命名#カーネルパラメータ]] を参照してください。}}
{{hc|/etc/systemd/system/efistub-update.service|<nowiki>
 
[Unit]
 
Description=Copy EFISTUB Kernel to UEFISYS Partition
 
   
  +
省略された場合、{{ic|/dev/sda}} の最初のパーティションが ESP として使用されます。
[Service]
 
Type=oneshot
 
ExecStart=/usr/bin/cp -f /boot/vmlinuz-linux $esp/EFI/arch/vmlinuz-arch.efi
 
ExecStart=/usr/bin/cp -f /boot/initramfs-linux.img $esp/EFI/arch/initramfs-arch.img
 
ExecStart=/usr/bin/cp -f /boot/initramfs-linux-fallback.img $esp/EFI/arch/initramfs-arch-fallback.img
 
</nowiki>}}
 
   
  +
引用符内の {{ic|-u}}/{{ic|--unicode}} 引数は、単なる [[カーネルパラメータ|カーネルパラメータ]] のリストであるため、必要に応じて追加のパラメーターを指定する必要があります(例: [[電源管理/サスペンドとハイバネート|ハイバネート先指定を initramfs に渡す]])
次のコマンドでサービスを有効にしてください:
 
# systemctl enable efistub-update.path
 
   
  +
LTS Linux カーネル、NVME ストレージ、特定のサブボリュームを備えた BTRFS ファイルシステム、およびスワップパーティションでの休止状態の例:
==== Incron ====
 
   
  +
# efibootmgr --create \
{{Pkg|incron}} を使って更新後に EFISTUB カーネルを同期するスクリプトを実行することができます。
 
  +
--disk /dev/nvme0n1 --part 1 \
  +
--label "EFISTUB Arch" \
  +
--loader /vmlinuz-linux-lts \
  +
--unicode 'root=UUID=01a40dd8-28f0-4636-be1e-aeed60c98095 resume=UUID=2d877d5d-4ca1-4d46-a3d6-b6ee94cbbd78 rw rootflags=subvol=@ loglevel=3 quiet initrd=\initramfs-linux-lts.img'
   
  +
ブートエントリを使用してリストを取得したり、ブートの注文を設定したり、削除したりするには、[[efibootmgr]] を参照してください。
{{Tip|下のスクリプトを {{ic|/usr/local/bin/efistub-update.sh}} として保存してください}}
 
{{bc|<nowiki>
 
#!/usr/bin/env bash
 
/usr/bin/cp -f /boot/vmlinuz-linux $esp/EFI/arch/vmlinuz-arch.efi
 
/usr/bin/cp -f /boot/initramfs-linux.img $esp/EFI/arch/initramfs-arch.img
 
/usr/bin/cp -f /boot/initramfs-linux-fallback.img $esp/EFI/arch/initramfs-arch-fallback.img
 
</nowiki>}}
 
   
  +
{{Tip|1=<nowiki/>
{{Tip|下のスクリプトを {{ic|/etc/incron.d/efistub-update.conf}} として保存してください}}
 
  +
* {{AUR|kesboot-git}} パッケージを使用すると、これを簡素化して自動化できます。このパッケージには、パッケージ操作中にEFI変数を追加および削除できる [[pacman フック]] も含まれています。
{{Note|最初のパラメータ {{ic|/boot/initramfs-linux-fallback.img}} は監視するファイルです。2番目のパラメータ {{ic|IN_CLOSE_WRITE}} は監視するイベントです。3番目のパラメータ {{ic|/usr/local/bin/efistub-update.sh}} は起動するスクリプトです。}}
 
  +
* https://github.com/de-arl/auto-UEFI-entry は、コマンドを作成するための Bash ヘルパーです。
{{bc|<nowiki>
 
  +
* ブートエントリーを作成するコマンドをシェルスクリプトに保存しておくと、カーネルパラメーターを変更する場合などに簡単に修正できて便利です。この際、古いブートエントリーを削除する処理を自動化することを検討してください。現在のところ、''efibootmgr'' は [https://github.com/rhboot/efibootmgr/issues/49 既存のエントリーの編集をサポートしていません]
/boot/initramfs-linux-fallback.img IN_CLOSE_WRITE /usr/local/bin/efistub-update.sh
 
  +
* フォーラム投稿 [https://bbs.archlinux.org/viewtopic.php?pid=1090040#p1090040 The linux kernel with build in bootloader?] も参考になるかもしれません。
</nowiki>}}
 
  +
}}
   
  +
==== bcfg ====
{{Tip|この方法を使うには、incron が有効になっている必要があります。有効になっていない場合は次を実行してください
 
{{bc|<nowiki>
 
# systemctl enable incrond.service
 
</nowiki>}}}}
 
   
  +
UEFI の実装によっては ''efibootmgr'' を使って NVRAM をうまく変更することが難しいものがあります。''efibootmgr'' がうまくエントリを作成できない場合、UEFI シェル v2 で [[UEFI#bcfg|bcfg]] コマンドを使うことができます (例:[https://archlinux.org/download/ Arch Linux live iso] から)
==== Mkinitcpio フック ====
 
   
  +
まず、あなたの [[ESP]] が存在するデバイス番号を調べます。
Mkinitcpio はフックを生成することができシステムレベルデーモンを機能させる必要はありません。ファイルをコピーする前にバックグラウンドプロセスを生成して {{ic|vm-linuz}}, {{ic|initramfs-linux.img}}, {{ic|initramfs-linux-fallback.img}} の生成を待ちます。
 
   
  +
Shell> map
{{Tip|下のスクリプトを {{ic|/usr/lib/initcpio/install/efistub-update}} として保存してください}}
 
{{bc|<nowiki>
 
#!/usr/bin/env bash
 
   
  +
この例では、デバイス番号として {{ic|1}} を使用しています。[[ESP]] の中身を一覧表示する。
build() {
 
/root/watch.sh &
 
}
 
   
  +
sshell> ls FS1:
help() {
 
cat <<HELPEOF
 
This hook waits for mkinitcpio to finish and copies the finished ramdisk and kernel to the ESP
 
HELPEOF
 
}
 
</nowiki>}}
 
   
  +
現在のブートエントリーを表示するには
{{Tip|下のスクリプトを {{ic|/root/watch.sh}} として保存し実行可能にしてください}}
 
{{bc|<nowiki>
 
#!/usr/bin/env bash
 
   
  +
Shell> bcfg boot dump
while [[ -d "/proc/$PPID" ]]; do
 
sleep 1
 
done
 
   
  +
カーネルのエントリを追加するには、以下を使用します。
/usr/bin/cp -f /boot/vmlinuz-linux $esp/EFI/arch/vmlinuz-arch.efi
 
/usr/bin/cp -f /boot/initramfs-linux.img $esp/EFI/arch/initramfs-arch.img
 
/usr/bin/cp -f /boot/initramfs-linux-fallback.img $esp/EFI/arch/initramfs-arch-fallback.img
 
   
  +
Shell> bcfg boot add ''N'' とします。FS1:\vmlinuz-linux "Arch Linux"
echo "Synced kernel with ESP"
 
</nowiki>}}
 
   
  +
ここで {{ic|''N''}} はブートメニューに追加されるエントリの場所です。0 は最初のメニュー項目です。既に存在するメニュー項目は、破棄されることなくメニュー内で移動されます。
{{Tip|{{ic|efistub-update}} を {{ic|/etc/mkinitcpio.conf}} 内の hook のリストに加えて下さい}}
 
   
  +
ESP 上にファイルを作成し、必要なカーネルオプションを追加します。
==== バインドマウント ====
 
   
  +
Shell> FS1:\options.txt を編集します。
ESP を {{ic|/boot}} にマウントする代わりに、バインドマウントを使うことで ESP のディレクトリを {{ic|/boot}} にマウントすることができます ({{ic|mount(8)}} を参照)。これによって ESP を自由に扱えるようにしつつ pacman が直接カーネルを更新できるようにすることができます。ファイルをコピーする他の方法よりもずっとシンプルな方法になります。
 
   
  +
ファイル内に、ブートラインを追加します。たとえば、以下のようになります。
{{Note|1=バインドマウントを利用するには FAT32 に対応するカーネルとブートローダーが必要です。通常の Arch のインストールでは問題になりませんが、他のディストリビューションでは問題になることがあります (つまり {{ic|/boot}} にシンボリックリンクを必要とするディストリビューション)。フォーラムの[https://bbs.archlinux.org/viewtopic.php?pid=1331867#p1331867 この投稿]を見て下さい。}}
 
   
  +
root=/dev/sda2 ro initrd=initramfs-linux.img
[[#カーネルと initramfs を ESP にコピーする|上]]に書かれているように、ESP のディレクトリに全てのブートファイルをコピーしますが、ESP は {{ic|/boot}} の外にマウントします (例: {{ic|/esp}})。そしてディレクトリをバインドマウントします:
 
   
  +
{{Note|ファイル内の行頭に余分なスペースを入れてください。行頭には [[Wikipedia:Byte order mark|byte order mark]] があり、ブート時にエラーの原因となるその隣の文字を潰してしまいます。}}
# mount --bind /esp/EFI/arch/ /boot
 
   
ファイルが {{ic|/boot}} に現れようしたい場合、[[fstab|fstab]]編集して永続化せます:
+
保存するには {{ic|F2}} を、終了するには {{ic|F3}}してくだい。
   
  +
前のエントリにこれらのオプションを追加します。
{{hc|/etc/fstab|<nowiki>
 
/esp/EFI/arch /boot none defaults,bind 0 0
 
</nowiki>}}
 
   
  +
Shell> bcfg boot -opt ''N'' FS1:\options.txt
{{Warning|この方法を使って起動するには {{ic|1=root=''system_root''}} [[カーネルパラメータ#パラメータ一覧|カーネルパラメータ]]を使う必要があります。}}
 
   
  +
追加する項目がある場合は、この作業を繰り返してください。
== EFISTUB の起動 ==
 
   
  +
前に追加した項目を削除するには、次のようにします。
{{Warning|Linux Kernel EFISTUB initramfs のパスは EFI System Partition のルートからの相対パスでなければなりません。例えば、initramfs が {{ic|$esp/EFI/arch/initramfs-linux.img}} にあったとしたら、適切な UEFI 行は {{ic|1=initrd=/EFI/arch/initramfs-linux.img}} か {{ic|1=initrd=\EFI\arch\initramfs-linux.img}} になります。}}
 
   
  +
Shell> bcfg boot rm ''N''
以下の方法のどれか一つを使うことで EFISTUB カーネルを起動することができます:
 
   
=== gummiboot を使う ===
+
==== kesboot ====
   
  +
{{AUR|kesboot-git}} パッケージのスクリプトを使って EFISTUB での作業を単純化・自動化することもできます。パッケージの操作中に EFI 変数を追加・削除するための [[pacman フック]] も含まれています。
[[Gummiboot|Gummiboot]] は EFISTUB カーネルのナイスなメニューを提供する UEFI Boot Manager です。EFISTUB ブートの推奨ブートマネージャです。詳細は [[Gummiboot|gummiboot]] を見て下さい。
 
   
  +
まず、パッケージをインストールして、{{ic|/etc/kesboot.conf}} ファイルを設定します。
=== rEFInd を使う ===
 
   
  +
{{hc|/etc/kesboot.conf|2=
[[rEFInd|rEFInd]] は (Intel Mac で使われている) rEFIt Boot Manager の Rod Smith (GPT-fdisk の作者) によるフォークです。rEFInd は Mac 以外の UEFI ブートについて rEFIt の多くの問題を修正してあり EFISTUB カーネルをサポートしています。詳しくは [[rEFInd|rEFInd]] を見て下さい。
 
  +
CMDLINES=('linux' 'acpi=on'
  +
'linux-zen' 'iommu=off')
  +
}}
  +
  +
{{Note|フック (変数 {{ic|INSTALL_HOOK}} と {{ic|REMOVE_HOOK}}) を使用すると、実行するたびに {{ic|CMDLINES}} 配列を上書きします(すべてのレコードの内容を。}}
  +
  +
次に、以下を実行します。
  +
  +
# kesboot -u
  +
  +
また、本パッケージには EFI ブートの初期設定用のプログラムも含まれています。[[EFI システムパーティション#パーティションのマウント|ESPのマウント]] ディレクトリの後、以下を実行してください。
  +
  +
# /usr/lib/setup-efi-boot
   
 
=== UEFI Shell を使う ===
 
=== UEFI Shell を使う ===
   
通常の UEFI アプリケーションように UEFI Shell から EFISTUB カーネルを起動することが可能です。の場合カーネルパラメータは通常のパラメータとして起動する EFISTUB カーネルファイルに渡します。
+
通常の UEFI アプリケーションと同じように UEFI Shell から EFISTUB カーネルを起動できます。の場合通常のパラメータとして起動する EFISTUB カーネルファイルにカーネルパラメータを渡してください:
   
 
> fs0:
 
> fs0:
  +
> /vmlinuz-linux root=PARTUUID=3518bb68-d01e-45c9-b973-0b5d918aae96 rw initrd=/initramfs-linux.img
> cd \EFI\arch
 
> vmlinuz-arch.efi root=PARTUUID=3518bb68-d01e-45c9-b973-0b5d918aae96 rootfstype=ext4 add_efi_memmap initrd=EFI/arch/initramfs-arch.img
 
   
また、ブパラメータを記述したシンプルな {{ic|archlinux.nsh}} ファイを書いて UEFI System Partition に置き、それを実行することできます:
+
毎回カネルパラメータを全て指定したくない場合、UEFI ステムパーティショ {{ic|archlinux.nsh}} などのシェスクリプトの実行コマンドを保存することできます。以下のコマンドで起動できるようになります:
   
 
> fs0:
 
> fs0:
 
> archlinux
 
> archlinux
   
スクリプト例:
+
==== startup.nsh スクリプトの使用 ====
  +
{{hc|$ESP/archlinux.nsh|2=
 
  +
いくつかの UEFI 実装はコールドブート間で EFI 変数を保持せず (例:[[VirtualBox]] バージョン 6.1 以前)、UEFI ファームウェアインターフェースを通して設定したものは電源切断時に失われてしまいます。
echo -on
 
  +
\EFI\arch\vmlinuz-arch.efi root=PARTUUID=3518bb68-d01e-45c9-b973-0b5d918aae96 rootfstype=ext4 add_efi_memmap initrd=/EFI/arch/initramfs-arch.img
 
  +
[https://www.uefi.org/sites/default/files/resources/UEFI_Shell_Spec_2_0.pdf UEFI Shell Specification 2.0] は ESP パーティションのルートにある {{ic|startup.nsh}} というスクリプトが常に解釈され、任意の命令を含むことができると定めています; その中でブートローディングラインを設定することが可能です。ESP パーティションを {{ic|/boot}} にマウントし、カーネルブートローディングラインを含む {{ic|startup.nsh}} スクリプトを作成することを確認します。例えば
}}
 
   
  +
vmlinuz-linux rw root=/dev/sd''X'' [rootfs=''myfs''] [rootflags=''myrootflags''] \
この方法では名前をメモしておいたり20-30文字も入力せずとも UUID を指定することができます。
 
  +
[kernel.flag=''foo''] [''mymodule''.flag=''bar''] \
  +
[initrd=\intel-ucode.img] initrd=\initramfs-linux.img
   
  +
この方法は、実際のハードウェアで遭遇する可能性のあるほぼすべての UEFI ファームウェアバージョンで機能します。最後の手段として使用できます。 '''スクリプトは1つの長い行である必要があります。''' 括弧内のセクションはオプションであり、ガイドとしてのみ提供されています。シェルスタイルの改行は、視覚的にわかりやすくするためのものです。 FAT ファイルシステムはバックスラッシュをパス区切り文字として使用します。この場合、バックスラッシュは initramfs が ESP パーティションのルートにあることを宣言します。 Intel マイクロコードのみが起動パラメータ行にロードされます。 AMD マイクロコードは、後で起動プロセス中にディスクから読み取られます。これはカーネルによって自動的に行われます。
=== ブートマネージャを使わずに直接起動する ===
 
   
  +
== ヒントとテクニック ==
{{Warning|1=カーネルと efibootmgr の組み合わせによっては手動で調整しないと動かないことがあります [https://bugs.archlinux.org/task/34641]。ブートエントリを削除することはできますが作成することは出来なくなります。}}
 
   
  +
=== フォールバック RAM ディスクを使用したブートエントリ ===
{{Note|UEFI ファームウェアによってはブートエントリの uefi アプリケーションにコマンドラインパラメータを埋め込むことができません。}}
 
   
  +
ブートマネージャなしで EFISTUB を使用する場合、カーネルコマンドラインはブート時に変更できません。例えば {{ic|initramfs-linux-fallback.img}} を使ったり、Intel マイクロコード無しで起動したりするような、少なくともある種のフォールバックの可能性を持つには、efibootmgr でさらなるブートエントリーを作成するだけです。
UEFI ブートエントリに直接カーネルパラメータを埋め込むことが可能です。つまりあなたの UEFI ブートオーダー・GUI を使って GRUB など他のブートローダーを使わずに直接 Arch Linux を起動することができます (下のコマンドの {{ic|X}} と {{ic|Y}} は EFI System Partition があるディスクとパーティションに置き換えてください、{{ic|1=root=}} パラメータは root にあわせて変更してください)。
 
   
  +
== トラブルシューティング ==
# mount -t efivarfs efivarfs /sys/firmware/efi/efivars # 既にマウントされている場合は無視して下さい
 
# efibootmgr -d '''/dev/sdX''' -p '''Y''' -c -L "Arch Linux" -l /vmlinuz-linux -u "root='''/dev/sda2''' rw initrd=/initramfs-linux.img"
 
   
  +
=== EFISTUB はいくつかの Dell システムで動作しません ===
作成されたエントリが問題ないか確認するために次のコマンドを実行すると良いでしょう:
 
   
  +
いくつかの世代の Dell ファームウェアは、ブートローダに渡す引数を間違えており、そのため EFISTUB は通常起動不可能なシステムを意味する null コマンドラインをパースします ([https://lore.kernel.org/linux-efi/20200907170021.GA2284449@rani.riverdale.lan/ linux-efi thread] を参照してください)
# efibootmgr -v
 
   
  +
Linux 5.10 からは、この挙動を修正する回避策が見つかっています (この [https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4a568ce29d3f48df95919f82a80e4b9be7ea0dc1 commit ] を参照してください) Linux < 5.10 では、[https://github.com/RobertCsordas/arch-efiboot arch-efiboot] のような efi-packer を使うか、別のブートローダを使うことができます。
ブートの順番を設定するには、次を実行します:
 
   
  +
=== ブートエントリーの変更が適用されない ===
# efibootmgr -o XXXX,XXXX
 
   
  +
Haswell 時代の Asus ボード([https://forums.archlinux.fr/viewtopic.php?t=19618 こちらのフォーラムを参照]) などの一部のマザーボードは、システムが起動しない限りブートエントリの変更に気づきません。更新された EFISTUB エントリをブートする前に、別の既存のブート エントリを使用してください。
XXXX は `efibootmgr` コマンドによって出力されるそれぞれのエントリの番号に置き換えてください。
 
   
  +
== 参照 ==
{{Tip|シェルスクリプトでブートエントリを作成するコマンドをどこかに保存しておけば、修正 (例えばカーネルパラメータの変更) が楽になります。}}
 
   
  +
* [https://www.kernel.org/doc/html/latest/admin-guide/efi-stub.html EFISTUB の Linux カーネルドキュメント]
efibootmgr の詳細は [[Unified Extensible Firmware Interface#efibootmgr|UEFI#efibootmgr]] で説明しています。フォーラムの投稿 https://bbs.archlinux.org/viewtopic.php?pid=1090040#p1090040 。
 
  +
* [https://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=commitdiff;h=291f36325f9f252bd76ef5f603995f37e453fc60;hp=55839d515495e766605d7aaabd9c2758370a8d27 Linux カーネル EFISTUB Git コミット]
  +
* [https://www.rodsbooks.com/efi-bootloaders/efistub.html Rod Smith の EFISTUB 記事]

2025年1月27日 (月) 02:43時点における最新版

関連記事

EFI boot stub (別名:EFI stub) は、EFI 実行ファイルであるカーネルのことを指します。つまり、UEFI から直接起動できるカーネルのことです。

歴史的に、この記事や Debian Wiki では、この用語を一語で表現 (EFISTUB または EFIStub) としていました。

Arch Linux のカーネルはデフォルトで EFI ブートスタブです。もし カーネルをコンパイル する場合は、CONFIG_EFI_STUB=y を設定して有効化します。詳細については、The EFI Boot Stub を参照してください。

続行する前に、EFI システムパーティション を用意し、どのようにマウントするか選択 する必要があります。

ヒント:
  • ESP(EFIシステムパーティション)を /boot にマウントすれば、pacman が UEFI が読み取るカーネルを直接更新します。
  • EFIブートスタブは ブートローダー を介して間接的に起動することも可能です:
    • 複数のUEFIブートマネージャーが追加のオプションを提供したり、UEFIブートプロセスを簡略化したりすることができます。
    • これは、カーネルパラメータ を試したり、複数のカーネルや OS を使用したりする場合、またはマザーボードの UEFI ブートメニューが使いにくい場合に特に有用です。
    • カーネルと initramfs が存在するパーティションのファイルシステムドライバーを持つブートマネージャー(例: rEFInd)を使用すれば、これらを ESP の外に置くことが可能です。

EFISTUB の起動

ノート: カーネル EFI ブートスタブに渡される initramfs のパスは、EFI システムパーティション(ESP)のルートからの相対パスであり、EFI 規格に従ってバックスラッシュを使用する必要があります。例えば、initramfs が esp/EFI/arch/initramfs-linux.img にある場合、対応する UEFI 形式の行は initrd=\EFI\arch\initramfs-linux.img となります。以下の例では、すべてが esp/ 以下にあると仮定します。

UEFI を直接使う

UEFI は GRUB のような中間ブートローダを必要としないように設計されています。あなたのマザーボードに優れた UEFI 実装があれば、UEFI ブートエントリーにカーネルパラメータを埋め込んで、マザーボードが直接 Arch を起動させることができます。 efibootmgr や UEFI Shell v2 を使ってマザーボードのブートエントリーを変更することができます。

ノート:
  • 古い UEFI の実装は Linux カーネルとの互換性に問題がある場合があります。もしあなたの UEFI にバグフィックスが施された新しいバージョンがあるのなら、メーカー推奨のツールでフラッシュすることを検討してください。
  • NVRAM のブートエントリから EFI バイナリにコマンドラインパラメータを渡さないファームウェアもあります[1] この場合、カーネルとパラメータを Unified カーネルイメージ に統合して、できた .efi ファイルでブートエントリを作成することが可能です。

efibootmgr

カーネルをロードする efibootmgr を使用してブートエントリを作成するには:

# efibootmgr --create --disk /dev/sdX --part Y --label "Arch Linux" --loader /vmlinuz-linux --unicode 'root=block_device_identifier rw initrd=\initramfs-linux.img'

ここで、/dev/sdX は ESP(EFI システムパーティション)が存在するドライブを、Y はそのパーティション番号を指します。また、root=のパラメーターにはLinuxのルートパーティションを指定します。

ノート: サポートされているデバイス名の形式については カーネルパラメータ、対応する値の取得方法については 永続的なブロックデバイスの命名、および例については永続的なブロックデバイスの命名#カーネルパラメータ を参照してください。

省略された場合、/dev/sda の最初のパーティションが ESP として使用されます。

引用符内の -u/--unicode 引数は、単なる カーネルパラメータ のリストであるため、必要に応じて追加のパラメーターを指定する必要があります(例: ハイバネート先指定を initramfs に渡す)

LTS Linux カーネル、NVME ストレージ、特定のサブボリュームを備えた BTRFS ファイルシステム、およびスワップパーティションでの休止状態の例:

# efibootmgr --create \
 --disk /dev/nvme0n1 --part 1 \
 --label "EFISTUB Arch" \
 --loader /vmlinuz-linux-lts \
 --unicode 'root=UUID=01a40dd8-28f0-4636-be1e-aeed60c98095 resume=UUID=2d877d5d-4ca1-4d46-a3d6-b6ee94cbbd78 rw rootflags=subvol=@ loglevel=3 quiet initrd=\initramfs-linux-lts.img'

ブートエントリを使用してリストを取得したり、ブートの注文を設定したり、削除したりするには、efibootmgr を参照してください。

ヒント:
  • kesboot-gitAUR パッケージを使用すると、これを簡素化して自動化できます。このパッケージには、パッケージ操作中にEFI変数を追加および削除できる pacman フック も含まれています。
  • https://github.com/de-arl/auto-UEFI-entry は、コマンドを作成するための Bash ヘルパーです。
  • ブートエントリーを作成するコマンドをシェルスクリプトに保存しておくと、カーネルパラメーターを変更する場合などに簡単に修正できて便利です。この際、古いブートエントリーを削除する処理を自動化することを検討してください。現在のところ、efibootmgr既存のエントリーの編集をサポートしていません
  • フォーラム投稿 The linux kernel with build in bootloader? も参考になるかもしれません。

bcfg

UEFI の実装によっては efibootmgr を使って NVRAM をうまく変更することが難しいものがあります。efibootmgr がうまくエントリを作成できない場合、UEFI シェル v2 で bcfg コマンドを使うことができます (例:Arch Linux live iso から)

まず、あなたの ESP が存在するデバイス番号を調べます。

Shell> map

この例では、デバイス番号として 1 を使用しています。ESP の中身を一覧表示する。

sshell> ls FS1:

現在のブートエントリーを表示するには

Shell> bcfg boot dump

カーネルのエントリを追加するには、以下を使用します。

Shell> bcfg boot add N とします。FS1:\vmlinuz-linux "Arch Linux"

ここで N はブートメニューに追加されるエントリの場所です。0 は最初のメニュー項目です。既に存在するメニュー項目は、破棄されることなくメニュー内で移動されます。

ESP 上にファイルを作成し、必要なカーネルオプションを追加します。

Shell> FS1:\options.txt を編集します。

ファイル内に、ブートラインを追加します。たとえば、以下のようになります。

root=/dev/sda2 ro initrd=initramfs-linux.img
ノート: ファイル内の行頭に余分なスペースを入れてください。行頭には byte order mark があり、ブート時にエラーの原因となるその隣の文字を潰してしまいます。

保存するには F2 を、終了するには F3 を押してください。

前のエントリにこれらのオプションを追加します。

Shell> bcfg boot -opt N FS1:\options.txt

追加する項目がある場合は、この作業を繰り返してください。

前に追加した項目を削除するには、次のようにします。

Shell> bcfg boot rm N

kesboot

kesboot-gitAUR パッケージのスクリプトを使って EFISTUB での作業を単純化・自動化することもできます。パッケージの操作中に EFI 変数を追加・削除するための pacman フック も含まれています。

まず、パッケージをインストールして、/etc/kesboot.conf ファイルを設定します。

/etc/kesboot.conf
CMDLINES=('linux' 'acpi=on'
          'linux-zen' 'iommu=off')
ノート: フック (変数 INSTALL_HOOKREMOVE_HOOK) を使用すると、実行するたびに CMDLINES 配列を上書きします(すべてのレコードの内容を。

次に、以下を実行します。

# kesboot -u

また、本パッケージには EFI ブートの初期設定用のプログラムも含まれています。ESPのマウント ディレクトリの後、以下を実行してください。

# /usr/lib/setup-efi-boot

UEFI Shell を使う

通常の UEFI アプリケーションと同じように UEFI Shell から EFISTUB カーネルを起動できます。その場合、通常のパラメータとして起動する EFISTUB カーネルファイルにカーネルパラメータを渡してください:

> fs0:
> /vmlinuz-linux root=PARTUUID=3518bb68-d01e-45c9-b973-0b5d918aae96 rw initrd=/initramfs-linux.img

毎回カーネルパラメータを全て指定したくない場合、UEFI システムパーティションに archlinux.nsh などのシェルスクリプトの実行コマンドを保存することができます。以下のコマンドで起動できるようになります:

> fs0:
> archlinux

startup.nsh スクリプトの使用

いくつかの UEFI 実装はコールドブート間で EFI 変数を保持せず (例:VirtualBox バージョン 6.1 以前)、UEFI ファームウェアインターフェースを通して設定したものは電源切断時に失われてしまいます。

UEFI Shell Specification 2.0 は ESP パーティションのルートにある startup.nsh というスクリプトが常に解釈され、任意の命令を含むことができると定めています; その中でブートローディングラインを設定することが可能です。ESP パーティションを /boot にマウントし、カーネルブートローディングラインを含む startup.nsh スクリプトを作成することを確認します。例えば

vmlinuz-linux rw root=/dev/sdX [rootfs=myfs] [rootflags=myrootflags] \
 [kernel.flag=foo] [mymodule.flag=bar] \
 [initrd=\intel-ucode.img] initrd=\initramfs-linux.img

この方法は、実際のハードウェアで遭遇する可能性のあるほぼすべての UEFI ファームウェアバージョンで機能します。最後の手段として使用できます。 スクリプトは1つの長い行である必要があります。 括弧内のセクションはオプションであり、ガイドとしてのみ提供されています。シェルスタイルの改行は、視覚的にわかりやすくするためのものです。 FAT ファイルシステムはバックスラッシュをパス区切り文字として使用します。この場合、バックスラッシュは initramfs が ESP パーティションのルートにあることを宣言します。 Intel マイクロコードのみが起動パラメータ行にロードされます。 AMD マイクロコードは、後で起動プロセス中にディスクから読み取られます。これはカーネルによって自動的に行われます。

ヒントとテクニック

フォールバック RAM ディスクを使用したブートエントリ

ブートマネージャなしで EFISTUB を使用する場合、カーネルコマンドラインはブート時に変更できません。例えば initramfs-linux-fallback.img を使ったり、Intel マイクロコード無しで起動したりするような、少なくともある種のフォールバックの可能性を持つには、efibootmgr でさらなるブートエントリーを作成するだけです。

トラブルシューティング

EFISTUB はいくつかの Dell システムで動作しません

いくつかの世代の Dell ファームウェアは、ブートローダに渡す引数を間違えており、そのため EFISTUB は通常起動不可能なシステムを意味する null コマンドラインをパースします (linux-efi thread を参照してください)

Linux 5.10 からは、この挙動を修正する回避策が見つかっています (この commit を参照してください) Linux < 5.10 では、arch-efiboot のような efi-packer を使うか、別のブートローダを使うことができます。

ブートエントリーの変更が適用されない

Haswell 時代の Asus ボード(こちらのフォーラムを参照) などの一部のマザーボードは、システムが起動しない限りブートエントリの変更に気づきません。更新された EFISTUB エントリをブートする前に、別の既存のブート エントリを使用してください。

参照