->back to toppage

課題内容 - Level.1 -

Linux kernelを構築する。kernelのソースの場所を見つけ、それを設定(config)し、 コンパイルせよ。コンパイルしたkernelが正しく動く事を確認せよ。


Kernelの再構築手順

ソースの場所

kernelのソースは通常,/usr/src/のディレクトリ下にlinux-リリース番号-の形で置かれている. ディレクトリ下に何も無い場合やバージョンアップを行うなら, The Linux Kernel Archivesなどのサイトからkernelのソースをダウンロードして展開しておく.

今回の場合はバージョンのアップもかねてlinux-2.6.17をダウンロードして/usr/src/に展開して いる.なお、ここからの説明はすべて/usr/src/linux-2.6.17での作業としている.


前準備

まず、kernelの再構築する前に現在使っているkernelとの区別をつけるため,それとモジュールの インストールの際に既存のモジュールを上書きを避けるためにリリースの設定を 変更しておく.設定はMakefileのEXTRAVERSIONの内容を書き換える事で変更する.ここでは -mycustumと設定しておく.
VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 17 EXTRAVERSION = -mycustom ・・・

次にkernelの構築環境の初期化を行っておく.この初期化は、make mrproperコマンドを実行すればよい.
%make mrproper
このコマンドは.configファイルも削除するので前の設定を用いたいのならばバックアップをとって おく.ちなみに新しくダウンロードしてきたkernelにおいては特にこの作業をする必要は無い.


Kernel Configuration

では、メインのkernelの設定へ
kernelの設定方法は以下のように,いくつかあるので使いやすい方を選ぶ.

この他にも全ての設定をYesとするmake allyesconfigやその逆のmake allnoconfig、 できるだけモジュールにするmake allmodconfigなどがある.またそれぞれのアーキテクチャにそった 設定がarch/***/configs/の中にある.これらである程度の設定を行ってもらい,細かい設定を上のコマンド を用いるなどをすれば設定が容易になるだろう.
実験環境ではgconfigは動かなかった.設定はxconfigをメインに使った.


設定項目

kernelの設定項目は非常に多い.以下の表は大まかな設定の内容を記述している.

表1:設定内容
64-bit kernel 64ビット用のカーネルにするかどうかの設定
Processor suport PPC系列のprocessorの選択やmulti processorのサポート
Code maturity level option 開発中や試験的に使用している機能の項目の選択をできるようにする
General setup 一般設定の項目
Loadable module support ローダブルモジュールを利用するための設定.モジュールのロードに関する項目やkernelのモジュールの自動読みこみなどがある
Block layer ブロックデバイスのサイズのサポートなど
Platform support Prossecer Typeによって変化する.
Kernel options サーバ向けかデスクトップ向けにするかの選択(?)他にも電源管理とか,サスペンドとか.
Bus options 拡張カードバスに関する設定
Advanced setup さらに細かい設定を行えるようにするかどうかの設定
Nerworking TCP/IPを使用するかどうかなどのネットワークの設定項目
Device Drivers デバイスドライバに関する設定.さまざまなデバイスの必要かどうかを設定する.
File systems サポートするファイルシステムに関する設定.
Library routines CRCチェックに関する設定
Instrumentation Support  
Kernel hacking 強制リブートやダンプなどの機能をつける.主にkernelのデバッグに利用する機能.
Security options セキュリティ機能に関する項目
Cryptographic options 暗号化アルゴリズムに関する設定


今回の実験の関連の設定ではLoadable module supportにあるModule unloadingの設定をONにしておく, また,いらないと思われるモジュールは排除して今後のコンパイルを早められるようにした.


Kernelのコンパイル

設定が終ったらkernelをコンパイルする.
kernelが2.6の場合はkernelのコンパイルはmakeコマンドを実行するだけでよい.
%make
makeをするとkernelとmoduleのコンパイルが同時に行われる.もし,別々でコンパイルしたいのなら
%make zImage %make modules
とのようにすることでコンパイルが可能.2.6より下のバージョンでコンパイルを行う場合は make zImage,make modulesを行う前にmake depをして変更をカーネルツリーに反映させる必要がある. コンパイルが通ればvmlinuxやSystem.map,arch/powerpc/boot/zImageなどが生成されているはずだ.

