Linux Kernelの再構築

結構頻繁にLinuxカーネルを再構築する機会に遭遇するのですが,その度にGoogleでWebページを検索するのも面倒になってきたので,ここで一度まとめておきます.

ソースコード/パッチファイルのダウンロード

Linux Kernelのソースコードおよびパッチファイルは,www.kernel.orgから入手することが出来ます.また,Linux KernelはRingServerでもミラーされていますので,負荷分散やダウンロード速度などを考慮するとこれらのミラーサイトを利用する方が良いと思います.以下に列挙するURLから,ネットワーク的に近いサーバを選択して下さい.

アーカイブの展開およびパッチの適用

カーネルの再構築はrootで行いますので,suコマンドでrootに変更します.また,カーネルソースコードは,/usr/srcディレクトリ下に展開します.尚,LANG設定は日本語の場合だと文字化けなどが起こることもありますので,LANG設定はCにしておいた方が無難です.

% su -
passwd: (パスワードを入力)
# LANG=C
# tar xzvf linux-x.x.x.tar.gz -C /usr/src

また,パッチを適用する際は,パッチファイルを適用するカーネルディレクトリにコピーした後にpatchコマンドを用いて適用します.

# cp xxx.patch linux-x.x.x/
# patch -p1 < xxx.patch

シンボリックリンクの更新

アプリケーションのコンパイルや動作の際に,/usr/src/linuxディレクトリ下の情報を必要とする場合があります.そのため,/usr/src/linuxのリンク先が展開したディレクトリになるように,シンボリックリンクを更新します.

# rm /usr/src/linux
# ln -s /usr/src/linux-x.x.x /usr/src/linux

カーネルの環境設定

カーネルの環境設定には,いくつかの方法があります.まず,はじめに既存のカーネル環境(現在の環境設定)を引き継ぎたい場合は,設定ファイルを.configというファイル名でコピーした後に,make oldconfigコマンドを使用します.既存のカーネルの設定ファイルは,/usr/src/linux-x.x.x/configs/kernel-x.x.x-i686.confiに存在します(x.x.xは,現在使用しているカーネルのバージョン).現在使用しているカーネルのバージョンを調べるときは,unameコマンドを利用します.

# uname -v
2.4.31
# cp /usr/src/linux-2.4.31/configs/kernel-2.4.31-i686.config ./.config
# make oldconfig

カーネルの環境設定方法は,以下の3種類があります(カーネルのパラメータを設定する際のツール).

  • make config
  • make menuconfig
  • make xconfig

GUI環境が利用できる場合は,make xconfigコマンドが便利です(kernel 2.6.xでGnomeを利用している場合はmake gconfig,kernel 2.6.xでKDEを利用している場合はmake kconfig).設定が終了したら,保存を選んで終了します.

カーネルコンパイル

以下のコマンドでカーネルコンパイルを行います(kernel 2.6.xから,make depコマンドはなくなった).

# make dep
# make clean
# make bzImaze
# make modules
# make modules_install
# make install

また,SCSIを使用する(ルートパーティションSCSIのハードディスク上に存在する)場合は,initrdイメージを作成します(x.x.xは作成したカーネルのバージョン).

# /sbin/mkinitrd /boot/initrd-x.x.x.img x.x.x

ブートローダの設定

最後に,ブートローダの設定を修正します.設定方法は,GRUBLILOの場合で異なります.設定後,リブートして作成したカーネルで起動させます.

GRUB

GRUBの設定ファイルが存在する場所は,/etc/grub.confまたは/boot/grub/grub.confとなります.この設定ファイルに,作成したカーネルで起動するための設定を加えます(titleは,Linux-newとする).デバイス名(hd0, /dev/hda1など)は,各自の設定ファイルを参考にして設定して下さい.

title Linux-new
    root (hd0,0)
    kernel /vmlinuz-x.x.x ro root=/dev/hda1 acpi=on
    initrd /initrd-x.x.x.img

title Linux-up
    root (hd0,0)
    kernel /vmlinuz-2.4.31 ro root=/dev/hda1 acpi=on
    initrd /initrd-2.4.31.img

LILO

LILOの設定ファイルが存在する場所は,/etc/lilo.confです.この設定ファイルに,作成したカーネルで起動するための設定を加えます(labelは,Linux-newとする).デバイス名(/dev/hda1など)は,各自の設定ファイルを参考にして設定して下さい.

image=/boot/vmlinuz-x.x.x
label=Linux-new
root=/dev/hda1
initrd=/boot/initrd-x.x.x.img
read-only

image=/boot/vmlinuz-2.4.31
label=Linux-up
root=/dev/hda1
initrd=/boot/initrd-2.4.31.img
read-only

LILOの場合は,設定ファイルを修正後に以下のコマンドを実行します.

# /sbin/lilo

参考URL