
Linux kerneld mini-HOWTO

Henrik Storner

kerneld-howto@linuxdoc.org

JF Project - 日本語訳

JF@linux.or.jp

Copyright (C) 2000 by Linux Documentation Project <
kerneld-howto@linuxdoc.org>
Revision History                                                       
Revision v2.0                       22 May 2000                        
conversion from HTML to DocBook SGML.                                  
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Table of Contents
1. kerneld mini-HOWTO について
    1.1. Credits
   
   
2. kerneld とは？
    2.1. 何故 kerneld を使うのか？
    2.2. ファイルの入手先
   
   
3. 設定方法
    3.1. kerneld を使ってみる
   
   
4. kerneld がロードする対象のモジュールを認識する方法
    4.1. ブロックデバイス
    4.2. キャラクタデバイス
    4.3. ネットワークデバイス
    4.4. バイナリフォーマット
    4.5. ライン制御 (slip, cslip, ppp)
    4.6. ネットワークプロトコルファミリ (IPX, AppleTalk, AX.25)
    4.7. ファイルシステム
   
   
5. 個別の設定を必要とするデバイス
    5.1. char-major-10 : マウス、watchdog、random デバイス
    5.2. SCSI ドライバのロード：scsi_hostadapter の設定
    5.3. モジュールのロードだけでは不十分な場合：post-install
   
   
6. kerneld の動作を監視する方法
7. 特殊な kerneld の使い方
8. よくある問題と疑問

1. kerneld mini-HOWTO について

この文書では、自動カーネルモジュールローダである "kerneld" のインストー
ルと使い方について説明します。この文書の最新版は、 Linux Documentation
Project にあります。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1.1. Credits

この文書は、Henrik Storner <storner@osiris.ping.dk> が 1997年7月 19日に
作成した HTML バージョン 1.7 をベースにして、Gary Lawrence Murphy <
garym@teledyn.com> が 2000年5月20日に改訂および DocBook 化を行いました
。

この mini-HOWTO の作成にあたっては、以下の方々にお世話になりました。

 ・ Bjorn Ekwall bj0rn@blox.se
   
 ・ Ben Galliart bgallia@luc.edu
   
 ・ Cedric Tefft cedric@earthling.net
   
 ・ Brian Miller bmiller@netspace.net.au
   
 ・ James C. Tsiao jtsiao@madoka.jpl.nasa.gov
   

この文書に間違いがあった場合は、<kerneld-howto@linuxdoc.org> までメール
でお知らせください。コメント・激励・提案は、歓迎いたします。この文書を
更新し、より正確なものにしてゆくために、ご連絡をお願いします。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

2. kerneld とは？

この文書で紹介する kerneld というプログラムは、Bjorn Ekwall によって、
開発版カーネル 1.3 の配布当時に導入されました。kerneld を使うと、デバイ
スドライバやネットワークドライバ、ファイルシステムなどのカーネルモジュ
ールが必要に応じて自動的にロードされるようになります。それゆえ、
modprobe や insmod コマンドを使い、手動でモジュールをロードする必要がな
くなります。

また、安定版カーネルには(今のところ？)組み込まれてはいませんが、次のよ
うな面白い機能もあります。

 ・ 初期設定のモニタ省電力プログラム(screen blanker)の代わりに、ユー
    ザプログラムを起動するように設定できます。つまり、どんなプログラム
    でもスクリーンセーバとして使うことができます。
   
 ・ 上記モニタ省電力プログラムに関する機能と同様に、標準コンソールの
    ビープ音を全く違ったものに変更することができます。
   

kerneld は、次のふたつのコンポーネントから構成されています。

 ・ Linux カーネル空間からデーモンにリクエストを送り、特定のタスク処
    理を担当するモジュールを呼び出させるカーネル機能。
   
 ・ カーネルからのリクエストを処理するために、どのモジュールをロード
    すべきか判断するユーザ空間デーモン。
   

kerneld の機能を働かせるには、両方のコンポーネントが動いていなければな
りません。片方だけの設定では不十分です。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

2.1. 何故 kerneld を使うのか？

