「EFI ブートスタブ」の版間の差分
(→EFISTUB の起動: 情報を更新) |
細 (AshMyzk がページ「EFISTUB」を「EFI ブートスタブ」に移動しました: 英語版と同じくページ名を変更) |
||
(3人の利用者による、間の13版が非表示) | |||
1行目: | 1行目: | ||
[[Category:ブートローダー]] |
[[Category:ブートローダー]] |
||
+ | [[de:EFISTUB]] |
||
[[en:EFISTUB]] |
[[en:EFISTUB]] |
||
[[es:EFISTUB]] |
[[es:EFISTUB]] |
||
− | [[ |
+ | [[fr:EFISTUB]] |
+ | [[pt:EFISTUB]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
{{Related|Arch ブートプロセス}} |
{{Related|Arch ブートプロセス}} |
||
18行目: | 20行目: | ||
* カーネルと initramfs があるパーティションにファイルシステムドライバがあるブートマネージャーを使えば、ESP からカーネルを外すことができます。 |
* カーネルと initramfs があるパーティションにファイルシステムドライバがあるブートマネージャーを使えば、ESP からカーネルを外すことができます。 |
||
}} |
}} |
||
− | |||
− | == EFISTUB の設定 == |
||
− | |||
− | [[EFI システムパーティション]]を作成したら、システムパーティションをマウントする方法を選択してください。一番簡単なのは {{ic|/boot}} にマウントするか {{ic|/boot}} に[[EFI システムパーティション#バインドマウントを使う|バインドマウント]]することです。pacman が直接 EFI ファームウェアによって読み込まれるカーネルを更新してくれます。その場合、[[#EFISTUB の起動]]に進んでください。 |
||
− | |||
− | {{Note|[[rEFInd]] などのファイルシステムドライバーを備えているブートマネージャを使用する場合、カーネルや initramfs を ESP 以外に保存できます。}} |
||
− | |||
− | === 他の ESP マウントポイント === |
||
− | |||
− | EFI システムパーティションを {{ic|/boot}} にマウントしない場合、ブートファイルをコピーする必要があります (以下 EFI システムパーティションの場所を {{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 |
||
− | |||
− | {{Note|Intel 製の CPU を使用する場合、[[マイクロコード]]をブートエントリの場所にコピーする必要があります。}} |
||
− | |||
− | さらに、カーネルのアップデートがあったときに ESP のファイルを更新する必要があります。更新しないとシステムが起動できなくなってしまいます。以下のセクションでは自動でコピーする方法を説明しています。 |
||
− | |||
− | ==== systemd を使う ==== |
||
− | |||
− | [[Systemd]] には特定のイベントが起こったときにタスクを実行する機能があります。{{ic|/boot}} が更新されたときに特定のパスにおける変更を検知して EFISTUB カーネルと initramfs ファイルを同期してください: |
||
− | |||
− | {{hc|/etc/systemd/system/efistub-update.path|<nowiki> |
||
− | [Unit] |
||
− | Description=Copy EFISTUB Kernel to UEFISYS Partition |
||
− | |||
− | [Path] |
||
− | PathChanged=/boot/initramfs-linux-fallback.img |
||
− | |||
− | [Install] |
||
− | WantedBy=multi-user.target |
||
− | WantedBy=system-update.target |
||
− | </nowiki>}} |
||
− | |||
− | {{Note|上記のユニットは {{ic|initramfs-linux-fallback.img}} の変更を監視します。このファイルは mkinitcpio によって最後に作成されるファイルであり、ビルドが完了する前に他のファイルをコピーしてしまう競合状態を避けることができます。}} |
||
− | |||
− | {{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}} |
||
− | }} |
||
− | |||
− | ユニットを作成したら {{ic|efistub-update.path}} を[[起動]]・[[有効化]]してください。 |
||
− | |||
− | ==== incron を使う ==== |
||
− | |||
− | {{Pkg|incron}} を使うことでカーネルの更新時に EFISTUB カーネルを同期させるスクリプトを実行できます。 |
||
− | |||
− | {{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}} |
||
− | |||
− | {{Note|最初のパラメータの {{ic|/boot/initramfs-linux-fallback.img}} は監視するファイルです。2番目のパラメータの {{ic|IN_CLOSE_WRITE}} は監視する操作です。3番目のパラメータの {{ic|/usr/local/bin/efistub-update.sh}} は実行するスクリプトです。}} |
||
− | |||
− | {{hc|/etc/incron.d/efistub-update.conf|<nowiki> |
||
− | /boot/initramfs-linux-fallback.img IN_CLOSE_WRITE /usr/local/bin/efistub-update.sh</nowiki>}} |
||
− | |||
− | この方法を使う場合、{{ic|incrond}} のサービスを有効にしてください: |
||
− | |||
− | # systemctl enable incrond.service |
||
− | |||
− | ==== mkinitcpio フックを使う ==== |
||
− | |||
− | Mkinitcpio はフックを生成することができ、システムレベルのデーモンを必要としません。バックグラウンドプロセスが生成され {{ic|vm-linuz}}, {{ic|initramfs-linux.img}}, {{ic|initramfs-linux-fallback.img}} が生成されてからファイルをコピーします。 |
||
− | |||
− | {{ic|/etc/mkinitcpio.conf}} のフックのリストに {{ic|efistub-update}} を追加してください。 |
||
− | |||
− | {{hc|/usr/lib/initcpio/install/efistub-update|<nowiki> |
||
− | #!/usr/bin/env bash |
||
− | build() { |
||
− | /root/watch.sh & |
||
− | } |
||
− | |||
− | 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 |
||
− | |||
− | 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 |
||
− | |||
− | echo "Synced kernel with ESP"}} |
||
− | |||
− | ==== mkinitcpio フックを使う (別の方法) ==== |
||
− | |||
− | 上記の方法と別に、コピー操作を減らす方法があります。逆転の発想で initramfs を {{ic|/boot}} ではなく EFI パーティションに直接保存します。そして mkinitcpio フックを使ってカーネルなどのファイルを ESP にコピーします。 |
||
− | |||
− | {{ic|/etc/mkinitcpio.d/linux.preset}} ファイルを編集してください: |
||
− | |||
− | {{hc|/etc/mkinitcpio.d/linux.preset|<nowiki> |
||
− | # mkinitcpio preset file for the 'linux' package |
||
− | |||
− | # Directory to copy the kernel, the initramfs... |
||
− | ESP_DIR="/boot/efi/EFI/arch" |
||
− | |||
− | ALL_config="/etc/mkinitcpio.conf" |
||
− | ALL_kver="/boot/vmlinuz-linux" |
||
− | |||
− | PRESETS=('default' 'fallback') |
||
− | |||
− | #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}} ファイルを作成して実行可能属性を付与してください: |
||
− | |||
− | {{hc|/usr/lib/initcpio/install/esp-update-linux|<nowiki> |
||
− | # Directory to copy the kernel, the initramfs... |
||
− | ESP_DIR="/boot/efi/EFI/arch" |
||
− | |||
− | build() { |
||
− | cp /boot/vmlinuz-linux "${ESP_DIR}/vmlinuz-linux.efi" |
||
− | # If ucode is used uncomment this line |
||
− | #cp /boot/intel-ucode.img "${ESP_DIR}/" |
||
− | } |
||
− | |||
− | help() { |
||
− | cat <<HELPEOF |
||
− | This hook copies the kernel to the ESP partition |
||
− | HELPEOF |
||
− | } |
||
− | </nowiki>}} |
||
− | |||
− | テストするには以下のコマンドを実行: |
||
− | |||
− | # rm /boot/initramfs-linux-fallback.img |
||
− | # rm /boot/initramfs-linux.img |
||
− | # mkinitcpio -p linux |
||
== EFISTUB の起動 == |
== EFISTUB の起動 == |
||
177行目: | 25行目: | ||
{{Tip|追加のオプションを提供したり、UEFI ブートのプロセスを簡素化したりできる UEFI ブートマネージャーがいくつかあります。特に [[カーネルパラメータ]] を試している場合や、複数のカーネル/オペレーティングシステムがある場合に。詳細については、[[Arch ブートプロセス#ブートローダー]] を参照してください。}} |
{{Tip|追加のオプションを提供したり、UEFI ブートのプロセスを簡素化したりできる UEFI ブートマネージャーがいくつかあります。特に [[カーネルパラメータ]] を試している場合や、複数のカーネル/オペレーティングシステムがある場合に。詳細については、[[Arch ブートプロセス#ブートローダー]] を参照してください。}} |
||
− | {{Note|Linux カーネル EFISTUB initramfs のパスは EFI システムパーティションのルートからの相対パスで、 |
+ | {{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 を直接使う === |
||
− | UEFI は [[GRUB]] のような中間ブートローダを必要としないように設計されています。あなたのマザーボードに優れた UEFI 実装があれば、UEFI ブートエントリーにカーネルパラメータを埋め込んで、マザーボードが直接 Arch を起動させることができます [[efibootmgr]] や UEFI Shell v2 を使ってマザーボードのブートエントリーを変更することができます。 |
+ | UEFI は [[GRUB]] のような中間ブートローダを必要としないように設計されています。あなたのマザーボードに優れた UEFI 実装があれば、UEFI ブートエントリーにカーネルパラメータを埋め込んで、マザーボードが直接 Arch を起動させることができます。 [[efibootmgr]] や UEFI Shell v2 を使ってマザーボードのブートエントリーを変更することができます。 |
{{Note|1=<nowiki/> |
{{Note|1=<nowiki/> |
||
196行目: | 44行目: | ||
または、''efibootmgr'' とスワップパーティションでの休止状態を使用してブートエントリを作成します |
または、''efibootmgr'' とスワップパーティションでの休止状態を使用してブートエントリを作成します |
||
− | # efibootmgr --disk ''/dev/sdX'' --part ''Y'' --create --label "Arch Linux" --loader /vmlinuz-linux --unicode 'root=PARTUUID=''XXXXXXXX- |
+ | # 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/sdX''}} と {{ic|''Y''}} は ESP が存在するディスクとパーティションに置き換えてください。{{ic|1=root=}} パラメータを変更することで Linux のルートパーティションを指定できます (ディスクの UUID を使うこともできます)。{{ic|-u}} 引数を |
+ | {{ic|''/dev/sdX''}} と {{ic|''Y''}} は ESP が存在するディスクとパーティションに置き換えてください。{{ic|1=root=}} パラメータを変更することで Linux のルートパーティションを指定できます (ディスクの UUID を使うこともできます)。{{ic|-u/--unicode}} 引数を(シングル)クオーテーションで囲っているのは[[カーネルパラメータ]]を指定するためであり、[[サスペンドとハイバネート#必要なカーネルパラメータ|ハイバネート]]や[[マイクロコード]]を使う場合はパラメータを追加する必要があります。 |
以下のコマンドを実行することで作成したエントリが問題ないか確認できます: |
以下のコマンドを実行することで作成したエントリが問題ないか確認できます: |
||
271行目: | 119行目: | ||
}} |
}} |
||
− | {{Note|フック (変数 {{ic|INSTALL_HOOK}} と {{ic|REMOVE_HOOK}}) を使用すると、実行するたびに {{ic|CMDLINES}} 配列を上書きします |
+ | {{Note|フック (変数 {{ic|INSTALL_HOOK}} と {{ic|REMOVE_HOOK}}) を使用すると、実行するたびに {{ic|CMDLINES}} 配列を上書きします(すべてのレコードの内容を。}} |
次に、以下を実行します。 |
次に、以下を実行します。 |
||
304行目: | 152行目: | ||
この方法は、実際のハードウェアで遭遇する可能性のあるほぼすべての UEFI ファームウェアバージョンで機能します。最後の手段として使用できます。 '''スクリプトは1つの長い行である必要があります。''' 括弧内のセクションはオプションであり、ガイドとしてのみ提供されています。シェルスタイルの改行は、視覚的にわかりやすくするためのものです。 FAT ファイルシステムはバックスラッシュをパス区切り文字として使用します。この場合、バックスラッシュは initramfs が ESP パーティションのルートにあることを宣言します。 Intel マイクロコードのみが起動パラメータ行にロードされます。 AMD マイクロコードは、後で起動プロセス中にディスクから読み取られます。これはカーネルによって自動的に行われます。 |
この方法は、実際のハードウェアで遭遇する可能性のあるほぼすべての UEFI ファームウェアバージョンで機能します。最後の手段として使用できます。 '''スクリプトは1つの長い行である必要があります。''' 括弧内のセクションはオプションであり、ガイドとしてのみ提供されています。シェルスタイルの改行は、視覚的にわかりやすくするためのものです。 FAT ファイルシステムはバックスラッシュをパス区切り文字として使用します。この場合、バックスラッシュは initramfs が ESP パーティションのルートにあることを宣言します。 Intel マイクロコードのみが起動パラメータ行にロードされます。 AMD マイクロコードは、後で起動プロセス中にディスクから読み取られます。これはカーネルによって自動的に行われます。 |
||
+ | |||
+ | == ヒントとテクニック == |
||
+ | |||
+ | === フォールバック RAM ディスクを使用したブートエントリ === |
||
+ | |||
+ | ブートマネージャなしで EFISTUB を使用する場合、カーネルコマンドラインはブート時に変更できません。例えば {{ic|initramfs-linux-fallback.img}} を使ったり、Intel マイクロコード無しで起動したりするような、少なくともある種のフォールバックの可能性を持つには、efibootmgr でさらなるブートエントリーを作成するだけです。 |
||
+ | |||
+ | == トラブルシューティング == |
||
+ | |||
+ | === EFISTUB はいくつかの Dell システムで動作しません === |
||
+ | |||
+ | いくつかの世代の Dell ファームウェアは、ブートローダに渡す引数を間違えており、そのため EFISTUB は通常起動不可能なシステムを意味する null コマンドラインをパースします ([https://lore.kernel.org/linux-efi/20200907170021.GA2284449@rani.riverdale.lan/ linux-efi thread] を参照してください) |
||
+ | |||
+ | 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 を使うか、別のブートローダを使うことができます。 |
||
+ | |||
+ | === ブートエントリーの変更が適用されない === |
||
+ | |||
+ | Haswell 時代の Asus ボード([https://forums.archlinux.fr/viewtopic.php?t=19618 こちらのフォーラムを参照]) などの一部のマザーボードは、システムが起動しない限りブートエントリの変更に気づきません。更新された EFISTUB エントリをブートする前に、別の既存のブート エントリを使用してください。 |
||
+ | |||
+ | == 参照 == |
||
+ | |||
+ | * [https://www.kernel.org/doc/html/latest/admin-guide/efi-stub.html EFISTUB の Linux カーネルドキュメント] |
||
+ | * [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年9月22日 (日) 17:06時点における最新版
Linux カーネルは EFISTUB ブートをサポートしており、EFI ファームウェアがカーネルを EFI 実行可能ファイルとしてロードできるようにします。このオプションは、Arch Linux カーネルではデフォルトで有効になっています。カーネルをコンパイルする場合は、カーネル構成で CONFIG_EFI_STUB=y
を設定することでアクティブにできます。詳細については、EFI BootStub を参照してください。
目次
EFISTUB の準備
まず、EFI システムパーティション を作成し、そのマウント方法を選択する必要があります。ESP のマウントオプションは EFI システムパーティション#パーティションのマウント を見て下さい。
EFISTUB の起動
UEFI を直接使う
UEFI は GRUB のような中間ブートローダを必要としないように設計されています。あなたのマザーボードに優れた UEFI 実装があれば、UEFI ブートエントリーにカーネルパラメータを埋め込んで、マザーボードが直接 Arch を起動させることができます。 efibootmgr や UEFI Shell v2 を使ってマザーボードのブートエントリーを変更することができます。
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/sdX
と Y
は 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
保存するには 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 エントリをブートする前に、別の既存のブート エントリを使用してください。