@IT の Linux Kernel Watch は、いつも楽しく読ませて頂いています。Linux カーネルには次々と魅力的な拡張が為されていますが、安定性を追求する CentOS では中々、新しいカーネルが提供されません。そこで、今回はカーネルをソースコードから自分でコンパイルしてみます。今回は以下の通り、CentOS 5 x86_64 を使いました。
$ 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 でした。
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" でカーネルソースを初期化します。
make mrproper
横着する為に、現カーネルのコンフィグを新カーネルへ引き継ぎます。現カーネルのコンフィグ(.config)を引き継ぎ、新カーネルへ差分を取り出して設定するには "make oldconfig" します。大量に質問されますが、ENTER キーを押しっぱなしにして、とりあえず全てデフォルトのままにしておきます。
cp /boot/config-2.6.18-194.26.1.el5 .config
make oldconfig
新カーネルでの新しい機能を設定する為に、"make menuconfig" します。
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] の中のすべての項目
- [Network packet filtering framework (NetFilter)]
- [Networking options]
コンパイルと RPM パッケージの作成
ここまでの作業が完了したら、カーネルをコンパイルします。今回は単純にコンパイルするのではなく、別の CentOS 5 にも流用出来るよう、"make rpm" で RPM パッケージを作成しておきます。カーネルのコンパイルには非常に時間がかかり、端末のスペックにも依存しますが、私の環境では 40 分ほどかかりました。
sudo make rpm
コンパイルが完了したら、パッケージは以下に作成されます。
- RPM パッケージ
- /usr/src/redhat/RPMS/x86_64/
- SRPM パッケージ
- /usr/src/redhat/SRPMS/
インストール
RPM パッケージをインストールします。
sudo rpm -ivh /usr/src/redhat/RPMS/x86_64/kernel-2.6.36.1-1.x86_64.rpm
インストールが完了しても、まだ新カーネルで起動するには準備が足りません。次は mkinitrd で起動用の RamDisk を作成します。
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 のカーネル定義部分のうち、一番上に記載します。
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 を再起動すると、新しいカーネルで立ち上がりました。
$ 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
参考
以下を参考にさせて頂きました。
コメント