kerneld を使うべき理由はいくつかあります。ここでは、著者自身が考える理
由を述べますが、他の人にとっては他の理由があるかもしれません。

 

 ・ ほとんど違いのない複数システムがあり、それらすべてのシステムのカ
    ーネルをビルドする必要がある場合、たとえばネットワークカードだけが
    違うといった場合に、別々に各システムのカーネルをビルドせずとも、単
    一のカーネルといくつかのモジュールをビルドするだけで済みます。
   
 ・ 開発者にとっては、モジュールのほうが、プログラムのテストがやり易
    くなります。ドライバのロードやアンロードをする場合でも、システムを
    再起動する必要がありません。これは、あらかじめ kerneld がロードした
    モジュールだけでなく、すべてのモジュールについて言えることです。
   
 ・ カーネルが使うメモリを節約できるので、アプリケーションにより多く
    のメモリをまわせます。カーネルが使うメモリは「絶対に」スワップアウ
    トされないので、もし使用しないドライバをカーネルに組み込んで、それ
    が 100Kb あったとすると、その分だけ RAM を無駄遣いしていることにな
    ります。
   
 ・ 著者が使っている ftape フロッピーテープドライバや iBCS などは、モ
    ジュールとしてのみ提供されているのですが、それらのモジュールを必要
    とするたびに毎回ロードやアンロードをする手間を省けます。
   
 ・ Linux ディストリビューションの作成者は、あらかじめ 284 通りのブー
    トイメージを作成せずとも、個々のユーザが手持ちのハードウェアに応じ
    てドライバをロードできるようになります。現在の Linux ディストリビュ
    ーションでは、ハードウェアを検出して、実際に必要なモジュールだけを
    ロードするようになっています。
   

とはいえ、読者が kerneld を使いたくない事情というのもあるでしょう。必要
なすべてのドライバを組み込んだ単一のカーネルイメージのほうがいい場合は
、他の文書をあたってください。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

2.2. ファイルの入手先

Linux カーネルでの kerneld サポートは、カーネル 1.3.57 で導入されました
。もしそれ以前のカーネルバージョンを使っている場合、kerneld 機能を有効
にするにはカーネルのアップグレードが必要です。最新版の Linux カーネルソ
ースは以下のサイトから入手できますが、Linux FTP アーカイブサイトならた
いていどこででも手に入ります。

 ・ Kernel.Org Archive
   
 ・ Metalab Linux Archive
   
 ・ TSX-11 at MIT
   

ユーザ空間デーモンは、modules パッケージに同梱されています。通常これら
はカーネルソースと同じ場所に置かれています。
   
   
    Note: 最新版カーネルでモジュールの自動ロードを利用しようとしている
    場合は、なるべく新しい modutils パッケージを使い、modules パッケー
    ジは使わないでください。その際は、必ずカーネルソース付属の
    Documentation/Changes ファイルをチェックして、お使いのカーネルイメ
    ージが必要とするパッケージがどのバージョン以降なのかを確認してくだ
    さい。また、FAQ に記述した、モジュールと 2.1 カーネルでの問題につい
    てもご覧ください。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

3. 設定方法

まず必要なパーツを入手します。適当なカーネルと最新版 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 やそのミラーサイトで閲覧することができます(訳
    注：日本語訳は、こちらです)。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

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 分
以上使わない状態が続くと、そのメモリは解放されます。アプリケーションに
割り当てるメモリが足りない場合などに、この機能は非常に重宝します。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

4. kerneld がロードする対象のモジュールを認識する方法

kerneld は、たいていのモジュールタイプをあらかじめ認識できるように作成
されていますが、状況によっては、kernel からのリクエストをどう処理してよ
いか分からないということもあります。これは CD-ROM ドライバやネットワー
クドライバの場合に見られる症状です。ロード可能なモジュールが複数存在し
ているのです。

kerneld デーモンがカーネルから受け取るリクエストは、次のうちのどれかに
該当します。

 ・ ブロック・デバイス・ドライバ
   
 ・ キャラクタ・デバイス・ドライバ
   
 ・ バイナリ・フォーマット
   
 ・ tty 回線制御
   
 ・ ファイルシステム
   
 ・ ネットワーク・デバイス
   
 ・ ネットワークサービス (たとえば、rarp など)
   
 ・ ネットワークプロトコル (たとえば、IPX など)
   

kerneld は、設定ファイル /etc/conf.modules をスキャンしてどのモジュール
をロードすべきか決定します [1] 。このファイルには 2 種類の項目がありま
す。ひとつはモジュールファイルが置かれている場所へのパスであり、もうひ
とつは特定のサービスに対してロードすべきモジュールを割り振っているエイ
リアスです。この設定ファイルがまだシステム上にない場合は、次のコマンド
で作成することができます。
  /sbin/modprobe -c | grep -v '^path' /etc/conf.modules                

デフォルトの path 設定に加えて、さらに別の path 設定を追加したい場合、
その際は、必ずデフォルトの全 path も一緒に設定してください。 /etc/
conf.modules 内に path 設定があると、 modprobe がデフォルトで認識してい
たすべての path が書き換えられてしまうからです。

ただ、もともと通常必要とされる設定はなされているはずなので、それをいじ
って、わざわざpath を追加したいとは思わないでしょう。

