Linux のカーネルを 2.4 に入れ替える

Linux のカーネルも バージョン2.4.3がリリースされ、そろそろ安定してきたころなのでカーネルバージョン2.2 を入れ替えてみます。Redhat 6.2J のカーネルを入れ替える方法を記述していますが、不明な点もあるので参考程度にしてね。Linux のカーネルって他の UNIX カーネルにくらべるとまだまだ作りが雑ですね。

* カーネルやツールの入手

linux-2.4.3.tar.gz を www.kernel.org から入手します。作業はスーパーユーザーで行います。また、カーネル2.4 を利用する際に新しいバージョンのツールが必要になります。詳細は /usr/src/linux/Documentation/Changes を参照してください。

kernel 2.4 linux-2.4.3.tar.gz
util-linux util-linux-2.11a.tar.gz
ksymoops ksymoops-2.4.1.tar.gz
modutils modutils-2.4.5.tar.gz
mkinitrd mkinitrd-3.0.9-1.src.rpm
e2fsprogs e2fsprogs-1.19.tar.gz

http://www.userfriendly.net/linux/RPM/ から最新の rpm パッケージを探すことができます。

* ソースの展開

/usr/src/linux ディレクトリーにソースを展開するが、ソースを展開する前にオリジナルまたは前バージョンのソースを別名に変更する。バージョンがわかるようなディレクトリー名にして linux というシンボリックリンクを 張ると良い。

    # cd /usr/src
    # rm linux
    # gzip -dc linux-2.4.3.tar.gz | tar xpf -
    # mv linux linux-2.4.3
    # ln -s linux-2.4.3 linux

* カーネルのコンフィグレーション

/usr/src/linux ディレクトリーに移動し、コンフィグレーションプログラムを実行します。もし、ソースに独自の変更を加えたりした場合、Makefile 中の EXTRAVERSION にローカルなバージョンを設定することで細かいリビジョンで管理する事ことができます。(例えば、EXTRAVERSION = -5.0 )これは、カーネルを再構築する度にインクリメントすることで古いカーネルを上書きせずに新しいカーネルを作ることができます。

カーネルのコンフィグレーションを行う前に、現在のシステムの状態を確認しておくとコンフィグレーションを行う上で役立ちます。PCIデバイスを表示する lspci や 組み込まれているモジュールを表示する lsmod 。

    # /bin/dmesg
    # /sbin/lspci
    # /sbin/lsmod

とりあえずゴミを消してからコンフィグレーションコマンドを起動します。上記コマンドで調べたデバイスやカードを利用できるように設定します。ほとんどの場合、デフォルトのままで構わないが、最低でも CPU のタイプや Network カードのタイプぐらいはチェックしておいたほうが良い。make oldconfig で、以前の状態と同じ設定にしてくれますが、ちゃんと設定し直したいので make menuconfig で設定します。

    # make mrproper
    # make menuconfig
      ... menu による設定 ...
      Do you wish to save your new kernel configuration?  <yes>

menuconfig を実行した際に表示されるメニューの「Save Configuration to an Alternate File」「Load an Alternate Configuration File」を利用して設定内容をファイルに保存したり読み込んだりできます。デフォルトでは .config ファイルに保存されます。カーネルを作成するには .config ファイルが必要です。

* コンパイルとインストール

設定が終わったら、カーネルのコンパイルとモジュールを作成します。ドキュメントでは zImage を作成するようになっているが、大抵カーネルが大きすぎるので bzImage を作成します。bzlilo で、カーネルのインストールまで行うようだが安全を期すため bzImage を指定します。

    # make dep clean
    # make bzImage

起動用 FD を作成するなら、新しい FD をドライブにセットして以下のコマンドを実行します。

    # make bzdisk

続いて、必要なモジュールの作成とインストールを行います。/lib/modules にカーネルのバージョンの名前のディレクトリが作られその下にモジュールがインストールされます。

    # make modules && make modules_install

そして、カーネルを /boot ディレクトリーにインストールします。

    # installkernel 2.4.3 arch/i386/boot/bzImage System.map

このコマンドで、/boot の下に System.map, vmlinuz それぞれの後にバージョンがついた形(System.map-2.4.3, vmlinuz-2.4.3)でインストールされます。

ロードモジュールの調整やチェック等(conf.modules または modules.conf)を行い、最後に、モジュールリストの作成と起動用RAMDISKファイルシステムの作成(mkinitrd : SCSI からブートする場合など)行います。

    # /sbin/modprobe -c > /etc/conf.modules.NEW
    # vi /etc/conf.modules.NEW
      ファイルの先頭から alias 行の直前までを削除する
    # mv /etc/conf.modules /etc/conf.modules.old
    # mv /etc/conf.modules.NEW /etc/conf.modules
    # depmod -a
    # mkinitrd /boot/initrd-2.4.3.img 2.4.3

* lilo に新しいカーネル用の情報を追加する

/etc/lilo.conf に新しいカーネルをブートするための情報を追加し lilo コマンドで ブート情報を更新します。

    # vi /etc/lilo.conf
      boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
linear
default=linux-2.4.3
image=/boot/vmlinuz-2.2.14-5.0
label=linux
read-only
root=/dev/hda1
image=/boot/vmlinuz-2.4.3
label=linux-2.4.3
read-only
root=/dev/hda1
# /sbin/lilo Added linux
Added linux-2.4.3 *

/etc/lilo.conf を編集したあとに lilo コマンドを実行することを忘れないで下さい。

* カーネルを 2.2 から 2.4 に変更したことで設定し直さなければならないこと

カーネルを バージョン2.4 にしたことで幾つか不要になったものやバージョンアップをしなければならないものがあります。

/usr/sbin/ntsysv コマンドで、カーネル 2.4 に組み込まれたサービス(デーモン)を停止する。Redhat 6.2J では、プラグ&プレイを管理する kudzu と PCカードを管理する pcmcia を停止します。

Redhat 6.2J では、pcmcia 関連(pcmcia-cs)や PPP関連(pppd)はバージョンアップが必要です。利用している場合、バージョンアップしなければなりません。

あとは、リブートすることで カーネル 2.4 でシステムが立ち上がります。

* Linux のチューニングで良く行われる作業

Linux のパフォーマンスを向上させるために、swap のサイズやメモリを増やしたり、不要なサービスを停止することを行います。それ以外に、システムが一度にオープンできる最大ファイル数や 最大i-node 数を増やす作業をします。これは、Web サーバーとして Linux を採用する際に良く行われる作業です。下記の echo コマンドの実行を、システムの起動スクリプト(/etc/rc.d/rc.local)に記述しておくと良い。

    # echo 16384 > /proc/sys/fs/file-max
    # echo 49152 > /proc/sys/fs/inode-max

デフォルト値の約4倍にすると良いという結果も出ているようですが、システムの状態やカーネルのバージョンによっても異なる場合があるのであくまでも目安として考えて下さい。