「EFI ブートスタブ」の版間の差分
(他言語へのリンクを追加) |
(同期) |
||
(2人の利用者による、間の2版が非表示) | |||
10行目: | 10行目: | ||
{{Related|Unified Extensible Firmware Interface}} |
{{Related|Unified Extensible Firmware Interface}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
+ | '''EFI boot stub''' (別名:'''EFI stub''') は、EFI 実行ファイルであるカーネルのことを指します。つまり、UEFI から直接起動できるカーネルのことです。 |
||
− | Linux カーネルは EFISTUB ブートをサポートしており、[[EFI]] ファームウェアがカーネルを EFI 実行可能ファイルとしてロードできるようにします。このオプションは、Arch Linux カーネルではデフォルトで有効になっています。カーネルをコンパイルする場合は、カーネル構成で {{ic|1=CONFIG_EFI_STUB=y}}を設定することでアクティブにできます。詳細については、[https://www.kernel.org/doc/html/latest/admin-guide/efi-stub.html EFI BootStub] を参照してください。 |
||
+ | 歴史的に、この記事や [[Debian:EFIStub|Debian Wiki]] では、この用語を一語で表現 (EFISTUB または EFIStub) としていました。 |
||
− | == EFISTUB の準備 == |
||
+ | Arch Linux のカーネルはデフォルトで EFI ブートスタブです。もし [[カーネル/伝統的なコンパイル方法#カーネルの設定|カーネルをコンパイル]] する場合は、{{ic|1=CONFIG_EFI_STUB=y}} を設定して有効化します。詳細については、[https://docs.kernel.org/admin-guide/efi-stub.html The EFI Boot Stub] を参照してください。 |
||
− | まず、[[EFI システムパーティション]] を作成し、そのマウント方法を選択する必要があります。ESP のマウントオプションは [[EFI システムパーティション#パーティションのマウント]] を見て下さい。 |
||
+ | |||
+ | 続行する前に、[[EFI システムパーティション]] を用意し、[[EFI システムパーティション#パーティションのマウント|どのようにマウントするか選択]] する必要があります。 |
||
{{Tip| |
{{Tip| |
||
− | * |
+ | * ESP(EFIシステムパーティション)を {{ic|/boot}} にマウントすれば、[[pacman]] が UEFI が読み取るカーネルを直接更新します。 |
+ | * EFIブートスタブは [[ブートローダー]] を介して間接的に起動することも可能です: |
||
− | * カーネルと initramfs があるパーティションにファイルシステムドライバがあるブートマネージャーを使えば、ESP からカーネルを外すことができます。 |
||
+ | ** 複数のUEFIブートマネージャーが追加のオプションを提供したり、UEFIブートプロセスを簡略化したりすることができます。 |
||
+ | ** これは、[[カーネルパラメータ]] を試したり、複数のカーネルや OS を使用したりする場合、またはマザーボードの UEFI ブートメニューが使いにくい場合に特に有用です。 |
||
+ | ** カーネルと initramfs が存在するパーティションのファイルシステムドライバーを持つブートマネージャー(例: [[rEFInd]])を使用すれば、これらを ESP の外に置くことが可能です。 |
||
}} |
}} |
||
== EFISTUB の起動 == |
== EFISTUB の起動 == |
||
+ | {{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''/}} 以下にあると仮定します。}} |
||
− | {{Tip|追加のオプションを提供したり、UEFI ブートのプロセスを簡素化したりできる UEFI ブートマネージャーがいくつかあります。特に [[カーネルパラメータ]] を試している場合や、複数のカーネル/オペレーティングシステムがある場合に。詳細については、[[Arch ブートプロセス#ブートローダー]] を参照してください。}} |
||
− | |||
− | {{Note|Linux カーネル EFISTUB initramfs のパスは EFI システムパーティションのルートからの相対パスで、(EFI 標準に従って)バックスラッシュを使用する必要がありま す。例えば、initramfs が {{ic|''esp''/EFI/arch/initramfs-linux.img}} にある場合、対応する UEFI フォーマットの行は {{ic|1=initrd=\EFI\arch\initramfs-linux.img}} でなければなりません。以下の例では、全ては {{ic|''esp''/}} の下にあると仮定しています。}} |
||
=== UEFI を直接使う === |
=== UEFI を直接使う === |
||
38行目: | 41行目: | ||
==== efibootmgr ==== |
==== efibootmgr ==== |
||
− | カーネルをロードするブートエントリを |
+ | カーネルをロードする ''efibootmgr'' を使用してブートエントリを作成するには: |
− | # efibootmgr --disk ''/dev/sdX'' --part ''Y'' |
+ | # efibootmgr --create --disk ''/dev/sdX'' --part ''Y'' --label "Arch Linux" --loader /vmlinuz-linux --unicode 'root=''block_device_identifier'' rw initrd=\initramfs-linux.img' |
− | + | ここで、{{ic|''/dev/sdX''}} は ESP(EFI システムパーティション)が存在するドライブを、{{ic|''Y''}} はそのパーティション番号を指します。また、{{ic|1=root=}}のパラメーターにはLinuxのルートパーティションを指定します。 |
|
+ | {{Note|サポートされているデバイス名の形式については [[カーネルパラメータ#パラメータ一覧|カーネルパラメータ]]、対応する値の取得方法については [[永続的なブロックデバイスの命名]]、および例については[[永続的なブロックデバイスの命名#カーネルパラメータ]] を参照してください。}} |
||
− | # efibootmgr --disk ''/dev/sdX'' --part ''Y'' --create --label "Arch Linux" --loader /vmlinuz-linux --unicode 'root=PARTUUID=''XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'' resume=PARTUUID=''XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'' rw initrd=\initramfs-linux.img' --verbose |
||
+ | 省略された場合、{{ic|/dev/sda}} の最初のパーティションが ESP として使用されます。 |
||
− | {{ic|''/dev/sdX''}} と {{ic|''Y''}} は ESP が存在するディスクとパーティションに置き換えてください。{{ic|1=root=}} パラメータを変更することで Linux のルートパーティションを指定できます (ディスクの UUID を使うこともできます)。{{ic|-u/--unicode}} 引数を(シングル)クオーテーションで囲っているのは[[カーネルパラメータ]]を指定するためであり、[[サスペンドとハイバネート#必要なカーネルパラメータ|ハイバネート]]や[[マイクロコード]]を使う場合はパラメータを追加する必要があります。 |
||
+ | 引用符内の {{ic|-u}}/{{ic|--unicode}} 引数は、単なる [[カーネルパラメータ|カーネルパラメータ]] のリストであるため、必要に応じて追加のパラメーターを指定する必要があります(例: [[電源管理/サスペンドとハイバネート|ハイバネート先指定を initramfs に渡す]]) |
||
− | 以下のコマンドを実行することで作成したエントリが問題ないか確認できます: |
||
+ | LTS Linux カーネル、NVME ストレージ、特定のサブボリュームを備えた BTRFS ファイルシステム、およびスワップパーティションでの休止状態の例: |
||
− | # efibootmgr -v |
||
+ | # 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]] を参照してください。 |
||
− | # efibootmgr --bootorder ''XXXX'',''XXXX'' --verbose |
||
− | |||
− | ここでの、''XXXX'' は各エントリに対して ''efibootmgr'' コマンドの出力に現れる番号です。 |
||
{{Tip|1=<nowiki/> |
{{Tip|1=<nowiki/> |
||
+ | * {{AUR|kesboot-git}} パッケージを使用すると、これを簡素化して自動化できます。このパッケージには、パッケージ操作中にEFI変数を追加および削除できる [[pacman フック]] も含まれています。 |
||
− | * https://github.com/de-arl/auto-UEFI-entry は、コマンドを作成するためのツールです。 |
||
+ | * https://github.com/de-arl/auto-UEFI-entry は、コマンドを作成するための Bash ヘルパーです。 |
||
− | * ブートエントリを作成するコマンドをシェルスクリプトに保存しておくと、カーネルパラメータを変更する際などに修正が容易になり便利です。その際、''efibootmgr'' が現在 [https://github.com/rhboot/efibootmgr/issues/49 は既存のエントリの編集をサポートしていない] ように、古いブートエントリの削除を自動化することを検討してください。 |
||
+ | * ブートエントリーを作成するコマンドをシェルスクリプトに保存しておくと、カーネルパラメーターを変更する場合などに簡単に修正できて便利です。この際、古いブートエントリーを削除する処理を自動化することを検討してください。現在のところ、''efibootmgr'' は [https://github.com/rhboot/efibootmgr/issues/49 既存のエントリーの編集をサポートしていません] |
||
− | * [https://bbs.archlinux.org/viewtopic.php?pid=1090040#p1090040 The linux kernel with build in bootloader?] と題されたフォーラムへの投稿も参考になるかもしれません。 |
||
+ | * フォーラム投稿 [https://bbs.archlinux.org/viewtopic.php?pid=1090040#p1090040 The linux kernel with build in bootloader?] も参考になるかもしれません。 |
||
− | }} |
||
+ | }} |
||
==== bcfg ==== |
==== bcfg ==== |
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 システムパーティション を用意し、どのようにマウントするか選択 する必要があります。
目次
EFISTUB の起動
UEFI を直接使う
UEFI は GRUB のような中間ブートローダを必要としないように設計されています。あなたのマザーボードに優れた UEFI 実装があれば、UEFI ブートエントリーにカーネルパラメータを埋め込んで、マザーボードが直接 Arch を起動させることができます。 efibootmgr や UEFI Shell v2 を使ってマザーボードのブートエントリーを変更することができます。
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 を参照してください。
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
保存するには 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')
次に、以下を実行します。
# 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 エントリをブートする前に、別の既存のブート エントリを使用してください。