上記とは異なり、alias や option の設定を追加するだけの場合、 /etc/
conf.modules に対して新規に書き込まれた設定は modprobe の既知の設定に追
加されます。 alias や option を定義し直した場合、 /etc/conf.modules の
新規の設定は、もとの設定を上書きします。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

4.1. ブロックデバイス

/sbin/modprobe -c を実行すると、カーネルが認識している全モジュールと、
そのモジュールに対するリスエスト名との一覧が表示されます。たとえば、フ
ロッピードライバをロードするためのリクエストは、メジャー番号(major
number) 2 を持つブロックデバイスに対するリクエストとなります。
  osiris:~ $ /sbin/modprobe -c | grep floppy                           
  alias block-major-2 floppy                                           

この場合、なぜ block-major-2 という名称になるのでしょうか？理由は、/dev
/fd* というフロッピーデバイスがメジャーデバイス番号 2 を使うブロックデ
バイスだからです。
  osiris:~ $ ls -l /dev/fd0 /dev/fd1                                   
  brw-rw-rw-   1 root     root       2,   0 Mar  3  1995 /dev/fd0      
  brw-r--r--   1 root     root       2,   1 Mar  3  1995 /dev/fd1      
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

4.2. キャラクタデバイス

キャラクタデバイスの場合も上記と同じような処理になります。たとえば、
ftape フロッピーテープドライバは、メジャーデバイス番号が 27 番となって
います。この番号は次のようにして確認できます。
  osiris:~ $ ls -lL /dev/ftape                                         
  crw-rw----   1 root     disk      27,   0 Jul 18  1994 /dev/ftape    

ただ、kerneld は、初期設定のままでは ftape ドライバを認識しません。 /
sbin/modprobe -c で出力されるリストには載っていないからです。それゆえ、
kerneld を設定して ftape ドライバをロードするようにさせるには、kerneld
の設定ファイルである /etc/conf.modules に次の一行を追加する必要がありま
す。
  alias char-major-27 ftape                                            
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

4.3. ネットワークデバイス

char-major-xxx や block-major-yyy で設定するのではなく、デバイス名を使
うことも可能です。これが便利なのは、ネットワークドライバを使う場合です
。たとえば、 eth0 で ne2000 ネットワークカードを使う場合、次の行を付け
加えます。
  alias eth0 ne                                                        

ドライバにオプションを渡す必要がある場合、たとえば、そのカードが使用す
る IRQ をモジュールに指定する場合などは、 "options" という行を追加しま
す。
  options ne irq=5                                                     

この設定により、kerneld は以下のコマンドを使って NE2000 ドライバをロー
ドします。
  /sbin/modprobe ne irq=5                                              

もちろん、実際に使うオプションは、ロードするモジュールに合わせて設定し
てください。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

4.4. バイナリフォーマット

バイナリフォーマットも同様に扱われます。プログラムを実行しようとして、
そのプログラムをロードする方法をカーネルが認識できない場合はいつも、
kerneld に binfmt-xxx というリクエストが送られます。ここで xxx の部分に
はある数字が入りますが、これは実行ファイルの最初の数バイトを見て決定さ
れます。それゆえ、たとえば、ZMAGIC の binfmt_aout モジュール ( a.out バ
イナリのモジュール) をロードできるよう kerneld を設定する場合、以下のよ
うになります。
  alias binfmt-267 binfmt_aout                                         

ZMAGIC ファイルのマジック番号は 267 なので、/etc/magic をチェックすれば
、0413 という数字が記載されているのが分かると思います。kerneld は 10 進
数を使いますが、/etc/magic では 8 進数が使われているので、8 進数 413 =
10 進数 267 であることに注意してください。実際の a.out 実行ファイルには
、(NMAGIC、QMAGIC、ZMAGIC という) 3 種類の若干異なる形式が存在している
ので、binfmt_aout モジュールを完全にサポートするには以下のような設定が
必要です。
  alias binfmt-264 binfmt_aout  # pure executable (NMAGIC)             
  alias binfmt-267 binfmt_aout  # demand-paged executable (ZMAGIC)     
  alias binfmt-204 binfmt_aout  # demand-paged executable (QMAGIC)     

ただ、a.out、Java、iBCS のバイナリフォーマットは、特に設定せずとも、
kerneld に自動的に認識されるようになっています。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

4.5. ライン制御 (slip, cslip, ppp)

ライン制御は、tty-ldisc-x という書式でリクエストされます。ここで x には
、通常 SLIP 用の 1 か、PPP 用の 3 が入ります。特に設定をせずとも、
kerneld はどちらも自動で認識します。

ppp を使う場合、kerneld に ppp 用のデータ圧縮モジュールである bsd_comp
をロードさせたいときは、以下の 2 行を /etc/conf.modules に追加してくだ
さい。
  alias tty-ldisc-3 bsd_comp                                           
  alias ppp0 bsd_comp                                                  
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

