EFI スタブ

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page EFI stub and the translation is 98% complete.
Other languages:
Resources
This article has some todo items:
  • CONFIG_PM_STD_PARTITION for hibernation

多くのコンピュータに存在する (U)EFI ファームウェアはブートマネージャとして機能し、対応した EFI ブートローダを使用してシステムをブートすることができます。カーネル 自体をこのようなブートローダ (EFI スタブと呼ばれます) にすることで、2 次ブートローダを必要とせずにブートすることができます。この記事では、カーネルを設定して、EFI モードで実行中のコンピュータの EFI システムパーティション (ESP) にインストールするための手順を提供します。

カーネル設定

ヒント
EFI システムパーティションの手順に従って、先に ESP をセットアップしておいてください。

以下のカーネル設定オプションが有効化されていなくてはなりません:

カーネル カーネル 6.1+ に対して EFI スタブサポートを有効化する
Processor type and features  --->
    [*] EFI runtime service support
    [*]     EFI stub support
    [ ]     EFI mixed-mode support (OPTIONAL)
メモ
EFI mixed-mode support は、CPU が 64 ビットモードに対応しており、EFI handover が有効化されている場合に、32 ビットファームウェアから 64 ビットカーネルをブートするためにのみ必要です。
メモ
ディストリビューションカーネル (gentoo-kernel-bin を除く) では、カーネル設定はsavedconfig または /etc/kernel/config.d に保存されます。

インストール

カーネル

EFI スタブサポートを付けてカーネルを設定したら (ESP/efi にマウントされていると仮定して)。システムによっては /efi/efi が既に存在することがあり、その場合はそれを使用しなくてはなりません。/efi/EFI (または /efi/efi が既に存在する場合はそちら) の下に個別のディレクトリを作成することが推奨されます。以下では example の名前を使用します:

root #mkdir -p /efi/EFI/example

カーネルは現在のカーネルディレクトリから作成され、新しいディレクトリにコピーされます。これはカーネルを /efi/EFI/example/bzImage.efi にインストールします:

/usr/src/linux #make && make modules_install && cp arch/x86/boot/bzImage /efi/EFI/example/bzImage.efi
ヒント
UEFI BIOS によっては稀に、個別の UEFI エントリを受け付けないことがあります。この場合はカーネルを次のように再コピーしなくてはなりません: cp /usr/src/linux/arch/x86/boot/bzImage /efi/EFI/boot/bootx64.efi。これは、すべての UEFI が UEFI エントリを作成しなくても受け付けなくてはならないパス名です。

EFI ファームウェア設定

カーネルファイルが /efi/EFI/example/bzImage.efi にある場合は、ブートエントリは以下で追加することができます:

root #efibootmgr --create --disk /dev/sda --label "Gentoo EFI Stub" --loader "\EFI\example\bzImage.efi"

さらなる例を efibootmgr で見つけることができます。

ルートパーティション設定

UEFI から直接ブートするためには、ブートするシステムのルート (/) パーティションがどこにあるのかをカーネルまたは initramfs が認識していなくてはなりません。grub などのブートマネージャを使用する場合は、カーネルはルートパーティションをどこから探せばよいかの情報を、ブートマネージャからコマンドライン引数を介して取得します。スタブカーネルを使用する場合は、カーネルにこの情報を渡すために使用できる方法として 2 つの選択肢があります:

カーネル内で設定する

カーネル カーネル 6.1+ のためのルートパーティション情報
Processor type and features  --->
    [*] Built-in kernel command line
    (root=/dev/sda3 ro)
重要
ルートの場所は PARTUUID を使用して、または initramfs を使用する場合には (ファイルシステムの) UUID を使用して設定するほうが、一般的により好ましく間違いを起こしにくいです。この情報は blkid コマンドを使用して得ることができます:
root #blkid | grep sda3
/dev/sda3: UUID="d1e0c1e0-3a40-42c5-8931-cfa2c7deae32" TYPE="ext4" PARTUUID="adf55784-15d9-4ca3-bb3f-56de0b35d88d"
カーネル カーネル 6.1+ のためのルートパーティション情報
Processor type and features  --->
    [*] Built-in kernel command line
    (root=PARTUUID=adf55784-15d9-4ca3-bb3f-56de0b35d88d ro)

パーティションの PARTUUID はファイルシステムの UUID とは異なります。UUID は一意なファイルシステムパーティションを指し、initramfs で使用する必要があるもので、PARTUUID はディスクパーティションを指し、カーネルをブートするときに使用することができるものです。

UEFI 内で設定する

カーネルコマンドライン引数付きのエントリを追加するには:

root #efibootmgr --create --disk /dev/sda --label "Gentoo EFI Stub" --loader "\EFI\example\bzImage.efi" -u "root=/dev/sda3"

マイクロコードのロード

initramfs を使わないカーネルを使用する場合は、以下の記事に記載されているようにマイクロコードをロードすることが推奨されます:

セキュアブートのために署名する

このカーネルをセキュアブートする場合は、app-crypt/sbsigntools に含まれる sbsign を使用して署名しなくてはなりません:

root #sbsign --key {db key} --cert {db cert} /efi/EFI/example/bzImage.efi

さらなる情報が Secure Boot で確認できます。

initramfs とともに併用する

外部の (CPIO アーカイブの) initramfs とともにカーネルを使用する場合、追加の手順が必要です。initramfs を作成した後で、これも ESP にコピーする必要があります:

root #cp /path/to/my/initramfs/myinitrd.cpio.gz /efi/EFI/example/initrd.cpio.gz

カーネルは initramfs をどこから探すべきかの情報を必要とし、initramfs はルートパーティションをどこから探すべきかの情報を必要とします。UEFI は両方の情報を与えなくてはなりません:

root #efibootmgr -c -d /dev/sda -p 1 -L "Gentoo EFI Stub" -l '\EFI\example\bzImage.efi' -u 'root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx initrd=\EFI\example\initrd.cpio.gz'

Early Userspace Mounting を使用する場合は、Generating the Initramfs および Using a Stub Kernel の節でそれについて詳しく説明しています。

バックアップカーネル

It is recommended to always have a backup kernel. If a bootmanager like grub is already installed, it should not be uninstalled, because grub can boot a stub kernel just like a normal kernel. A second possibility is to work with an additional UEFI entry. Before installing a new kernel, the current one can be copied from /efi/EFI/example/ to /efi/EFI/backup. The second UEFI entry was also created with efibootmgr. In this example, other names were used:

root #efibootmgr
BootCurrent: 0002
Timeout: 1 seconds
BootOrder: 0002,0000,0001
Boot0000* Secure        HD(1,GPT,0adcbfee-21aa-42ea-9a9a-2e53bd05e6a2,0x800,0x7f800)/File(\EFI\secure\bzImage.efi)
Boot0001* gentoo        HD(1,GPT,0adcbfee-21aa-42ea-9a9a-2e53bd05e6a2,0x800,0x7f800)/File(\EFI\gentoo\grubx64.efi)
Boot0002* Backup        HD(1,GPT,0adcbfee-21aa-42ea-9a9a-2e53bd05e6a2,0x800,0x7f800)/File(\EFI\backup\bzImage.efi)

トラブルシューティング

root #efibootmgr -c -L "Gentoo Linux" -l '\EFI\Gentoo\bootx64.efi' -u 'root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'
efibootmgr で、スワップパーティションへのハイバネーションに対応したブートエントリを作成するには:
root #efibootmgr -c -L "Gentoo Linux" -l '\EFI\Gentoo\bootx64.efi' -u 'root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX resume=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'

関連項目

外部資料

参照