モジュールをインストールする.
%make modules_install
これによって/lib/modulesのディレクトリ下に設定したリリースの名前のフォルダができ,モジュールが インストールされる.

kernelをインストール(/bootにコピー)する.
%cp arch/powerpc/boot/zImage /boot/vmlinuz-2.6.17.mycustom %cp vmlinux /boot/vmlinux-2.6.17.mycustom %cp System.map-2.6.17.mycustom
この時,zImage及びvmlinuxというファイルがkernel本体である.zImageはvmlinuxを圧縮したものである. System.mapはsymbol情報を格納したファイルである.これらを/bootのディレクトリ下に適当に名前を変更 してコピーする.

initrdの作成
%mkinitrd -i initrd-2.6.17.mycustom -k vmlinux-2.6.17.mycustom -M System.map-2.6.17.mycustom
Suseの場合は以上のようにして作成する,もしくはmkinitrdコマンドだけを行う事で現在/bootにあるそれぞれの kernelについてのinitrdを作成してくれる.
initrdはブートローダにRAMディスクをロードする機能を与える.そしてこのRAMディスクはrootとしてmount され,そこから各種のプログラムを起動する事ができる.これを使う事によってSCSIやFireWireなどの機器から のkernelの起動が可能となっている.今回はそれらを用いるわけでもないので必要性は薄いと思われるが作成 しておく事にする.



Boot loaderの編集

kernelのコピーが終ったら,次はそのkernelをブートさせるための設定をブートローダに加える必要がある. ブートローダにはいくつかの種類があるがここではyabootの設定を説明する.yabootはMacとlinuxをデュアルブート できるブートローダで,その設定はliloと共通となっている.今回はデュアルブートを行なう環境が必要なため yabootを用いた.通常,yabootの設定ファイルは/etc/yaboot.confにあるが、SUSEではliloの設定ファイルから 読み込んでいるようである.liloの設定ファイルは/etc/lilo.confであり,これを見てみると以下のようになっている.
activate timeout = 80 default = linux boot = /dev/hda3 image = /boot/vmlinux ###Don't change this comment - YaST2 identifier: Original name: linux### label = linux append = " quiet sysrq=1" initrd = /boot/initrd root = /dev/hda6
これを以下のようにし,作成したkernelの設定を追加する.
activate timeout = 80 default = linux boot = /dev/hda3 image = /boot/vmlinux ###Don't change this comment - YaST2 identifier: Original name: linux### label = linux append = " quiet sysrq=1" initrd = /boot/initrd root = /dev/hda6 image = /boot/vmlinux-2.6.17.mycustom ### mycustom linux ### label = mycustom append = " quiet sysrq=1" initrd = /boot/initrd-2.6.17.mycustom root = /dev/hda6
赤く表示しているところが追加した部分.labelはPCを起動した際にどのkernelをブートするのかを選択する 時に表示される名前.imageはブートするkernel本体を指してしている.appendはkernelのブート時にkernel に渡す引数で,rootがこのlinuxの通常時にルートとして扱われるデバイスを表している.

設定が終ったらその設定を反映させる
%/sbin/lilo
これでエラーがでなかったら再起動をする.
起動したらlabelで指定した項目が新しくでているのでそれを入力する. これで起動できればkernelの再構築は成功である.

最後に新しいkernelとなっているかを確認する.
%uname -r 2.6.17.mycustom
ちゃんと設定したkernelが動いている事が伺える.




考察

kernelを再構築するメリットには主にカーネルのアップデートや、kernelの設定を変更する事によって サポートされて(して)なかったデバイスドライバが使用できるようになったり、また逆に必要の無いデバイ スドライバの排除、モジュール化などによってカーネルの起動を早めるといったことが上げられる。この他 にも今回の実験のようにシステムコールの追加やカーネルのデバッグなどの開発の作業の際にもkernelの 再構築は行われる.

今回,kernelを再構築した後,apparmorの起動がfailedとなった.このモジュールはSUSE特有(?)のセキュリティ の機能らしく,どうやらkernelを変更した際にそのkernelには含まれていなかった模様.まだ試しては無いが ソースを持ってきて組み込めば大丈夫だと思われる.


参考文献




<-previous problem    go to top    next problem->