4.6. ネットワークプロトコルファミリ (IPX, AppleTalk, AX.25)

ネットワークプロトコルのなかにもモジュールとしてロードできるものがあり
ます。カーネルが kerneld に対してプロトコルファミリをリクエストする際は
、net-pf-X というリクエストを送ります。ここで X には、必要とするプロト
コルファミリを示す数字が入ります。たとえば、net-pf-3 というリクエストは
AX.25 を、 net-pf-4 は IPX を、net-pf-5 は、AppleTalk を表しています。
これらの数字は、Linux ソースの include/linux/socket.h ファイルにある
AF_AX25 や AF_IPX 等の定義に基づいて決定されています。
  alias net-pf-4 ipx                                                   

起動時に未定義プロトコルファミリに関するメッセージが表示されるのを抑制
する方法については、FAQ に詳しい情報を記載しています。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

4.7. ファイルシステム

ファイルシステムに関する kerneld リクエストには、そのファイルシステムタ
イプの名称だけを使います。よくある例としては、CD-ROM のファイルシステム
用に isofs モジュールをロードする場合があります。すなわち、ファイルシス
テムタイプとして iso9660 を使う場合です。その際の設定方法は以下のように
なります。
  alias iso9660 isofs                                                  
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

5. 個別の設定を必要とするデバイス

デバイスのなかには、通常のようにデバイスとモジュールをエイリアスで繋ぐ
だけでなく、さらにいくつかの追加設定を必要とするものがあります。たとえ
ば、以下のようなデバイスです。

 ・ メジャー番号 10 を持つキャラクタデバイス：種々のデバイス
   
 ・ SCSI デバイス
   
 ・ 特殊な初期化を必要とするデバイス
   

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

5.1. char-major-10 : マウス、watchdog、random デバイス

ハードウェアデバイスは、通常、メジャー番号によって個別に認識されます。
たとえば、ftape は、char-major-27 です。しかし、/dev には、キャラクタデ
バイスのメジャー番号 10 (char major 10) を割り当てられているデバイスが
各種大量にあります。該当するのは、以下のようなものです。

 ・ 様々なマウス (バスマウス、PS/2 マウス)
   
 ・ Watchdog デバイス
   
 ・ カーネル random デバイス
   
 ・ APM (Advanced Power Management) インターフェイス
   

これらのデバイスは、単一のモジュールではなく、それぞれのデバイスごとの
モジュールによって制御されるので、これらの各種デバイス (misc.device)に
関する kerneld の設定には、メジャー番号に加えてマイナー番号も使用されま
す。
  alias char-major-10-1 psaux     # For PS/2 mouse                     
  alias char-major-10-130 wdt     # For WDT watchdog                   

この機能を利用するには、カーネルのバージョン 1.3.82 以降が必要です。そ
れ以前のバージョンでは、kerneld にマイナー番号を渡すことができないので
、kerneld はどのデバイスをロードすべきか判断できません。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

5.2. SCSI ドライバのロード：scsi_hostadapter の設定

SCSI デバイスのドライバは、SCSI ホストアダプタのドライバ(たとえば、
Adaptec 1542)と、実際に使っている SCSI デバイスタイプごとのドライバ (た
とえば、ハードディスク、CD-ROM、テープドライブなど)の両方から成り立って
いて、これらはすべてモジュール化できます。しかし、たとえば、Adaptec の
カードに接続した CD-ROM ドライブにアクセスしようとする場合、カーネルと
kerneld が認識するのは、SCSI CD-ROM のサポートのために sr_mod が必要だ
ということだけです。その CD-ROM がどのような SCSI コントローラに接続さ
れているかは認識しないので、どのモジュールをロードして SCSI コントロー
ラをサポートすべきか分からないのです。

この問題を解決するには、/etc/conf.modules に SCSI ドライバモジュールの
設定を書き込んで、多数ある SCSI コントローラ用のモジュールのうちどれを
ロードすべきか kerneld に指示するようにします。その設定は、たとえば、以
下のようになります。
  alias scd0 sr_mod               # sr_mod for SCSI CD-ROM's ...       
  alias scsi_hostadapter aha1542  # ... need the Adaptec driver        

こうした設定は、カーネルのバージョン 1.3.82 以降でないと機能しないので
注意してください。

上記設定が有効なのは、SCSI コントローラが一枚の場合だけです。複数の
SCSI カードがある場合、設定はもう少し複雑になります。

