まず必要なパーツを入手します。適当なカーネルと最新版 modules パッケージです。つぎに、パッケージの指示に 従って、モジュールのユーティリティをインストールします。操作は 簡単です。パッケージを解凍して make install を 実行するだけです。これによって、genksysm、insmod、lsmod、modprobe、 depmod、kerneld といった プログラムが /sbin にインストールされます。 この際、起動のたびに必要となる設定を初期化スクリプトに書き込んで おくことをおすすめします。以下の行を Slackware の場合は /etc/rc.d/rc.S ファイルに、Debian や Corel、Red Hat、 Mandrake、Caldera といった SysVinit 系の場合は /etc/rc.d/rc.sysinit ファイルに書き込んでください。
# Start kerneld - this should happen very early in the # boot process, certainly BEFORE you run fsck on filesystems # that might need to have disk drivers autoloaded if [ -x /sbin/kerneld ] then /sbin/kerneld fi # Your standard fsck commands go here # And you mount command to mount the root fs read-write # Update kernel-module dependencies file # Your root-fs MUST be mounted read-write by now if [ -x /sbin/depmod ] then /sbin/depmod -a fi |
上記のコマンドは、お使いの SysV init スクリプトに既に書かれている 場合もあります。上段では、kerneld 自体を起動しています。下段では、 初期化のために depmod -a を実行して、 利用可能な全モジュールのリストを作成し、その依存関係を調べて います。depmod がモジュールのマップを作成し、それによって、 あるモジュールをロードする前に他のモジュールをロードしておく必要 があるかどうかを kerneld に指示します。
Note: kerneld の最近のバージョンでは、libgdbm という GNU gdbm ライブラリとリンクするオプションが付いています。 モジュールユーティリティをビルドする際にこの機能を有効にすると、 libgdbm が使えない場合には kerneld を起動できなくなって しまいます。これが問題となるのは、/usr を 独立のパーティションとしていて、/usr が マウントされる前に kerneld が起動される場合です。おすすめする解決策 としては、/usr/lib/libgdbm を /lib に移動させるか、kerneld に静的にリンクするかのどちらかです。
つぎに、カーネルソースを解凍して、必要な設定作業を行ったうえでビルド します。カーネルの構築作業が初めての場合は、Linux ソースの最上 ディレクトリにある README ファイルを必ず読んでください。カーネル設定 で make xconfig を実行する際は、最初のほうに書かれた 以下の質問について特に注意してください。
Enable loadable module support (CONFIG_MODULES) [Y/n/?] Y |
loadable module support を有効にする必要があります。でないと、 kerneld がロードすべきモジュールがコンパイルされません。ここでは、 Yes と答えてください。
Kernel daemon support (CONFIG_KERNELD) [Y/n/?] Y |
もちろん、これも有効にする必要があります。そうすれば、カーネル内の 多くの要素をモジュールとしてビルドすることができます。たとえば、 次のような質問をされた場合、
Normal floppy disk support (CONFIG_BLK_DEV_FD) [M/n/y/?] |
M と答えることで "Module" にする ことができます。一般に、システムの起動に必要なドライバだけを カーネルに組み込むべきであり、それ以外はモジュールとしてビルド してかまいません。
必要不可欠なドライバ |
システムの起動に必要不可欠なドライバは、カーネル自体に組み込まなければ ならず、モジュールとしてロードすることはできません。よくある例としては、 ハードディスクのドライバやルートファイルシステムのドライバなどがそれに 該当します。デュアルブート設定にしていて、起動時に Linux 以外のファイル システム置かれたファイルを必要とする場合は、そのファイルシステム用の ドライバもカーネルに組み込んでおかなければなりません。 |
make config コマンドを使ってカーネルを設定する 場合は、設定後に make dep clean bzlilo modules modules_install と打てば、新規カーネルとモジュールのコンパイルおよびインストールが できます。
まあ、こんな感じでしょうか。
カーネルイメージのコンパイル: make zImage コマンドを使った場合、カーネルの インストール手続きの手前まで実行された後、新規カーネルイメージが arch/i386/boot/zImage ファイルとして保存され ます。このカーネルイメージファイルを使うには、ブートイメージを 置くべき場所にこのファイルをコピーした上で、LILO コマンドによって インストールする必要があります。
カーネルを自分で設定してビルド・インストールする作業に関する詳しい 情報は、Kernel-HOWTO をご覧ください。この文書は、comp.os.linux.answers に定期的に投稿されていて、 Linux Documentation Project やそのミラーサイトで閲覧することができます(訳注: 日本語訳は、こちらです)。
上記設定が済んだら、リブートして新規カーネルが使えるようにします。 システムが立ち上がったら、ps ax コマンドを実行 してください。以下のような行が表示され、kerneld が動いているのが 分かるはずです。
PID TTY STAT TIME COMMAND 59 ? S 0:01 /sbin/kerneld |
kerneld が便利な点のひとつは、いったんカーネルとモジュールを インストールしてしまえば、それ以外にほとんど設定する必要が なくなるということです。手始めに、モジュールとしてビルドした ドライバのひとつを使ってみましょう。おそらく、何の設定をせずとも 動作するはずです。もし、フロッピーのドライバをモジュールとして ビルドしたなら、DOS フロッピーディスクをドライブに差し込んで、 次のように打つことができます。
osiris:~ $ mdir a: Volume in drive A has no label Volume Serial Number is 2E2B-1102 Directory for A:/ binuti~1 gz 1942 02-14-1996 11:35a binutils-2.6.0.6-2.6.0.7.diff.gz libc-5~1 gz 24747 02-14-1996 11:35a libc-5.3.4-5.3.5.diff.gz 2 file(s) 26689 bytes |
フロッピードライバが動いています! フロッピーディスクを使おうと するとき、kerneld によりドライバが自動的にロードされるのです。
実際にフロッピーモジュールがロードされていることを確認するには、 /sbin/lsmod コマンドを実行すれば、現在ロード されているすべてのモジュールの一覧が表示されます。
osiris:~ $ /sbin/lsmod Module: #pages: Used by: floppy 11 0 (autoclean) |
ここで、"(autoclean)" とは、そのモジュールが 1 分以上 使われていなかった場合に、それが kerneld により自動的に削除される ということを意味しています。それゆえ、11 page 分のメモリ( 1 page が 4 kB なので、44 kB) は、フロッピードライブにアクセスしている 間だけ使用されることになります。1 分以上使わない状態が続くと、 そのメモリは解放されます。アプリケーションに割り当てるメモリが 足りない場合などに、この機能は非常に重宝します。