デフォルトカーネル:汎用性が重荷になる時
低スペックなVPS(1 vCPU、2GB RAM)でUbuntu 22.04を実行した際、大したものをインストールしていないのに動作が重いと感じたことはありませんか?私は以前、超低遅延(low-latency)が要求されるアプリケーションをデプロイした時にこの状況に直面しました。Ubuntuのデフォルトカーネルは、古いプリンターから最新のグラフィックボードまで、あらゆるハードウェアを認識するため非常に優秀です。しかし、その広範なサポートが不必要な遅延を生む原因にもなっています。
起動のたびに、システムは大量の不要なモジュールをロードします。Webサーバーを運用するのに、Webカメラのドライバや見慣れないWi-Fiカード、あるいはReiserFSのサポートが本当に必要でしょうか?答えは「いいえ」です。これらのモジュールはRAMを占有するだけでなく、CPUが不要な割り込み(interrupt)を処理するリソースを浪費させます。
なぜ汎用(Generic)版ではなく、カーネルを自前でビルドすべきなのか?
DebianやUbuntuなどのディストリビューションは、「インストールすればすぐに動く」という互換性を優先しています。そのため、提供されるカーネルは常にGeneric(汎用)構成になっています。
Nginx and MySQLのみが動作する本番(production)サーバーを管理していると想像してみてください。XboxコントローラーやBluetoothのドライバを保持し続けるのは、明らかにリソースの無駄です。これらを取り除くことで、システムが軽量化されるだけでなく、攻撃対象領域(attack surface)を縮小し、利用者の少ない古いモジュールに起因するセキュリティ脆弱性を制限することもできます。
さらに、自前でコンパイルすることで、AMD EPYCや最新世代のIntel Xeonなど、使用しているCPUシリーズに特化した最適化が可能になります。これにより、汎用カーネルでは無視されがちな特定の命令セットを活用できるようになります。
カーネルをアップグレードする際の3つの一般的な選択肢
効率化を求める際、エンジニアは通常、以下の3つの方向性を検討します:
- サードパーティ製カーネル (XanMod, Liquorix): インストールは簡単でパフォーマンスの向上も顕著ですが、他人の設定に依存することになります。
- PPAからのメインラインカーネル (Mainline Kernel): kernel.orgからUbuntu向けにビルドされたパッケージです。最新版を利用できるメリットがありますが、依然として不要なモジュールが多く含まれています。
- ソースコードからの自前コンパイル: 最も時間はかかりますが、最高の結果が得られます。システムに何を残すかを完全にコントロールできます。
カーネルの「オーダーメイド」とプロフェッショナルな.debパッケージ化の手順
実際のプロジェクトで、4GB RAMのサーバー向けにカーネルをチューニングしたところ、バックグラウンドでのRAM消費を約180MB削減し、ブート時間を5秒短縮できました。以下に、同じ構成の複数のサーバーへ簡単にデプロイできるよう、.debファイルを作成する手順を紹介します。
ステップ1:ビルドツールの準備
まず、ビルドに必要なライブラリをインストールします。このプロセスで約500MBのディスク容量を使用します。
sudo apt update
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev -y
sudo apt install xz-utils wget curl bc -y
ステップ2:公式カーネルソースコードのダウンロード
kernel.orgにアクセスして、最新の安定版(Stable)のリンクを取得します。ここではバージョン6.6.15を選択します。
mkdir ~/kernel-build && cd ~/kernel-build
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.15.tar.xz
tar -xvf linux-6.6.15.tar.xz
cd linux-6.6.15
ステップ3:設定の微調整 – 「余分な脂肪」を削ぎ落とす
カーネルには数千のオプションがあるため、最初から一つずつ選ぶのは無謀です。最も賢い方法は、現在のUbuntuの設定を継承し、そこから不要な部分を削っていくことです。
cp /boot/config-$(uname -r) .config
make menuconfig
menuconfigの画面では、以下の項目に注目してください:
- Processor type and features: Genericの代わりに、使用しているCPU(例:Core i7, AMD Zen 3など)を正しく選択します。
- Device Drivers: データセンターのサーバーであれば、Wireless、Sound card、Multimedia supportなどはすべて無効にします。
- File systems: ext4しか使わないのであれば、Btrfs、XFS、NTFSなどを無効にしてカーネルを軽量化します。
ヒント: Ubuntuの場合、CONFIG_SYSTEM_TRUSTED_KEYSの項目を探し、その値を空にしてください。そうしないと、デジタル署名のエラーでビルドが失敗します。
ステップ4:コンパイルと自動パッケージ化
手動でmake installを実行する代わりに、bindeb-pkgを使用することをお勧めします。このコマンドは.debファイルを生成するため、管理やアンインストール、他のマシンへのコピーが非常にスムーズになります。
時間を節約するために、CPUの全パワーを活用しましょう:
make -j$(nproc) bindeb-pkg
待ち時間は通常20分から60分程度です。休憩したり、他の作業をしたりするのに最適な時間です。
ステップ5:インストールと成果の確認
完了すると、~/kernel-buildディレクトリにインストールファイルが生成されます。最も重要な2つのファイルをインストールするだけです:
cd ..
sudo dpkg -i linux-image-6.6.15*.deb linux-headers-6.6.15*.deb
sudo <a href="https://itfromzero.com/ja/linux/linux%e3%81%aesystemd-boot%e8%a8%ad%e5%ae%9a%ef%bc%9agrub2%e3%82%88%e3%82%8a%e9%ab%98%e9%80%9f%e3%83%bb%e8%bb%bd%e9%87%8f%e3%83%bb%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%81%aa%e8%b5%b7%e5%8b%95.html">update-grub</a>
sudo reboot
再起動後、uname -aを入力してください。新しいバージョンが表示されれば、システムの「心臓部」をマスターしたことになります。
度重なる失敗から学んだ教訓
カーネルのコンパイルは日常的に行う作業ではありませんが、Linuxの仕組みを深く理解するのに役立ちます。適切に最適化されたシステムは、デフォルト設定よりも明らかに安定し、レスポンスも速くなります。
最後に注意点: 常にGrubメニューに古いカーネルを一つ残しておいてください。新しいカーネルでカーネルパニック(Kernel Panic)が発生した場合でも、システムに入って修正するための逃げ道になります。新しいカーネルが少なくとも1週間安定して動作するまでは、デフォルトのカーネルを急いで削除しないでください。

