なぜ自分でカーネルをコンパイルするのか?
Ubuntu、RHEL、Debianなどの標準的なディストリビューションには、「万能型(one-size-fits-all)」のカーネルが付属しています. これらの汎用ビルドは、古いThinkPadから128コアのThreadripperサーバーまで、ほぼあらゆる環境で起動するように設計されています。この膨大な互換性を実現するために、メンテナは通常は不要な数千ものドライバーや機能を詰め込んでいます。その結果、バイナリは肥大化し、攻撃対象領域(アタックサーフェス)が広がり、不必要なメモリオーバーヘッドが発生します。
私がカスタムカーネルに興味を持ったきっかけは、ラックサーバーの群れがフロッピーディスクやWi-Fiカードのドライバーを読み込んでいるのに気づいたことでした。空調管理されたデータセンターにあるこれらのマシンが、ディスクケットやワイヤレス信号を扱うことは一生ありません。こうしたレガシーコンポーネントを削ぎ落とすことで、よりスリムで高速、かつ大幅に安全な環境を構築できます。
トレードオフ:汎用 vs カスタム
標準カーネルと手動ビルドの選択は、利便性とコントロールのバランスです。本番環境において、それぞれがどのように機能するか見てみましょう。
汎用カーネル(ディストリビューション標準)
- バイナリ配布: すぐに動作するコンパイル済みの
.debまたは.rpmファイルを入手できます。 - 膨大な互換性: 1990年代のSCSIコントローラーから最新のNVMeドライブまで、あらゆるモジュールが含まれています。
- 自動アップデート: セキュリティパッチは
aptやdnfを通じて、手動操作なしで適用されます。 - パフォーマンス: 一般的に平均的です。コードは特定のCPU命令セットを活用するよりも、幅広い互換性を優先して最適化されています。
カスタムカーネル(オーダーメイドのアプローチ)
- ソースコード優先: kernel.org から直接生のコードを取得します。
- ハードウェア固有: 使用している NIC、ストレージコントローラー、チップセットのドライバーのみを含めます。
- 命令セットの最適化: Zen 3やIce Lakeなどのアーキテクチャに合わせてコンパイルできます。これにより、コンパイラは特殊な命令(AVX-512など)をより効率的に使用できるようになります。
- 要塞化(ハーデニング): 特権のないeBPFや、エクスプロイトの標的になりやすい特定のレガシーシステムコールなどの高リスク機能を恒久的に無効化できます。
手動コンパイルの現実
コンパイルはあらゆるシナリオにおける魔法の杖ではありません。継続的なメンテナンスへのコミットメントが必要です。
メリット
- フットプリントの削減: 最小限のカーネルは、CPUキャッシュをより効果的に活用します。4GB RAMのクラウドインスタンスでは、カスタムカーネルによって基本メモリ使用量が120MBから約45MBに減少するのを確認しました。これにより、高コンカレンシーなWebアプリに不可欠なリソースを解放できます。
- 引き算によるセキュリティ: FireWireや古いUSBドライバーのコードが存在しなければ、それらが悪用されることもありません。ローカル権限昇格の脆弱性というカテゴリー全体を事実上排除できます。
- 最先端の機能: 最新のスケジューリングの改善やファイルシステムのパッチを、安定版ディストリビューションのリポジトリに届く数ヶ月前に導入できます。
デメリット
- 時間の投資: ハードウェアによりますが、コンパイルには最新のワークステーションで10分、安価なVPSでは1時間以上かかる場合があります。
- 手動パッチ適用: あなた自身がアップストリームとなります。新しいCVEが発表されたら、手動でダウンロード、構成、再コンパイルを行う必要があります。
- 脆弱性(壊れやすさ): NVMeドライバーを入れ忘れるなどのミス一つで「カーネルパニック」が発生し、システムが起動しなくなります。
ビルドの前提条件
最初の数回は必ずステージングサーバーやローカルのVMでビルドを行ってください。稼働中の本番ノードで実験してはいけません。この例では、Ubuntu 22.04 LTSを使用します。
まず、必要なツールチェーンをインストールします:
sudo apt update
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev dwarves zstd -y
少なくとも25GBの空きディスク容量を確保してください。コンパイルプロセスでは、膨大な量の中間オブジェクトファイルが生成されます。
ステップバイステップの実装
1. ソースコードの取得
kernel.org にアクセスして、最新の安定版を確認してください。本番環境では、長期サポート(LTS)ブランチを選択することをお勧めします。

