「EFI ブートスタブ」の版間の差分
(EFISTUB の準備を翻訳して追加) |
(→EFISTUB の起動: 情報を更新) |
||
175行目: | 175行目: | ||
== EFISTUB の起動 == |
== EFISTUB の起動 == |
||
+ | {{Tip|追加のオプションを提供したり、UEFI ブートのプロセスを簡素化したりできる UEFI ブートマネージャーがいくつかあります。特に [[カーネルパラメータ]] を試している場合や、複数のカーネル/オペレーティングシステムがある場合に。詳細については、[[Arch ブートプロセス#ブートローダー]] を参照してください。}} |
||
− | {{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/}} にあることを前提としています。}} |
||
+ | {{Note|Linux カーネル EFISTUB initramfs のパスは EFI システムパーティションのルートからの相対パスで、(EFI 標準に従って)バックスラッシュを使用する必要がありま す。例えば、initramfs が {{ic|''esp''/EFI/arch/initramfs-linux.img}} にある場合、対応する UEFI フォーマットの行は {{ic|1=initrd=happyEFIarch/initramfs-linux.img}} でなければなりません。以下の例では、全ては {{ic|''esp''/}} の下にあると仮定しています。}} |
||
− | === ブートマネージャを使う === |
||
+ | === UEFI を直接使う === |
||
− | UEFI ブートマネージャには UEFI ブートを簡単にすることができるオプションが存在します (特に複数のカーネルやオペレーティングシステムをインストールしている場合)。詳しくは[[ブートローダー]]を見てください。 |
||
+ | UEFI は [[GRUB]] のような中間ブートローダを必要としないように設計されています。あなたのマザーボードに優れた UEFI 実装があれば、UEFI ブートエントリーにカーネルパラメータを埋め込んで、マザーボードが直接 Arch を起動させることができます [[efibootmgr]] や UEFI Shell v2 を使ってマザーボードのブートエントリーを変更することができます。 |
||
− | === UEFI Shell を使う === |
||
+ | {{Note|1=<nowiki/> |
||
− | 通常の UEFI アプリケーションと同じように UEFI Shell から EFISTUB カーネルを起動できます。その場合、通常のパラメータとして起動する EFISTUB カーネルファイルにカーネルパラメータを渡してください: |
||
+ | * 古い UEFI の実装は Linux カーネルとの互換性に問題がある場合があります。もしあなたの UEFI にバグフィックスが施された新しいバージョンがあるのなら、メーカー推奨のツールでフラッシュすることを検討してください。 |
||
+ | * NVRAM のブートエントリから EFI バイナリにコマンドラインパラメータを渡さないファームウェアもあります[https://bbs.archlinux.org/viewtopic.php?id=178154] この場合、カーネルとパラメータを [[Unified カーネルイメージ]] に統合して、できた ''.efi'' ファイルでブートエントリを作成することが可能です。 |
||
+ | }} |
||
+ | ==== efibootmgr ==== |
||
− | > fs0: |
||
− | > /vmlinuz-linux root=PARTUUID=3518bb68-d01e-45c9-b973-0b5d918aae96 rw initrd=/initramfs-linux.img |
||
+ | カーネルをロードするブートエントリを ''efibootmgr'' で作成する。 |
||
− | 毎回カーネルパラメータを全て指定したくない場合、UEFI システムパーティションに {{ic|archlinux.nsh}} などのシェルスクリプトの実行コマンドを保存することができます。以下のコマンドで起動できるようになります: |
||
+ | # 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 |
||
− | > fs0: |
||
− | > archlinux |
||
+ | または、''efibootmgr'' とスワップパーティションでの休止状態を使用してブートエントリを作成します |
||
− | === UEFI を直接使う === |
||
+ | # efibootmgr --disk ''/dev/sdX'' --part ''Y'' --create --label "Arch Linux" --loader /vmlinuz-linux --unicode 'root=PARTUUID=''XXXXXXXX-''. XXXX-XXXX-XXXX-XXXXXX'' resume=PARTUUID=''XXXXXX-XXXX-XXXX-XXXX'' rw initrd=Thinkinitramfs-linux. img' --verbose |
||
− | UEFI は [[GRUB]] などの中間的なブートローダーを排除できるように設計されています。使用しているマザーボードの UEFI 実装に問題がなければ、カーネルパラメータを UEFI ブートエントリの中に埋め込んでマザーボードから Arch を直接起動できます。{{Pkg|efibootmgr}} や UEFI Shell v2 を使ってマザーボードのブートエントリを編集できます。 |
||
− | |||
− | ==== efibootmgr ==== |
||
− | |||
− | 以下のようなコマンドを実行してください: |
||
− | |||
− | # 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}} 引数をダブルクオーテーションで囲っているのは[[カーネルパラメータ]]を指定するためであり、[[サスペンドとハイバネート#必要なカーネルパラメータ|ハイバネート]]や[[マイクロコード]]を使う場合はパラメータを追加する必要があります。 |
{{ic|''/dev/sdX''}} と {{ic|''Y''}} は ESP が存在するディスクとパーティションに置き換えてください。{{ic|1=root=}} パラメータを変更することで Linux のルートパーティションを指定できます (ディスクの UUID を使うこともできます)。{{ic|-u}} 引数をダブルクオーテーションで囲っているのは[[カーネルパラメータ]]を指定するためであり、[[サスペンドとハイバネート#必要なカーネルパラメータ|ハイバネート]]や[[マイクロコード]]を使う場合はパラメータを追加する必要があります。 |
||
209行目: | 204行目: | ||
# efibootmgr -v |
# efibootmgr -v |
||
+ | ブート順を設定する場合。 |
||
− | {{Warning|特定のカーネルと {{ic|efibootmgr}} のバージョンの組み合わせでは新しいブートエントリを作成できません。NVRAM に空き容量が存在しないことが原因です。EFI のダンプファイルを削除してみてください: |
||
+ | # efibootmgr --bootorder ''XXXX'',''XXXX'' --verbose |
||
− | # rm /sys/firmware/efi/efivars/dump-* |
||
+ | ここでの、''XXXX'' は各エントリに対して ''efibootmgr'' コマンドの出力に現れる番号です。 |
||
− | もしくは、{{ic|efi_no_storage_paranoia}} カーネルパラメータを使って起動してください。キャッシュに前のバージョンが存在する場合、efibootmgr のバージョンを 0.11.0 にダウングレードしてみてください。このバージョンでは Linux のバージョン 4.0.6 が動作します。詳しくは {{Bug|34641}} を参照。}} |
||
+ | {{Tip|1=<nowiki/> |
||
− | ブートの順序を設定するには、次のコマンドを実行: |
||
+ | * 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 ==== |
||
− | # efibootmgr -o XXXX,XXXX |
||
+ | UEFI の実装によっては ''efibootmgr'' を使って NVRAM をうまく変更することが難しいものがあります。''efibootmgr'' がうまくエントリを作成できない場合、UEFI シェル v2 で [[UEFI#bcfg|bcfg]] コマンドを使うことができます (例:[https://archlinux.org/download/ Arch Linux live iso] から) |
||
− | XXXX は `efibootmgr` コマンドの出力で確認できるエントリの数字に置き換えてください。 |
||
+ | まず、あなたの [[ESP]] が存在するデバイス番号を調べます。 |
||
− | {{Tip|ブートエントリを作成するコマンドをシェルスクリプトに保存することで、(カーネルパラメータを変更するときなど) 編集が簡単になります。}} |
||
+ | Shell> map |
||
− | efibootmgr については [[UEFI#efibootmgr]] を見てください。https://bbs.archlinux.org/viewtopic.php?pid=1090040#p1090040 も参照。 |
||
+ | この例では、デバイス番号として {{ic|1}} を使用しています。[[ESP]] の中身を一覧表示する。 |
||
− | ==== UEFI Shell ==== |
||
− | UEFI の実装によっては efibootmgr を使用して NVRAM を編集できないことがあります。efibootmgr でエントリを作成できない場合、UEFI Shell v2 の [[UEFI#bcfg|bcfg]] コマンドを使用する方法があります。 |
||
+ | sshell> ls FS1: |
||
− | カーネルのエントリを追加するには、以下を実行: |
||
+ | 現在のブートエントリーを表示するには |
||
− | Shell> bcfg boot add '''N''' fs'''V''':\vmlinuz-linux "Arch Linux" |
||
+ | Shell> bcfg boot dump |
||
− | {{ic|N}} はエントリの優先度 (0 が一番優先されます) に、{{ic|V}} は EFI パーティションのボリューム番号に置き換えてください。ボリューム番号がわからない場合、map コマンドを使うことでファイルシステムが確認できるので、ls コマンドで中身を確認してください: |
||
+ | カーネルのエントリを追加するには、以下を使用します。 |
||
− | Shell> map |
||
+ | |||
− | Shell> ls fs0: |
||
+ | Shell> bcfg boot add ''N'' とします。FS1:\vmlinuz-linux "Arch Linux" |
||
+ | |||
+ | ここで {{ic|''N''}} はブートメニューに追加されるエントリの場所です。0 は最初のメニュー項目です。既に存在するメニュー項目は、破棄されることなくメニュー内で移動されます。 |
||
+ | |||
+ | ESP 上にファイルを作成し、必要なカーネルオプションを追加します。 |
||
+ | |||
+ | Shell> FS1:\options.txt を編集します。 |
||
+ | |||
+ | ファイル内に、ブートラインを追加します。たとえば、以下のようになります。 |
||
+ | |||
+ | root=/dev/sda2 ro initrd=initramfs-linux.img |
||
+ | |||
+ | {{Note|ファイル内の行頭に余分なスペースを入れてください。行頭には [[Wikipedia:Byte order mark|byte order mark]] があり、ブート時にエラーの原因となるその隣の文字を潰してしまいます。}} |
||
+ | |||
+ | 保存するには {{ic|F2}} を、終了するには {{ic|F3}} を押してください。 |
||
+ | |||
+ | 前のエントリにこれらのオプションを追加します。 |
||
+ | |||
+ | Shell> bcfg boot -opt ''N'' FS1:\options.txt |
||
+ | |||
+ | 追加する項目がある場合は、この作業を繰り返してください。 |
||
+ | |||
+ | 前に追加した項目を削除するには、次のようにします。 |
||
+ | |||
+ | Shell> bcfg boot rm ''N'' |
||
+ | |||
+ | ==== kesboot ==== |
||
+ | |||
+ | {{AUR|kesboot-git}} パッケージのスクリプトを使って EFISTUB での作業を単純化・自動化することもできます。パッケージの操作中に EFI 変数を追加・削除するための [[pacman フック]] も含まれています。 |
||
+ | |||
+ | まず、パッケージをインストールして、{{ic|/etc/kesboot.conf}} ファイルを設定します。 |
||
+ | |||
+ | {{hc|/etc/kesboot.conf|2= |
||
+ | 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 アプリケーションと同じように UEFI Shell から EFISTUB カーネルを起動できます。その場合、通常のパラメータとして起動する EFISTUB カーネルファイルにカーネルパラメータを渡してください: |
||
+ | |||
+ | > fs0: |
||
+ | > /vmlinuz-linux root=PARTUUID=3518bb68-d01e-45c9-b973-0b5d918aae96 rw initrd=/initramfs-linux.img |
||
+ | |||
+ | 毎回カーネルパラメータを全て指定したくない場合、UEFI システムパーティションに {{ic|archlinux.nsh}} などのシェルスクリプトの実行コマンドを保存することができます。以下のコマンドで起動できるようになります: |
||
+ | |||
+ | > fs0: |
||
+ | > archlinux |
||
+ | |||
+ | ==== startup.nsh スクリプトの使用 ==== |
||
+ | |||
+ | いくつかの UEFI 実装はコールドブート間で EFI 変数を保持せず (例:[[VirtualBox]] バージョン 6.1 以前)、UEFI ファームウェアインターフェースを通して設定したものは電源切断時に失われてしまいます。 |
||
+ | [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''] \ |
||
− | Shell> bcfg boot -opt '''N''' "root='''/dev/sdX#''' rw initrd=\initramfs-linux.img" |
||
+ | [kernel.flag=''foo''] [''mymodule''.flag=''bar''] \ |
||
+ | [initrd=\intel-ucode.img] initrd=\initramfs-linux.img |
||
+ | この方法は、実際のハードウェアで遭遇する可能性のあるほぼすべての UEFI ファームウェアバージョンで機能します。最後の手段として使用できます。 '''スクリプトは1つの長い行である必要があります。''' 括弧内のセクションはオプションであり、ガイドとしてのみ提供されています。シェルスタイルの改行は、視覚的にわかりやすくするためのものです。 FAT ファイルシステムはバックスラッシュをパス区切り文字として使用します。この場合、バックスラッシュは initramfs が ESP パーティションのルートにあることを宣言します。 Intel マイクロコードのみが起動パラメータ行にロードされます。 AMD マイクロコードは、後で起動プロセス中にディスクから読み取られます。これはカーネルによって自動的に行われます。 |
||
− | {{ic|N}} は優先度に {{ic|/dev/sdX#}} はルートパーティションに置き換えてください。 |
2022年3月4日 (金) 00:02時点における版
Linux カーネルは EFISTUB ブートをサポートしており、EFI ファームウェアがカーネルを EFI 実行可能ファイルとしてロードできるようにします。このオプションは、Arch Linux カーネルではデフォルトで有効になっています。カーネルをコンパイルする場合は、カーネル構成で CONFIG_EFI_STUB=y
を設定することでアクティブにできます。詳細については、EFI BootStub を参照してください。
目次
EFISTUB の準備
まず、EFI システムパーティション を作成し、そのマウント方法を選択する必要があります。ESP のマウントオプションは EFI システムパーティション#パーティションのマウント を見て下さい。
EFISTUB の設定
EFI システムパーティションを作成したら、システムパーティションをマウントする方法を選択してください。一番簡単なのは /boot
にマウントするか /boot
にバインドマウントすることです。pacman が直接 EFI ファームウェアによって読み込まれるカーネルを更新してくれます。その場合、#EFISTUB の起動に進んでください。
他の ESP マウントポイント
EFI システムパーティションを /boot
にマウントしない場合、ブートファイルをコピーする必要があります (以下 EFI システムパーティションの場所を 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
さらに、カーネルのアップデートがあったときに ESP のファイルを更新する必要があります。更新しないとシステムが起動できなくなってしまいます。以下のセクションでは自動でコピーする方法を説明しています。
systemd を使う
Systemd には特定のイベントが起こったときにタスクを実行する機能があります。/boot
が更新されたときに特定のパスにおける変更を検知して EFISTUB カーネルと initramfs ファイルを同期してください:
/etc/systemd/system/efistub-update.path
[Unit] Description=Copy EFISTUB Kernel to UEFISYS Partition [Path] PathChanged=/boot/initramfs-linux-fallback.img [Install] WantedBy=multi-user.target WantedBy=system-update.target
/etc/systemd/system/efistub-update.service
[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
ユニットを作成したら efistub-update.path
を起動・有効化してください。
incron を使う
incron を使うことでカーネルの更新時に EFISTUB カーネルを同期させるスクリプトを実行できます。
/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
/etc/incron.d/efistub-update.conf
/boot/initramfs-linux-fallback.img IN_CLOSE_WRITE /usr/local/bin/efistub-update.sh
この方法を使う場合、incrond
のサービスを有効にしてください:
# systemctl enable incrond.service
mkinitcpio フックを使う
Mkinitcpio はフックを生成することができ、システムレベルのデーモンを必要としません。バックグラウンドプロセスが生成され vm-linuz
, initramfs-linux.img
, initramfs-linux-fallback.img
が生成されてからファイルをコピーします。
/etc/mkinitcpio.conf
のフックのリストに efistub-update
を追加してください。
/usr/lib/initcpio/install/efistub-update
#!/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 }
/root/watch.sh
#!/usr/bin/env bash while [[ -d "/proc/$PPID" ]]; do sleep 1 done /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 を /boot
ではなく EFI パーティションに直接保存します。そして mkinitcpio フックを使ってカーネルなどのファイルを ESP にコピーします。
/etc/mkinitcpio.d/linux.preset
ファイルを編集してください:
/etc/mkinitcpio.d/linux.preset
# 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"
そして /usr/lib/initcpio/install/esp-update-linux
ファイルを作成して実行可能属性を付与してください:
/usr/lib/initcpio/install/esp-update-linux
# 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 }
テストするには以下のコマンドを実行:
# rm /boot/initramfs-linux-fallback.img # rm /boot/initramfs-linux.img # mkinitcpio -p linux
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-XXXXXX resume=PARTUUID=XXXXXX-XXXX-XXXX-XXXX rw initrd=Thinkinitramfs-linux. img' --verbose
/dev/sdX
と Y
は ESP が存在するディスクとパーティションに置き換えてください。root=
パラメータを変更することで Linux のルートパーティションを指定できます (ディスクの UUID を使うこともできます)。-u
引数をダブルクオーテーションで囲っているのはカーネルパラメータを指定するためであり、ハイバネートやマイクロコードを使う場合はパラメータを追加する必要があります。
以下のコマンドを実行することで作成したエントリが問題ないか確認できます:
# 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 マイクロコードは、後で起動プロセス中にディスクから読み取られます。これはカーネルによって自動的に行われます。