原則として、何らかの SCSI ホストアダプタが既にインストールされている場
合、それ以外のホストアダプタ用ドライバを kerneld にロードさせることはで
きません。両方のドライバを(モジュールではなく) カーネルに組み込んでしま
うか、もしくは手動でロードする必要があります。
   
   
    Tip: kerneld に複数の SCSI ホストアダプタをロードさせる方法があるこ
    とはあります。James Tsiao が以下のようなアイデアを教えてくれました
    。
       
        modules.dsp での依存関係を手書きで設定し直せば、kerneld にふた
        つ目の SCSI ホストドライバを簡単にロードさせることができます。
        次にように設定すればいいのです。
          /lib/modules/2.0.30/scsi/st.o: /lib/modules/2.0.30/scsi/aha1542.o
       
        上記に設定により、kerneld は、st.o をロードする前に、aha1542.o
        をロードするようになります。わたしの自宅のマシンの設定は上記と
        全く同じなのですが、テープ、 CD-ROM、その他汎用の SCSI デバイス
        を含む全 SCSI デバイスが問題なく動いています。ただ、この設定の
        欠点としては、depmod -a コマンドではこうした依存関係を自動認識
        できないので、ユーザが手で設定を書き加える必要があることと、起
        動時に depmod -a を実行してはいけないことです。とはいえ、一旦設
        定が終われば、kerneld は aha1542.o をまったく問題なく自動的にロ
        ードします。

注意すべき点として、上記テクニックが有効なのは、各種 SCSI デバイスがふ
たつの SCSI コントローラに接続されている場合だけであるということです。
たとえば、ハードディスクがひとつのコントローラ上にあり、CD-ROM ドライブ
やテープ、およびその他の汎用 SCSI デバイスが別のコントローラ上にある場
合だけです。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

5.3. モジュールのロードだけでは不十分な場合：post-install

モジュールをロードしただけではデバイスが動かない場合があります。例を挙
げると、サウンドカードをモジュールとしてコンパイルした場合、ボリューム
を一定のレベルに設定しておくと便利です。しかし、ここで問題となるのは、
ボリュームを設定したとしても、再度モジュールをロードするとその設定が無
効になってしまうことです。以下に Ben Galliart (<bgallia@luc.edu>) によ
る便利なトリックを紹介します。
   
   
    試行錯誤の結果、 setmix パッケージをインストールしてから、以下の行
    を /etc/conf.modules に追加する必要があることが分かりました。
      post-install sound /usr/local/bin/setmix -f /etc/volume.conf     

上記設定の意味は、sound モジュールがロードされた後、kerneld が
post-install sound で始まる設定行で指示されたコマンドを実行するというこ
とです。これによって、sound モジュールは、/usr/local/bin/setmix -f /etc
/volume.conf というコマンドによって設定されます。

これは、他のモジュールを使う場合にも便利だと思います。たとえば、 lp モ
ジュールを tunelp プログラムによって設定するには以下のようにします。
  post-install lp tunelp options                                       

kerneld にこのオプションを認識させるには、kerneld のバージョン 1.3.69f
以降が必要です。
   
   
    Note: この mini-HOWTO の以前のバージョンでは pre-remove オプション
    について説明していました。これは、kerneld がモジュールを削除する直
    前に、特定のコマンドを実行するために利用されるはずのものでした。し
    かし、結局この機能は使い物にならなかったので、利用しないよう呼びか
    けがあり、おそらく今後の kerneld のリリースからこのオプションは姿を
    消すでしょう。現在、モジュールの設定方法全体が見直されているので、
    読者がこの文書を読む頃には、システム上で違う設定が要求されているか
    もしれません。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

6. kerneld の動作を監視する方法

あらゆる事柄を試してみても、カーネルが kerneld に対して何をさせようとし
ているのかが分からない場合、kerneld が受け取っているリクエストを確認し
て、/etc/conf.modules に何を書き込むべきかを理解する手段があります。
kdstat ユーティリティです。

この気の利いたプログラムは、module のパッケージに同梱されているのですが
、デフォルトではコンパイルもインストールもされません。ビルドするには、
kerneld のソースコードがあるディレクトリに移動して、make kdstat と打ち
込んでください。そして、kerneld に動作情報を表示させるために、kdstat
debug を実行すると、kerneld は自己の動作に関するメッセージをコンソール
に出力します。この状態で、使いたいコマンドを実行すると、該当する
kerneld へのリクエストを見ることができます。このリクエストを /etc/
conf.modules に書き込んで、そのジョブを実行するのに必要なモジュールへの
エイリアスを通すと、設定ができます。

デバッギングを終了するには、/sbin/kdstat nodebug を実行してください。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

7. 特殊な kerneld の使い方

読者は、スクリーンセーバ・モジュールの設定方法を知りたいとお思いかもし
れません。もちろん、説明します！

モジュールパッケージの kerneld/GOODIES というディレクトリには、kerneld
でスクリーンセーバやコンソールビープ音等をサポートするカーネルパッチが
あります。これらはまだ正式なカーネルの一部とはなっていないので、利用す
るには、これらのカーネルパッチをインストールした上でカーネルを再構築す
る必要があります。

