Initaramfs 不要のカーネルを作る例
始めに
LFS から Arch にやってきたけど、Arch は initaramfs イメージを使って起動する。LFS で initramfs なしでやってきたノウハウを活かして Arch でも initramfs なしで起動するカーネルを作ってみた
initramfs なんで必要?
まず Linux のブートの仕組みから。ド素人の理解なので不正確かもしれない。なんとなくそんな感じというように受け止めてほしい。
Grub ブートローダーは、たいていの記憶デバイスを動かせるし、たいていのファイルシステムを扱える。なのでまず、どこかの記憶デバイスのなにかのファイルシステム上に存在するカーネルを起動させることができる。
Grub の役目は終り、カーネルが始動する。この後はカーネル自身がなんとかしなくてはならない。カーネルは /sbin/init を起動しようとする。このとき、自分の例では SATA 接続の SSD に XFS ファイルシステムで /sbin/init がある。Arch のカーネルは XFS はモジュールになっているので、xfs モジュールを読みこみたいが、/lib/modules を読むのに xfs モジュールが必要なので詰む。
なのでカーネル自身に xfs も sata コントローラも両方組み込んでおく必要があるし、逆を言えば、そうすれば initramfs は無くても動く。
Arch での kernel ビルドの準備
前提としてカーネルのビルドは知ってる、としてます。ビルド方法そのものは説明しません。
まずは Arch の linux パッケージで入ってるのと同じバージョンのカーネルソースを https://www.kernel.org 持ってくる。そうすると Arch の Linux の .config を使って make olddefconfig
でほぼ同じ設定にできるので、そこから開始する。ほぼ同じというのは Archwiki によると多少パッチを独自に当てているから、ということになる。全く同じにしたい人は Arch の物を取ってくれば良いだろう。
ちなみに Arch の .config は zcat /proc/config.gz > .config
で取得できる
Arch での kernel config
make nconfig
にて
File systems --->
<*> XFS filesystem support
これだけで良い。Arch は記憶デバイス用のドライバーは基本モジュールではなくて組み込みにしてあるみたいだ。自分の例だと以下のおかげで動く。
Device Drivers --->
<*> Serial ATA and Parallel ATA drivers (libata) --->
<*> AHCI SATA support
カーネルパニック起こしながらトライしてみると良いと思う。
grub.cfg の設定と起動。
カーネル起動コマンドから initrd
の行を削除したら、祈りを捧げよう。
あっと、もうひとつあった。kernel 行の root パーティション指定が UUID になってると思うので、デバイス名直打ちか PARTUUID に変える必要がある。UUID はファイルシステム上の固有 ID であり、カーネルにファイルシステムを組み込んだんだから行ってくれよ、と思うのだけど、この段階では、行ってくれない。自分の場合は root=/dev/sda3
としてる。ノート PC で入れ替えることなどほぼないので。
捕捉: CPU マイクロコードは?
initramfs イメージがなくてもマイクロコードは実行中に読みこめる。BLFS の説明が詳しい。
またコンフィグツリーの
Device Drivers --->
Generic Driver Options --->
Firmware loader --->
() Build named firmware blobs into the kernel binary
ここにファームウェアをフルパスで指定しておけばカーネルに組込める。
まとめ
というわけで kernel panic を恐れずにいろいろやってみてください。