萌えハッカーニュースリーダー

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

出典: https://www.kernel.org/doc/Documentation/efi-stub.txt
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

博士、それはちょっと違うと思います…!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search