パッチをインストールするには、次のような patch コマンドを使います。
  cd /usr/src/linux                                                    
  patch -s -p1 /usr/src/modules-*/kerneld/GOODIES/blanker_patch        

その上で、カーネルを再構築し、作成された新規カーネルをインストールしま
す。

以上で、スクリーンセーバ起動の要請があると、kerneld は /sbin/
screenblanker というファイルをコマンドとして実行するようになります。こ
のファイルの中身は好みに応じて変更することができます。たとえば、自分が
好きなスクリーンセーバを起動するシェルスクリプトに変更することができま
す。

カーネルがスクリーンをもとに戻す際は、SIGQUIT シグナルが /sbin/
screenblanker を実行しているプロセスに送信されます。入れ替えたシェルス
クリプトやスクリーンセーバは、これをトラップして、終了できなければなり
ません。スクリーンをもとのテキストモードに戻すという処理を忘れないでく
ださい。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

8. よくある問題と疑問

8.1. /sbin/ifconfig を実行すると、Cannot locate module for net-pf-X と
    いうメッセージが表示されるのは何故でしょう？
8.2. kerneld を使い初めてから、PPP コネクションを張っている際に、システ
    ムの反応が非常に遅くなってしまいました。
8.3. kerneld が SCSI ドライバをロードしてくれない！
8.4. modprobe が gcc2_compiled が未定義だと文句を言う。
8.5. サウンドドライバのボリューム等の設定を記憶させたい。
8.6. DOSEMU でモジュールを使う必要があるのですが、どうすれば kerneld に
    それらをロードさせることができますか？
8.7. Ouch, kerneld timed out, message failed というメッセージが表示され
    るのは、なぜでしょう？
8.8. kerneld がファイルシステムモジュールをロードするのを待たずに、
    mount が実行されてしまう。
8.9. kerneld が ncpfs モジュールをロードできません。
8.10. kerneld が smbfs をロードできません。
8.11. モジュール化が可能なものすべてをモジュールとしてビルドしたら、シ
    ステムが起動しなくなったり、kerneld がルートファイルシステムモジュ
    ールをロードできなくなったりします。
8.12. 起動時に kerneld がロードされません。libgdbm 関するエラーが出ます
    。
8.13. Cannot load module xxx というエラーが出るのですが、カーネル再構築
    の際に xxx は無効にしているのです！
8.14. カーネルとモジュールを再構築したのですが、それでも起動時に
    unresolved symbols というメッセージが表示されます。
8.15. Linux 2.1/2.3 をインストールしたら、モジュールがまったくロードで
    きなくなってしまった！
8.16. ダイヤル・オン・デマンドでのネットワーキングは可能ですか？

8.1. /sbin/ifconfig を実行すると、Cannot locate module for net-pf-X と
いうメッセージが表示されるのは何故でしょう？

カーネルバージョン 1.3.80 の頃に、ネットワーク関係のコードが変更され、
(IPX や AX.45、AppleTalk といった)プロトコルファミリがモジュールとして
ロードできるようになりました。このために、 net-pf-X という kerneld への
リクエストが新規に追加されました。ここで X にはプロトコルを判別するため
の数字が入ります(種々の数字の意味については、/usr/src/linux/include/
linux/socket.h をご覧ください)。ただ、残念なことに、ifconfig はたまたま
こうしたメッセージをトリガーしてしまっているようです。それゆえ、システ
ムの起動時に ifconfig でループバックデバイスが設定される際に、多くのユ
ーザのログにそうしたメッセージが出力されてしまいます。このメッセージは
無害であり、 /etc/conf.modules に以下の行を追加すれば出力されなくなりま
す。
  alias net-pf-3 off      # Forget AX.25                               
  alias net-pf-4 off      # Forget IPX                                 
  alias net-pf-5 off      # Forget AppleTalk                           

当然ではありますが、IPX をモジュールとして使う場合は、上記の行を追加し
て IPX を無効にすることのないよう注意してください。

8.2. kerneld を使い初めてから、PPP コネクションを張っている際に、システ
ムの反応が非常に遅くなってしまいました。

これについては、複数のユーザから報告を受けています。残念なことに、tkPPP
スクリプトを使って PPP コネクションをモニターさせる設定にすると、システ
ムによっては kerneld との間で動作が干渉するようです。このスクリプトは、
ifconfig を実行しながらループ処理をしているようですが、これが kerneld
の起動を誘発し、kerneld は net-pf-X モジュール (上記参照)を探そうとする
ので、システム負荷が高くなり、場合によってはシステムログに "Cannot
locate module for net-pf-X" というメッセージが大量に吐き出されます。こ
れを回避する方法はまだ見つかっていないので、tkPPP を使わないようにする
か、コネクション監視の方法を変えるかする以外にありません。

