「REFInd」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(修正)
1行目: 1行目:
  +
{{Lowercase title}}
[[Category:ブートプロセス]]
 
  +
[[Category:ブートローダー]]
[[en:Unified Extensible Firmware Interface/Secure Boot]]
 
  +
[[de:rEFInd]]
[[zh-hans:Unified Extensible Firmware Interface (简体中文)/Secure Boot]]
 
  +
[[en:REFInd]]
  +
[[ru:REFInd]]
  +
[[zh-hans:REFInd]]
 
{{Related articles start}}
 
{{Related articles start}}
 
{{Related|Arch ブートプロセス}}
 
{{Related|Arch ブートプロセス}}
  +
{{Related|ブートローダー}}
 
{{Related|Unified Extensible Firmware Interface}}
 
{{Related|Unified Extensible Firmware Interface}}
{{Related|セキュリティ}}
+
{{Related|EFISTUB}}
  +
{{Related|booster}}
 
{{Related articles end}}
 
{{Related articles end}}
   
  +
[https://www.rodsbooks.com/refind/ rEFInd] は [[UEFI]] [[ブートマネージャー]]です。[[EFISTUB]] カーネルを起動することができます。既にメンテナンスされてない rEFIt のフォークであり、Mac 以外の UEFI ブートに関して多数の問題が修正されています。プラットフォームに依存せず、複数の OS を簡単に起動できるように設計されています。
[[Wikipedia:ja:Unified Extensible Firmware Interface#セキュアブート|セキュアブート]]とは、[[UEFI]] 規格に含まれているセキュリティ機能であり、[[Arch ブートプロセス|プリブートプロセス]]に保護レイヤを追加するために設計されました。起動時の実行を許可/禁止されているバイナリの暗号署名されたリストを保持することにより、マシンのコアブートコンポーネント (ブートマネージャ、カーネル、initramfs) が改ざんされていないという信頼性を高めるのに役立ちます。
 
   
  +
{{Note|この記事では [[EFI システムパーティション]]のマウントポイントを {{ic|''esp''}} で示します。}}
なので、セキュアブートは、コンピュータ環境を[[セキュリティ|セキュアに保つ]]試みの一環、あるいはそれを補完するものであるとみなせます。[[dm-crypt/システム全体の暗号化|システムの暗号化]]のような他のソフトウェアのセキュリティ対策では簡単に[[dm-crypt/システム全体の暗号化#boot パーティションの暗号化 (GRUB)|カバー]]できない攻撃対象領域を減らしますが、完全に異なったものであり、それらに依存していません。セキュアブートは、独自の長所と[[wikipedia:Unified_Extensible_Firmware_Interface#Secure_Boot_2|短所]]を備えた、現在のセキュリティ慣例の一つの要素として独立しています。
 
   
  +
== サポートされているファイルシステム ==
{{Note|Linux におけるセキュアブートについてのより詳細な概要は、[https://www.rodsbooks.com/efi-bootloaders/secureboot.html Rodsbooks' Secure Boot] の記事と[[#参照|他のオンライン上のリソース]] を参照してください。この記事では、Arch Linux でセキュアブートをセットアップする方法に焦点を置いています。}}
 
   
  +
rEFInd は、ファイルシステムのサポートを[[Arch ブートプロセス#UEFI|ファームウェアから]]継承します (つまり、少なくとも FAT12、FAT16、FAT32 はサポートされることを意味します)。加えて、rEFInd は、ESP 上の自身のインストールディレクトリ内のサブディレクトリ {{ic|drivers}} と {{ic|drivers_x64}} (例: {{ic|''esp''/EFI/refind/drivers_x64/}}) 内にある [[Unified Extensible Firmware Interface#UEFI ドライバ|UEFI ドライバ]]もロードします。
== セキュアブートの状態を確認する ==
 
   
  +
また、rEFInd には[https://www.rodsbooks.com/refind/drivers.html#selecting 少数の]読み取り専用 EFI ファイルシステムドライバ (特に [[ext4]] と [[Btrfs]]) も同梱されています。
=== OS の起動前 ===
 
   
  +
== インストール ==
OS の起動前にセキュアブートの状態を確認するには、ファームウェアのセットアップ画面を見る必要があります。すでにマシンが起動済みであれば、ほとんどの場合再起動する必要があります。
 
   
  +
{{pkg|refind}} パッケージを[[インストール]]してください。
起動プロセス中に特別なキーを押すことでファームウェアのセットアップ画面にアクセスできます。それがどのキーかはファームウェアに依りますが、通常 {{ic|Esc}}、{{ic|F2}}、{{ic|Del}} のどれかです。もしかするとその他のファンクションキーかもしれません。ファームウェアによっては、どのキー押すべきかが起動プロセスの開始時に短い時間表示されます。通常、マザーボードのマニュアルにキーが記載されています。マシンの電源を入れたらすぐに(スクリーンが表示されるよりも前に)キーを押して、そのまま押し続ける必要があるかもしれません。
 
   
  +
== rEFInd ブートマネージャをインストールする ==
ファームウェアのセットアップ画面に入ったら、意図せずに設定を変更してしまわないよう気をつけてください。通常、セットアップ画面の下部に案内指示や設定の短いヘルプがあります。セットアップ自体はいくつかのページから構成されているかもしれません。それらのページの中から正しい場所に移動する必要があります。設定は単に「セキュアブート」と表示されるかもしれません(これでオン/オフを設定できます)。
 
   
  +
rEFInd には、ReiserFS (非推奨)、Ext2、Ext4、Btrfs、ISO-9660、HFS+ の '''読み取り専用''' サポートを実装する [[Unified Extensible Firmware Interface#UEFI ドライバ|UEFI ドライバ]]が同梱されています。さらに、rEFInd は、UEFI 自体によってアクセス可能な任意のファイルシステムにアクセスできます。これには、FAT (UEFI 仕様によって義務付けられています)、Mac の HFS+、一部のシステムでは ISO-9660 が含まれています。
=== OS の起動後 ===
 
   
  +
他のドライバーについては [https://www.rodsbooks.com/refind/drivers.html#finding The rEFInd Boot Manager: Using EFI Drivers: Finding Additional EFI Drivers] を参照してください。
[[systemd]] を使用するシステム上では、[[systemd-boot]] でセキュアブートの状態を簡単に確認できます:
 
   
  +
rEFInd を使うには、[[#refind-install スクリプトによるインストール|refind-install スクリプト]] を使うか、[[#手動インストール|rEFInd のファイルをコピーし、ブートエントリを手動でセットアップ]]して、rEFInd を [[EFI システムパーティション]]にインストールしなければなりません。
{{Note|以下のコマンドを実行するために systemd-boot をブートマネージャとして使う必要はありません。これは他の *ctl systemd ユーティリティ (localectl, timedatectl...) と似たもので、設定に干渉しません。}}
 
   
  +
{{Warning|カーネルと initramfs は、rEFInd によって読み込むことのできるファイルシステム上に存在していなければなりません。}}
{{bc|$ bootctl status
 
System:
 
Firmware: UEFI 2.70 (American Megatrends 5.15)
 
Secure Boot: enabled
 
Setup Mode: user
 
Boot into FW: supported
 
...
 
}}
 
   
  +
=== refind-install スクリプトによるインストール ===
ここでは、セキュアブートが有効化され強制されていることがわかります。他に取りうる値は、"Secure Boot" は {{ic|disabled}}、"Setup Mode" は {{ic|setup}} です([https://github.com/systemd/systemd/issues/8154#issue-296106251 例])。
 
   
  +
rEFInd パッケージには ''refind-install'' というスクリプトが含まれており、簡単に rEFInd をデフォルトの EFI ブートエントリに設定できます。このスクリプトにはオプションが存在し、様々なセットアップや UEFI 実装に対応しています。様々なインストールオプションの説明は、{{man|8|refind-install}} やインストールスクリプトのコメントを見てください。
マシンがセキュアブートで起動されているかどうかを調べる他の方法は、以下のコマンドを使用することです:
 
   
  +
多くのシステムでは以下を実行するだけで十分なはずです:
$ od --address-radix=n --format=u1 /sys/firmware/efi/efivars/SecureBoot*
 
   
  +
# refind-install
セキュアブートが有効化されている場合、このコマンドは5桁の数値を出力し、最後の値が {{ic|1}} となります。例えば:
 
   
  +
このコマンドは、[[ESP]] を検出しマウントしようと試み、rEFInd のファイルを {{ic|''esp''/EFI/refind/}} にコピーし、[[efibootmgr]] を使って rEFInd をデフォルトの EFI ブートアプリケーションにします。
6 0 0 0 1
 
   
  +
または、デフォルト/フォールバックのブートパスである {{ic|''esp''/EFI/BOOT/bootx64.efi}} に rEFInd をインストールすることもできます。ブータブルな USB フラッシュドライブや、''efibootmgr'' による NVRAM の変更に問題を抱えているシステム等で有用です:
しかし、機能が不十分なブートローダを使用している場合、(ファームウェアで有効になっている場合でも) カーネルがセキュアブートを検出できない場合があります。これは、システムの起動直後にカーネルのメッセージを確認することで確認できます:
 
   
  +
# refind-install --usedefault ''/dev/sdXY''
{{hc|# dmesg {{!}} grep -i secure|
 
[ 0.013442] Secure boot disabled
 
[ 0.013442] Secure boot could not be determined
 
}}
 
   
  +
{{ic|''/dev/sdXY''}} は EFI システムパーティションです (マウントポイントではなく、ブロックデバイスを指定してください)。
セキュアブートが検出された場合、カーネルメッセージは {{ic|Secure boot enabled}} となります。
 
   
  +
{{Tip|デフォルトでは {{ic|refind-install}} はカーネルの存在するファイルシステムのドライバーだけをインストールします。他にもドライバーが必要な場合は、{{ic|/usr/share/refind/drivers_x64/}} から {{ic|''esp''/EFI/refind/drivers_x64/}} にドライバを手動でコピーしてインストールしてください。もしくは {{ic|--alldrivers}} オプションで全てのドライバーをインストールすることもできます。ブータブルな USB フラッシュドライブなどでは全てのドライバーをインストールすると便利です。}}
== インストールメディアを起動する ==
 
   
  +
rEFInd のファイルを ESP にインストールしたら、rEFInd が作成した {{ic|refind_linux.conf}} (カーネルと同じディレクトリにあります) に必要な[[カーネルパラメータ]]が含まれていることを確認してください。{{ic|--usedefault}} オプションを使用した場合はこの設定ファイルは作成されません。root として {{ic|mkrlconf}} を実行して作成してください。
公式の Arch インストールイメージはセキュアブートをサポートしていません ({{Bug|53864}})。Arch インストールメディアのセキュアブートサポートは {{ic|archlinux-2013.07.01-dual.iso}} で初めて追加されました。しかし、その後 {{ic|archlinux-2016.06.01-dual.iso}} で削除されました。その時、''prebootloader'' は、未署名の EFI バイナリを使用する {{pkg|efitools}} に置き換えられました。それ以降、公式のインストールメディアにセキュアブートのサポートが追加されることはありませんでした。
 
   
  +
{{Warning|chroot で {{ic|refind-install}} を実行する場合 (Arch Linux をライブ環境でインストールする際など)、{{ic|/boot/refind_linux.conf}} が作られるときに実際にインストールされる環境ではなくライブ環境のカーネルオプションが使われます。そのため {{ic|/boot/refind_linux.conf}} を編集し、[[カーネルパラメータ]]がシステムにおいて正しいことを確認してください。さもないと、次回のブート時にカーネルパニックが発生する可能性があります。設定ファイルの例は [[#refind_linux.conf]] を見てください。}}
インストールメディアをセキュアブートのシステムでブートするには、セキュアブートを無効化するか、イメージを変更して署名されたブートローダを追加する必要があります。
 
   
  +
デフォルトでは、rEFInd は (rEFInd にそのドライブ用のドライバが存在する) すべてのドライブをスキャンし、発見した EFI ブートローダーのブートエントリを追加します。これにはカーネルも含まれているはずです (Arch Linux はデフォルトで [[EFISTUB]] が有効化されているからです)。なので、この時点でブータブルなシステムが出来上がっているでしょう。
[https://gitlab.archlinux.org/tpowa/archboot/-/wikis/Archboot-Homepage Archboot] イメージはインストールメディアでセキュアブートを使用する手段を提供します。
 
   
  +
==== Secure Boot ====
=== セキュアブートを無効化する ===
 
   
  +
rEFInd における[[セキュアブート]]のサポートについては [https://www.rodsbooks.com/refind/secureboot.html Managing Secure Boot] を参照してください。
セキュアブートの機能は UEFI インターフェイスを通して無効化できます。ファームウェアの設定画面にアクセスする方法は [[#OS の起動前]] で説明されています。
 
   
  +
===== PreLoader を使う =====
ホットキーが使用できず Windows が起動する場合、次の方法で強制的にファームウェア設定を開くように再起動できます (Windows 10 の場合): ''Settings > Update & Security > Recovery > Advanced startup (Restart now) > Troubleshoot > Advanced options > UEFI Firmware settings > restart''。
 
   
  +
[[セキュアブート#PreLoader をセットアップする]] を参照して署名済みの {{ic|PreLoader.efi}} と {{ic|HashTool.efi}} バイナリを用意してください。
一部のマザーボード (例: Packard Bell 製ノートパソコンや最近の Xiaomi ノートパソコン) では、管理者パスワードを設定しないとセキュアブートを無効化できません (無効化した後に管理者パスワードは消去できます)。[https://www.rodsbooks.com/efi-bootloaders/secureboot.html#disable Rod Smith の Secure Boot 無効化に関する記事] も参照。
 
   
  +
{{ic|--preloader ''/path/to/preloader''}} オプションを付けて {{ic|refind-install}} を実行します:
=== インストールイメージを再パックする ===
 
   
  +
# refind-install --preloader /usr/share/preloader-signed/PreLoader.efi
[[#ブートローダを PreLoader に置き換える]] を見てください。
 
   
  +
セキュアブートを有効にして起動すると、HashTool が起動するので rEFInd のハッシュ ({{ic|loader.efi}}) と rEFInd のドライバー (例: {{ic|ext4_x64.efi}}) そしてカーネル (例: {{ic|vmlinuz-linux}}) を登録してください。
=== インストールメディアを編集する ===
 
   
  +
詳しくは {{man|8|refind-install}} を見てください。
[[USB インストールメディア]]を使用している場合、そのメディア上の [[EFI システムパーティション]]を手動で編集してセキュアブートのサポートを追加することが可能です。
 
   
  +
{{Tip|署名済み ''HashTool'' は、''HashTool''が起動されたパーティションだけにアクセスすることができます。カーネルが ESP 上にない場合、''HashTool'' からハッシュを登録することはできなくなります。[[#KeyTool]] を使うことで問題を回避できます (KeyTool は MokList のハッシュを登録でき、さらに1つのパーティションに制限されないからです)。''KeyTool'' は使用する前に必ずハッシュを登録するようにしてください。}}
USB ドライブを挿入し、EFI システムパーティションを[[マウント]]してください:
 
   
  +
===== shim を使う =====
# mount /dev/disk/by-label/ARCHISO_EFI /mnt
 
   
  +
{{AUR|shim-signed}} を[[インストール]]してください。[[セキュアブート#shim]] を読んでください。ただし、ファイルをコピーする部分はすべてスキップしてください。
そして、[[#署名済みのブートローダを使う]] の指示に従って、署名済みのブートローダをインストールしてください。例えば、[[#PreLoader]] をインストールするには:
 
   
  +
====== ハッシュを使う ======
{{bc|
 
# mv /mnt/EFI/BOOT/BOOTx64.EFI /mnt/EFI/BOOT/loader.efi
 
# cp /usr/share/preloader-signed/PreLoader.efi /mnt/EFI/BOOT/BOOTx64.EFI
 
# cp /usr/share/preloader-signed/HashTool.efi /mnt/EFI/BOOT/HashTool.efi
 
}}
 
   
  +
''shim'' でハッシュだけを使うには、{{ic|refind-install}} を {{ic|--shim ''/path/to/shim''}} オプションで実行してください:
== セキュアブートを実現する ==
 
   
  +
# refind-install --shim /usr/share/shim-signed/shimx64.efi
''セキュアブート''の理想的なセットアップを実現するにはいくつか条件があります:
 
   
  +
次回セキュアブートを有効化した状態で起動すると、MokManager が起動します。その時、rEFInd ({{ic|grubx64.efi}})、rEFInd のドライバ (例: {{ic|ext4_x64.efi}})、カーネル (例: {{ic|vmlinuz-linux}}) のハッシュを登録する必要があります。
# UEFI がほぼ信頼されていて(しかし、いくつかのよく知られた[[Wikipedia:Unified_Extensible_Firmware_Interface#Criticism|批判]]と脆弱性[https://www.uefi.org/sites/default/files/resources/UEFI%20Firmware%20-%20Security%20Concerns%20and%20Best%20Practices.pdf]がある)、必ず[[#セキュアブートを保護する|強力なパスワードで保護されている]]こと。
 
# メーカー/サードパーティーのデフォルトの鍵は、セキュアブートのセキュリティモデルを大幅に弱化させることが判明しているので、使用しないこと。[https://habr.com/ru/post/446238/]
 
# セキュアブートによって確立された信頼の鎖をブート中に維持して攻撃面を減らすために、マイクロコード(必要な場合)と initramfs を含む、ユーザ署名済み結合 [[EFISTUB]] カーネルイメージ(ブートマネージャ無し)を UEFI が直接ロードすること。
 
# マシンへ物理的にアクセスできる誰かが、カーネルイメージの作成と署名プロセスで使用されるツールとファイルにアクセスしたり改ざんしたりできないようにするために、[[dm-crypt/システム全体の暗号化|ドライブの完全暗号化]]を使用すること。
 
# [[TPM]] を使うことでさらに改善することができるかもしれませんが、ツールやサポートの問題がこれを難しくしています。
 
# [[GRUB]] ブートローダを使うには、セキュアブートを有効化する前に追加の手順が必要になります。詳細は [[GRUB#セキュアブートサポート]] を参照してください。
 
   
  +
====== Machine Owner Key を使う ======
シンプルかつ完全に自立したセットアップは [[#自分の鍵を使う]] で説明されています。一方、[[#署名済みのブートローダを使う]] では、サードパーティにより署名された中間ツールを使用します。
 
   
  +
rEFInd を Machine Owner Key (MOK) で署名するには、{{Pkg|sbsigntools}} をインストールしてください。
=== 自分の鍵を使う ===
 
   
  +
{{Tip|既に [[セキュアブート#shim で鍵を使う|MOK]] を作成しているのであればファイルを {{ic|refind_local.key}} (PEM 形式秘密鍵)、{{ic|refind_local.crt}} (PEM 形式証明書)、{{ic|refind_local.cer}} (DER 形式証明書) という名前で {{ic|/etc/refind.d/keys}} ディレクトリに配置してください。}}
{{Warning|プラットフォームの鍵をあなたの鍵で置き換えると、一部のマシン(ノート PC を含む)でハードウェアを文鎮化してしまう可能性があります。そうなると、修正するためにファームウェアの設定画面に入ることが不可能になります。これは、一部のデバイス (GPU など) の (ブート中に実行される) ファームウェア([[Wikipedia:OpROM|OpROMs]])が [[#Microsoft Windows|Microsoft 3rd Party UEFI CA 証明書を使って署名されている]]ためです。}}
 
   
  +
{{ic|--shim ''/path/to/shim''}} と {{ic|--localkeys}} オプションを付けて {{ic|refind-install}} を実行します:
セキュアブートでは以下の鍵が使われます:
 
   
  +
# refind-install --shim /usr/share/shim-signed/shimx64.efi --localkeys
; Platform Key (PK): トップレベル鍵
 
; Key Exchange Key (KEK): Signature Database や Forbidden Signatures Database の更新に署名するのに使われる鍵
 
; Signature Database (db): EFI バイナリに署名するのに使われる鍵やハッシュが含まれます
 
; Forbidden Signatures Database (dbx): EFI バイナリを拒否リストに追加するために使われる鍵やハッシュが含まれます
 
   
  +
''refind-install'' は鍵を作成して自分自身とドライバーに署名します。同じ鍵を使ってカーネルに署名する必要があります。例:
より詳細な説明は [https://blog.hansenpartnership.com/the-meaning-of-all-the-uefi-keys/ The Meaning of all the UEFI Keys] を見てください。
 
   
  +
# sbsign --key /etc/refind.d/keys/refind_local.key --cert /etc/refind.d/keys/refind_local.crt --output /boot/vmlinuz-linux /boot/vmlinuz-linux
セキュアブートをを使用するには最低でも '''PK''', '''KEK''', '''db''' 鍵が必要です。KEK, db, dbx 証明書は複数追加できますが、Platform Key はひとつしか使えません。
 
   
  +
{{Tip|カーネルの署名は [[mkinitcpio]] のポストフックを使って自動化できます。[[Unified Extensible Firmware Interface/セキュアブート#mkinitcpio のポストフックでカーネルに署名する]] を見てください。}}
Secure Boot を "User Mode" にすると、上位の鍵を使用してアップデートに署名しないかぎり鍵を更新できなくなります (''sign-efi-sig-list'' を使用)。Platform key は自分自身で署名することができます。
 
   
  +
MokManager で {{ic|refind_local.cer}} を MoKList に追加してください。{{ic|refind_local.cer}} は rEFInd のインストールディレクトリ (例えば {{ic|''esp''/EFI/refind/keys/refind_local.cer}}) の {{ic|keys}} という名前のディレクトリに存在します。
==== 現在の変数をバックアップする ====
 
   
  +
詳しくは {{man|8|refind-install}} を参照してください。
新しい鍵を作成したり EFI 変数を変更したりする前に、現在の変数をバックアップしておくことを推奨します。そうすれば、エラーが発生した場合に変数を復元できます。
 
   
  +
===== 自分の鍵を使う =====
主要なセキュアブートの変数4つを全てバックアップするには、{{Pkg|efitools}} パッケージを[[インストール]]し、以下のコマンドを実行してください:
 
   
  +
[[セキュアブート#自分の鍵を使う]] に従って鍵を作成してください。
$ for var in PK KEK db dbx ; do efi-readvar -v $var -o old_${var}.esl ; done
 
   
  +
{{ic|/etc/refind.d/keys}} ディレクトリを作成して署名データベース ('''db''') 鍵と証明書を保存します。ファイルの名前は次のとおりにしてください: {{ic|refind_local.key}} (PEM 形式秘密鍵)、{{ic|refind_local.crt}} (PEM 形式証明書)、{{ic|refind_local.cer}} (DER 形式証明書)。
新しいコンピュータやマザーボードでこれらのコマンドを実行する場合、抽出される変数はおそらくマイクロソフトにより提供されたものでしょう。
 
   
  +
インストールスクリプトの実行時に {{ic|--localkeys}} オプションを付け加えます。例:
==== ファームウェアを "Setup Mode" にする ====
 
   
  +
# refind-install --localkeys
Platform Key が削除されると、セキュアブートは Setup Mode になります。ファームウェアを Setup Mode にするには、ファームウェア設定ユーティリティに入り、証明書を削除/クリアするオプションを探してください。設定ユーティリティに入る方法は [[#OS の起動前]] で説明されています。
 
   
  +
これで rEFInd の EFI バイナリが自分の鍵と証明書で署名されます。
==== sbctl でプロセスをアシスト ====
 
   
  +
=== 手動インストール ===
[https://github.com/Foxboron/sbctl sbctl] は、セキュアブートをセットアップしたりファイルを署名したりするユーザーフレンドリーな方法です。
 
   
  +
{{Tip|rEFInd は様々な方法で Linux を起動することができます。[https://www.rodsbooks.com/refind/linux.html The rEFInd Boot Manager: Methods of Booting Linux] でそれらの方法が触れられています。}}
{{Note|sbctl はすべてのハードウェアで動作するわけではありません。このツールがうまく動作するかはハードウェアの製造元に掛かっています。}}
 
   
  +
{{ic|refind-install}} スクリプトが上手く動かない場合、rEFInd を手動でセットアップすることができます。
使用するには {{Pkg|sbctl}} を[[インストール]]してください。[https://github.com/Foxboron/sbctl#sbctl---secure-boot-manager upstream README] と {{man|8|sbctl}} も参照してください。
 
   
  +
まず実行可能ファイルを ESP にコピーしてください:
===== キーを作成・登録する =====
 
   
  +
# mkdir -p ''esp''/EFI/refind
始める前に、ファームウェアの設定画面に行き、セキュアブートのモードを '''Setup mode''' にしてください。これはデバイスごとに異なります。
 
  +
# cp /usr/share/refind/refind_x64.efi ''esp''/EFI/refind/
   
  +
rEFInd をデフォルト/フォールバックブートパスにインストールしたい場合は、以下の指示で {{ic|''esp''/EFI/refind/}} を {{ic|''esp''/EFI/BOOT/}} に置き換え、rEFInd の EFI 実行ファイルを {{ic|''esp''/EFI/BOOT/bootx64.efi}} にコピーしてください:
ログインし直したら、セキュアブートの状態を確認してください:
 
   
  +
# mkdir -p ''esp''/EFI/BOOT
$ sbctl status
 
  +
# cp /usr/share/refind/refind_x64.efi ''esp''/EFI/BOOT/bootx64.efi
   
  +
それから [[efibootmgr]] を使って UEFI の NVRAM にブートエントリを作成してください ({{ic|''/dev/sdX''}} と {{ic|''Y''}} はあなたの ESP のマウントポイントに合わせて置き換えて下さい)。rEFInd をデフォルト/フォールバックのブートパス {{ic|''esp''/EFI/BOOT/bootx64.efi}} にインストールした場合は、このステップは省略してもかまいません。
sbctl がインストールされておらず、セキュアブートが無効化されていることを確認できるはずです。
 
   
  +
# efibootmgr --create --disk ''/dev/sdX'' --part ''Y'' --loader /EFI/refind/refind_x64.efi --label "rEFInd Boot Manager" --unicode
次に、カスタムのセキュアブート鍵を作成してください:
 
   
  +
この時点で rEFInd で起動することができるようになっているはずです。ただしカーネルを起動することはできません。カーネルが ESP にない場合、(適切なドライバーが存在するとき) rEFInd はパーティションをマウントしてカーネルを検索することができます。
# sbctl create-keys
 
   
  +
rEFInd はインストールディレクトリに存在する {{ic|drivers}} と {{ic|drivers_''arch''}} (例: {{ic|drivers_x64}}) サブディレクトリから全てのドライバーを自動的にロードします。
あなたの鍵を Microsoft の鍵と一緒に UEFI に登録してください:
 
   
  +
# mkdir ''esp''/EFI/refind/drivers_x64
# sbctl enroll-keys -m
 
  +
# cp /usr/share/refind/drivers_x64/'''drivername'''_x64.efi ''esp''/EFI/refind/drivers_x64/
   
  +
これで rEFInd はカーネルのブートエントリが用意できているはずですが、適切なカーネルパラメータが渡されていません。[[#カーネルパラメータを渡す]] を行って下さい。それによって rEFInd を使ってカーネルを起動することができるようになります。この段階で起動ができない、または rEFInd の設定を変更したい場合、設定ファイルを使ってオプションを変更することができます:
{{Warning|一部のファームウェアは Microsoft の鍵で署名されており、セキュアブートが有効化されると Microsoft の鍵によって検証されます。デバイスが検証できないと、そのデバイスが文鎮化してしまう可能性があります。Microsoft の鍵抜きであなたの鍵を登録するには、{{ic|# sbctl enroll-keys}} を実行してください。ただし、あなたが何をしようとしているのか理解している場合に限り、これを行ってください。}}
 
   
  +
# cp /usr/share/refind/refind.conf-sample ''esp''/EFI/refind/refind.conf
セキュアブートの状態を再び確認してください:
 
   
  +
サンプル設定ファイルにたくさんコメントが付いているので開いてみて下さい。
$ sbctl status
 
   
  +
設定ファイルに {{ic|textonly}} を設定していない場合、rEFInd のアイコンをコピーしないとプレースホルダが表示されます:
sbctl がインストールされているはずです。しかし、あなたの鍵でブートファイルを署名するまで、セキュアブートは動作しません。
 
   
  +
# cp -r /usr/share/refind/icons ''esp''/EFI/refind/
===== 署名 =====
 
   
  +
フォントをコピーして {{ic|refind.conf}} の {{ic|font}} 設定を変更することで他のフォントを使うこともできます:
セキュアブートを動作させるために署名が必要なファイルを確認します:
 
   
  +
# cp -r /usr/share/refind/fonts ''esp''/EFI/refind/
# sbctl verify
 
   
  +
{{tip|rEFInd のメニューで {{ic|F10}} を押すと ESP の一番上のディレクトリにスクリーンショットが保存されます。}}
次に、署名されていないすべてのファイルに署名します。通常、[[カーネル]]と[[ブートローダー]]には署名が必要です。例えば:
 
   
  +
=== アップグレード ===
# sbctl sign -s /boot/vmlinuz-linux
 
# sbctl sign -s /boot/EFI/BOOT/BOOTX64.EFI
 
   
  +
Pacman は {{ic|/usr/share/refind/}} にある rEFInd のファイルをアップデートしますが、ESP に新しいファイルをコピーしたりはしません。{{ic|refind-install}} で rEFInd のインストールが上手くいっているのであれば、再度実行することでアップデートされたファイルをコピーできます。新しい設定ファイルは {{ic|refind.conf-sample}} としてコピーされるので、[[diff|差分]]ツールを使って設定ファイルをマージすることができます。rEFInd が[[#手動インストール]]を必要とする場合、どのファイルが必要なのかは自分で判断してコピーする必要があります。
署名が必要なファイルは、システムのレイアウト、カーネル、ブートローダーによって異なります。
 
   
  +
==== Pacman フック ====
これで完了です! システムを再起動し、ファームウェアの設定でセキュアブートをオンに戻してください。ブートローダーとOSがロードされれば、セキュアブートは機能しているはずです。以下のコマンドで確認してください:
 
   
  +
[[Pacman フック]]を使うことでアップデートの処理を自動化することができます:
$ sbctl status
 
   
  +
{{hc|/etc/pacman.d/hooks/refind.hook|2=[Trigger]
===== pacman フックを使って自動的に署名する =====
 
  +
Operation=Upgrade
 
  +
Type=Package
sbctl には、[[カーネル|Linux カーネル]]、[[systemd]]、[[ブートローダー]]がアップデートされたときに自動的にすべての新規ファイルを署名する [[pacman フック]]が同梱されています。
 
  +
Target=refind
 
{{Tip|[[Systemd-boot]] と {{ic|systemd-boot-update.service}} を使用している場合、[[ブートローダー]]は再起動後にしかアップデートされないので、sbctl の [[pacman フック]]はその新しいファイルを署名しません。回避策としては、{{ic|/usr/lib/}} 内の[[ブートローダー]]を直接署名すると良いかもしれません。{{ic|bootctl install}} と {{ic|update}} は自動的に、通常の ''.efi'' ではなく ''.efi.signed'' ファイルを認識し、[[ESP]] にコピーします。{{man|1|bootctl}} を参照してください。
 
 
# sbctl sign -s -o /usr/lib/systemd/boot/efi/systemd-bootx64.efi.signed /usr/lib/systemd/boot/efi/systemd-bootx64.efi
 
   
  +
[Action]
  +
Description = Updating rEFInd on ESP
  +
When=PostTransaction
  +
Exec=/usr/bin/refind-install
 
}}
 
}}
   
  +
{{ic|1=Exec=}} の部分は、あなたの環境で正しく動作するアップデートコマンドに変更する必要があるかもしれません。[[#手動インストール]]を行った場合は、フックから呼び出す独自のアップデートスクリプトを作成することで、アップデートを自動化できます。
==== 手動による手順 ====
 
   
  +
{{Tip|[[#Secure Boot]] で rEFInd をセットアップした場合、{{ic|--localkeys}} を追加することに加えて、{{ic|--yes}} オプションも {{ic|refind-install}} コマンドに追加する必要があるかもしれません。このオプションは、Secure Boot が無効化されているときにこのコマンドが実行された場合に、コマンドの実行が失敗するのを防ぐことができます。詳細は、{{man|8|refind-install}} を見てください。}}
===== efitools をインストールする =====
 
   
  +
{{Note|ESP が {{ic|/boot}} にマウントされておらず、ESP の自動マウントに頼っている場合、[[EFI システムパーティション#代替のマウントポイント]] で説明されているように、{{ic|vfat}} モジュールをプリロードしてください。さもないと、{{Pkg|refind}} がカーネルと共にアップグレードされた場合に、ESP にアクセスできなくなってしまいます。}}
以下のほぼ全てのセクションで、{{Pkg|efitools}} パッケージが[[インストール]]されている必要があります。
 
   
===== 鍵の生成 =====
+
== 設定 ==
   
  +
rEFInd の設定ファイル {{ic|refind.conf}} は rEFInd の EFI アプリケーションと同じディレクトリに存在します (大抵は {{ic|''esp''/EFI/refind}} あるいは {{ic|''esp''/EFI/BOOT}})。デフォルト設定ファイルにはオプションの詳細な説明が含まれており、さらに詳しい説明は [https://www.rodsbooks.com/refind/configfile.html Configuring the Boot Manager] に載っています。
鍵を生成するには以下の手順を行ってください:
 
   
  +
=== カーネルパラメータを渡す ===
秘密鍵と複数の形式の証明書を作成する必要があります:
 
   
  +
rEFInd によってカーネルに渡される[[カーネルパラメータ]]を設定する方法は2つあります。
; {{ic|.key}}: EFI バイナリと EFI 署名リストの署名に必要な PEM 形式の''秘密''鍵。
 
; {{ic|.crt}}: {{man|1|sbsign}}、{{man|1|sbvarsign}}、{{man|1|sign-efi-sig-list}} で必要な PEM 形式の証明書。
 
; {{ic|.cer}}: ファームウェアが使用する DER 形式の証明書。
 
; {{ic|.esl}}: {{man|1|sbvarsign}} や {{man|1|efi-updatevar}}、''KeyTool''、ファームウェアのための EFI 署名リストの証明書。
 
; {{ic|.auth}}: {{man|1|efi-updatevar}} や ''sbkeysync''、''KeyTool''、ファームウェアのための認証ヘッダが付いた EFI 署名リストの証明書 (つまり、署名済みの証明書アップデートファイル)。
 
   
  +
==== rEFInd によって自動的に検出されたカーネルの場合 ====
所有者を識別する [[Wikipedia:Globally unique identifier|GUID]] を作成してください:
 
   
  +
自動的に検出されたカーネルの場合、{{ic|/boot/refind_linux.conf}} に明示的にカーネルパラメータを指定したり、あるいはルータパーティションとカーネルパラメータを特定する rEFInd の機能に頼ったりできます。詳細は [https://www.rodsbooks.com/refind/linux.html#easiest Methods of Booting Linux: For Those With Foresight or Luck: The Easiest Method] を見てください。
$ uuidgen --random > GUID.txt
 
 
Platform key:
 
 
$ openssl req -newkey rsa:4096 -nodes -keyout PK.key -new -x509 -sha256 -days ''3650'' -subj "/CN=''my Platform Key''/" -out PK.crt
 
$ openssl x509 -outform DER -in PK.crt -out PK.cer
 
$ cert-to-efi-sig-list -g "$(< GUID.txt)" PK.crt PK.esl
 
$ sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt PK PK.esl PK.auth
 
 
"User Mode" で Platform Key を削除できるようにするために空のファイルを署名してください:
 
 
$ sign-efi-sig-list -g "$(< GUID.txt)" -c PK.crt -k PK.key PK /dev/null noPK.auth
 
 
Key Exchange Key:
 
 
$ openssl req -newkey rsa:4096 -nodes -keyout KEK.key -new -x509 -sha256 -days ''3650'' -subj "/CN=''my Key Exchange Key''/" -out KEK.crt
 
$ openssl x509 -outform DER -in KEK.crt -out KEK.cer
 
$ cert-to-efi-sig-list -g "$(< GUID.txt)" KEK.crt KEK.esl
 
$ sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt KEK KEK.esl KEK.auth
 
 
Signature Database key:
 
 
$ openssl req -newkey rsa:4096 -nodes -keyout db.key -new -x509 -sha256 -days ''3650'' -subj "/CN=''my Signature Database key''/" -out db.crt
 
$ openssl x509 -outform DER -in db.crt -out db.cer
 
$ cert-to-efi-sig-list -g "$(< GUID.txt)" db.crt db.esl
 
$ sign-efi-sig-list -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db db.esl db.auth
 
 
====== ヘルパースクリプト ======
 
 
便利なヘルパースクリプトがこのトピックの参照メージの著者により提供されています[https://www.rodsbooks.com/efi-bootloaders/controlling-sb.html#creatingkeys]([[python]] が必要です)。簡単に編集されたバージョンも {{AUR|sbkeys}} としてパッケージングされています。
 
 
スクリプトを使うには、安全な場所にフォルダを作成し(例えば、後で {{AUR|sbupdate-git}} を使って unified カーネルイメージを作成し署名する予定なのであれば {{ic|/etc/efi-keys/}})、スクリプトを実行してください:
 
 
# mkdir /etc/efi-keys
 
# cd !$
 
# curl -L -O https://www.rodsbooks.com/efi-bootloaders/mkkeys.sh
 
# chmod +x mkkeys.sh
 
# ./mkkeys.sh
 
''鍵に埋め込む Common Name を入力 (例: "Secure Boot")''
 
 
これは様々な形式で必要なファイルを生成します。
 
 
===== ファームウェアに鍵を登録する =====
 
 
'''db'''、'''KEK'''、'''PK''' 証明書を登録するには、以下に述べる方法のうち1つを使ってください。
 
 
{{Tip|'''dbx''' (forbidden signatures db) は空なので、以下の手順では省いても安全です。}}
 
 
{{Warning|Platform Key を登録するとセキュアブートは "Setup Mode" から "User Mode" になります。なので、Platform Key は最後に登録する必要があります。}}
 
 
====== sbkeysync を使う ======
 
 
{{Pkg|sbsigntools}} をインストールしてください。そして、以下のディレクトリ構造を持つ {{ic|/etc/secureboot/keys}} ディレクトリを作成してください:
 
 
/etc/secureboot/keys
 
├── db
 
├── dbx
 
├── KEK
 
└── PK
 
 
例えば、以下のように:
 
 
# mkdir -p /etc/secureboot/keys/{db,dbx,KEK,PK}
 
 
そして、先程生成した ''.auth'' ファイルをそれぞれの場所にコピーしてください(例えば、{{ic|PK.auth}} は {{ic|/etc/secureboot/keys/PK}} へといった感じです)。
 
 
{{ic|sbkeysync}} がシステムの UEFI に加える変更を確認したい場合は、以下を使用してください:
 
 
# sbkeysync --pk --dry-run --verbose
 
 
最後に、{{ic|sbkeysync}} を使って鍵を登録してください。
 
 
# sbkeysync --verbose
 
# sbkeysync --verbose --pk
 
   
 
{{Tip|
 
{{Tip|
  +
* {{ic|/etc/os-release}} がカーネルと同じパーティションに存在する場合、rEFInd は自動的にブートエントリのアイコンとして Arch Linux のアイコン ({{ic|os_arch.png}}) を選択します。{{ic|/boot}} が別のパーティションにある場合は、[https://www.rodsbooks.com/refind/configfile.html#icons Configuring the Boot Manager: Setting OS Icons] を見てください。
* {{ic|sbkeysync}} で書き込みエラーが発生した場合、{{ic|sbkeysync}} のコマンドの前にまず {{ic|1=chattr -i /sys/firmware/efi/efivars/{PK,KEK,db}*}} を実行して、ファイルの属性を一時的に変更してください。これで、{{ic|efivars}} ディレクトリ内の EFI 鍵を書き込むことができます。{{man|1|chattr}} を参照してください。
 
  +
* rEFInd は [https://sourceforge.net/p/refind/discussion/general/thread/c3865a4e3a/ Unified カーネルイメージのディストリビューションの検出をサポートしていません]。[[Unified カーネルイメージ]]のアイコンを表示するには、{{ic|/usr/share/refind/icons/os_arch.png}} を {{ic|''esp''/EFI/Linux/}} にコピーし、ファイル名が一致していることを確認してください。例えば、{{ic|''esp''/EFI/Linux/arch-linux.efi}} が存在する場合、アイコンの名前を {{ic|''esp''/EFI/Linux/arch-linux.png}} としてください。
* {{ic|PK.auth}} で {{ic|permission denied}} エラーが発生する場合、次のコマンドでその鍵を登録できます: {{ic|efi-updatevar -f /etc/secureboot/keys/PK/PK.auth PK}}
 
 
}}
 
}}
   
  +
rEFInd で Arch Linux [[カーネル]]の命名規則をサポートし、カーネルとそれぞれの initramfs イメージがマッチするようにするには、{{ic|refind.conf}} 内の {{ic|extra_kernel_version_strings}} をアンコメントし編集する必要があります。例えば:
次の起動時に、UEFI は User Mode に戻り、セキュアブートポリシーを強制するはずです。
 
   
  +
{{hc|''esp''/EFI/refind/refind.conf|
====== ファームウェアのセットアップユーティリティを使う ======
 
  +
...
  +
extra_kernel_version_strings linux-hardened,linux-rt-lts,linux-zen,linux-lts,linux-rt,linux
  +
...
  +
}}
   
  +
{{Note|
[[FAT]] でフォーマットされたファイルシステム ([[EFI システムパーティション]] が使えます) に '''{{ic|noPK.auth}} ファイルを除いて''' {{ic|*.cer}}、{{ic|*.esl}}、{{ic|*.auth}} をすべてコピーしてください。
 
  +
* rEFInd はカーネルごとに1つの initramfs しか検出しません。つまり、フォールバック initramfs や[[マイクロコード]]のイメージは検出されないことになります。それらは手動で指定しなければなりません。
 
  +
* 上記の {{ic|extra_kernel_version_strings}} 行が無いと、{{ic|refind_linux.conf}} 内の {{ic|%v}} 変数は Arch Linux [[カーネル]]において機能しません。
{{Warning|'''{{ic|noPK.auth}} を [[EFI システムパーティション]] (ESP) にコピーしないでください!''' そうしてしまうと、例えば誰かがあなたの PC を盗んだ場合に、その人が EFI セキュアブートファームウェア内のあなたの Platform Key を削除し、"Setup Mode" を有効化して、セキュアブート鍵(PK, KEK, db, dbx)をその人のものに置き換えることができてしまいます。これでは UEFI セキュアブートの意味がありません。あなただけが Platform Key を置き換えられるようにするべきです。なので、あなたの以外の人が {{ic|noPK.auth}} ファイルにアクセスできないようにするべきなのです。以上の理由から、{{ic|noPK.auth}} ファイルは、あなただけがアクセスできる秘密の安全な場所に保管してください。{{ic|noPK.auth}} ファイルの保管場所として安全なのは:
 
 
* {{ic|KeyTool}} を使用している場合は、'''[[EFI システムパーティション]]のある外部 USB スティック'''。残念ながら、{{ic|KeyTool}} は、暗号化されていないストレージからしかファイルを読み出すことができません。
 
* {{ic|sbkeysync}} を使っている場合は、[[保存データ暗号化|PC 上の暗号化されているストレージ]]。
 
UEFI 仕様に従って PC 上の [[EFI システムパーティション]]は暗号化されていてはならず、(あなたの PC が盗まれた場合や、ハードドライブが抜き取られて他の PC に接続された場合に)他の PC 上でマウントかつ読み込み可能です。また、{{ic|noPK.auth}} ファイルをあなたの PC の [[ESP]] にコピーして、後で削除することも推奨されません。なぜなら、FAT32 の [[EFI システムパーティション]]上で削除されたファイルは、[[ファイルリカバリ#Testdisk と PhotoRec|PhotoRec のようなツールで復元できてしまう]]からです。
 
 
}}
 
}}
   
  +
===== refind_linux.conf =====
ファームウェアのセットアップユーティリティを起動し、'''db'''、'''KEK'''、'''PK''' 証明書を登録してください。ファームウェアのインターフェイスは様々です。鍵を登録する方法の例は [https://www.rodsbooks.com/efi-bootloaders/controlling-sb.html#setuputil Replacing Keys Using Your Firmware's Setup Utility] を見てください。
 
   
  +
rEFInd が自動的にカーネルを検出する場合、カーネルパラメータの含まれている {{ic|refind_linux.conf}} ファイルはそのカーネルと同じディレクトリに置くことができます。{{ic|/usr/share/refind/refind_linux.conf-sample}} を設定ファイルのベースにすることができます。{{ic|refind_linux.conf}} の1つ目のアンコメントされている行がカーネルのデフォルトパラメータとなります。それ以降の行は {{ic|+}}、{{ic|F2}}、{{ic|Insert}} を使ってアクセスできるサブメニュー内にエントリを作成します。
使用するツールがサポートしていれば、''.cer'' よりも ''.auth'' と ''.esl'' を使用することを推奨します。
 
   
  +
あるいは、{{ic|mkrlconf}} を root として実行してみてください。このスクリプトは、{{ic|/boot}} 内からカーネルを探し、自動的に {{ic|refind_linux.conf}} を生成しようと試みます。このスクリプトは、最も基本的なカーネルパラメータしか設定しませんので、作成されたファイルが正しいかを確認してください。
====== KeyTool を使う ======
 
   
  +
{{ic|1=initrd=}} パラメータを指定しない場合、カーネルと同じディレクトリから一般的な RAM ディスクのファイル名を探索して自動的にそのパラメータを追加します。複数の {{ic|1=initrd=}} パラメータが必要な場合、手動でそれらを {{ic|refind_linux.conf}} で指定しなければなりません。例えば、initramfs の前に[[マイクロコード]]を渡す場合:
{{ic|KeyTool.efi}} は {{Pkg|efitools}} パッケージに含まれています。それを ESP にコピーしてください。鍵を登録した後にこのツールを使うには、{{ic|sbsign}} で署名してください。
 
   
  +
{{hc|/boot/refind_linux.conf|2=
# sbsign --key db.key --cert db.crt --output ''esp''/KeyTool-signed.efi /usr/share/efitools/efi/KeyTool.efi
 
  +
"Boot using default options" "root=PARTUUID=''XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'' rw add_efi_memmap initrd=boot\intel-ucode.img initrd=boot\amd-ucode.img initrd=boot\initramfs-%v.img"
  +
"Boot using fallback initramfs" "root=PARTUUID=''XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'' rw add_efi_memmap initrd=boot\intel-ucode.img initrd=boot\amd-ucode.img initrd=boot\initramfs-%v-fallback.img"
  +
"Boot to terminal" "root=PARTUUID=''XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'' rw add_efi_memmap initrd=boot\intel-ucode.img initrd=boot\amd-ucode.img initrd=boot\initramfs-%v.img systemd.unit=multi-user.target"
  +
}}
   
  +
{{Warning|
ファームウェアのセットアップユーティリティかブートローダか [[Unified Extensible Firmware Interface#UEFI シェル|UEFI シェル]]を使って {{ic|KeyTool-signed.efi}} を起動して、鍵を登録してください。
 
  +
* {{ic|initrd}} のパスは、カーネルの存在するファイルシステムのルートディレクトリからの相対パスです。これは {{ic|1=initrd=\boot\initramfs-%v.img}} だったり、({{ic|/boot}} が ESP などの別のパーティションに存在する場合) {{ic|1=initrd=initramfs-%v.img}} だったりします。
  +
* {{ic|initrd}} パラメータではパスのセパレータとしてバックスラッシュ ({{ic|\}}) を使用してください。さもないと、カーネルは initramfs イメージを見つけることができないかもしれません: {{ic|EFI stub: ERROR: Failed to open file: /boot/intel-ucode.img}}。
  +
* [[Booster]] によって生成された initramfs イメージを使用する場合は、initramfs ファイルの名前の {{ic|initramfs}} を {{ic|booster}} に置き換えてください。例: {{ic|1=initrd=\boot\booster-%v.img}}。
  +
}}
   
  +
{{Note|
KeyTool メニューオプションの説明は [https://www.rodsbooks.com/efi-bootloaders/controlling-sb.html#keytool Replacing Keys Using KeyTool] を見てください。
 
  +
* 引用符は、繰り返すことによりエスケープできます (つまり、{{ic|""}} は {{ic|"}} のエスケープ版です)。例えば、上記の {{ic|refind_linux.conf}} の最初のブートエントリにオプション {{ic|1="acpi_osi=Windows 2015"}} を渡すには: {{bc|1="Boot using default options" "... initrd=boot\initramfs-%v.img '''acpi_osi=""Windows 2015""''' "}}
 
  +
* rEFInd は、(カーネルのファイル名から抽出することにより) {{ic|refind_linux.conf}} 内の {{ic|%v}} をカーネルのバージョンに置き換えます。rEFInd で Arch Linux カーネルをサポートするには、{{ic|esp/EFI/refind/refind.conf}} 内の {{ic|extra_kernel_version_strings}} を [[#rEFInd によって自動的に検出されたカーネルの場合]] で説明されているように編集しなければなりません。
===== EFI バイナリに署名する =====
 
 
''セキュアブート''を有効化(つまり "User Mode" に)すると、署名した EFI バイナリ(例: アプリケーション、[[Unified Extensible Firmware Interface#UEFI ドライバ|ドライバ]]、[[Unified カーネルイメージ]])しか起動できなくなります。
 
 
====== sbsigntools を使う ======
 
 
{{Pkg|sbsigntools}} を[[インストール]]して、{{man|1|sbsign}} で EFI バイナリに署名してください。
 
 
{{Tip|
 
* バイナリが署名されたかどうか確認したり署名を一覧表示したりするには: {{ic|$ sbverify --list ''/path/to/binary''}}。
 
* [[rEFInd]] ブートマネージャの {{ic|refind-install}} スクリプトで rEFInd EFI バイナリを署名し、[[ESP]] へ db 証明書と一緒にコピーできます。手順は [[rEFInd#自分の鍵を使う]] を見てください。
 
 
}}
 
}}
   
  +
===== 設定しない =====
{{Note|''sbsign'' を {{ic|--output}} 無しで実行すると、出力されるファイルは {{ic|''filename''.signed}} となります。詳細は {{man|1|sbsign}} を見てください。}}
 
   
  +
rEFInd を ESP 上にインストールしただけで、それ以上の操作をせずに (例えば、UEFI シェルや KeyTool、ファームウェアから直接) rEFInd を起動すると、(なんの設定もせずに) 自動検出によって作成されたブートメニュが表示されます。
カーネルとブートマネージャに署名するには、''sbsign'' を使用してください。例えば:
 
   
  +
これがうまく行くのは、rEFInd にフォールバック機構があるからです。この機能は以下のようなことができます:
# sbsign --key db.key --cert db.crt --output /boot/vmlinuz-linux /boot/vmlinuz-linux
 
# sbsign --key db.key --cert db.crt --output ''esp''/EFI/BOOT/BOOTx64.EFI ''esp''/EFI/BOOT/BOOTx64.EFI
 
   
  +
* [https://uapi-group.org/specifications/specs/discoverable_partitions_specification/ Discoverable Partitions Specification] や {{ic|/etc/fstab}} を使って ({{ic|1=root=}} パラメータ用に) ルートパーティションを特定する。
{{Warning|カーネル以外を署名しなかったら initramfs を改ざんから守ることはできません。''sbsign'' で手動で署名できる結合イメージを生成する方法は [[Unified カーネルイメージ]] を見てください。}}
 
  +
* [[Wikipedia:GUID Partition Table#Partition entries (LBA 2-33)|GPT パーティション属性]] (属性 {{ic|60}} "read-only" を使用) や {{ic|/etc/fstab}} を使ってカーネルオプション ({{ic|ro}} や {{ic|rw}}) を検出する。
   
  +
{{Note|rEFInd はエスケープコードをサポートしていません (例えば、{{ic|/etc/fstab}} での[[fstab#|ファイルパスのスペース]])。}}
====== mkinitcpio のポストフックでカーネルに署名する ======
 
   
  +
==== 手動でブートエントリを記述する ====
[[mkinitcpio]] のポストフックを使って、initramfs の生成時にカーネルイメージに署名することもできます。
 
   
  +
カーネルが自動検出されない場合、もしくはメニューエントリのオプションを自分で設定したい場合、手動で {{ic|refind.conf}} にブートエントリを作成することができます。{{ic|scanfor}} には {{ic|manual}} を含めて下さい、そうしないとエントリが rEFInd のメニューに表示されません。カーネルパラメータは {{ic|options}} キーワードで設定できます。rEFInd は {{ic|initrd}} キーワードで指定されたファイルを使って {{ic|1=initrd=}} パラメータを追加します。initrd を追加する必要がある場合 (例: [[マイクロコード]])、{{ic|options}} で指定してください ({{ic|initrd}} キーワードで指定された initrd が最後に追加されます)。
以下のファイルを[[作成]]し、[[実行可能属性]]を付与してください:
 
   
  +
手動でのブートエントリの記述については [https://www.rodsbooks.com/refind/configfile.html#stanzas Creating Manual Boot Stanzas] で説明されています。
{{hc|/etc/initcpio/post/kernel-sbsign|2=
 
#!/usr/bin/env bash
 
   
  +
{{hc|''esp''/EFI/refind/refind.conf|2=
kernel="$1"
 
  +
...
<nowiki>[[ -n "$kernel" ]] || exit 0
 
   
  +
menuentry "Arch Linux" {
# use already installed kernel if it exists
 
  +
icon /EFI/refind/icons/os_arch.png
[[ ! -f "$KERNELDESTINATION" ]] || kernel="$KERNELDESTINATION"</nowiki>
 
  +
volume "Arch Linux"
  +
loader /boot/vmlinuz-linux
  +
initrd /boot/initramfs-linux.img
  +
options "root=PARTUUID=''XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'' rw add_efi_memmap initrd=boot\intel-ucode.img initrd=boot\amd-ucode.img"
  +
submenuentry "Boot using fallback initramfs" {
  +
initrd /boot/initramfs-linux-fallback.img
  +
}
  +
submenuentry "Boot to terminal" {
  +
add_options "systemd.unit=multi-user.target"
  +
}
  +
}
  +
}}
   
  +
カーネルの存在するパーティションのファイルシステム [[LABEL]]、[[PARTLABEL]]、[[PARTUUID]] のどれかとマッチするように {{ic|volume}} を変更する必要があるでしょう。PARTUUID は大文字である必要があります。ボリュームラベルの割当の例は [[永続的なブロックデバイスの命名#by-label]] を見てください。{{ic|volume}} が指定されていない場合、rEFInd が起動したパーティション (典型的には EFI システムパーティション) のボリュームをデフォルトとして使用します。
keypairs=(''/path/to/''db.key ''/path/to/''db.crt)
 
   
  +
{{Warning|
for (( i=0; i<${#keypairs[@]}; i+=2 )); do
 
  +
* {{ic|loader}} と {{ic|initrd}} のパスは、カーネルの存在するファイルシステムのルートディレクトリからの相対パスです。{{ic|/boot}} が ESP などの別のパーティションに存在する場合、loader と initrd のパスはそれぞれ {{ic|/vmlinuz-linux}} と {{ic|/initramfs-linux.img}} となります。
key="${keypairs[$i]}" cert="${keypairs[(( i + 1 ))]}"
 
  +
* 引用符で囲まれた {{ic|initrd}} パラメータすべてで、パスのセパレータとしてバックスラッシュ ({{ic|\}}) を使用してください。さもないと、カーネルは initramfs イメージを見つけることができないかもしれません: {{ic|EFI stub: ERROR: Failed to open file: /boot/initramfs-linux.img}}。
if ! sbverify --cert "$cert" "$kernel" &>/dev/null; then
 
  +
* [[Booster]] によって生成された initramfs イメージを使用する場合は、initramfs ファイルの名前の {{ic|initramfs}} を {{ic|booster}} に置き換えてください。例: {{ic|initrd /boot/booster-linux.img}}。
sbsign --key "$key" --cert "$cert" --output "$kernel" "$kernel"
 
fi
 
done
 
 
}}
 
}}
   
  +
{{Note|引用符は、繰り返すことによりエスケープできます (つまり、{{ic|""}} は {{ic|"}} のエスケープ版です)。例えば、オプション {{ic|1="acpi_osi=Windows 2015"}} を上記のブートエントリ {{ic|"Arch Linux"}} に渡すには: {{bc|1=options "... initrd=boot\amd-ucode.img '''acpi_osi=""Windows 2015""''' "}}
{{ic|''/path/to/''db.key}} と {{ic|''/path/to/''db.crt}} の部分は、カーネルの署名に使用するキーペアへのパスに置き換えてください。
 
  +
}}
   
  +
== 既存の UEFI Windows 環境で rEFInd を使う ==
systemd-boot を使用する場合、この手順を半自動的に行う[[systemd-boot#自動で更新|専用の pacman フック]]が存在します。
 
   
  +
{{Note|基本的には [[Windows と Arch のデュアルブート]]に書かれていることが適用されます。}}
====== mkinitcpio のポストフックで unified カーネルイメージに署名する ======
 
   
  +
rEFInd は UEFI の Windows をインストールしたときに作成される EFI システムパーティションに対応しているため、Windows と一緒に Arch をインストールする際にもうひとつ FAT32 パーティションを作成・フォーマットする必要はありません。Windows の ESP をマウントして通常通りに rEFInd をインストールするだけです。デフォルトで、rEFInd の自動検出機能が既存の Windows (リカバリ) ブートローダーを認識するはずです。
[[Unified カーネルイメージ#セキュアブート用の UKI への署名]] 章を参照してください。
 
   
  +
{{Note|一部のケースで、Windows は異なった挙動をします (低解像度の起動画面、OEM ロゴが Windows のロゴに置き換わる、起動画面のあとに黒画面、アーティファクト)。そのような問題に遭遇した場合、{{ic|''esp''/EFI/refind/refind.conf}} で {{ic|use_graphics_for +,windows}} を設定するか、Windows のブート設定に {{ic|graphics on}} を追加してみてください。}}
===== sbupdate による完全に自動化された unified カーネルの生成と署名 =====
 
   
  +
== ツール ==
{{Note|''sbupdate'' が作成されたのは、[[mkinitcpio]] やその他の [[initramfs]] ジェネレータに [[unified カーネルイメージ]]の生成機能が追加されて以前は面倒であった作業が非常に簡単になる前です。今日では、[[#sbctl でプロセスをアシスト]] にあるように sbctl を使用することを検討してください。}}
 
   
  +
rEFInd は、様々な[https://www.rodsbooks.com/refind/installing.html#addons サードパーティーツール]の実行をサポートしています。ツールは別途インストールする必要があります。{{ic|refind.conf}} 内の {{ic|showtools}} を編集して表示したいツールを選択してください。
[https://github.com/andreyv/sbupdate sbupdate] は、Arch Linux で unified カーネルイメージの生成と署名を自動化するために特別に作られたツールです。このツールは、[[pacman フック]]を通してカーネルのインストール・削除・アップデートを処理します。
 
   
  +
{{hc|''esp''/EFI/refind/refind.conf|
{{AUR|sbupdate-git}} をインストールして、プロジェクトのホームページにある手順に従って設定してください。[https://github.com/andreyv/sbupdate#sbupdate]
 
  +
...
 
  +
showtools [[#UEFI シェル|shell]], [[#Memtest86+|memtest]], [[#鍵管理ツール|mok_tool]], [[#GPT fdisk (gdisk)|gdisk]], [[#fwupd|fwupdate]] ...
{{Tip|[[systemd-boot]] を使用している場合、設定の必要とせずにに署名済みのカーネルイメージを直接認識させるために {{ic|1=OUT_DIR="EFI/Linux"}} を設定してください。{{man|7|systemd-boot|FILES}} と [[Systemd-boot#ローダーの追加]] を参照してください。}}
 
  +
...
 
設定したら、イメージを生成するために {{ic|sbupdate}} を root として実行してください。
 
 
{{Note|''sbupdate'' の出力にはしばしばエラーを含んでいます(例えば {{ic|warning: data remaining[26413568 vs 26423180]: gaps between PE/COFF sections?}})。これらは無害で、安全に無視できます。[https://github.com/andreyv/sbupdate/issues/30]}}
 
 
==== 鍵をアップデートする ====
 
 
一度セキュアブートを "User Mode" にしたら、KEK, db, dbx を変更するには上位の鍵による署名が必要です。
 
 
例えば、db 鍵を新しいものに置き換えたい場合:
 
 
# [[#鍵を作成する|新しい鍵を作成]]
 
# EFI 署名リストに変換
 
# EFI 署名リストに署名
 
# 署名された証明書アップデートファイルを登録
 
 
$ cert-to-efi-sig-list -g "$(< GUID.txt)" ''new_db''.crt ''new_db''.esl
 
$ sign-efi-sig-list -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db ''new_db''.esl ''new_db''.auth
 
 
db 鍵を置き換えるかわりに Signature Database に別の鍵を'''追加'''したい場合、{{ic|-a}} オプションを使う必要があります ({{man|1|sign-efi-sig-list}} を参照):
 
 
$ sign-efi-sig-list '''-a''' -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db ''new_db''.esl ''new_db''.auth
 
 
{{ic|''new_db''.auth}} が作成されたら[[#ファームウェアに鍵を登録する|登録]]してください。
 
 
==== 他のオペレーティングシステムとデュアルブートする ====
 
 
===== Microsoft Windows =====
 
 
"Microsoft Windows Production PCA 2011" 鍵を UEFI セキュアブート変数に登録しない場合、[[#鍵を作成する|カスタム、個人の鍵]]で Windows のブートローダー ({{ic|EFI/Microsoft/Boot/bootmgfw.efi}}) を署名しても、Windows を起動することは通常'''不可能'''です:
 
 
* {{ic|bootmgfw.efi}} に "Microsoft Windows Production PCA 2011" とあなたの独自のセキュアブート DB 鍵の'''両方'''の署名 (つまり、'''2つの署名''') が含まれている場合、''INSYDE Corp. 4096.01 (UEFI Version 2.31, Version F.70, Release Date: 07/18/2016, BIOS Revision 15.112, Firmware Revision: 29.66)'' のような UEFI ファームウェア実装は、{{ic|bootmgfw.efi}} を起動せず、セキュリティ違反エラー ('''{{ic|Selected boot image did not authenticate. Press ENTER to continue.}}''') を発生させます: このような UEFI ファームウェア実装は、おそらく'''1番目'''の署名だけは読み込むことができるでしょうが、'''2番目'''の署名は無理でしょう。2番目の署名の証明書だけが UEFI セキュアブート変数に登録されているので、セキュアブートの検証が失敗するのです。
 
* {{ic|bootmgfw.efi}} ファイルの "Microsoft Windows Production PCA 2011" 証明書が strip/削除されていて、さらにあなたの独自のセキュアブート DB 鍵の署名だけがそのファイルに追加されている場合、UEFI はそのファイルを起動するでしょう。しかし、Windows はリカバリ/回復環境を起動してしまいます: Windows は Windows 環境が破損していると報告するでしょう ({{ic|bootmgfw.efi}} ファイルの "Microsoft Windows Production PCA 2011" 署名が存在しないからです)。
 
 
なので、[[Windows と Arch のデュアルブート|Windows とデュアルブート]]するには
 
 
* 選択肢1: {{ic|bootmgfw.efi}} のハッシュを {{ic|DB}} 変数の許可ハッシュリストに追加する必要があります。そして、Windows アップデートが {{ic|bootmgfw.efi}} を変更するたびに毎回 {{ic|DB}} 変数をアップデートする必要があります。これはかなり面倒くさいうえ、エラーが発生しやすく、Microsoft によってサポートされている方法ではありません。さらに、このようなセットアップでは Bitlocker は正しく動作しないでしょう (Windows パーティションを復号化するために毎回 Bitlocker が回復パスワードを尋ねてきます)。
 
* 選択肢2: Micosoft の証明書を UEFI セキュアブート変数に追加する必要があります。[https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-secure-boot-key-creation-and-management-guidance#14-signature-databases-db-and-dbx Microsoft は2つの {{ic|DB}} 証明書と1つの {{ic|KEK}} 証明書を持っています] ([https://learn.microsoft.com/ja-jp/windows-hardware/manufacture/desktop/windows-secure-boot-key-creation-and-management-guidance?view=windows-11#14-signature-databases-db-and-dbx 日本語訳ページ]):
 
** [https://www.microsoft.com/pkiops/certs/MicWinProPCA2011_2011-10-19.crt Microsoft Windows Production PCA 2011 証明書] は、Windows OS をロードできるようにするために、{{ic|DB}} 変数に含めなければなりません。
 
** [https://www.microsoft.com/pkiops/certs/MicCorUEFCA2011_2011-06-27.crt Microsoft Corporation UEFI CA 2011 証明書] (またの名を Microsoft 3rd Party UEFI CA 証明書) は、UEFI ドライバやオプションの ROM、{{Pkg|shim}} などのサードパーティのバイナリを使用するために、{{ic|DB}} 変数に含めるべきです。
 
** [https://www.microsoft.com/pkiops/certs/MicCorKEKCA2011_2011-06-24.crt Microsoft Corporation KEK CA 2011 証明書]は、「{{ic|DBX}} を更新して問題のあるイメージの失効を有効に」し「署名された新しい Windows イメージの準備をするために {{ic|DB}} を更新する」ために、{{ic|KEK}} 変数に含めるべきです。しかし、"Microsoft Corporation KEK CA 2011" 証明書がなくとも、Windows は起動するでしょう。
 
 
Microsoft の GUID ({{ic|77fa9abd-0359-4d32-bd60-28f4e78f784b}}) を使用して Microsoft の DER 形式 {{ic|DB}} 証明書の EFI Signature Lists を作成し、それらのリストを1つのファイルにまとめてください:
 
 
$ sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_Win_db.esl MicWinProPCA2011_2011-10-19.crt
 
$ sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_UEFI_db.esl MicCorUEFCA2011_2011-06-27.crt
 
$ cat MS_Win_db.esl MS_UEFI_db.esl > MS_db.esl
 
 
任意 (Microsoft の UEFI セキュアブート要件を厳密に満たすために): Microsoft の GUID ({{ic|77fa9abd-0359-4d32-bd60-28f4e78f784b}}) を使って Microsoft の DER 形式 {{ic|KEK}} 証明書の EFI Signature List を作成してください:
 
 
$ sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_Win_KEK.esl MicCorKEKCA2011_2011-06-24.crt
 
 
{{ic|DB}} 変数のアップデートを {{ic|KEK}} を使って署名してください。{{ic|sign-efi-sig-list}} を {{ic|-a}} オプションで使用してください ({{ic|-a}} オプションは {{ic|DB}} 証明書を置き換えるのではなく '''追加''' します):
 
 
$ sign-efi-sig-list -a -g 77fa9abd-0359-4d32-bd60-28f4e78f784b -k KEK.key -c KEK.crt db MS_db.esl add_MS_db.auth
 
 
任意 (Microsoft の UEFI セキュアブート要件を厳密に満たすために): {{ic|KEK}} 変数のアップデートを {{ic|PK}} で署名してください。{{ic|sign-efi-sig-list}} を {{ic|-a}} オプションで使用してください ({{ic|-a}} オプションは {{ic|KEK}} 証明書を置き換えるのではなく '''追加''' します):
 
 
$ sign-efi-sig-list -a -g 77fa9abd-0359-4d32-bd60-28f4e78f784b -k PK.key -c PK.crt KEK MS_Win_KEK.esl add_MS_Win_KEK.auth
 
 
[[#ファームウェアに鍵を登録する]] に従い、UEFI セキュアブートデータベース変数に {{ic|add_MS_db.auth}} を登録してください。Microsoft の UEFI セキュアブート要件を厳密に満たしたい場合は、{{ic|add_MS_Win_KEK.auth}} も登録してください。
 
 
=== 署名済みのブートローダを使う ===
 
 
署名済みのブートローダーを使うというのは Microsoft の鍵で署名されたブートローダーを使うということです。署名済みのブートローダーとしては PreLoader と shim が存在します。どちらも他の EFI バイナリ (通常の[[ブートローダー]]) をチェインロードします。Microsoft は未署名のあらゆるバイナリを自動起動するブートローダーに署名しないことになっているため、PreLoader と shim は Machine Owner Key リストと呼ばれるホワイトリストを使っています。バイナリの SHA256 ハッシュあるいはバイナリの署名鍵が MokList に存在する場合、バイナリが起動されますが、存在しない場合はハッシュや鍵を登録するための鍵管理ユーティリティが起動します。
 
 
{{Warning|Microsoft が "Secured-core PC" と呼ぶものには Microsoft 3rd Party UEFI CA 証明書 (Microsoft Corporation UEFI CA 2011) が登録されていません。[https://docs.microsoft.com/en-us/windows/security/information-protection/secure-the-windows-10-boot-process#secure-boot] ([https://learn.microsoft.com/ja-jp/windows/security/information-protection/secure-the-windows-10-boot-process#%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2-%E3%83%96%E3%83%BC%E3%83%88 日本語訳ページ])。唯一登録されている DB 証明書は Microsoft Windows Production PCA 2011 証明書で、これは Windows ブートローダーを署名するためだけに使用されます。
 
 
Microsoft 3rd Party UEFI CA 証明書で署名された EFI バイナリや OpROM を起動するには、Microsoft 3rd Party UEFI CA 証明書の登録をファームウェアの設定で有効化する必要があります。
 
 
}}
 
}}
   
==== PreLoader ====
+
=== UEFI シェル ===
   
  +
[[Unified Extensible Firmware Interface#UEFI シェル]] を見てください。
起動時に PreLoader は {{ic|loader.efi}} を実行しようとします。MokList に {{ic|loader.efi}} のハッシュが存在しない場合、PreLoader は {{ic|HashTool.efi}} を起動します。HashTool で起動したい EFI バイナリのハッシュ、つまり[[ブートローダー]] ({{ic|loader.efi}}) とカーネルを登録する必要があります。
 
   
  +
[[EFI システムパーティション]]のルートに {{ic|shellx64.efi}} をコピーしてください。
{{Note|バイナリ (ブートローダーやカーネル) をアップデートするたびに新しいハッシュの登録が必要です。}}
 
   
  +
=== Memtest86+ ===
{{Tip|[[rEFInd]] ブートマネージャの {{ic|refind-install}} スクリプトは rEFInd と PreLoader EFI バイナリを ESP にコピーできます。手順は [[rEFInd#PreLoader を使う]] を見てください。}}
 
   
  +
{{Pkg|memtest86+-efi}} をインストールし、それを {{ic|''esp''/EFI/tools/}} にコピーしてください。
===== PreLoader をセットアップする =====
 
   
  +
# cp /boot/memtest86+/memtest.efi ''esp''/EFI/tools/memtest86.efi
{{Note|{{Pkg|efitools}} パッケージに含まれている {{ic|PreLoader.efi}} と {{ic|HashTool.efi}} は署名されていないため、使い道は限られています。署名済みの {{ic|PreLoader.efi}} と {{ic|HashTool.efi}} を入手するには {{AUR|preloader-signed}} をインストールするか [https://blog.hansenpartnership.com/linux-foundation-secure-boot-system-released/ 手動でダウンロード] します。}}
 
   
  +
=== 鍵管理ツール ===
{{AUR|preloader-signed}} パッケージを[[インストール]]して {{ic|PreLoader.efi}} と {{ic|HashTool.efi}} を[[ブートローダー]]のディレクトリにコピーしてください。[[systemd-boot]] の場合、以下を実行:
 
   
  +
rEFInd can detect Secure Boot key management tools if they are placed in rEFInd's directory on ESP, {{ic|''esp''/}} or {{ic|''esp''/EFI/tools/}}.
# cp /usr/share/preloader-signed/{PreLoader,HashTool}.efi ''esp''/EFI/systemd
 
   
  +
==== HashTool ====
そしてブートローダーのバイナリをコピーして {{ic|loader.efi}} に名前を変更します。[[systemd-boot]] の場合、以下を実行:
 
   
  +
[[#PreLoader を使う]] に従ってください。{{ic|HashTool.efi}} は rEFInd のディレクトリに配置されます。
# cp ''esp''/EFI/systemd/systemd-bootx64.efi ''esp''/EFI/systemd/loader.efi
 
   
  +
==== MokManager ====
最後に、{{ic|PreLoader.efi}} を起動する NVRAM エントリを新しく作成してください:
 
   
  +
[[#shim を使う]] に従ってください。MokManager は rEFInd のディレクトリに配置されます。
# efibootmgr --unicode --disk /dev/sd'''''X''''' --part '''''Y''''' --create --label "PreLoader" --loader /EFI/systemd/PreLoader.efi
 
   
  +
==== KeyTool ====
{{ic|X}} は [[EFI システムパーティション]]のドライブ文字に、{{ic|Y}} は同じくパーティション番号に置き換えてください。
 
   
  +
{{Pkg|efitools}} をインストールしてください。
上記のエントリは起動リストの一番最初に追加する必要があります。{{ic|efibootmgr}} コマンドで確認して、必要であればブートローダーの設定を変更してください。
 
   
  +
KeyTool EFI バイナリを {{ic|KeyTool.efi}} か {{ic|KeyTool-signed.efi}} という名前で {{ic|''esp''/}} か {{ic|''esp''/EFI/tools/}} に配置してください。
====== フォールバック ======
 
   
  +
{{ic|KeyTool.efi}} を署名する方法については [[セキュアブート#KeyTool を使う]] を見てください。
カスタム NVRAM エントリの起動に問題が発生する場合、{{ic|HashTool.efi}} と {{ic|loader.efi}} を UEFI によって自動的に起動されるデフォルトのブートローダーの場所にコピーしてください:
 
   
  +
=== GPT fdisk (gdisk) ===
# cp /usr/share/preloader-signed/HashTool.efi ''esp''/EFI/BOOT/
 
# cp ''esp''/EFI/systemd/systemd-bootx64.efi ''esp''/EFI/BOOT/loader.efi
 
   
  +
[[gdisk#gdisk EFI アプリケーション|gdisk EFI アプリケーション]]をダウンロードし、{{ic|gdisk_x64.efi}} を {{ic|''esp''/EFI/tools/}} にコピーしてください。
{{ic|PreLoader.efi}} を上書きコピーして、名前を変更します:
 
   
  +
=== fwupd ===
# cp /usr/share/preloader-signed/PreLoader.efi ''esp''/EFI/BOOT/BOOTx64.EFI
 
   
  +
{{Pkg|fwupd-efi}} をインストールし、[[fwupd]] をセットアップしてください。
Windows にしか対応しない非協力的な UEFI 実装の場合、{{ic|PreLoader.efi}} を Windows で使用されるデフォルトローダーの場所にコピーしてください:
 
   
  +
{{ic|fwupdx64.efi}} バイナリとファームウェアファイルを {{ic|''esp''/EFI/tools/}} にコピーしてください:
# mkdir -p ''esp''/EFI/Microsoft/Boot
 
# cp /usr/share/preloader-signed/PreLoader.efi ''esp''/EFI/Microsoft/Boot/bootmgfw.efi
 
   
  +
# cp /usr/lib/fwupd/efi/fwupdx64.efi ''esp''/EFI/tools/
{{Note|Windows とデュアルブートする場合、元の {{ic|bootmgfw.efi}} はバックアップしておいてください。ファイルを置き換えると Windows のアップデートで問題が発生する可能性があります。}}
 
   
  +
=== 電源オフや再起動 ===
上と同じように、{{ic|HashTool.efi}} と {{ic|loader.efi}} を {{ic|''esp''/EFI/Microsoft/Boot}} にコピーしてください。
 
   
  +
rEFInd には電源オフと再起動のメニューエントリが組み込まれていると報告されています。このツールのリストはこの Wiki ではとても広範囲なものなので、UEFI や他の UEFI ブートマネージャ (例えば [[systemd-boot]]) のユーザは、{{aur|powerofforreboot.efi}} に興味を持つかもしれません。
セキュアブートを有効にした状態でシステムを起動したら、上のセクションの手順に従って {{ic|loader.efi}} と {{ic|/vmlinuz-linux}} (あるいは使用している他のカーネルイメージ) を登録します。
 
   
  +
== ヒントとテクニック ==
===== 起動途中で使用するには? =====
 
   
  +
=== UEFI シェルでドライバを使用する ===
{{ic|Failed to Start loader... I will now execute HashTool.}} というメッセージが表示されるでしょう。{{ic|loader.efi}} と {{ic|vmlinuz.efi}} のハッシュを登録するために HashTool を使用するには、以下の手順を踏んでください。以下の手順では、リマスタリングされた archiso インストールメディアのタイトルについて仮定をおいています。実際のタイトルはブートローダのセットアップに依存します。
 
   
  +
rEFInd のドライバを UEFI シェル内で使用するには、{{ic|load}} コマンドを使ってロードし、マッピングされたドライバを {{ic|map -r}} コマンドを使ってリフレッシュしてください。
* ''OK'' を選択してください
 
* HashTool のメインメニューで、''Enroll Hash'' を選択し、{{ic|\loader.efi}} を選んで ''Yes'' で確定してください。再び ''Enroll Hash'' と {{ic|archiso}} を選択し archiso のディレクトリに入って、{{ic|vmlinuz.efi}} を選択し、''Yes'' で確定してください。そして、''Exit'' を選択してブートデバイスの選択メニューに戻ってください。
 
* ブートデバイスの選択メニューで、''Arch Linux archiso x86_64 UEFI CD'' を選んでください。
 
   
  +
Shell> load FS0:\EFI\refind\drivers\ext4_x64.efi
===== PreLoader を除去する =====
 
  +
Shell> map -r
   
  +
これで、UEFI シェルからファイルシステムにアクセスできるようになりました。
{{Note|以下を実行する前にバックアップを作成すると良いでしょう。}}
 
   
  +
=== efifb の解像度を設定する ===
{{AUR|preloader-signed}} を[[アンインストール]]し、コピーしたファイルを削除して、設定を元に戻します。[[systemd-boot]] の場合、以下を実行:
 
   
  +
{{ic|refind.conf}} で解像度が間違った値に設定されている場合、Apple [[Mac]] を除くすべてのシステムで rEFInd は、サポートされている解像度のリストを表示します。Apple Mac の場合は、rEFInd はサイレントにデフォルトの解像度を使用します。
# rm ''esp''/EFI/systemd/{PreLoader,HashTool}.efi
 
# rm ''esp''/EFI/systemd/loader.efi
 
# efibootmgr --unicode --bootnum ''N'' --delete-bootnum
 
# bootctl update
 
   
  +
[https://docs.kernel.org/fb/efifb.html efifb] によってサポートされているフレームバッファの解像度を判断するには、{{ic|/usr/share/gnu-efi/apps/x86_64/modelist.efi}} を {{Pkg|gnu-efi}} から [[ESP]] のルートディレクトリにコピーしてください。[[UEFI シェル]] に入り、{{ic|modelist.efi}} を実行してください。
{{ic|N}} は {{ic|PreLoader.efi}} を起動するために作成した NVRAM のブートエントリに置き換えてください。{{ic|efibootmgr}} コマンドで確認を行なって、必要に応じてブート順序を修正してください。
 
   
  +
{{hc|Shell> FS0:\modelist.efi|
{{Note|上記のコマンドは一番簡単な場合です。他にもファイルを作成したり、コピーしたり、ファイル名を変更したり、編集したりした場合、おそらくそれらも処理する必要があります。PreLoader をブートエントリとして使用していた場合、明らかに[[#セキュアブートを無効化する]]必要もあります。
 
  +
GOP reports MaxMode 3
  +
0: 640x480 BGRR pitch 640
  +
*1: 800x600 BGRR pitch 800
  +
2: 1024x768 BGRR pitch 1024
 
}}
 
}}
   
  +
どれかの解像度を {{ic|refind.conf}} で設定してください。再起動し、{{ic|dmesg {{!}} grep efifb}} を root として実行して設定が反映されていることを確認してください。
===== 登録したハッシュを削除する =====
 
   
  +
=== Btrfs サブボリュームのサポート ===
MOK データベースに登録されたハッシュのエントリは NVRAM の容量を少し圧迫します。空き容量を増やしたり、時代遅れなプログラムが起動しないようにしたりするために、場合によっては使用しないハッシュを削除する必要があるでしょう。
 
   
  +
{{Tip|{{ic|btrfs_x64.efi}} ドライバがインストールされていることを確認してください。{{ic|/usr/share/refind/drivers_x64/btrfs_x64.efi}} から {{ic|''esp''/EFI/refind/drivers_x64/btrfs_x64.efi}} にコピーすることで手動でインストールできます。または、{{ic|refind-install /dev/sdx --alldrivers}} オプションですべてのドライバをインストールできます。}}
{{Pkg|efitools}} を[[インストール]]し、{{ic|KeyTool.efi}} をコピーしてください:
 
   
  +
{{Warning|{{ic|btrfs_x64.efi}} は {{ic|raid1c3/4}} をサポートしていません。}}
# cp /usr/share/efitools/efi/KeyTool.efi ''esp''/EFI/systemd/KeyTool.efi
 
   
  +
==== 自動検出 ====
PreLoader を起動するよう設定すれば、KeyTool のエントリが現れます。これで、MOK データベース内のハッシュを編集することができます。
 
   
  +
Btrfs ボリューム上でカーネルの自動検出を有効にするには、{{ic|refind.conf}} 内の {{ic|also_scan_dirs}} をアンコメントしてください。
==== shim ====
 
   
  +
{{hc|''esp''/EFI/refind/refind.conf|
起動時に shim は {{ic|grubx64.efi}} を実行しようとします。MokList に {{ic|grubx64.efi}} のハッシュあるいは署名鍵が存在しない場合、shim は {{ic|mmx64.efi}} を起動します。MokManager で起動したい EFI バイナリ ([[ブートローダー]] ({{ic|grubx64.efi}}) とカーネル) のハッシュか署名鍵を登録する必要があります。
 
  +
...
 
  +
also_scan_dirs +,''subvolume''/boot
{{Note|
 
  +
...
* [[#shim でハッシュを使う]] を使う場合、バイナリ(例: ブートローダやカーネル)を更新するたびに、新しいハッシュをを登録する必要があります。
 
* バージョン 15.3 以降、shim は、有効な {{ic|.sbat}} セクションが無いと EFI バイナリを起動しません。EFI バイナリが {{ic|.sbat}} セクションを持っているか確認するには、{{ic|objdump -j .sbat -s ''/path/to/binary.efi''}} を実行してください。詳細は [https://github.com/rhboot/shim/blob/main/SBAT.md SBAT ドキュメント] を見てください。
 
* セキュアブートがもたらすセキュリティには興味がなく、Windows 11 の要件のためだけにセキュアブートを有効化する場合、{{ic|mokutil --disable-validation}} で shim の認証プロセスを無効化すると良いかもしれません。その場合、grub(sbat は依然として必要でしょう)やカーネルイメージを署名する必要はありません。それと同時に、grub の {{ic|chainloader}} で Windows を起動することができます。
 
 
}}
 
}}
   
  +
次に、{{ic|refind_linux.conf}} 内の {{ic|1=rootflags}} に {{ic|1=subvol=''subvolume''}} を追加してください。そして、initrd のパスの先頭に {{ic|''subvolume''}} を追加してください。
===== shim をセットアップする =====
 
   
  +
{{hc|/boot/refind_linux.conf|2=
{{Tip|[[rEFInd]] ブートマネージャの {{ic|refind-install}} スクリプトは rEFInd EFI バイナリを署名することができ、shim や MOK 証明書と一緒にバイナリを ESP にコピーできます。手順は [[rEFInd#shim を使う]] を見てください。}}
 
  +
"Boot using standard options" "root=PARTUUID=''XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'' rw '''rootflags=subvol=''subvolume''''' initrd='''''subvolume'''''\boot\initramfs-%v.img"
  +
}}
   
  +
==== マニュアルブートの設定 ====
{{AUR|shim-signed}} を[[インストール]]してください。
 
   
  +
[[btrfs]] サブボリュームをルートとして起動する場合、サブボリュームへのパスをローダーと initrd のパスの先頭に追加し、{{ic|options}} の行を {{ic|1=rootflags=subvol=''root_subvolume''}} のように変更してください。以下の例では、ルートは 'ROOT' という名前で btrfs サブボリュームとしてマウントされています (例: {{ic|1=mount -o subvol=ROOT /dev/sdxY /mnt}}):
現在の[[ブートローダー]]の名前を {{ic|grubx64.efi}} に変更してください:
 
   
# mv ''esp''/EFI/BOOT/BOOTx64.EFI ''esp''/EFI/BOOT/grubx64.efi
+
{{hc|''esp''/EFI/refind/refind.conf|2=
  +
...
  +
menuentry "Arch Linux" {
  +
icon /EFI/refind/icons/os_arch.png
  +
volume "[bootdevice]"
  +
loader '''/ROOT'''/boot/vmlinuz-linux
  +
initrd '''/ROOT'''/boot/initramfs-linux.img
  +
options "root=PARTUUID=''XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'' rw '''rootflags=subvol=ROOT'''"
  +
...
  +
}
  +
}}
   
  +
そうしないと、次のようなエラーが発生します: {{ic|ERROR: Root device mounted successfully, but /sbin/init does not exist.}}
''shim'' と ''MokManager'' を ESP 上のブートローダーのディレクトリにコピーしてください; {{ic|shimx64.efi}} はブートローダの以前のファイル名を使ってください:
 
   
  +
=== LoaderDevicePartUUID ===
{{Note|有効な {{ic|bootx64.csv}} が存在しない限り、{{ic|fbx64.efi}} (同じディレクトリ内にあります) はコピー'''しない'''でください。さもないと、shim は {{ic|grubx64.efi}} を'''実行せず'''、動作に失敗してマシンをリセットします。}}
 
   
  +
バージョン 0.13.1 以降、rEFInd は UEFI 変数 [https://systemd.io/BOOT_LOADER_INTERFACE/ LoaderDevicePartUUID] の設定をサポートしています 。これを有効化すると、{{man|8|systemd-gpt-auto-generator}} が EFI システムパーティションを、{{ic|/etc/fstab}} で指定せずに自動マウントできるようになります。[[systemd#GPT パーティションの自動マウント]] を見てください。
# cp /usr/share/shim-signed/shimx64.efi ''esp''/EFI/BOOT/BOOTx64.EFI
 
# cp /usr/share/shim-signed/mmx64.efi ''esp''/EFI/BOOT/
 
   
最後に、{{ic|BOOTx64.EFI}} を起動する新 NVRAM ントリを作成してください:
+
rEFInd が {{ic|LoaderDevicePartUUID}} を設定できるようにする、{{ic|refind.conf}} を編集 {{ic|write_systemd_vars true}} をアンコメントしてください:
   
  +
{{hc|''esp''/EFI/refind/refind.conf|2=
# efibootmgr --unicode --disk /dev/sd'''''X''''' --part '''''Y''''' --create --label "Shim" --loader /EFI/BOOT/BOOTx64.EFI
 
  +
...
 
  +
write_systemd_vars true
''shim'' は、MokList に格納されている Machine Owner Key やハッシュによってバイナリを認証することができます。
 
  +
...
 
; Machine Owner Key (MOK): EFI バイナリに署名するためにユーザが生成し利用する鍵
 
; hash: EFI バイナリの SHA256 ハッシュ
 
 
ハッシュを用いるのは単純ですが、ブートローダやカーネルをアップデートするたびに、MokManager 内のそれらのハッシュを追加する必要があります。MOK では鍵を一度追加するだけで済みますが、ブートローダとカーネルをアップデートするたびに、それらに署名する必要があります。
 
 
====== shim でハッシュを使う ======
 
 
''shim'' は、MokList に {{ic|grubx64.efi}} の SHA256 ハッシュが存在しない場合、{{ic|mmx64.efi}} を起動します。
 
 
''MokManager'' で ''Enroll hash from disk'' を選択してから {{ic|grubx64.efi}} を探して MokList に追加してください。同じようにカーネルの {{ic|vmlinuz-linux}} も追加してください。完了したら ''Continue boot'' を選択してください。ブートローダーが起動してカーネルが起動します。
 
 
====== shim で鍵を使う ======
 
 
{{Pkg|sbsigntools}} をインストールしてください。
 
 
以下のファイルが必要です:
 
 
; {{ic|.key}}: EFI バイナリに署名するための PEM 形式の''秘密''鍵。
 
; {{ic|.crt}}: ''sbsign'' で使うための PEM 形式の証明書。
 
; {{ic|.cer}}: ''MokManager'' で使うための DER 形式の証明書。
 
 
Machine Owner Key を作成:
 
 
$ openssl req -newkey rsa:4096 -nodes -keyout MOK.key -new -x509 -sha256 -days ''3650'' -subj "/CN=''my Machine Owner Key''/" -out MOK.crt
 
$ openssl x509 -outform DER -in MOK.crt -out MOK.cer
 
 
({{ic|grubx64.efi}} という名前の) ブートローダーとカーネルに署名:
 
 
# sbsign --key MOK.key --cert MOK.crt --output /boot/vmlinuz-linux /boot/vmlinuz-linux
 
# sbsign --key MOK.key --cert MOK.crt --output ''esp''/EFI/BOOT/grubx64.efi ''esp''/EFI/BOOT/grubx64.efi
 
 
ブートローダーとカーネルをアップデートするたびに上記の署名が必要です。カーネルの署名は [[pacman フック]] で自動化できます。例えば:
 
 
{{hc|/etc/pacman.d/hooks/999-sign_kernel_for_secureboot.hook|2=
 
[Trigger]
 
Operation = Install
 
Operation = Upgrade
 
Type = Package
 
Target = linux
 
Target = linux-lts
 
Target = linux-hardened
 
Target = linux-zen
 
 
[Action]
 
Description = Signing kernel with Machine Owner Key for Secure Boot
 
When = PostTransaction
 
Exec = /usr/bin/find /boot/ -maxdepth 1 -name 'vmlinuz-*' -exec /usr/bin/sh -c 'if ! /usr/bin/sbverify --list {} 2>/dev/null {{!}} /usr/bin/grep -q "signature certificates"; then /usr/bin/sbsign --key MOK.key --cert MOK.crt --output {} {}; fi' ;
 
Depends = sbsigntools
 
Depends = findutils
 
Depends = grep
 
 
}}
 
}}
   
  +
{{ic|cat /sys/firmware/efi/efivars/LoaderDevicePartUUID-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f}} で値を確認するか、{{ic|bootctl}} の出力の "Boot loader sets ESP information" の状態を見ることで、この変数が設定されていることを確認できます。
{{ic|MOK.cer}} を FAT でフォーマットされたファイルシステムにコピーしてください ([[EFI システムパーティション]] を使うことができます)。
 
   
  +
== トラブルシューティング ==
再起動してセキュアブートを有効にしてください。''shim'' は MokList に {{ic|grubx64.efi}} を署名するときに使った証明書がない場合、{{ic|mmx64.efi}} を起動します。
 
   
  +
=== Apple Mac ===
''MokManager'' で ''Enroll key from disk'' を選択してから {{ic|MOK.cer}} を探して MokList に追加してください。完了したら ''Continue boot'' を選択してください。ブートローダーが起動して、Machine Owner Key で署名されたバイナリを起動できるようになります。
 
   
  +
{{AUR|mactel-boot}} は Linux 用の実験的な ''bless'' ユーティリティです。これが動作しないときは、OSX の中から ''bless'' を使って rEFInd をデフォルトのブートローダに設定してください:
====== shim で鍵と GRUB を使う ======
 
   
  +
# bless --setBoot --folder ''esp''/EFI/refind --file ''esp''/EFI/refind/refind_x64.efi
手順は [[GRUB#Shim-lock]] を見てください。
 
   
  +
=== 空の rEFInd メニュースクリーン ===
===== 登録されたハッシュ/鍵を削除する =====
 
   
  +
{{ic|drivers_x64}} フォルダにファイルシステムドライバが複数存在すると ([[#rEFInd ブートマネージャをインストールする]] を参照)、ファイルシステムドライバのバグによって rEFInd が正しく機能しなくなり、rEFInd のロゴだけの空白画面 (カスタムテーマの場合は、背景画像) が表示されることがあります。これを修正するには、'''カーネルの存在するファイルシステム用のドライバ以外'''のすべてのドライバを削除してください。
MOK データベースに登録されたハッシュ/鍵のエントリは、NVRAM の領域を少しずつ圧迫していきます。領域を節約し、古いプログラムがブートされないようにするために、使っていないハッシュ/鍵は削除すると良いかもしれません。
 
   
  +
また、Windows とデュアルブートしている場合に rEFInd が他のディスク上の EFI システムパーティションの自動スキャンに失敗して、空白画面が発生することもあります。これを修正するには、''blkid'' を使って Windows パーティションを特定し、それぞれの Windows パーティションの [[PARTUUID]] を {{ic|refind.conf}} 内の {{ic|dont_scan_volumes}} 変数にコンマで区切って追加してください。例えば:
MOK データベースは {{Pkg|mokutil}} で管理できます。
 
   
  +
{{hc|# blkid|2=
登録された鍵とハッシュを一覧表示する:
 
  +
/dev/nvme0n1p1: LABEL="SYSTEM" UUID="4CE7-C215" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="EFI system partition" PARTUUID="'''13aa9955-1234-5678-9098-006c334b5088'''"
 
  +
/dev/nvme0n1p5: LABEL="Windows RE Tools" BLOCK_SIZE="512" UUID="08C4E6C5C4E6B45A" TYPE="ntfs" PARTLABEL="Basic data partition" PARTUUID="'''4eced110-0987-6543-2123-b0ab8576869b'''"
# mokutil --list-enrolled
 
 
データベースからハッシュを削除する。ここで入力するパスワードは、MOK マネージャで削除の確認を行う際に再び尋ねられます。
 
 
# mokutil --delete-hash <削除するハッシュ>
 
Input password:
 
 
データベースから鍵を削除する:
 
 
# mokutil --delete MOK.cer
 
 
次回のブート時に削除されるハッシュ/鍵を一覧表示する:
 
 
# mokutil --list-delete
 
 
次回のブート時に、登録/削除するハッシュ/鍵のオプション付きで MOK マネージャが初期化されます。詳細は {{man|1|mokutil}} を参照してください。
 
 
===== shim を除去する =====
 
 
{{AUR|shim-signed}} を[[アンインストール]]して、コピーした ''shim'' と ''MokManager'' のファイルを削除してブートローダーを元の名前に戻してください。
 
 
== セキュアブートを保護する ==
 
 
マシンに物理アクセスできる者がセキュアブートを無効化してしまうことを阻止する唯一の方法は、ファームウェアの設定をパスワードで保護することです。
 
 
ほとんどの UEFI ファームウェアはそのような機能を提供します。通常、ファームウェア設定の「セキュリティ」セクションにその項目があるはずです。
 
 
== ヒントとテクニック ==
 
 
=== ISO の再パック ===
 
 
{{Pkg|libisoburn}} と {{Pkg|mtools}} を使うことで、公式のインストールイメージを展開したり、再パックしたりできます。この方法で、カスタムの鍵か署名済みのブートローダを使ってセキュアブートをサポートするイメージを作成することができます。
 
 
==== 公式の ISO をカスタムの鍵で署名する ====
 
 
ブートローダー ({{ic|BOOTx64.EFI}} と {{ic|BOOTIA32.EFI}})、カーネル、UEFI シェルを ISO から抽出し、それらを署名し、署名済みファイルを ISO に再パックすることで、カスタムの鍵で公式の ISO にセキュアブートサポートを追加できます。
 
 
まず、関連するファイルと El Torito ブートイメージを抽出してください:
 
 
{{bc|
 
$ osirrox -indev archlinux-''YYYY.MM.DD''-x86_64.iso \
 
-extract_boot_images ./ \
 
-extract /EFI/BOOT/BOOTx64.EFI BOOTx64.EFI \
 
-extract /EFI/BOOT/BOOTIA32.EFI BOOTIA32.EFI \
 
-extract /shellx64.efi shellx64.efi \
 
-extract /shellia32.efi shellia32.efi \
 
-extract /arch/boot/x86_64/vmlinuz-linux vmlinuz-linux
 
 
}}
 
}}
  +
 
  +
{{hc|''esp''/EFI/refind/refind.conf|2=
''mkarchiso'' によって使用されている {{man|1|xorrisofs}} のオプション {{ic|-rational-rock}} は、ISO 9660 のファイルを読み取り専用にし、これは抽出後も維持されます。ファイルを書き込み可能にし、変更できるようにしましょう:
 
  +
...
 
  +
dont_scan_volumes 13aa9955-1234-5678-9098-006c334b5088,4eced110-0987-6543-2123-b0ab8576869b
$ chmod +w BOOTx64.EFI BOOTIA32.EFI shellx64.efi shellia32.efi vmlinuz-linux
 
  +
...
 
ファイルを署名してください。{{Pkg|sbsigntools}} を使って署名する場合、以下のようにできます:
 
 
$ sbsign --key db.key --cert db.crt --output BOOTx64.EFI BOOTx64.EFI
 
$ sbsign --key db.key --cert db.crt --output BOOTIA32.EFI BOOTIA32.EFI
 
$ sbsign --key db.key --cert db.crt --output shellx64.efi shellx64.efi
 
$ sbsign --key db.key --cert db.crt --output shellia32.efi shellia32.efi
 
$ sbsign --key db.key --cert db.crt --output vmlinuz-linux vmlinuz-linux
 
 
ブートローダーと UEFI シェルを {{ic|eltorito_img2_uefi.img}} にコピーしてください。これは EFI システムパーティションとして使用され、El Torito UEFI ブートイメージとしてリストアップされます。{{ic|eltorito_img2_uefi.img}} のサイズは固定されていますが、丸め/アライメントのためや予約済みセクタに対処するために ''mkarchiso'' によって 1 MiB の空き領域が追加されています。なので、署名によるサイズ増は問題にはならないはずです。
 
 
$ mcopy -D oO -i eltorito_img2_uefi.img BOOTx64.EFI BOOTIA32.EFI ::/EFI/BOOT/
 
$ mcopy -D oO -i eltorito_img2_uefi.img shellx64.efi shellia32.efi ::/
 
 
変更された El Torito UEFI ブートイメージを使って ISO を再パックし、署名されたブートローダーのファイル、UEFI シェル、カーネルを ISO 9660 に追加してください:
 
 
{{bc|
 
$ xorriso -indev archlinux-''YYYY.MM.DD''-x86_64.iso \
 
-outdev archlinux-''YYYY.MM.DD''-x86_64-Secure_Boot.iso \
 
-boot_image any replay \
 
-append_partition 2 0xef eltorito_img2_uefi.img \
 
-map BOOTx64.EFI /EFI/BOOT/BOOTx64.EFI \
 
-map BOOTIA32.EFI /EFI/BOOT/BOOTIA32.EFI \
 
-map shellx64.efi /shellx64.efi \
 
-map shellia32.efi /shellia32.efi \
 
-map vmlinuz-linux /arch/boot/x86_64/vmlinuz-linux
 
 
}}
 
}}
   
  +
=== ディストリビューションのロゴを表示してくれない ===
完成した {{ic|archlinux-''YYYY.MM.DD''-x86_64-Secure_Boot.iso}} を起動してみてください。
 
   
  +
Arch のロゴではなく [[Wikipedia:ja:タックス|Tux]] が表示される場合、[https://sourceforge.net/p/refind/discussion/general/thread/767ddd52/ この問題]によるものであるかもしれません (ルートパーティションのタイプが ''Linux filesystem'' ではなく ''Linux x86-64 root (/)'' である場合)。
=== ブートローダを PreLoader に置き換える ===
 
   
  +
[[fdisk#パーティションタイプの変更|パーティションタイプを変更する]]ことで、この問題を解決することができます。
公式の ISO イメージにセキュアブートのサポートを追加するもう一つの方法は、ブートローダを抽出し、それを [[#PreLoader]] で置き換えることです。
 
   
  +
加えて、ルートパーティションのラベルが "Linux" であったり、"linux," という単語が含まれている場合にも、Tux が表示される場合があります。ディストリビューションの名前に合ったパーティションラベルに変更することを検討してください
{{Note|ISO の GRUB EFI バイナリ ({{ic|EFI/BOOT/BOOTx64.EFI}}) は {{ic|--disable-shim-lock}} でビルドされているため、shim で使用することはできません。これは GRUB の制限であり、GRUB に shim かカスタムの署名のどちらか一方との互換性を持たせることはできますが、同時に両方との互換性を持たせることはできません。}}
 
   
  +
この問題は、[[永続的なブロックデバイスの命名#by-label|ファイルシステムラベル]]を使用することで解決できます。
まず、ブートローダと El Torito ブートイメージを抽出してください。
 
   
  +
Tux ではなく Arch のロゴを表示させるもう一つの方法は、Arch のロゴ画像をカーネル (例えば {{ic|vmlinuz-linux}}) と同じ場所にコピーし、画像ファイルの名前をカーネルイメージのファイル名と同じにすることです:
{{bc|
 
$ osirrox -indev archlinux-''YYYY.MM.DD''-x86_64.iso \
 
-extract_boot_images ./ \
 
-cpx /EFI/BOOT/BOOTx64.EFI ./
 
}}
 
   
  +
# cp /usr/share/refind/icons/os_arch.png /boot/vmlinuz-linux.png
{{ic|BOOTx64.efi}} ファイルを PreLoader に置き換えてください:
 
 
{{bc|
 
$ mv BOOTx64.EFI loader.efi
 
$ cp /usr/share/preloader-signed/PreLoader.efi BOOTx64.EFI
 
$ cp /usr/share/preloader-signed/HashTool.efi HashTool.efi
 
}}
 
 
新しいファイルをブートイメージに追加してください:
 
 
$ mcopy -D oO -i eltorito_img2_uefi.img BOOTx64.EFI loader.efi HashTool.efi ::/EFI/BOOT/
 
 
最後に、変更されたブートイメージと新しいブートローダファイルを使って ISO を再パックしてください。
 
 
{{bc|
 
$ xorriso -indev archlinux-''YYYY.MM.DD''-x86_64.iso \
 
-outdev archlinux-''YYYY.MM.DD''-x86_64-Secure_Boot.iso \
 
-boot_image any replay \
 
-append_partition 2 0xef eltorito_img2_uefi.img \
 
-map_l ./ /EFI/BOOT/ BOOTx64.EFI loader.efi HashTool.efi
 
}}
 
   
 
== 参照 ==
 
== 参照 ==
   
  +
* Roderick W. Smith による [https://www.rodsbooks.com/refind/ The rEFInd Boot Manager]
* [https://edk2-docs.gitbook.io/understanding-the-uefi-secure-boot-chain/ Understanding the UEFI Secure Boot Chain] by tianocore
 
* [[Wikipedia:Unified Extensible Firmware Interface#Secure boot]]
+
* [[Wikipedia:rEFInd]]
  +
* {{ic|/usr/share/refind/docs/README.txt}}
* [https://www.rodsbooks.com/efi-bootloaders/secureboot.html Dealing with Secure Boot] by Rod Smith
 
  +
* [https://sourceforge.net/p/refind/discussion/ Sourceforge の rEFInd ディスカッションフォーラム]
* [https://www.rodsbooks.com/efi-bootloaders/controlling-sb.html Controlling Secure Boot] by Rod Smith
 
* [https://mjg59.dreamwidth.org/5850.html UEFI secure booting (part 2)] by Matthew Garrett
 
* [https://blog.hansenpartnership.com/uefi-secure-boot/ UEFI Secure Boot] by James Bottomley
 
* [https://git.kernel.org/cgit/linux/kernel/git/jejb/efitools.git/tree/README efitools README]
 
* [https://www.fsf.org/campaigns/secure-boot-vs-restricted-boot Will your computer's "Secure Boot" turn out to be "Restricted Boot"?] — Free Software Foundation
 
* [https://www.fsf.org/campaigns/secure-boot-vs-restricted-boot/statement/campaigns/secure-boot-vs-restricted-boot/whitepaper-web Free Software Foundation recommendations for free operating system distributions considering Secure Boot]
 
* [https://web.archive.org/web/20150928202110/https://firmware.intel.com/messages/219 Intel's UEFI Secure Boot Tutorial]
 
* [http://dreamhack.it/linux/2015/12/03/secure-boot-signed-modules-and-signed-elf-binaries.html Secure Boot, Signed Modules and Signed ELF Binaries]
 
* 国家安全保障局のドキュメント: [https://www.nsa.gov/Portals/70/documents/what-we-do/cybersecurity/professional-resources/ctr-uefi-defensive-practices-guidance.pdf UEFI Defensive Practices Guidance] と機密を解かれた[https://media.defense.gov/2020/Sep/15/2002497594/-1/-1/0/CTR-UEFI-SECURE-BOOT-CUSTOMIZATION-20200915.PDF/CTR-UEFI-SECURE-BOOT-CUSTOMIZATION-20200915.PDF UEFI Secure Boot customization]
 
* [http://jk.ozlabs.org/docs/sbkeysync-maintaing-uefi-key-databases/ sbkeysync & maintaining uefi key databases] by Jeremy Kerr
 
* [https://nwildner.com/posts/2020-07-04-secure-your-boot-process/ Secure your boot process: UEFI + Secureboot + EFISTUB + Luks2 + lvm + Arch Linux] (2020-07)
 
* [https://security.stackexchange.com/questions/29122/how-is-hibernation-supported-on-machines-with-uefi-secure-boot How is hibernation supported, on machines with UEFI Secure Boot?] (Security StackExchange)
 
* [http://0pointer.net/blog/authenticated-boot-and-disk-encryption-on-linux.html Authenticated Boot and Disk Encryption on Linux] by Lennart Poettering (2021-09-23)
 
   
{{TranslationStatus|Unified Extensible Firmware Interface/Secure Boot|2023-09-09|787225}}
+
{{TranslationStatus|rEFInd|2023-11-11|792041}}

2023年11月11日 (土) 16:39時点における版

関連記事

rEFIndUEFI ブートマネージャーです。EFISTUB カーネルを起動することができます。既にメンテナンスされてない rEFIt のフォークであり、Mac 以外の UEFI ブートに関して多数の問題が修正されています。プラットフォームに依存せず、複数の OS を簡単に起動できるように設計されています。

ノート: この記事では EFI システムパーティションのマウントポイントを esp で示します。

サポートされているファイルシステム

rEFInd は、ファイルシステムのサポートをファームウェアから継承します (つまり、少なくとも FAT12、FAT16、FAT32 はサポートされることを意味します)。加えて、rEFInd は、ESP 上の自身のインストールディレクトリ内のサブディレクトリ driversdrivers_x64 (例: esp/EFI/refind/drivers_x64/) 内にある UEFI ドライバもロードします。

また、rEFInd には少数の読み取り専用 EFI ファイルシステムドライバ (特に ext4Btrfs) も同梱されています。

インストール

refind パッケージをインストールしてください。

rEFInd ブートマネージャをインストールする

rEFInd には、ReiserFS (非推奨)、Ext2、Ext4、Btrfs、ISO-9660、HFS+ の 読み取り専用 サポートを実装する UEFI ドライバが同梱されています。さらに、rEFInd は、UEFI 自体によってアクセス可能な任意のファイルシステムにアクセスできます。これには、FAT (UEFI 仕様によって義務付けられています)、Mac の HFS+、一部のシステムでは ISO-9660 が含まれています。

他のドライバーについては The rEFInd Boot Manager: Using EFI Drivers: Finding Additional EFI Drivers を参照してください。

rEFInd を使うには、refind-install スクリプト を使うか、rEFInd のファイルをコピーし、ブートエントリを手動でセットアップして、rEFInd を EFI システムパーティションにインストールしなければなりません。

警告: カーネルと initramfs は、rEFInd によって読み込むことのできるファイルシステム上に存在していなければなりません。

refind-install スクリプトによるインストール

rEFInd パッケージには refind-install というスクリプトが含まれており、簡単に rEFInd をデフォルトの EFI ブートエントリに設定できます。このスクリプトにはオプションが存在し、様々なセットアップや UEFI 実装に対応しています。様々なインストールオプションの説明は、refind-install(8) やインストールスクリプトのコメントを見てください。

多くのシステムでは以下を実行するだけで十分なはずです:

# refind-install

このコマンドは、ESP を検出しマウントしようと試み、rEFInd のファイルを esp/EFI/refind/ にコピーし、efibootmgr を使って rEFInd をデフォルトの EFI ブートアプリケーションにします。

または、デフォルト/フォールバックのブートパスである esp/EFI/BOOT/bootx64.efi に rEFInd をインストールすることもできます。ブータブルな USB フラッシュドライブや、efibootmgr による NVRAM の変更に問題を抱えているシステム等で有用です:

# refind-install --usedefault /dev/sdXY

/dev/sdXY は EFI システムパーティションです (マウントポイントではなく、ブロックデバイスを指定してください)。

ヒント: デフォルトでは refind-install はカーネルの存在するファイルシステムのドライバーだけをインストールします。他にもドライバーが必要な場合は、/usr/share/refind/drivers_x64/ から esp/EFI/refind/drivers_x64/ にドライバを手動でコピーしてインストールしてください。もしくは --alldrivers オプションで全てのドライバーをインストールすることもできます。ブータブルな USB フラッシュドライブなどでは全てのドライバーをインストールすると便利です。

rEFInd のファイルを ESP にインストールしたら、rEFInd が作成した refind_linux.conf (カーネルと同じディレクトリにあります) に必要なカーネルパラメータが含まれていることを確認してください。--usedefault オプションを使用した場合はこの設定ファイルは作成されません。root として mkrlconf を実行して作成してください。

警告: chroot で refind-install を実行する場合 (Arch Linux をライブ環境でインストールする際など)、/boot/refind_linux.conf が作られるときに実際にインストールされる環境ではなくライブ環境のカーネルオプションが使われます。そのため /boot/refind_linux.conf を編集し、カーネルパラメータがシステムにおいて正しいことを確認してください。さもないと、次回のブート時にカーネルパニックが発生する可能性があります。設定ファイルの例は #refind_linux.conf を見てください。

デフォルトでは、rEFInd は (rEFInd にそのドライブ用のドライバが存在する) すべてのドライブをスキャンし、発見した EFI ブートローダーのブートエントリを追加します。これにはカーネルも含まれているはずです (Arch Linux はデフォルトで EFISTUB が有効化されているからです)。なので、この時点でブータブルなシステムが出来上がっているでしょう。

Secure Boot

rEFInd におけるセキュアブートのサポートについては Managing Secure Boot を参照してください。

PreLoader を使う

セキュアブート#PreLoader をセットアップする を参照して署名済みの PreLoader.efiHashTool.efi バイナリを用意してください。

--preloader /path/to/preloader オプションを付けて refind-install を実行します:

# refind-install --preloader /usr/share/preloader-signed/PreLoader.efi

セキュアブートを有効にして起動すると、HashTool が起動するので rEFInd のハッシュ (loader.efi) と rEFInd のドライバー (例: ext4_x64.efi) そしてカーネル (例: vmlinuz-linux) を登録してください。

詳しくは refind-install(8) を見てください。

ヒント: 署名済み HashTool は、HashToolが起動されたパーティションだけにアクセスすることができます。カーネルが ESP 上にない場合、HashTool からハッシュを登録することはできなくなります。#KeyTool を使うことで問題を回避できます (KeyTool は MokList のハッシュを登録でき、さらに1つのパーティションに制限されないからです)。KeyTool は使用する前に必ずハッシュを登録するようにしてください。
shim を使う

shim-signedAURインストールしてください。セキュアブート#shim を読んでください。ただし、ファイルをコピーする部分はすべてスキップしてください。

ハッシュを使う

shim でハッシュだけを使うには、refind-install--shim /path/to/shim オプションで実行してください:

# refind-install --shim /usr/share/shim-signed/shimx64.efi

次回セキュアブートを有効化した状態で起動すると、MokManager が起動します。その時、rEFInd (grubx64.efi)、rEFInd のドライバ (例: ext4_x64.efi)、カーネル (例: vmlinuz-linux) のハッシュを登録する必要があります。

Machine Owner Key を使う

rEFInd を Machine Owner Key (MOK) で署名するには、sbsigntools をインストールしてください。

ヒント: 既に MOK を作成しているのであればファイルを refind_local.key (PEM 形式秘密鍵)、refind_local.crt (PEM 形式証明書)、refind_local.cer (DER 形式証明書) という名前で /etc/refind.d/keys ディレクトリに配置してください。

--shim /path/to/shim--localkeys オプションを付けて refind-install を実行します:

# refind-install --shim /usr/share/shim-signed/shimx64.efi --localkeys

refind-install は鍵を作成して自分自身とドライバーに署名します。同じ鍵を使ってカーネルに署名する必要があります。例:

# sbsign --key /etc/refind.d/keys/refind_local.key --cert /etc/refind.d/keys/refind_local.crt --output /boot/vmlinuz-linux /boot/vmlinuz-linux
ヒント: カーネルの署名は mkinitcpio のポストフックを使って自動化できます。Unified Extensible Firmware Interface/セキュアブート#mkinitcpio のポストフックでカーネルに署名する を見てください。

MokManager で refind_local.cer を MoKList に追加してください。refind_local.cer は rEFInd のインストールディレクトリ (例えば esp/EFI/refind/keys/refind_local.cer) の keys という名前のディレクトリに存在します。

詳しくは refind-install(8) を参照してください。

自分の鍵を使う

セキュアブート#自分の鍵を使う に従って鍵を作成してください。

/etc/refind.d/keys ディレクトリを作成して署名データベース (db) 鍵と証明書を保存します。ファイルの名前は次のとおりにしてください: refind_local.key (PEM 形式秘密鍵)、refind_local.crt (PEM 形式証明書)、refind_local.cer (DER 形式証明書)。

インストールスクリプトの実行時に --localkeys オプションを付け加えます。例:

# refind-install --localkeys

これで rEFInd の EFI バイナリが自分の鍵と証明書で署名されます。

手動インストール

ヒント: rEFInd は様々な方法で Linux を起動することができます。The rEFInd Boot Manager: Methods of Booting Linux でそれらの方法が触れられています。

refind-install スクリプトが上手く動かない場合、rEFInd を手動でセットアップすることができます。

まず実行可能ファイルを ESP にコピーしてください:

# mkdir -p esp/EFI/refind
# cp /usr/share/refind/refind_x64.efi esp/EFI/refind/

rEFInd をデフォルト/フォールバックブートパスにインストールしたい場合は、以下の指示で esp/EFI/refind/esp/EFI/BOOT/ に置き換え、rEFInd の EFI 実行ファイルを esp/EFI/BOOT/bootx64.efi にコピーしてください:

# mkdir -p esp/EFI/BOOT
# cp /usr/share/refind/refind_x64.efi esp/EFI/BOOT/bootx64.efi

それから efibootmgr を使って UEFI の NVRAM にブートエントリを作成してください (/dev/sdXY はあなたの ESP のマウントポイントに合わせて置き換えて下さい)。rEFInd をデフォルト/フォールバックのブートパス esp/EFI/BOOT/bootx64.efi にインストールした場合は、このステップは省略してもかまいません。

# efibootmgr --create --disk /dev/sdX --part Y --loader /EFI/refind/refind_x64.efi --label "rEFInd Boot Manager" --unicode

この時点で rEFInd で起動することができるようになっているはずです。ただしカーネルを起動することはできません。カーネルが ESP にない場合、(適切なドライバーが存在するとき) rEFInd はパーティションをマウントしてカーネルを検索することができます。

rEFInd はインストールディレクトリに存在する driversdrivers_arch (例: drivers_x64) サブディレクトリから全てのドライバーを自動的にロードします。

# mkdir esp/EFI/refind/drivers_x64
# cp /usr/share/refind/drivers_x64/drivername_x64.efi esp/EFI/refind/drivers_x64/

これで rEFInd はカーネルのブートエントリが用意できているはずですが、適切なカーネルパラメータが渡されていません。#カーネルパラメータを渡す を行って下さい。それによって rEFInd を使ってカーネルを起動することができるようになります。この段階で起動ができない、または rEFInd の設定を変更したい場合、設定ファイルを使ってオプションを変更することができます:

# cp /usr/share/refind/refind.conf-sample esp/EFI/refind/refind.conf

サンプル設定ファイルにたくさんコメントが付いているので開いてみて下さい。

設定ファイルに textonly を設定していない場合、rEFInd のアイコンをコピーしないとプレースホルダが表示されます:

# cp -r /usr/share/refind/icons esp/EFI/refind/

フォントをコピーして refind.conffont 設定を変更することで他のフォントを使うこともできます:

# cp -r /usr/share/refind/fonts esp/EFI/refind/
ヒント: rEFInd のメニューで F10 を押すと ESP の一番上のディレクトリにスクリーンショットが保存されます。

アップグレード

Pacman は /usr/share/refind/ にある rEFInd のファイルをアップデートしますが、ESP に新しいファイルをコピーしたりはしません。refind-install で rEFInd のインストールが上手くいっているのであれば、再度実行することでアップデートされたファイルをコピーできます。新しい設定ファイルは refind.conf-sample としてコピーされるので、差分ツールを使って設定ファイルをマージすることができます。rEFInd が#手動インストールを必要とする場合、どのファイルが必要なのかは自分で判断してコピーする必要があります。

Pacman フック

Pacman フックを使うことでアップデートの処理を自動化することができます:

/etc/pacman.d/hooks/refind.hook
[Trigger]
Operation=Upgrade
Type=Package
Target=refind

[Action]
Description = Updating rEFInd on ESP
When=PostTransaction
Exec=/usr/bin/refind-install

Exec= の部分は、あなたの環境で正しく動作するアップデートコマンドに変更する必要があるかもしれません。#手動インストールを行った場合は、フックから呼び出す独自のアップデートスクリプトを作成することで、アップデートを自動化できます。

ヒント: #Secure Boot で rEFInd をセットアップした場合、--localkeys を追加することに加えて、--yes オプションも refind-install コマンドに追加する必要があるかもしれません。このオプションは、Secure Boot が無効化されているときにこのコマンドが実行された場合に、コマンドの実行が失敗するのを防ぐことができます。詳細は、refind-install(8) を見てください。
ノート: ESP が /boot にマウントされておらず、ESP の自動マウントに頼っている場合、EFI システムパーティション#代替のマウントポイント で説明されているように、vfat モジュールをプリロードしてください。さもないと、refind がカーネルと共にアップグレードされた場合に、ESP にアクセスできなくなってしまいます。

設定

rEFInd の設定ファイル refind.conf は rEFInd の EFI アプリケーションと同じディレクトリに存在します (大抵は esp/EFI/refind あるいは esp/EFI/BOOT)。デフォルト設定ファイルにはオプションの詳細な説明が含まれており、さらに詳しい説明は Configuring the Boot Manager に載っています。

カーネルパラメータを渡す

rEFInd によってカーネルに渡されるカーネルパラメータを設定する方法は2つあります。

rEFInd によって自動的に検出されたカーネルの場合

自動的に検出されたカーネルの場合、/boot/refind_linux.conf に明示的にカーネルパラメータを指定したり、あるいはルータパーティションとカーネルパラメータを特定する rEFInd の機能に頼ったりできます。詳細は Methods of Booting Linux: For Those With Foresight or Luck: The Easiest Method を見てください。

ヒント:

rEFInd で Arch Linux カーネルの命名規則をサポートし、カーネルとそれぞれの initramfs イメージがマッチするようにするには、refind.conf 内の extra_kernel_version_strings をアンコメントし編集する必要があります。例えば:

esp/EFI/refind/refind.conf
...
extra_kernel_version_strings linux-hardened,linux-rt-lts,linux-zen,linux-lts,linux-rt,linux
...
ノート:
  • rEFInd はカーネルごとに1つの initramfs しか検出しません。つまり、フォールバック initramfs やマイクロコードのイメージは検出されないことになります。それらは手動で指定しなければなりません。
  • 上記の extra_kernel_version_strings 行が無いと、refind_linux.conf 内の %v 変数は Arch Linux カーネルにおいて機能しません。
refind_linux.conf

rEFInd が自動的にカーネルを検出する場合、カーネルパラメータの含まれている refind_linux.conf ファイルはそのカーネルと同じディレクトリに置くことができます。/usr/share/refind/refind_linux.conf-sample を設定ファイルのベースにすることができます。refind_linux.conf の1つ目のアンコメントされている行がカーネルのデフォルトパラメータとなります。それ以降の行は +F2Insert を使ってアクセスできるサブメニュー内にエントリを作成します。

あるいは、mkrlconf を root として実行してみてください。このスクリプトは、/boot 内からカーネルを探し、自動的に refind_linux.conf を生成しようと試みます。このスクリプトは、最も基本的なカーネルパラメータしか設定しませんので、作成されたファイルが正しいかを確認してください。

initrd= パラメータを指定しない場合、カーネルと同じディレクトリから一般的な RAM ディスクのファイル名を探索して自動的にそのパラメータを追加します。複数の initrd= パラメータが必要な場合、手動でそれらを refind_linux.conf で指定しなければなりません。例えば、initramfs の前にマイクロコードを渡す場合:

/boot/refind_linux.conf
"Boot using default options"     "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw add_efi_memmap initrd=boot\intel-ucode.img initrd=boot\amd-ucode.img initrd=boot\initramfs-%v.img"
"Boot using fallback initramfs"  "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw add_efi_memmap initrd=boot\intel-ucode.img initrd=boot\amd-ucode.img initrd=boot\initramfs-%v-fallback.img"
"Boot to terminal"               "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw add_efi_memmap initrd=boot\intel-ucode.img initrd=boot\amd-ucode.img initrd=boot\initramfs-%v.img systemd.unit=multi-user.target"
警告:
  • initrd のパスは、カーネルの存在するファイルシステムのルートディレクトリからの相対パスです。これは initrd=\boot\initramfs-%v.img だったり、(/boot が ESP などの別のパーティションに存在する場合) initrd=initramfs-%v.img だったりします。
  • initrd パラメータではパスのセパレータとしてバックスラッシュ (\) を使用してください。さもないと、カーネルは initramfs イメージを見つけることができないかもしれません: EFI stub: ERROR: Failed to open file: /boot/intel-ucode.img
  • Booster によって生成された initramfs イメージを使用する場合は、initramfs ファイルの名前の initramfsbooster に置き換えてください。例: initrd=\boot\booster-%v.img
ノート:
  • 引用符は、繰り返すことによりエスケープできます (つまり、""" のエスケープ版です)。例えば、上記の refind_linux.conf の最初のブートエントリにオプション "acpi_osi=Windows 2015" を渡すには:
    "Boot using default options"     "... initrd=boot\initramfs-%v.img acpi_osi=""Windows 2015"" "
  • rEFInd は、(カーネルのファイル名から抽出することにより) refind_linux.conf 内の %v をカーネルのバージョンに置き換えます。rEFInd で Arch Linux カーネルをサポートするには、esp/EFI/refind/refind.conf 内の extra_kernel_version_strings#rEFInd によって自動的に検出されたカーネルの場合 で説明されているように編集しなければなりません。
設定しない

rEFInd を ESP 上にインストールしただけで、それ以上の操作をせずに (例えば、UEFI シェルや KeyTool、ファームウェアから直接) rEFInd を起動すると、(なんの設定もせずに) 自動検出によって作成されたブートメニュが表示されます。

これがうまく行くのは、rEFInd にフォールバック機構があるからです。この機能は以下のようなことができます:

ノート: rEFInd はエスケープコードをサポートしていません (例えば、/etc/fstab でのファイルパスのスペース)。

手動でブートエントリを記述する

カーネルが自動検出されない場合、もしくはメニューエントリのオプションを自分で設定したい場合、手動で refind.conf にブートエントリを作成することができます。scanfor には manual を含めて下さい、そうしないとエントリが rEFInd のメニューに表示されません。カーネルパラメータは options キーワードで設定できます。rEFInd は initrd キーワードで指定されたファイルを使って initrd= パラメータを追加します。initrd を追加する必要がある場合 (例: マイクロコード)、options で指定してください (initrd キーワードで指定された initrd が最後に追加されます)。

手動でのブートエントリの記述については Creating Manual Boot Stanzas で説明されています。

esp/EFI/refind/refind.conf
...

menuentry "Arch Linux" {
	icon     /EFI/refind/icons/os_arch.png
	volume   "Arch Linux"
	loader   /boot/vmlinuz-linux
	initrd   /boot/initramfs-linux.img
	options  "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw add_efi_memmap initrd=boot\intel-ucode.img initrd=boot\amd-ucode.img"
	submenuentry "Boot using fallback initramfs" {
		initrd /boot/initramfs-linux-fallback.img
	}
	submenuentry "Boot to terminal" {
		add_options "systemd.unit=multi-user.target"
	}
}

カーネルの存在するパーティションのファイルシステム LABELPARTLABELPARTUUID のどれかとマッチするように volume を変更する必要があるでしょう。PARTUUID は大文字である必要があります。ボリュームラベルの割当の例は 永続的なブロックデバイスの命名#by-label を見てください。volume が指定されていない場合、rEFInd が起動したパーティション (典型的には EFI システムパーティション) のボリュームをデフォルトとして使用します。

警告:
  • loaderinitrd のパスは、カーネルの存在するファイルシステムのルートディレクトリからの相対パスです。/boot が ESP などの別のパーティションに存在する場合、loader と initrd のパスはそれぞれ /vmlinuz-linux/initramfs-linux.img となります。
  • 引用符で囲まれた initrd パラメータすべてで、パスのセパレータとしてバックスラッシュ (\) を使用してください。さもないと、カーネルは initramfs イメージを見つけることができないかもしれません: EFI stub: ERROR: Failed to open file: /boot/initramfs-linux.img
  • Booster によって生成された initramfs イメージを使用する場合は、initramfs ファイルの名前の initramfsbooster に置き換えてください。例: initrd /boot/booster-linux.img
ノート: 引用符は、繰り返すことによりエスケープできます (つまり、""" のエスケープ版です)。例えば、オプション "acpi_osi=Windows 2015" を上記のブートエントリ "Arch Linux" に渡すには:
options  "... initrd=boot\amd-ucode.img acpi_osi=""Windows 2015"" "

既存の UEFI Windows 環境で rEFInd を使う

ノート: 基本的には Windows と Arch のデュアルブートに書かれていることが適用されます。

rEFInd は UEFI の Windows をインストールしたときに作成される EFI システムパーティションに対応しているため、Windows と一緒に Arch をインストールする際にもうひとつ FAT32 パーティションを作成・フォーマットする必要はありません。Windows の ESP をマウントして通常通りに rEFInd をインストールするだけです。デフォルトで、rEFInd の自動検出機能が既存の Windows (リカバリ) ブートローダーを認識するはずです。

ノート: 一部のケースで、Windows は異なった挙動をします (低解像度の起動画面、OEM ロゴが Windows のロゴに置き換わる、起動画面のあとに黒画面、アーティファクト)。そのような問題に遭遇した場合、esp/EFI/refind/refind.confuse_graphics_for +,windows を設定するか、Windows のブート設定に graphics on を追加してみてください。

ツール

rEFInd は、様々なサードパーティーツールの実行をサポートしています。ツールは別途インストールする必要があります。refind.conf 内の showtools を編集して表示したいツールを選択してください。

esp/EFI/refind/refind.conf
...
showtools shell, memtest, mok_tool, gdisk, fwupdate ...
...

UEFI シェル

Unified Extensible Firmware Interface#UEFI シェル を見てください。

EFI システムパーティションのルートに shellx64.efi をコピーしてください。

Memtest86+

memtest86+-efi をインストールし、それを esp/EFI/tools/ にコピーしてください。

# cp /boot/memtest86+/memtest.efi esp/EFI/tools/memtest86.efi

鍵管理ツール

rEFInd can detect Secure Boot key management tools if they are placed in rEFInd's directory on ESP, esp/ or esp/EFI/tools/.

HashTool

#PreLoader を使う に従ってください。HashTool.efi は rEFInd のディレクトリに配置されます。

MokManager

#shim を使う に従ってください。MokManager は rEFInd のディレクトリに配置されます。

KeyTool

efitools をインストールしてください。

KeyTool EFI バイナリを KeyTool.efiKeyTool-signed.efi という名前で esp/esp/EFI/tools/ に配置してください。

KeyTool.efi を署名する方法については セキュアブート#KeyTool を使う を見てください。

GPT fdisk (gdisk)

gdisk EFI アプリケーションをダウンロードし、gdisk_x64.efiesp/EFI/tools/ にコピーしてください。

fwupd

fwupd-efi をインストールし、fwupd をセットアップしてください。

fwupdx64.efi バイナリとファームウェアファイルを esp/EFI/tools/ にコピーしてください:

# cp /usr/lib/fwupd/efi/fwupdx64.efi esp/EFI/tools/

電源オフや再起動

rEFInd には電源オフと再起動のメニューエントリが組み込まれていると報告されています。このツールのリストはこの Wiki ではとても広範囲なものなので、UEFI や他の UEFI ブートマネージャ (例えば systemd-boot) のユーザは、powerofforreboot.efiAUR に興味を持つかもしれません。

ヒントとテクニック

UEFI シェルでドライバを使用する

rEFInd のドライバを UEFI シェル内で使用するには、load コマンドを使ってロードし、マッピングされたドライバを map -r コマンドを使ってリフレッシュしてください。

Shell> load FS0:\EFI\refind\drivers\ext4_x64.efi
Shell> map -r

これで、UEFI シェルからファイルシステムにアクセスできるようになりました。

efifb の解像度を設定する

refind.conf で解像度が間違った値に設定されている場合、Apple Mac を除くすべてのシステムで rEFInd は、サポートされている解像度のリストを表示します。Apple Mac の場合は、rEFInd はサイレントにデフォルトの解像度を使用します。

efifb によってサポートされているフレームバッファの解像度を判断するには、/usr/share/gnu-efi/apps/x86_64/modelist.efignu-efi から ESP のルートディレクトリにコピーしてください。UEFI シェル に入り、modelist.efi を実行してください。

Shell> FS0:\modelist.efi
GOP reports MaxMode 3
 0: 640x480 BGRR pitch 640
*1: 800x600 BGRR pitch 800
 2: 1024x768 BGRR pitch 1024

どれかの解像度を refind.conf で設定してください。再起動し、dmesg | grep efifb を root として実行して設定が反映されていることを確認してください。

Btrfs サブボリュームのサポート

ヒント: btrfs_x64.efi ドライバがインストールされていることを確認してください。/usr/share/refind/drivers_x64/btrfs_x64.efi から esp/EFI/refind/drivers_x64/btrfs_x64.efi にコピーすることで手動でインストールできます。または、refind-install /dev/sdx --alldrivers オプションですべてのドライバをインストールできます。
警告: btrfs_x64.efiraid1c3/4 をサポートしていません。

自動検出

Btrfs ボリューム上でカーネルの自動検出を有効にするには、refind.conf 内の also_scan_dirs をアンコメントしてください。

esp/EFI/refind/refind.conf
...
also_scan_dirs +,subvolume/boot
...

次に、refind_linux.conf 内の rootflagssubvol=subvolume を追加してください。そして、initrd のパスの先頭に subvolume を追加してください。

/boot/refind_linux.conf
"Boot using standard options"  "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw rootflags=subvol=subvolume initrd=subvolume\boot\initramfs-%v.img"

マニュアルブートの設定

btrfs サブボリュームをルートとして起動する場合、サブボリュームへのパスをローダーと initrd のパスの先頭に追加し、options の行を rootflags=subvol=root_subvolume のように変更してください。以下の例では、ルートは 'ROOT' という名前で btrfs サブボリュームとしてマウントされています (例: mount -o subvol=ROOT /dev/sdxY /mnt):

esp/EFI/refind/refind.conf
...
menuentry "Arch Linux" {
        icon     /EFI/refind/icons/os_arch.png
        volume   "[bootdevice]"
        loader   /ROOT/boot/vmlinuz-linux
        initrd   /ROOT/boot/initramfs-linux.img
        options  "root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw rootflags=subvol=ROOT"
...
}

そうしないと、次のようなエラーが発生します: ERROR: Root device mounted successfully, but /sbin/init does not exist.

LoaderDevicePartUUID

バージョン 0.13.1 以降、rEFInd は UEFI 変数 LoaderDevicePartUUID の設定をサポートしています 。これを有効化すると、systemd-gpt-auto-generator(8) が EFI システムパーティションを、/etc/fstab で指定せずに自動マウントできるようになります。systemd#GPT パーティションの自動マウント を見てください。

rEFInd が LoaderDevicePartUUID を設定できるようにするには、refind.conf を編集して write_systemd_vars true をアンコメントしてください:

esp/EFI/refind/refind.conf
...
write_systemd_vars true
...

cat /sys/firmware/efi/efivars/LoaderDevicePartUUID-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f で値を確認するか、bootctl の出力の "Boot loader sets ESP information" の状態を見ることで、この変数が設定されていることを確認できます。

トラブルシューティング

Apple Mac

mactel-bootAUR は Linux 用の実験的な bless ユーティリティです。これが動作しないときは、OSX の中から bless を使って rEFInd をデフォルトのブートローダに設定してください:

# bless --setBoot --folder esp/EFI/refind --file esp/EFI/refind/refind_x64.efi

空の rEFInd メニュースクリーン

drivers_x64 フォルダにファイルシステムドライバが複数存在すると (#rEFInd ブートマネージャをインストールする を参照)、ファイルシステムドライバのバグによって rEFInd が正しく機能しなくなり、rEFInd のロゴだけの空白画面 (カスタムテーマの場合は、背景画像) が表示されることがあります。これを修正するには、カーネルの存在するファイルシステム用のドライバ以外のすべてのドライバを削除してください。

また、Windows とデュアルブートしている場合に rEFInd が他のディスク上の EFI システムパーティションの自動スキャンに失敗して、空白画面が発生することもあります。これを修正するには、blkid を使って Windows パーティションを特定し、それぞれの Windows パーティションの PARTUUIDrefind.conf 内の dont_scan_volumes 変数にコンマで区切って追加してください。例えば:

# blkid
/dev/nvme0n1p1: LABEL="SYSTEM" UUID="4CE7-C215" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="EFI system partition" PARTUUID="13aa9955-1234-5678-9098-006c334b5088"
/dev/nvme0n1p5: LABEL="Windows RE Tools" BLOCK_SIZE="512" UUID="08C4E6C5C4E6B45A" TYPE="ntfs" PARTLABEL="Basic data partition" PARTUUID="4eced110-0987-6543-2123-b0ab8576869b"
esp/EFI/refind/refind.conf
...
dont_scan_volumes 13aa9955-1234-5678-9098-006c334b5088,4eced110-0987-6543-2123-b0ab8576869b
...

ディストリビューションのロゴを表示してくれない

Arch のロゴではなく Tux が表示される場合、この問題によるものであるかもしれません (ルートパーティションのタイプが Linux filesystem ではなく Linux x86-64 root (/) である場合)。

パーティションタイプを変更することで、この問題を解決することができます。

加えて、ルートパーティションのラベルが "Linux" であったり、"linux," という単語が含まれている場合にも、Tux が表示される場合があります。ディストリビューションの名前に合ったパーティションラベルに変更することを検討してください

この問題は、ファイルシステムラベルを使用することで解決できます。

Tux ではなく Arch のロゴを表示させるもう一つの方法は、Arch のロゴ画像をカーネル (例えば vmlinuz-linux) と同じ場所にコピーし、画像ファイルの名前をカーネルイメージのファイル名と同じにすることです:

# cp /usr/share/refind/icons/os_arch.png /boot/vmlinuz-linux.png

参照

翻訳ステータス: このページは en:rEFInd の翻訳バージョンです。最後の翻訳日は 2023-11-11 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。