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

提供: ArchWiki
ナビゲーションに移動 検索に移動
(前文の翻訳更新)
(他言語へのリンクを追加)
(3人の利用者による、間の14版が非表示)
1行目: 1行目:
 
[[Category:ブートローダー]]
 
[[Category:ブートローダー]]
  +
[[de:EFISTUB]]
 
[[en:EFISTUB]]
 
[[en:EFISTUB]]
 
[[es:EFISTUB]]
 
[[es:EFISTUB]]
[[ru:EFISTUB]]
+
[[fr:EFISTUB]]
  +
[[pt:EFISTUB]]
 
{{Related articles start}}
 
{{Related articles start}}
 
{{Related|Arch ブートプロセス}}
 
{{Related|Arch ブートプロセス}}
10行目: 12行目:
 
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] を参照してください。
 
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] を参照してください。
   
== EFISTUB の設定 ==
+
== EFISTUB の準備 ==
   
[[EFI システムパーティション]]を作成したらシステムパーティションをマウントする方法を選択してください一番簡単なは {{ic|/boot}} にマウントするか {{ic|/boot}} [[EFI システムパーティション#バイドマウントを使う|バインドマウント]]することです。pacman が直接 EFI ファームウェアによって読み込まれるカーネル更新しくれます。その場合、[[#EFISTUB の起動]]に進んでください。
+
まず、[[EFI システムパーティション]] を作成し、そのマウント方法を選択する必要がありますESP のマウントオプションは [[EFI システムパーティション#パーティショマウント]] をさい。
   
  +
{{Tip|
{{Note|[[rEFInd]] などのファイルシステムドライバーを備えているブートマネージャを使用する場合、カーネルや initramfs を ESP 以外に保存できます。}}
 
  +
* ESP を {{ic|/boot}} にマウントすると [[pacman]] は EFI ファームウェアが読み込むカーネルを直接更新します。
  +
* カーネルと initramfs があるパーティションにファイルシステムドライバがあるブートマネージャーを使えば、ESP からカーネルを外すことができます。
  +
}}
   
  +
== EFISTUB の起動 ==
=== 他の ESP マウントポイント ===
 
   
  +
{{Tip|追加のオプションを提供したり、UEFI ブートのプロセスを簡素化したりできる UEFI ブートマネージャーがいくつかあります。特に [[カーネルパラメータ]] を試している場合や、複数のカーネル/オペレーティングシステムがある場合に。詳細については、[[Arch ブートプロセス#ブートローダー]] を参照してください。}}
EFI システムパーティションを {{ic|/boot}} にマウントしない場合、ブートファイルをコピーする必要があります (以下 EFI システムパーティションの場所を {{ic|''esp''}} とします):
 
   
  +
{{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''/}} の下にあると仮定しています。}}
# mkdir -p ''esp''/EFI/arch
 
# cp /boot/vmlinuz-linux ''esp''/EFI/arch/vmlinuz-linux
 
# cp /boot/initramfs-linux.img ''esp''/EFI/arch/initramfs-linux.img
 
# cp /boot/initramfs-linux-fallback.img ''esp''/EFI/arch/initramfs-linux-fallback.img
 
   
  +
=== UEFI を直接使う ===
{{Note|Intel 製の CPU を使用する場合、[[マイクロコード]]をブートエントリの場所にコピーする必要があります。}}
 
   
  +
UEFI は [[GRUB]] のような中間ブートローダを必要としないように設計されています。あなたのマザーボードに優れた UEFI 実装があれば、UEFI ブートエントリーにカーネルパラメータを埋め込んで、マザーボードが直接 Arch を起動させることができます。 [[efibootmgr]] や UEFI Shell v2 を使ってマザーボードのブートエントリーを変更することができます。
さらに、カーネルのアップデートがあったときに ESP のファイルを更新する必要があります。更新しないとシステムが起動できなくなってしまいます。以下のセクションでは自動でコピーする方法を説明しています。
 
   
  +
{{Note|1=<nowiki/>
==== systemd を使う ====
 
  +
* 古い UEFI の実装は Linux カーネルとの互換性に問題がある場合があります。もしあなたの UEFI にバグフィックスが施された新しいバージョンがあるのなら、メーカー推奨のツールでフラッシュすることを検討してください。
  +
* NVRAM のブートエントリから EFI バイナリにコマンドラインパラメータを渡さないファームウェアもあります[https://bbs.archlinux.org/viewtopic.php?id=178154] この場合、カーネルとパラメータを [[Unified カーネルイメージ]] に統合して、できた ''.efi'' ファイルでブートエントリを作成することが可能です。
  +
}}
   
  +
==== efibootmgr ====
[[Systemd]] には特定のイベントが起こったときにタスクを実行する機能があります。{{ic|/boot}} が更新されたときに特定のパスにおける変更を検知して EFISTUB カーネルと initramfs ファイルを同期してください:
 
   
  +
カーネルをロードするブートエントリを ''efibootmgr'' で作成する。
{{hc|/etc/systemd/system/efistub-update.path|<nowiki>
 
[Unit]
 
Description=Copy EFISTUB Kernel to UEFISYS Partition
 
   
  +
# efibootmgr --disk ''/dev/sdX'' --part ''Y'' --create --label "Arch Linux" --loader /vmlinuz-linux --unicode 'root=PARTUUID=''XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'' rw initrd=\initramfs-linux.img' --verbose
[Path]
 
PathChanged=/boot/initramfs-linux-fallback.img
 
   
  +
または、''efibootmgr'' とスワップパーティションでの休止状態を使用してブートエントリを作成します
[Install]
 
WantedBy=multi-user.target
 
WantedBy=system-update.target
 
</nowiki>}}
 
   
  +
# 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
{{Note|上記のユニットは {{ic|initramfs-linux-fallback.img}} の変更を監視します。このファイルは mkinitcpio によって最後に作成されるファイルであり、ビルドが完了する前に他のファイルをコピーしてしまう競合状態を避けることができます。}}
 
   
  +
{{ic|''/dev/sdX''}} と {{ic|''Y''}} は ESP が存在するディスクとパーティションに置き換えてください。{{ic|1=root=}} パラメータを変更することで Linux のルートパーティションを指定できます (ディスクの UUID を使うこともできます)。{{ic|-u/--unicode}} 引数を(シングル)クオーテーションで囲っているのは[[カーネルパラメータ]]を指定するためであり、[[サスペンドとハイバネート#必要なカーネルパラメータ|ハイバネート]]や[[マイクロコード]]を使う場合はパラメータを追加する必要があります。
{{hc|1=/etc/systemd/system/efistub-update.service|2=
 
[Unit]
 
Description=Copy EFISTUB Kernel to UEFISYS Partition
 
   
  +
以下のコマンドを実行することで作成したエントリが問題ないか確認できます:
[Service]
 
Type=oneshot
 
ExecStart=/usr/bin/cp -f /boot/vmlinuz-linux ''esp''/EFI/arch/vmlinuz-linux
 
ExecStart=/usr/bin/cp -f /boot/initramfs-linux.img ''esp''/EFI/arch/initramfs-linux.img
 
ExecStart=/usr/bin/cp -f /boot/initramfs-linux-fallback.img ''esp''/EFI/arch/initramfs-linux-fallback.img
 
}}
 
{{Tip|(自分の鍵を使って) [[セキュアブート]]する場合、({{Pkg|sbsigntools}} を使って) イメージに署名するようにサービスを設定することができます:
 
{{bc|1=ExecStart=/usr/bin/sbsign --key ''/path/to/db.key'' --cert ''/path/to/db.crt'' --output ''esp''/EFI/arch/vmlinuz-linux ''esp''/EFI/arch/vmlinuz_linux}}
 
}}
 
   
  +
# efibootmgr -v
ユニットを作成したら {{ic|efistub-update.path}} を[[起動]]・[[有効化]]してください。
 
   
  +
ブート順を設定する場合。
==== incron を使う ====
 
   
  +
# efibootmgr --bootorder ''XXXX'',''XXXX'' --verbose
{{Pkg|incron}} を使うことでカーネルの更新時に EFISTUB カーネルを同期させるスクリプトを実行できます。
 
   
  +
ここでの、''XXXX'' は各エントリに対して ''efibootmgr'' コマンドの出力に現れる番号です。
{{hc|/usr/local/bin/efistub-update.sh|
 
#!/usr/bin/env bash
 
/usr/bin/cp -f /boot/vmlinuz-linux ''esp''/EFI/arch/vmlinuz-linux
 
/usr/bin/cp -f /boot/initramfs-linux.img ''esp''/EFI/arch/initramfs-linux.img
 
/usr/bin/cp -f /boot/initramfs-linux-fallback.img ''esp''/EFI/arch/initramfs-linux-fallback.img}}
 
   
  +
{{Tip|1=<nowiki/>
{{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 は、コマンドを作成するためのツールです。
  +
* ブートエントリを作成するコマンドをシェルスクリプトに保存しておくと、カーネルパラメータを変更する際などに修正が容易になり便利です。その際、''efibootmgr'' が現在 [https://github.com/rhboot/efibootmgr/issues/49 は既存のエントリの編集をサポートしていない] ように、古いブートエントリの削除を自動化することを検討してください。
  +
* [https://bbs.archlinux.org/viewtopic.php?pid=1090040#p1090040 The linux kernel with build in bootloader?] と題されたフォーラムへの投稿も参考になるかもしれません。
  +
}}
   
  +
==== bcfg ====
{{hc|/etc/incron.d/efistub-update.conf|<nowiki>
 
/boot/initramfs-linux-fallback.img IN_CLOSE_WRITE /usr/local/bin/efistub-update.sh</nowiki>}}
 
   
  +
UEFI の実装によっては ''efibootmgr'' を使って NVRAM をうまく変更することが難しいものがあります。''efibootmgr'' がうまくエントリを作成できない場合、UEFI シェル v2 で [[UEFI#bcfg|bcfg]] コマンドを使うことができます (例:[https://archlinux.org/download/ Arch Linux live iso] から)
この方法を使う場合、{{ic|incrond}} のサービスを有効にしてください:
 
   
  +
まず、あなたの [[ESP]] が存在するデバイス番号を調べます。
# systemctl enable incrond.service
 
   
  +
Shell> map
==== mkinitcpio フックを使う ====
 
   
  +
この例では、デバイス番号として {{ic|1}} を使用しています。[[ESP]] の中身を一覧表示する。
Mkinitcpio はフックを生成することができ、システムレベルのデーモンを必要としません。バックグラウンドプロセスが生成され {{ic|vm-linuz}}, {{ic|initramfs-linux.img}}, {{ic|initramfs-linux-fallback.img}} が生成されてからファイルをコピーします。
 
   
  +
sshell> ls FS1:
{{ic|/etc/mkinitcpio.conf}} のフックのリストに {{ic|efistub-update}} を追加してください。
 
   
  +
現在のブートエントリーを表示するには
{{hc|/usr/lib/initcpio/install/efistub-update|<nowiki>
 
#!/usr/bin/env bash
 
build() {
 
/root/watch.sh &
 
}
 
   
  +
Shell> bcfg boot dump
help() {
 
cat <<HELPEOF
 
This hook waits for mkinitcpio to finish and copies the finished ramdisk and kernel to the ESP
 
HELPEOF
 
}</nowiki>}}
 
   
  +
カーネルのエントリを追加するには、以下を使用します。
{{hc|/root/watch.sh|<nowiki>
 
#!/usr/bin/env bash
 
   
  +
Shell> bcfg boot add ''N'' とします。FS1:\vmlinuz-linux "Arch Linux"
while [[ -d "/proc/$PPID" ]]; do
 
sleep 1
 
done
 
</nowiki>
 
/usr/bin/cp -f /boot/vmlinuz-linux ''esp''/EFI/arch/vmlinuz-linux
 
/usr/bin/cp -f /boot/initramfs-linux.img ''esp''/EFI/arch/initramfs-linux.img
 
/usr/bin/cp -f /boot/initramfs-linux-fallback.img ''esp''/EFI/arch/initramfs-linux-fallback.img
 
   
  +
ここで {{ic|''N''}} はブートメニューに追加されるエントリの場所です。0 は最初のメニュー項目です。既に存在するメニュー項目は、破棄されることなくメニュー内で移動されます。
echo "Synced kernel with ESP"}}
 
   
  +
ESP 上にファイルを作成し、必要なカーネルオプションを追加します。
==== mkinitcpio フックを使う (別の方法) ====
 
   
  +
Shell> FS1:\options.txt を編集します。
上記の方法と別に、コピー操作を減らす方法があります。逆転の発想で initramfs を {{ic|/boot}} ではなく EFI パーティションに直接保存します。そして mkinitcpio フックを使ってカーネルなどのファイルを ESP にコピーします。
 
   
  +
ファイル内に、ブートラインを追加します。たとえば、以下のようになります。
{{ic|/etc/mkinitcpio.d/linux.preset}} ファイルを編集してください:
 
   
  +
root=/dev/sda2 ro initrd=initramfs-linux.img
{{hc|/etc/mkinitcpio.d/linux.preset|<nowiki>
 
# mkinitcpio preset file for the 'linux' package
 
   
  +
{{Note|ファイル内の行頭に余分なスペースを入れてください。行頭には [[Wikipedia:Byte order mark|byte order mark]] があり、ブート時にエラーの原因となるその隣の文字を潰してしまいます。}}
# Directory to copy the kernel, the initramfs...
 
ESP_DIR="/boot/efi/EFI/arch"
 
   
  +
保存するには {{ic|F2}} を、終了するには {{ic|F3}} を押してください。
ALL_config="/etc/mkinitcpio.conf"
 
ALL_kver="/boot/vmlinuz-linux"
 
   
  +
前のエントリにこれらのオプションを追加します。
PRESETS=('default' 'fallback')
 
   
  +
Shell> bcfg boot -opt ''N'' FS1:\options.txt
#default_config="/etc/mkinitcpio.conf"
 
default_image="${ESP_DIR}/initramfs-linux.img"
 
default_options="-A esp-update-linux"
 
   
  +
追加する項目がある場合は、この作業を繰り返してください。
#fallback_config="/etc/mkinitcpio.conf"
 
fallback_image="${ESP_DIR}/initramfs-linux-fallback.img"
 
fallback_options="-S autodetect"
 
</nowiki>}}
 
   
  +
前に追加した項目を削除するには、次のようにします。
そして {{ic|/usr/lib/initcpio/install/esp-update-linux}} ファイルを作成して実行可能属性を付与してください:
 
   
  +
Shell> bcfg boot rm ''N''
{{hc|/usr/lib/initcpio/install/esp-update-linux|<nowiki>
 
# Directory to copy the kernel, the initramfs...
 
ESP_DIR="/boot/efi/EFI/arch"
 
   
  +
==== kesboot ====
build() {
 
cp /boot/vmlinuz-linux "${ESP_DIR}/vmlinuz-linux.efi"
 
# If ucode is used uncomment this line
 
#cp /boot/intel-ucode.img "${ESP_DIR}/"
 
}
 
   
  +
{{AUR|kesboot-git}} パッケージのスクリプトを使って EFISTUB での作業を単純化・自動化することもできます。パッケージの操作中に EFI 変数を追加・削除するための [[pacman フック]] も含まれています。
help() {
 
cat <<HELPEOF
 
This hook copies the kernel to the ESP partition
 
HELPEOF
 
}
 
</nowiki>}}
 
   
  +
まず、パッケージをインストールして、{{ic|/etc/kesboot.conf}} ファイルを設定します。
テストするには以下のコマンドを実行:
 
   
  +
{{hc|/etc/kesboot.conf|2=
# rm /boot/initramfs-linux-fallback.img
 
  +
CMDLINES=('linux' 'acpi=on'
# rm /boot/initramfs-linux.img
 
  +
'linux-zen' 'iommu=off')
# mkinitcpio -p linux
 
  +
}}
   
  +
{{Note|フック (変数 {{ic|INSTALL_HOOK}} と {{ic|REMOVE_HOOK}}) を使用すると、実行するたびに {{ic|CMDLINES}} 配列を上書きします(すべてのレコードの内容を。}}
== EFISTUB の起動 ==
 
  +
  +
次に、以下を実行します。
   
  +
# kesboot -u
{{Warning|Linux カーネル EFISTUB の initramfs のパスは EFI システムパーティションのルートディレクトリからの相対パスになります。例えば、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}} になります。以下の例では必要なファイル全てが {{ic|$esp/}} にあることを前提としています。}}
 
   
  +
また、本パッケージには EFI ブートの初期設定用のプログラムも含まれています。[[EFI システムパーティション#パーティションのマウント|ESPのマウント]] ディレクトリの後、以下を実行してください。
=== ブートマネージャを使う ===
 
   
  +
# /usr/lib/setup-efi-boot
UEFI ブートマネージャには UEFI ブートを簡単にすることができるオプションが存在します (特に複数のカーネルやオペレーティングシステムをインストールしている場合)。詳しくは[[ブートローダー]]を見てください。
 
   
 
=== UEFI Shell を使う ===
 
=== UEFI Shell を使う ===
184行目: 141行目:
 
> archlinux
 
> archlinux
   
=== UEFI を直接使 ===
+
==== startup.nsh スクリプトの使 ====
   
  +
いくつかの UEFI 実装はコールドブート間で EFI 変数を保持せず (例:[[VirtualBox]] バージョン 6.1 以前)、UEFI ファームウェアインターフェースを通して設定したものは電源切断時に失われてしまいます。
UEFI は [[GRUB]] などの中間的なブートローダーを排除できるように設計されています。使用しているマザーボードの UEFI 実装に問題がなければ、カーネルパラメータを UEFI ブートエントリの中に埋め込んでマザーボードから Arch を直接起動できます。{{Pkg|efibootmgr}} や UEFI Shell v2 を使ってマザーボードのブートエントリを編集できます。
 
   
  +
[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}} スクリプトを作成することを確認します。例えば
==== efibootmgr ====
 
   
  +
vmlinuz-linux rw root=/dev/sd''X'' [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 マイクロコードは、後で起動プロセス中にディスクから読み取られます。これはカーネルによって自動的に行われます。
# efibootmgr -d ''/dev/sdX'' -p ''Y'' -c -L "Arch Linux" -l /vmlinuz-linux -u "root=''/dev/sdBZ'' rw initrd=/initramfs-linux.img"
 
   
  +
== ヒントとテクニック ==
{{ic|''/dev/sdX''}} と {{ic|''Y''}} は ESP が存在するディスクとパーティションに置き換えてください。{{ic|1=root=}} パラメータを変更することで Linux のルートパーティションを指定できます (ディスクの UUID を使うこともできます)。{{ic|-u}} 引数をダブルクオーテーションで囲っているのは[[カーネルパラメータ]]を指定するためであり、[[サスペンドとハイバネート#必要なカーネルパラメータ|ハイバネート]]や[[マイクロコード]]を使う場合はパラメータを追加する必要があります。
 
   
  +
=== フォールバック RAM ディスクを使用したブートエントリ ===
以下のコマンドを実行することで作成したエントリが問題ないか確認できます:
 
   
  +
ブートマネージャなしで EFISTUB を使用する場合、カーネルコマンドラインはブート時に変更できません。例えば {{ic|initramfs-linux-fallback.img}} を使ったり、Intel マイクロコード無しで起動したりするような、少なくともある種のフォールバックの可能性を持つには、efibootmgr でさらなるブートエントリーを作成するだけです。
# efibootmgr -v
 
   
  +
== トラブルシューティング ==
{{Warning|特定のカーネルと {{ic|efibootmgr}} のバージョンの組み合わせでは新しいブートエントリを作成できません。NVRAM に空き容量が存在しないことが原因です。EFI のダンプファイルを削除してみてください:
 
   
  +
=== EFISTUB はいくつかの Dell システムで動作しません ===
# rm /sys/firmware/efi/efivars/dump-*
 
   
  +
いくつかの世代の Dell ファームウェアは、ブートローダに渡す引数を間違えており、そのため EFISTUB は通常起動不可能なシステムを意味する null コマンドラインをパースします ([https://lore.kernel.org/linux-efi/20200907170021.GA2284449@rani.riverdale.lan/ linux-efi thread] を参照してください)
もしくは、{{ic|efi_no_storage_paranoia}} カーネルパラメータを使って起動してください。キャッシュに前のバージョンが存在する場合、efibootmgr のバージョンを 0.11.0 にダウングレードしてみてください。このバージョンでは Linux のバージョン 4.0.6 が動作します。詳しくは {{Bug|34641}} を参照。}}
 
   
  +
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
 
 
XXXX は `efibootmgr` コマンドの出力で確認できるエントリの数字に置き換えてください。
 
 
{{Tip|ブートエントリを作成するコマンドをシェルスクリプトに保存することで、(カーネルパラメータを変更するときなど) 編集が簡単になります。}}
 
 
efibootmgr については [[UEFI#efibootmgr]] を見てください。https://bbs.archlinux.org/viewtopic.php?pid=1090040#p1090040 も参照。
 
 
==== UEFI Shell ====
 
UEFI の実装によっては efibootmgr を使用して NVRAM を編集できないことがあります。efibootmgr でエントリを作成できない場合、UEFI Shell v2 の [[UEFI#bcfg|bcfg]] コマンドを使用する方法があります。
 
 
カーネルのエントリを追加するには、以下を実行:
 
 
Shell> bcfg boot add '''N''' fs'''V''':\vmlinuz-linux "Arch Linux"
 
 
{{ic|N}} はエントリの優先度 (0 が一番優先されます) に、{{ic|V}} は EFI パーティションのボリューム番号に置き換えてください。ボリューム番号がわからない場合、map コマンドを使うことでファイルシステムが確認できるので、ls コマンドで中身を確認してください:
 
 
Shell> map
 
Shell> ls fs0:
 
   
  +
Haswell 時代の Asus ボード([https://forums.archlinux.fr/viewtopic.php?t=19618 こちらのフォーラムを参照]) などの一部のマザーボードは、システムが起動しない限りブートエントリの変更に気づきません。更新された EFISTUB エントリをブートする前に、別の既存のブート エントリを使用してください。
最低限必要なカーネルオプションだけを追加する場合:
 
   
  +
== 参照 ==
Shell> bcfg boot -opt '''N''' "root='''/dev/sdX#''' rw initrd=\initramfs-linux.img"
 
   
  +
* [https://www.kernel.org/doc/html/latest/admin-guide/efi-stub.html EFISTUB の Linux カーネルドキュメント]
{{ic|N}} は優先度に {{ic|/dev/sdX#}} はルートパーティションに置き換えてください。
 
  +
* [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 記事]

2024年2月11日 (日) 07:15時点における版

関連記事

Linux カーネルは EFISTUB ブートをサポートしており、EFI ファームウェアがカーネルを EFI 実行可能ファイルとしてロードできるようにします。このオプションは、Arch Linux カーネルではデフォルトで有効になっています。カーネルをコンパイルする場合は、カーネル構成で CONFIG_EFI_STUB=yを設定することでアクティブにできます。詳細については、EFI BootStub を参照してください。

EFISTUB の準備

まず、EFI システムパーティション を作成し、そのマウント方法を選択する必要があります。ESP のマウントオプションは EFI システムパーティション#パーティションのマウント を見て下さい。

ヒント:
  • ESP を /boot にマウントすると pacman は EFI ファームウェアが読み込むカーネルを直接更新します。
  • カーネルと initramfs があるパーティションにファイルシステムドライバがあるブートマネージャーを使えば、ESP からカーネルを外すことができます。

EFISTUB の起動

ヒント: 追加のオプションを提供したり、UEFI ブートのプロセスを簡素化したりできる UEFI ブートマネージャーがいくつかあります。特に カーネルパラメータ を試している場合や、複数のカーネル/オペレーティングシステムがある場合に。詳細については、Arch ブートプロセス#ブートローダー を参照してください。
ノート: Linux カーネル EFISTUB initramfs のパスは EFI システムパーティションのルートからの相対パスで、(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 --disk /dev/sdX --part Y --create --label "Arch Linux" --loader /vmlinuz-linux --unicode 'root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw initrd=\initramfs-linux.img' --verbose

または、efibootmgr とスワップパーティションでの休止状態を使用してブートエントリを作成します

# 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

/dev/sdXY は ESP が存在するディスクとパーティションに置き換えてください。root= パラメータを変更することで Linux のルートパーティションを指定できます (ディスクの UUID を使うこともできます)。-u/--unicode 引数を(シングル)クオーテーションで囲っているのはカーネルパラメータを指定するためであり、ハイバネートマイクロコードを使う場合はパラメータを追加する必要があります。

以下のコマンドを実行することで作成したエントリが問題ないか確認できます:

# efibootmgr -v

ブート順を設定する場合。

# efibootmgr --bootorder XXXX,XXXX --verbose

ここでの、XXXX は各エントリに対して 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
ノート: ファイル内の行頭に余分なスペースを入れてください。行頭には 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 エントリをブートする前に、別の既存のブート エントリを使用してください。

参照