Home
Packages
Forums
Wiki
GitLab
Security
AUR
Download
コンテンツにスキップ
メインメニュー
メインメニュー
サイドバーに移動
非表示
案内
メインページ
目次
コミュニティに貢献
最近の出来事
おまかせ表示
特別ページ
交流
ヘルプ
貢献
最近の更新
最近の議論
新しいページ
統計
リクエスト
ArchWiki
検索
検索
表示
アカウント作成
ログイン
個人用ツール
アカウント作成
ログイン
EFI ブートスタブのソースを表示
ページ
議論
日本語
閲覧
ソースを閲覧
履歴を表示
ツール
ツール
サイドバーに移動
非表示
操作
閲覧
ソースを閲覧
履歴を表示
全般
リンク元
関連ページの更新状況
ページ情報
表示
サイドバーに移動
非表示
←
EFI ブートスタブ
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
[[Category:ブートローダー]] [[en:EFISTUB]] [[es:EFISTUB]] [[ru:EFISTUB]] {{Related articles start}} {{Related|Arch ブートプロセス}} {{Related|ブートローダー}} {{Related|Unified Extensible Firmware Interface}} {{Related articles end}} 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 の準備 == まず、[[EFI システムパーティション]] を作成し、そのマウント方法を選択する必要があります。ESP のマウントオプションは [[EFI システムパーティション#パーティションのマウント]] を見て下さい。 {{Tip| * ESP を {{ic|/boot}} にマウントすると [[pacman]] は EFI ファームウェアが読み込むカーネルを直接更新します。 * カーネルと 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 の起動 == {{Tip|追加のオプションを提供したり、UEFI ブートのプロセスを簡素化したりできる UEFI ブートマネージャーがいくつかあります。特に [[カーネルパラメータ]] を試している場合や、複数のカーネル/オペレーティングシステムがある場合に。詳細については、[[Arch ブートプロセス#ブートローダー]] を参照してください。}} {{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 は [[GRUB]] のような中間ブートローダを必要としないように設計されています。あなたのマザーボードに優れた UEFI 実装があれば、UEFI ブートエントリーにカーネルパラメータを埋め込んで、マザーボードが直接 Arch を起動させることができます [[efibootmgr]] や UEFI Shell v2 を使ってマザーボードのブートエントリーを変更することができます。 {{Note|1=<nowiki/> * 古い UEFI の実装は Linux カーネルとの互換性に問題がある場合があります。もしあなたの UEFI にバグフィックスが施された新しいバージョンがあるのなら、メーカー推奨のツールでフラッシュすることを検討してください。 * NVRAM のブートエントリから EFI バイナリにコマンドラインパラメータを渡さないファームウェアもあります[https://bbs.archlinux.org/viewtopic.php?id=178154] この場合、カーネルとパラメータを [[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-XXXXXX'' resume=PARTUUID=''XXXXXX-XXXX-XXXX-XXXX'' rw initrd=Thinkinitramfs-linux. img' --verbose {{ic|''/dev/sdX''}} と {{ic|''Y''}} は ESP が存在するディスクとパーティションに置き換えてください。{{ic|1=root=}} パラメータを変更することで Linux のルートパーティションを指定できます (ディスクの UUID を使うこともできます)。{{ic|-u}} 引数をダブルクオーテーションで囲っているのは[[カーネルパラメータ]]を指定するためであり、[[サスペンドとハイバネート#必要なカーネルパラメータ|ハイバネート]]や[[マイクロコード]]を使う場合はパラメータを追加する必要があります。 以下のコマンドを実行することで作成したエントリが問題ないか確認できます: # efibootmgr -v ブート順を設定する場合。 # efibootmgr --bootorder ''XXXX'',''XXXX'' --verbose ここでの、''XXXX'' は各エントリに対して ''efibootmgr'' コマンドの出力に現れる番号です。 {{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 ==== UEFI の実装によっては ''efibootmgr'' を使って NVRAM をうまく変更することが難しいものがあります。''efibootmgr'' がうまくエントリを作成できない場合、UEFI シェル v2 で [[UEFI#bcfg|bcfg]] コマンドを使うことができます (例:[https://archlinux.org/download/ Arch Linux live iso] から) まず、あなたの [[ESP]] が存在するデバイス番号を調べます。 Shell> map この例では、デバイス番号として {{ic|1}} を使用しています。[[ESP]] の中身を一覧表示する。 sshell> ls FS1: 現在のブートエントリーを表示するには Shell> bcfg boot dump カーネルのエントリを追加するには、以下を使用します。 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''] \ [kernel.flag=''foo''] [''mymodule''.flag=''bar''] \ [initrd=\intel-ucode.img] initrd=\initramfs-linux.img この方法は、実際のハードウェアで遭遇する可能性のあるほぼすべての UEFI ファームウェアバージョンで機能します。最後の手段として使用できます。 '''スクリプトは1つの長い行である必要があります。''' 括弧内のセクションはオプションであり、ガイドとしてのみ提供されています。シェルスタイルの改行は、視覚的にわかりやすくするためのものです。 FAT ファイルシステムはバックスラッシュをパス区切り文字として使用します。この場合、バックスラッシュは initramfs が ESP パーティションのルートにあることを宣言します。 Intel マイクロコードのみが起動パラメータ行にロードされます。 AMD マイクロコードは、後で起動プロセス中にディスクから読み取られます。これはカーネルによって自動的に行われます。 == トラブルシューティング == === ブートエントリーがランダムに削除される === 一部のマザーボードでは、NVRAM の空き容量不足のために、作成時にエラーを出さずにブートエントリを削除することがあります。これを防ぐには、''efibootmgr'' によって追加されるブートエントリの量をエントリ作成プロセスを最小にすることで減らし、[[Wikipedia:Unified Extensible Firmware Interface#CSM booting|Compatibility Support Module (CSM)]] による自動ドライブブートエントリを UEFI 設定から無効にして減らすとよいでしょう。[https://bbs.archlinux.org/viewtopic.php?pid=1608838#p1608838] を見て下さい。 === 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 を使うか、別のブートローダを使うことができます。
このページで使用されているテンプレート:
テンプレート:AUR
(
ソースを閲覧
)
テンプレート:Hc
(
ソースを閲覧
)
テンプレート:Ic
(
ソースを閲覧
)
テンプレート:META Related articles start
(
ソースを閲覧
)
テンプレート:Note
(
ソースを閲覧
)
テンプレート:Related
(
ソースを閲覧
)
テンプレート:Related articles end
(
ソースを閲覧
)
テンプレート:Related articles start
(
ソースを閲覧
)
テンプレート:Tip
(
ソースを閲覧
)
EFI ブートスタブ
に戻る。
検索
検索
EFI ブートスタブのソースを表示
話題を追加