3. 設定方法

まず必要なパーツを入手します。適当なカーネルと最新版 modules パッケージです。つぎに、パッケージの指示に 従って、モジュールのユーティリティをインストールします。操作は 簡単です。パッケージを解凍して make install を 実行するだけです。これによって、genksysminsmodlsmodmodprobedepmodkerneld といった プログラムが /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 やそのミラーサイトで閲覧することができます(訳注: 日本語訳は、こちらです)。

3.1. kerneld を使ってみる

上記設定が済んだら、リブートして新規カーネルが使えるようにします。 システムが立ち上がったら、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 分以上使わない状態が続くと、 そのメモリは解放されます。アプリケーションに割り当てるメモリが 足りない場合などに、この機能は非常に重宝します。