8.3. kerneld が SCSI ドライバをロードしてくれない！

SCSI ホストアダプタの設定を /etc/conf.modules に追加してください。詳し
くは、scsi_hostadapter の設定についての記述をご覧ください。

8.4. modprobe が gcc2_compiled が未定義だと文句を言う。

これは、モジュールユーティリティのバグであり、binutils 2.6.0.9 以降と組
み合わさった場合のみ見られるものです。binutils のリリースノートにも記述
されていますので、それを読むか、バグが修正されたモジュールユーティリテ
ィのアップグレード版をダウンロードして使ってください。

8.5. サウンドドライバのボリューム等の設定を記憶させたい。

モジュールに関する設定は、ロードされている間、モジュール自体の内部に保
存されます。それゆえ、kerneld がそのモジュールを自動的にアンロードする
と、ユーザが行った設定はすべて消去されるので、再度モジュールがロードさ
れた際にはデフォルトの設定に戻ってしまいます。

モジュールが自動的にロードされた後に、何らかのプログラムを実行してモジ
ュールを設定するよう kerneld に指示することができます。 Section 5.3 の
post-install の設定をご覧ください。

8.6. DOSEMU でモジュールを使う必要があるのですが、どうすれば kerneld に
それらをロードさせることができますか？

できません。正式版の DOSEMU も開発版のほうでも、kerneld を使った dosemu
モジュールのロードはサポートされていません。しかし、もしカーネル 2.0.26
以降を使っているなら、特別な dosemu モジュールは不要になりました。
DOSEMU を 0.66.1 かそれ以降のバージョンにアップグレードしてください。

8.7. Ouch, kerneld timed out, message failed というメッセージが表示され
るのは、なぜでしょう？

カーネルが kerneld にリクエストを送ると、カーネルは、kerneld からの応答
確認を 1 秒以内に受信することを期待します。kerneld がこの応答確認を送信
しない場合、上記メッセージがログに出力されます。このリクエストは再度送
信され、最終的に kerneld に渡されます。

上記の問題は、通常、非常に負荷の高いシステム上で起こります。 kerneld は
ユーザモードのプロセスなので、スケジューリングにおいて、システム上の他
のプロセスと同じ扱いになります。システムの負荷が高い場合、カーネルのタ
イムアウト時間が経過する前に応答確認を送信する順番が回ってこない場合が
あるのです。

システム負荷が低い場合にもこの問題が起こるようなら、kerneld を再起動し
てみてください。kerneld プロセスを kill して、再度 /usr/sbin/kerneld で
プロセスを起動します。それでも問題が解消しないときは、バグレポートを <
linux-kernel@vger.rutgers.edu> にメールしてください。ただ、バグレポート
を送る前には、必ずカーネル、kerneld およびモジュールユーティリティのバ
ージョンが最新版であることを確かめてからにしてください。使用環境につい
ては、 linux/Documentation/Changes をチェックしてください。

8.8. kerneld がファイルシステムモジュールをロードするのを待たずに、
mount が実行されてしまう。

mount(8) コマンドが kerneld のファイルシステムモジュールのロードを待た
ずに実行されてしまう問題については、数多くの報告が既になされています。
lsmod を使うと、kerneld がロードしたモジュールの一覧が表示されるので、
そのすぐ後で mount コマンドを再実行すれば上手くいくと思います。これはモ
ジュールユーティリティのバージョン 1.3.69f のバグのようであり、Debian
ユーザがこの影響を受けているようです。モジュールユーティリティの最新バ
ージョンを入手すれば解決します。

8.9. kerneld が ncpfs モジュールをロードできません。

ncpfs ユーティリティは、-DHAVE_KERNELD を付けてコンパイルする必要があり
ます。詳しくは、ncpfs の Makefile をご覧ください。

8.10. kerneld が smbfs をロードできません。

smbmount ユーティリティの古いバージョンを使っているのだと思われます。最
新バージョン (0.10 以降)を the SMBFS archive one TSX-11 から入手してく
ださい。

8.11. モジュール化が可能なものすべてをモジュールとしてビルドしたら、シ
ステムが起動しなくなったり、kerneld がルートファイルシステムモジュール
をロードできなくなったりします。

あらゆるものをモジュール化できるというわけではありません。カーネルには
最低限必要なドライバを組み込んで、ルートファイルシステムをマウントした
り、必要なプログラムを実行したりして、 kerneld を起動し得る状態にしなけ
ればなりません [2] 。すなわち、以下のドライバはモジュール化できません。

 ・ ルートファイルシステムが乗っているハードディスクのドライバ
   
 ・ ルートファイルシステム自体のドライバ
   
 ・ init、kerneld その他をロードするバイナリフォーマットのローダ
   

