Skip to content

CentOS 5 上で最新の Linux カーネルをコンパイルする

@IT の Linux Kernel Watch は、いつも楽しく読ませて頂いています。Linux カーネルには次々と魅力的な拡張が為されていますが、安定性を追求する CentOS では中々、新しいカーネルが提供されません。そこで、今回はカーネルをソースコードから自分でコンパイルしてみます。今回は以下の通り、CentOS 5 x86_64 を使いました。

1
2
$ uname -a
Linux centos-01.local 2.6.18-194.26.1.el5 #1 SMP Tue Nov 9 12:54:20 EST 2010 x86_64 x86_64 x86_64 GNU/Linux

また、開発ツールや開発ライブラリは予め、インストールしてあります。

ソースコードの取得

The Linux Kernel Archives から最新のソースコードをダウンロードし、展開します。現時点で安定版の最新カーネルは 2.6.31.1 でした。

1
2
3
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.36.1.tar.bz2
tar jxvf linux-2.6.36.1.tar.bz2
cd linux-2.6.36.1

カーネルパラメータの指定

次に "make mrproper" でカーネルソースを初期化します。

1
make mrproper

横着する為に、現カーネルのコンフィグを新カーネルへ引き継ぎます。現カーネルのコンフィグ(.config)を引き継ぎ、新カーネルへ差分を取り出して設定するには "make oldconfig" します。大量に質問されますが、ENTER キーを押しっぱなしにして、とりあえず全てデフォルトのままにしておきます。

1
2
cp /boot/config-2.6.18-194.26.1.el5 .config
make oldconfig

新カーネルでの新しい機能を設定する為に、"make menuconfig" します。

1
make menuconfig

ncurses がインストールされていれば ASCII 文字列で作成されたメニューが表示されます。今回はメニューから以下を有効にします。

  • [General setup]
    • [enable deprecated sysfs features to support old userspace tools] にチェック
  • [Networking support]
    • [Networking options]
      • [Network packet filtering framework (NetFilter)] [Core Netfilter Configuration] の中のすべての項目 [IP: Netfilter Configuration] の中のすべての項目 [IPv6: Netfilter Configuration] の中のすべての項目 [IP virtual server support] の中のすべての項目

コンパイルと RPM パッケージの作成

ここまでの作業が完了したら、カーネルをコンパイルします。今回は単純にコンパイルするのではなく、別の CentOS 5 にも流用出来るよう、"make rpm" で RPM パッケージを作成しておきます。カーネルのコンパイルには非常に時間がかかり、端末のスペックにも依存しますが、私の環境では 40 分ほどかかりました。

1
sudo make rpm

コンパイルが完了したら、パッケージは以下に作成されます。

  • RPM パッケージ
    • /usr/src/redhat/RPMS/x86_64/
  • SRPM パッケージ
    • /usr/src/redhat/SRPMS/

インストール

RPM パッケージをインストールします。

1
sudo rpm -ivh /usr/src/redhat/RPMS/x86_64/kernel-2.6.36.1-1.x86_64.rpm

インストールが完了しても、まだ新カーネルで起動するには準備が足りません。次は mkinitrd で起動用の RamDisk を作成します。

1
sudo /sbin/mkinitrd /boot/initrd-2.6.36.1.img 2.6.36.1

上記のコマンドが完了すると "/boot/initrd-2.6.36.1.img" というイメージが作成されます。最後に、起動時に表示される grub のメニューに新カーネルが表示されるよう、/boot/grub/grub.conf へ下記を追記します。私の環境では grub.conf 中で"default=0" 、つまり「一番、上に記載してあるカーネルで起動する」と定義してあったので、下記は grub.conf のカーネル定義部分のうち、一番上に記載します。

1
2
3
4
title CentOS (2.6.36.1)
  root (hd0,0)
  kernel /vmlinuz-2.6.36.1 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
  initrd /initrd-2.6.36.1.img

これで OS を再起動すると、新しいカーネルで立ち上がりました。

1
2
$ uname -a
Linux centos-01.local 2.6.36.1 #2 SMP Tue Nov 30 00:12:54 JST 2010 x86_64 x86_64 x86_64 GNU/Linux

参考

以下を参考にさせて頂きました。

  1. CentOSに最新カーネルを導入する(カーネル再構築)
  2. Linux Kernel再構築
  3. GRUBのデフォルトOSやOS選択待ち時間を変更するには