当社では、製品の使用目的やお客様の用途に合わせてLinuxカーネルの最適化を行っています。そのためディストリビューションのカーネルをそのまま用いることはほとんど無く、ソースから必要な機能のみをイネーブルしてコンパイルしたカーネルを用いています。新人の私は、Linuxカーネルをコンパイルしたことがなかったので、勉強がてらチャレンジしてみました。
1. ソース・ファイルの入手と準備
現在のバージョンの確認方法
$ su
# uname -a
Linux kakkey 2.6.21.4 ・・・
ディレクトリを移動
# cd /usr/src
最新のカーネル・ソースをhttp://www.kernel.orgより入手します。
The Public Linux Archive →
Linux Repository,including kernel source →
kernel/ → v2.6/ → より最新のkernel linux-2.6.21.5.tar.bz2をwgetでダウンロードします。
# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.5.tar.bz2
ソースを展開
# tar xjf /usr/src/linux-2.6.21.5 tar.bz2
「linux-バージョン番号」のディレクトリが作成されます。
2. コンパイル前の準備
念のため、コンパイル前の情報を保存しておきます。
ブート・ローダ「GURB」の設定ファイルを保存
# cd /boot/grub
# cp -a menu.lst menu.lst.orig
3. カーネルとモジュールのコンパイルと導入
カーネル・パラメータの設定
使用しているマシンはX Window System環境が無いサーバなので、CUIで設定するツール「make menuconfig」を使用します。
「make menuconfig」は「ncurses-dev」が必要なので、事前にインストールしておきます。
# cd /usr/src/linux-2.6.21.5
# apt-get install ncurses-dev
makeとgccが無い場合はインストールしておきます。
# apt-get install make gcc
安定稼動していた時のカーネル・パラメータを /usr/src/linux-2.6.21.5/.configにコピーし、make menuconfigを実行します。
# zcat /proc/config.gz > /usr/src/linux-2.6.21.5/.config
# make menuconfig
自分の環境にあわせて、パラメータを設定します。
[*] :静的にモジュールをカーネルに組み込む
<M> :動的にモジュールを組み込む
[ ],< > :無効
コンパイル&インストール
# make
# make modules
# make modules_install
# make install
自分で前のバージョンを保存しなくても、自動的にやってくれるようです。
# cd /boot
# ls -la
838062 Jun 12 00:41 System.map-2.6.21.4.old
77449 Jun 12 00:41 config-2.6.21.4.old
1435728 Jun 12 00:41 vmlinuz-2.6.21.4.old
# cd /usr/src/linux-2.6.21.5
# ls -la
44539 Jun 18 14:24 .config
40750 Jun 15 16:39 .config.old
4. 新しいカーネルで起動する
ブート・ローダの「GURB」の設定ファイルを変更
# cd /boot/grub
# vi menu.lst
title Debian GNU/Linux, kernel 2.6.18-4-686
root (hd0,1)
kernel /boot/vmlinuz-2.6.18-4-686 root=/dev/sda2 ro
initrd /boot/initrd.img-2.6.18-4-686
savedefault
title Debian GNU/Linux, kernel 2.6.18-4-686 (single-user mode)
root (hd0,1)
kernel /boot/vmlinuz-2.6.18-4-686 root=/dev/sda2 ro single
initrd /boot/initrd.img-2.6.18-4-686
savedefault
「title」の内容が、電源を入れた後、OSを選択する画面に表示される項目です。
新しいカーネルが起動できるように、menu.lstに以下の項目を追加します。
title Debian GNU/Linux, kernel 2.6.21.5
root (hd0,1)
kernel /boot/vmlinuz-2.6.21.5 root=/dev/sda2 ro
savedefault
設定が終了したら再起動します。
# reboot
新しいカーネルを選択して起動します。
uname -a で確認
Linux kakkey 2.6.21.5 ・・・
最新のカーネルで起動できました。
めでたし、めでたし。
#こんなに、すんなりいくことは珍しく、ルートファイルシステムがマウントできなくてパニックを起こすことなどもよくあるらしいです。