2025/04/20 20:06 Booting Linux kernels on x86 without using a bootloader such as GRUB2, etc.

ロボ子、今日はEFI Boot Stubについて話すのじゃ!

EFI Boot Stubですか。なんだか難しそうですね。

難しくないぞ!簡単に言うと、EFIファームウェアを使ってLinuxカーネルを直接起動するための仕組みのことじゃ。

従来のブートローダーを使わずに、ですか?

そう!grubとかeliloとか、そういうのなしで起動できるのじゃ。便利じゃろ?

なるほど。記事によると、x86やARMプラットフォームでは、kernel zImage/bzImageをPE/COFFイメージとして偽装するんですね。

そうそう!「bzImageヘッダーを修正するコードと、ファームウェアローダーがジャンプするEFI固有のエントリポイント」が、EFI boot stubと呼ばれる部分じゃ。

アーキテクチャによって実装場所が違うんですね。x86だと`arch/x86/boot/header.S`とか`arch/x86/boot/compressed/eboot.c`にあるんですね。

その通り!ARMだと`arch/arm/boot/compressed/efi-header.S`とかじゃな。arm64はちょっと違うみたいじゃが。

arm64は圧縮カーネルをサポートしないから、Image自体がPE/COFFイメージとして偽装されるんですね。そして、EFI stubがカーネルにリンクされる、と。

よく分かっておるの!ところで、bzImage.efiをインストールするにはどうすれば良いか分かるか?

`arch/x86/boot/bzImage`をEFIシステムパーティション(ESP)にコピーして、拡張子を".efi"に変更するんですよね。

正解!拡張子がないとEFIファームウェアローダーが実行を拒否するから注意じゃぞ。

EFIシェルからカーネルパラメータを渡すこともできるんですね。`bzImage.efi console=ttyS0 root=/dev/sda4`のように。

そうじゃ!それと、initrd=オプションでinitrdファイルを指定できるのじゃ。

initrdファイルへのパスは、ESPの先頭からの絶対パスである必要があるんですね。相対パスは機能しない、と。

その通り!パスはEFIスタイルのパスで、ディレクトリ要素はバックスラッシュで区切る必要があるぞ。

ARMやarm64では、dtb=オプションでデバイスツリーを指定できるんですね。

そうじゃが、dtb=オプションはデバッグツールとして、またはEFI CONFIGURATION TABLEにデバイスツリーが提供されていない場合の最終手段としてのみ使用するべきじゃ。

ファームウェアが提供するランタイムデータが失われる可能性があるからですね。

よく分かっておる!EFI Boot Stubを使うと、カーネルの起動が簡単になるし、カスタマイズ性も高まるのじゃ。

確かに便利そうですね。私も今度試してみます。

よし!ロボ子もEFI Boot Stubマスターじゃ!

ありがとうございます、博士!

ところでロボ子、ブートローダーなしで起動できるってことは、まるで私がお風呂上がりにバスタオルなしでうろうろするみたいじゃな!

博士、それはちょっと違うと思います…!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。