8.12. 起動時に kerneld がロードされません。libgdbm 関するエラーが出ます
。

kerneld の新しいバージョンでは、GNU dbm ライブラリ libgdbm.so を起動す
る必要があります。インストール時にはたいていこのファイルが /usr/lib に
置かれるのですが、おそらく /usr ファイルシステムがマウントされる前に
kerneld が起動されているのではないかと思われます。この場合の症状として
、kerneld は、ブート時に (rc スクリプトから) 起動されることがないのに、
システムが立ち上がった後なら手動で起動できるというのがあります。解決策
としては、/usr がマウントされた後に kerneld を起動するようにするか、も
しくは、 gdbm ライブラリを /lib 等のルートファイルシステム上に移動させ
るかのいずれかです。

8.13. Cannot load module xxx というエラーが出るのですが、カーネル再構築
の際に xxx は無効にしているのです！

Slackware (もしくはそれ以外でも)をインストールすると、デフォルトで /etc
/rc.d/rc.modules が作成され、このファイル内で各種モジュールに対して明示
的に modprobe が実行されます。 modprobe の対象となるモジュールがどれで
あるかは、インストール時のカーネル設定をもとに決められています。おそら
くカーネルを再構築して、 rc.modules で modprobe を実行されるはずのモジ
ュールのいくつかを無効にしたために、エラーメッセージが出ているのだと思
います。rc.modules を編集して使わなくなったモジュールをコメントアウトす
るか、rc.modules ファイル自体を削除して必要なときに kerneld にモジュー
ルをロードさせるようにしてください。

8.14. カーネルとモジュールを再構築したのですが、それでも起動時に
unresolved symbols というメッセージが表示されます。

おそらく、カーネルを再設定・再構築して、モジュールのいくつかを無効にし
たのだと思われます。使わなくなった古いモジュールが /lib/modules ディレ
クトリに残っていて、それが邪魔をしているのです。最も簡単な解決策は、/
lib/modules/x.y.z ディレクトリを丸ごと削除して、カーネルソースディレク
トリで再度 make modules_install を実行することです。この問題は、カーネ
ルのバージョンはそのままで再構築した場合のみ起こるものであることに注意
してください。もし新しいカーネルバージョンに移行したのに、このエラーが
表示される場合は、これとは異なる問題が発生していることになります。

8.15. Linux 2.1/2.3 をインストールしたら、モジュールがまったくロードで
きなくなってしまった！

奇数番号の Linux では開発版カーネルが使われています。それゆえ、ときどき
不具合が生じるのは致し方ありません。大幅な変更がなされた点として、モジ
ュールの処理方法と、カーネルとモジュールがロードされるメモリの位置の変
更があります。

つまり、開発版カーネルでモジュールを利用する場合、次のことを実行すべき
です。

 ・ Documentation/Changes ファイルを読んで、システム上でアップグレー
    ドを必要とするパッケージがどれであるかを確認すること。
   
 ・ modutils パッケージの最新版を使うこと。これは、 Red Hat の
    AlphaBits やそのミラーサイト TSX-11 から入手できます。
   

2.1 カーネルでモジュールを使いたい場合は、最低でもカーネル 2.1.29 を使
用することをおすすめします。

8.16. ダイヤル・オン・デマンドでのネットワーキングは可能ですか？

もともと、kerneld ではオンデマンドでのダイヤルアップネットワーク接続の
確立をサポートしていました。コネクションが確立されていない状態でパケッ
トをネットワークに送信しようとした場合、kerneld が /sbin/request_route
スクリプトを実行して、 PPP や SLIP コネクションを設定するようになってい
ました。

しかし、結局この仕組みはよくないということになりました。 Linux ネットワ
ーキングの開発で有名な Alan Cox は、 linux-kernel メーリングリストに次
のように書いています。
   
   
    request-route の仕組みは、時代遅れのオンボロとなっているから、不要
    だ。 [...] これも 2.1.x から削除していい。

request-route スクリプトと kerneld の組み合わせのかわりとして、 Eric
Schenk の diald パッケージを使って、デマンドダイアリングを運用すること
をおすすめします。

Notes

[1] ディストリビューションのなかには、この設定ファイルを modules.conf  
    としているところもあります。                                       
[2] 実際のところ、これは真実ではありません。1.3.x 以降や 2.x でのカーネ
    ルは、起動時に ram-disk が使えるようになっていて、これを LILO や   
    Loadlin でロードすることができます。このディスクから起動の初期の段 
    階でモジュールをロードすることが可能です。設定方法は、カーネルソー 
    スに付属する linux/Documentation/initrd.txt ファイルに記述されてい 
    ます。                                                             
