次のページ 前のページ 目次へ

kerneld mini-HOWTO (日本語版)

Version 1.4, last updated: June  3, 1996 
(日本語版)   last updated: July 24, 1996 
Henrik Storner (storner@osiris.ping.dk) 著
小川 健太郎    (k_ogawa@oyna.cc.muroran-it.ac.jp) 
藤井 真吾      (sfujii@super.win.or.jp) 共訳
 ----------------------------------------------------------------------------

はじめに
 
  この文書では、Linux のカーネルで kerneld の機能を使う方法を説明します。 
kerneld の機能は 1.3.57 以降で追加されました。この文書には、以下のことが書
いてあります。

    * kerneld とは何か
    * なぜ使いたいのか
    * 必要なものを得る方法
    * 設定する方法
    * 知らないモジュールを kerneld に教える方法
    * kerneld の監視の方法  (設定に有益であろう)
    * PPP と SLIP 接続のオンデマンドダイヤル
    * 特別な kerneld の利用
    * 一般的な問題と疑問
 
  もし文書中に間違いを見つけたら、メモを送って下さい。この mini-HOWTO を改良
するためのコメントや提案は、どんなものでも歓迎します。この文書の最新版は、
http://eolicom.olicom.dk/~storner/kerneld-mini-HOWTO.html にあります。次にこ
の mini-HOWTO がリリースされるまでの間、変更部分の最新版は、
http://eolicom.olicom.dk/~storner/kern.html にあります。(ただし未整理です。)

----------------------------------------------------------------------------
 
kerneld とは何か?

  kerneld は、Bjorn Ekwall によって開発者用カーネル 1.3 に導入された機能で
す。kerneld は、デバイスドライバやネットワークドライバやファイルシステムなど
のカーネル「モジュール」を、必要になった時点で自動的に読み込みます。modprobe
や insmod を使って手動で読み込まなくてもよいのです。


kerneld はその他にもいくつかの機能も持っています。

    * ネットワーク上の他のノードへアクセスごとにプログラムを起動できます。
      例えば、SLIP 接続や PPP 接続をしている場合、ダイアルオンデマンドネッ
      トワークを作ることは簡単です。

  標準カーネルには(まだ?)取り込まれていませんが、もっと面白い機能もあります。

    * 標準のスクリーンブランカーの代わりに、ユーザープログラムを実行する
      ことができます。つまりどんなプログラムでもスクリーンセーバーとして
      使うことができるのです。
    * スクリーンブランカーのサポートと同じように、標準コンソールのビープ音も
      全く違うものに変えることができます。

 kerneld は二つの別々な部分からできています。

    * Linux カーネルの機能   : あるタスクがモジュールを必要としているという
                               リクエストをデーモンに送る。
    * ユーザレベルのデーモン : カーネルからのリクエストに対して、どのモジュー
                               ルをロードするか決定する。

  kerneld サポートがうまく働くためにはどちらも必要です。どちらか一方だけを
設定しても不十分です。

----------------------------------------------------------------------------

なぜ使いたいのか?
 
  kerneld を使った方がよい理由はいくつかあります。ここでは私が使う理由を述べ
ます。他の人は他の理由で使いたいと思うかも知れません。

    * 例えばネットワークカードだけが違うといったように、少しだけしか構成が違
      わない複数のシステムのためにカーネルを作らなければならない場合。一つの
      カーネルとモジュールをいくつか作るだけで済みます。それぞれのシステムご
      とにカーネルを作る必要はありません。
    * モジュール化によって、開発者は簡単にテストをすることができます。ドライ
      バをロードしたりアンロードしたりするためにシステムを再起動する必要があ
      りません。(これは kerneld が読み込むモジュールに限らず全てのモジュール
      について言えることです。)
    * カーネルが使うメモリの量を節約します。つまりアプリケーションが使えるメ
      モリが増えるということです。カーネルが使うメモリは*絶対に*スワップア
      ウトされないので、100kbの大きさの使われないドライバがカーネルに組み込ま
      れているのなら、単なる RAM の無駄使いです。
    * 私が使っている ftape フロッピーテープドライバ または iBCS などは、モ
      ジュールとしてのみ提供されています。しかし、必要に応じてロードしたり
      アンロードしたりする手間に煩わされたくありません。

  もちろん、kerneld を使わない方がいい理由もあります。開発者用カーネルは試し
たくないということも理由の一つになりえます。当然ながら、開発者カーネルには
バグが付きものですので、ディスク全体を消してしまう可能性だってあります。(私
のところではそんなことは一度も起こっていませんし、多くの人達が、なんの問題
もなく開発者用カーネルを使っています。しかし、システムに壊滅的な打撃を与え
るという可能性がないとはいえません。) この数カ月の間にLinux カーネルの次の
安定版がリリースされれば、この理由はなくなるでしょう。
[訳注 : すでに安定版カーネル 2.0.0 がリリースされています。]

 ----------------------------------------------------------------------------

必要なものを得る方法は?
 
  Linux カーネルでのサポートは、Linux 1.3.57で導入されました。もしこれより古
いカーネルを使っていて、kerneld のサポートが必要なら、アップグレードする必要
があります。カーネルのソースを置いている有名な Linux の ftp サイトは、以下の
通りです。

   ftp://sunsite.unc.edu/pub/Linux/kernel/v1.3/linux-1.3.57.tar.gz
   ftp://tsx-11.mit.edu/pub/linux/sources/system/v1.3/linux-1.3.57.tar.gz
   ftp://ftp.funet.fi/pub/Linux/PEOPLE/Linus/v1.3/linux-1.3.57.tar.gz

  ユーザーレベルのデーモンは、modules-1.2.8 パッケージとより新しい 
modules-1.3.57 パッケージに含まれています。これらは普通カーネルのソースと同
じ場所から入手できますが、正式な場所は以下の通りです。
 
   ftp://sunsite.unc.edu/pub/Linux/kernel/modules-1.3.57.tar.gz
   ftp://tsx-11.mit.edu/pub/linux/sources/sbin/modules-1.3.57.tar.gz
   ftp://ftp.funet.fi/pub/Linux/tools/modules-1.3.57.tar.gz

注意:あなたがこれを読んでいる時には、さらに新しいモジュールパッケージが利用
      できるかもしれません。modules-1.3.57 には、最新の binutil でモジュール
      をコンパイルしたときに、insmod が "gcc2_compiled not defined" と言って
      くるというバグが知られています。もしこの問題に見舞われて、上に挙げたサ
      イトでアップデートを見つけることができないのならば、Bjorn Ekwall の Web
      サイト  http://www.pi.se/blox/modules を見て下さい。
[訳注 : modules-2.0.0 が現在入手可能です。]

----------------------------------------------------------------------------

設定する方法は?
 
  はじめに、必要な部品を手に入れてください。適切なカーネルと最も新しい modules
ユーティリティです。次に modules ユーティリティをインストールしてください。
これは非常に簡単で、ソースファイルを展開して、make install を実行するだけで
す。これで、genksysm, insmod, lsmod, modprobe, depmod, kerneld がコンパイル
され、/sbin にインストールされます。さらに、必要な設定が Linux の起動時に行
なわれるように、起動スクリプトに何行か付け加えることをおすすめします。以下
に示す行を Slackware なら /etc/rc.d/rc.S ファイルに、SysVinit (つまり Debian, 
RedHat, Caldera) なら /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

はじめの部分は、kerneld 自体を起動します。

  次の部分では 'depmod -a' を呼び出しています。depmod プログラムは利用可能な
モジュールのリストを作り、それらの相互依存を解析します。つまり depmod は、あ
るモジュールをロードする前に他のモジュールをロードしておく必要があるかどうか
を知っているのです。
 
注意:最新の kerneld のバージョンは GNU dbm ライブラリ libgbdm がリンクされ
      ています。libgdm は /usr 以下に置かれるので、違うパーティションに /usr
      がある場合には、マウントするまでには kerneld は起動できません。[訳注:
      libgdm.so は /usr/lib にあります。kerneld が shared lib を使うように
      なっている場合には困ったことになります。] おすすめの解決法は、
      libgdbm を /usr/lib から /lib へ移動させることです。
      [訳注: modules-2.0.0 では、デフォルトで libgdbm とはリンクされていま
      せんから、このことを気にしなくてもいいです。]

  つぎに、カーネルのソースを展開して、あなたのお好みに合わせてカーネルを設定
し、構築して下さい。まだやったことがないのでしたら、Linux のソースの一番上の
ディレクトリにある README ファイルを読んでください。カーネルを設定するために
make config を実行する時に、早いうちに現れるいくつかの質問に注意してください。

   Enable loadable module support (CONFIG_MODULES) [Y/n/?] Y
 
  ローダブルモジュールのサポートを選ぶ必要があります。でないと kerneld によっ
てロードされるモジュールが作られません。ここでは Yes と答えます。

   Kernel daemon support (CONFIG_KERNELD) [Y/n/?] Y
 
  これも、もちろん必要です。こうすると、カーネルの中で多くの部分はモジュール
として構築することができます。以下のような質問に対しては「M」と答えて、この
モジュールにすることができます。

   Normal floppy disk support (CONFIG_BLK_DEV_FD) [M/n/y/?] 
 
  普通はシステムを起動するのに必要なドライバ(ハードディスクドライバ,ルート
ファイルシステムのドライバ)しか、カーネルに組み込んでおく必要がありません。
残りはモジュールにできます。

  'make config'が一通り終ったら、'make dep', 'make clean', 'make zImage'
(または 'make zlilo'), 'make modules', 'make modules_install' を順に実行し
てください。

ふぅ。

  'make zImage' は、新しいカーネルイメージを arch/i386/boot/zImage に置き
ます。これをブートイメージを置く場所にコピーするか、あとで、LILO にインストー
ルします。
 
  カーネルの設定、構築、インストールにについての詳細は、定期的に
comp.os.linux.answers に投稿される Kernel-HOWTO を読んでください。
sunsite.unc.edu の /pub/Linux/docs/HOWTO の中からも入手可能です。


----------------------------------------------------------------------------

kerneld を試す

  では新しいカーネルで再起動してください。システムが起動した時に、'ps -ax' 
を実行して下さい。すると kerneld の行が現れます。
 
     PID TTY STAT  TIME COMMAND
      59  ?  S     0:01 /sbin/kerneld
  
  kerneld を用いることの利点の一つは、一度カーネルとデーモンがインストールさ
れると、ほとんど設定が必要ないことです。まずモジュールとして作られたドライバ
の1つを試してみましょう。特別な設定がなくても動くでしょう。私はフロッピード
ライバをモジュール化としました。そしてドライブの中に 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ページ分のメモリー(= 44 kB,
1 ページは 4kB)は、フロッピードライブにアクセスしている間だけ使用されます。
1 分以上フロッピーを使わなければ、そのメモリは解放されます。アプリケーション
のためのメモリが不足しているなら、とても喜ばしいことです。。

----------------------------------------------------------------------------

 kerneld は、どのようにしてロードするモジュールを知るのでしょうか?

  kerneld は、ごく一般的なタイプのモジュールに対する知識は持っていますが、
カーネルからのリクエストを処理する方法が分からなくなる状況があります。CD-ROM
ドライバやネットワークドライバのように、ロード可能なモジュールが複数ある場合
がこのケースに当てはまります。

kerneld デーモンがカーネルから受け取るリクエストは、以下の項目のうちの一つ
です。

    * ブロックデバイスドライバ
    * キャラクタデバイスドライバ
    * バイナリフォーマット
    * tty ライン制御
    * ファイルシステム
    * ネットワーク経路(必要に応じてダイアルする slip や ppp リンク)
    * ネットワークデバイス
    * ネットワークサービス(例えば、rarp)
    * ネットワークプロトコル(例えば、IPX)
 
  kerneld は、設定ファイル /etc/conf.modules を調べることで、どのモジュール
をロードするかを決めます。このファイルの中には2種類のエントリがあります。パ
ス(どこにモジュールファイルがあるか)と、エイリアス(どのモジュールをロードする
か)です。もしこのファイルがないのなら、以下のコマンドを実行することによって、
作ることができます。

   /sbin/modprobe -c | grep -v '^path' >/etc/conf.modules

  デフォルトのパス以外に「パス」を付け加えたい場合、/etc/conf.module には
「デフォルト」のパスを *すべて* 同じように入れておかなくては *なりません*。
なぜなら /etc/conf.module にあるパスは modprobe のデフォルトパスと
*入れ換わる* からです。

  普通はパスを付け加えたいとは思わないでしょう。組み込まれている[訳注:パスの]
セットは「標準的」な設定になるように考慮されているはずですから。約束します!

  一方、もしエイリアスもしくはオプションに項目を加えたいのならば、
/etc/conf.modules の中の新しいエントリが、modprobeがすでに知っているエントリ
に*付け加えられる*でしょう。もしエイリアスもしくはオプションを再定義すれば、
/etc/conf.modulesの中の新しいエントリーは組み込まれたエントリによって上書き
されるでしょう。

ブロックデバイス
================
  '/sbin/modprobe -c'を実行すると、kerneld が知っているモジュールと各モジュー
ルが関連しているリクエストの一覧表を得られます。例えば、フロッピードライバの
ロードを完了するリクエストは、メジャー番号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
 
キャラクタデバイス
==================
  キャラクタデバイスも、同じような方法で処理されています。例えば、ftape
フロッピーテープドライバは、major-device 27番に設定されています。
 
   osiris:~ $ ls -lL /dev/ftape 
   crw-rw----   1 root     disk      27,   0 Jul 18  1994 /dev/ftape
 
  しかし、デフォルトでは ftape ドライバについて知りません。(このドライバは、
'/sbin/modprobe -c' からの出力に表示されないのです。)

  したがって、kerneld が ftape ドライバをロードするように設定するために、
kerneld の設定ファイル /etc/conf.modules に一行を加えなければなりません。
 
   alias char-major-27 ftape
 
ネットワークデバイス
====================
  'char-major-xxx' や 'block-major-yyy' の代わりにデバイスの名前も使うことが
できます。これは、ネットワークデバイスにとって特に便利です。例えば、eth0 とし
て動作する NE2000 ネットワークカードは以下のようにロードされます。
 
   alias eth0 ne
 
  ネットワークカードが使う IRQ などのオプションをドライバに渡さなければなら
ない場合、'options' 行を追加します。
 
   options ne irq=5
 
  この行により、kerneld は以下のコマンドで NE2000 ドライバをロードするように
なります。当然、実際に有効なオプションは、ロードするモジュールに依存していま
す。

   /sbin/modprobe ne irq=5
  
バイナリフォーマット
====================
  バイナリフォーマットも似たような方法で扱われています。カーネルがどのよう
にロードしていいのかを分からないプログラムを実行するときに、kerneld は、
"binfmt-xxx" というリクエストを受けます。ここで xxx は、実行可能ファイルのは
じめの数バイトから決められる番号です。ZMAGIC(a.out) 実行ファイルをサポートす
るために binfmt_aout モジュールをロードするような kerneld の設定は以下の通
りです。
 
   alias binfmt-267 binfmt_aout
 
  ここで、ZMAGIC ファイルのマジックナンバーは(/etc/magic を見て下さい)、267
です。(/etc/magic を見ると、0413 と言う数字があるでしょう。/etc/magic は8進
数を使いますが、kerneld は 10進数を使います。8進数の413は、10進数の267です。)
a.out 実行可能ファイルには実際にはわずかに異なった三つの種類(NMAGIC と QMAGIC
と ZMAGIC)がありますので、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 に
よって自動的に認識されます。
 
ライン制御 (slip, cslip, ppp)
=============================
  ライン制御は"tty-ldisc-x"でリクエストされます。ここで x は、1(slip の場合)
または、3(PPP の場合)です。どちらも、kerneld によって自動的に識別されます。

ネットワークプロトコル群 (IPX, AppleTalk, AX.25)
================================================
  いくつかのネットワークプロトコルもまた、モジュールとしてロードすることがで
きます。カーネルはプロトコル群 (例えば IPX) を 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_PPX 等として定義されています。) それで、IPX モジュールを自動的に
ロードするために、/etc/conf.modules でこのようなエントリを付け加える必要があ
ります。
 
   alias net-pf-4 ipx

  未定義のプロトコル群に関する起動時の面倒なメッセージを避けるための情報に
ついては、以下の「一般的な問題」のセクションを見て下さい。

ファイルシステム
================
  ファイルシステムについての kerneld へのリクエストは単にファイルシステムの
型の名前で行なわれます。これの一般的な使い方は CD-ROM ファイルシステム、すな
わち "iso9660" 型のファイルシステムのために isofs モジュールを読み込むことで
しょう。
 
   alias iso9660 isofs

----------------------------------------------------------------------------

特殊な設定が必要なデバイス

  通常のエイリアスの記述(デバイス名->モジュール名など) 以外にもちょっとした
設定が必要なデバイスもあります。

    * メジャー番号 10 のキャラクタ・デバイス : いろいろなデバイス
    * SCSI ドライバ
    * 特別な初期化が必要なデバイス

char-major-10 : マウス、watchdog と ランダム
============================================
  ハードウェアデバイスは、普通メジャーデバイス番号で区別されます。例えば ftape
は char-major-27 です。しかし、/dev を調べると分かるように char-major-10 のエ
ントリは、全く種類の違う複数のデバイスからなっています。

    * さまざまなマウス(バス・マウス、PS/2 マウス)
    * watchdog デバイス
    * カーネル・「ランダム」・デバイス
    * APM (Advanced Power Management)インターフェース
 
  明らかに、これらのデバイスは単一のモジュールではなくいくつもの異なったモ
ジュールによってコントロールされています。それゆえ、これらのいろいろなデバ
イスのための 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 はどのデバイスモ
ジュールをロードしたらよいか分からないのです。

SCSI ドライバのロード:scsi_hostadapter エントリ
================================================
  SCSI デバイスドライバは、Adaptec 1542 などの SCSI ホストアダプタと、ハー
ドディスクや CD-ROM、 テープデバイスといった SCSI デバイスのドライバから
なっています。これらは全て、モジュールとしてロードできます。しかし、例えば 
Adaptec のカードにつながった CD-ROM ドライブを読みたい場合を考えてみましょ
う。kernel と kerneld は SCSI CD-ROM ドライブをサポートするには sr_mod
モジュールをロードする必要があるということを知っているだけです。 CD-ROM がど
の SCSI コントローラに接続されているかということは分かりませんので、どの SCSI
コントローラ用モジュールをロードしなければならないのかも分からないのです。

  これを解決するためには、/etc/conf.modules に SCSI ドライバのモジュールに
ついてのエントリを付け加えます。kerneld にどの SCSI コントローラ用モジュー
ルをロードすべきかを教えてやらなくてはなりません。 
 
         alias scd0 sr_mod               # sr_mod for SCSI CD-ROM's ...
         alias scsi_hostadapter aha1542  # ... need the Adaptec driver
 
  この方法は、カーネル・バージョン 1.3.82 以降でないと使えません。

  もし、複数の SCSI コントローラを持っているならば、今のところなす術がありま
せん。CD-ROM ドライブには Adaptec のドライバが必要で、テープドライブには
BusLogic ドライバが必要、といったことを kerneld に伝える手段はありません。

モジュールのロードだけでは十分ではないとき: 'post-install' エントリ
===================================================================
  ときには、モジュールをロードするだけでは、うまく動作しない場合もあります。
例えば、サウンドカードをモジュールとしてコンパイルした場合、ボリュームレベル
を設定できると便利です。唯一の問題は、モジュールが次にロードされた時に設定が
消失することです。以下に Ben Galliart (bgallia@luc.edu)による巧妙なトリック
を示しておきます。
 
    最終的に解決するには set-mix-0.1 パッケージをインストールする必要があり
    ます。
    ( ftp://sunsite.unc.edu/pub/Linux/apps/sound/mixers/setmix-0.1.tar.gz )

    そして、/etc/conf.modules に以下の行を付け加えます。

        post-install sound /usr/local/bin/setmix -f /etc/volume.conf
  
  こうすると、kerneld はサウンドモジュールがロードされた後に
'post-install sound' エントリにあるコマンドが実行されるようになります。つま
り、サウンドモジュールは '/usr/local/bin/setmix -f /etc/volume.conf' 
コマンドで初期化されるのです。

  これは他のモジュールに対しても有用です。例えば 以下のエントリを加えること
によって、tunelp プログラムでlp モジュールを設定できるようになります。
 
         post-install lp tunelp <options>

  kerneld に、これらのオプションを認識させるためには、バージョン 1.3.69f 以降
の kerneld が必要です。これはまだ現在ベータ・テスト中で、Bjorn Ekwall の
modules-page http://www.pi.se/blox/modules/ から入手可能です。
[訳注 : 現在 modules-2.0.0 が入手可能です。]

注意:この mini-HOWTO の以前のバージョン[訳注:英語版 Version 1.3 以前]では、
      kerneld がモジュールを削除する直前に実行するコマンドを指定する 
      "pre-remove" オプションについて書いてありました。しかし、これは働かな
      いので使うことはできません。おそらく、将来の kerneld リリースでは消え
      去っているでしょう。モジュールの設定の方法については現在も変更され続け
      ており、この文書の時点では変更されているかもしれません。

----------------------------------------------------------------------------

kerneld を監視する

  もしいろいろなことを試してみて、それでもカーネルが kerneld に何をリクエス
トしているのか分からなかったとしましょう。kerneld が受けたリクエストを見る方
法があります。したがって /etc/conf.modules に何を書くべきか理解することができ
ます。kdstat ユーティリティです。

  この良くできた小さなプログラムは modules-1.3.57 パッケージについてきますが、
デフォルトではコンパイルもインストールもされません。構築するには、以下のよう
にしてください。

    cd /usr/src/modules-1.3.57/kerneld
    make kdstat
 
  そして、kerneld に何をしているのか表示させるためにこれを実行します。

    kdstat debug

  こうすると、kerneld は何をしているのかをコンソールに書き出します。何か使っ
てみたいコマンドを実行すると、kerneld へのリクエストを見ることができます。
これらは /etc/conf.modules に書き加えることができますし、ジョブを完了するた
めに必要なモジュールにエイリアスすることもできます。

デバッグを止めるには、'/sbin/kdstat nodebug' を実行します。

----------------------------------------------------------------------------
 
ダイアルオンデマンドネットワーク

  カーネルがデータを送る際に経路が未知であるときも、kerneld はリクエストを
受け取ります。典型的な例は、ネットワークアクセスが、一時的に有効にな
る SLIP もしくは PPP 接続です。

  kerneld が受けるリクエストは、「request-route a.b.c.d」という形式です。ここ
で a.b.c.d はカーネルがデータを送ろうとしている宛先の IP アドレスです。
kerneld は、IP アドレスをパラメータとして受け取るシェルスクリプト 
/sbin/request-route を実行することによって、このリクエストを処理します。ほと
んどの場合、最初にリクエストされる IP アドレスは、ネームサーバのものでしょう
から(/etc/resolv.conf を見てください。)、request-route スクリプトにはこのア
ドレスが渡されるでしょう。ダイヤルアップもしくはイーサネットで接続可能な
ネットワークが複数あるので無い限り、IP アドレスに気を使う必要はありません。
ネットワークアクセスはすべて同じ手順を踏みますから、ある IP アドレスと別の IP 
アドレスに対するリクエストを区別する必要はありません。

  オンデマンドダイアルを実現するためには、/sbin/request-route スクリプトを 
SLIP または PPP 接続用に変更するだけで十分です。SLIP については、概して 'dip'
または SLIP サーバーを呼び出し接続を確立する他のプログラムの実行が必要です。
PPP については、たぶん chat と pppd を実行することになるでしょう。スクリプト
では ppp または slip モジュールのロードを気にする必要はありません。ロードは
kerneld が自動的に行います。

  ISP[訳注:Internet Service Provider?] を呼び出して SLIP/PPP の接続を確立する
には少し時間がかかりますし、いつも成功するとは限りません。request-route スク
リプトには kerneld へのリクエストが完了するのをカーネルが待つタイムリミット
を設定するタイマがついています。デフォルトでは 60 秒です。しかし大抵ネット
ワークの接続には60秒もかかりませんので最も速い反応を得るためには、ネットワー
クの接続が完了したらすぐに request-route タイマーを kill してやる必要があり
ます。SLIP のユーザは (dip の最近のバージョンでは) DIP スクリプトの 
"mode SLIP" コマンドの直前に以下のコマンドを挿入することによって kill します。

   shell kill `cat /tmp/request-route`
 
 PPP のユーザは /etc/ppp/ip-up スクリプトに以下の内容を加える必要があります。

   kill `cat /tmp/request-route`
 
  もしネットワークが設定に 60 秒よりも長くかかるのなら、/sbin/request-route
スクリプトの中のタイマーの長さを変える必要があるでしょう。その場合、たぶん
kerneld を起動する /etc/rc.d/rc.S の中に "delay=xxx" オプションを付け加え
て、使われていないモジュールを kerneld が自動消去するまでの時間を変える必要が
あります。'xxx' の値は、モジュールが削除されるまでの時間を秒で表したものです。
(デフォルトは 60 秒です。) 特に、ppp を使っている場合には必要です。ppp モ
ジュールは、pppd が起動されるとすぐにロードされます、しかし
"/usr/sbin/pppd connect `chat -f /etc/chat.script` ..." のようなコマンドが
使われている場合には、chat スクリプトが実行されている間 pppd はアイドル状態
になります。そのため、chat スクリプトが終る前に ppp モジュールがアンロードさ
れてしまうかもしれません!

  kerneld は、ネットワークの接続を切るためにネットワークの挙動を監視したりは
していません。[訳注:kerneld にはネットワークが使われているかどうか知る術があ
りません。] しかし、PPP ユーザは、ppp-2.2.0 で導入された pppd の 
'idle-timeout' オプションを利用することができます。pppd に 'idle-timout 600'
というオプションをつけておけば、PPP 接続が600 秒間(10 分間)使われなかいと切
断されます。SLIP ユーザは接続の切断を手動で行なわなければなりません。

----------------------------------------------------------------------------

kerneld の特別な使いかた
 
  スクリーンセーバーモジュールをどうやって設定するか知りたいでしょう?

  modules-1.3.57 の 'kerneld/GOODIES' ディレクトリに kerneld でスクリーンセー
バーとコンソールビープをサポートするための2つのパッチが入っています。これは
まだ公式カーネルの一部にはなっていません。ですから、カーネルパッチを当てて、
カーネルを再構築する必要があります。[訳注: modules-2.0.0 でも同様]

  パッチを当てるためには、"patch" コマンドを使います。

    cd /usr/src/linux
    patch -s -p1 </usr/src/modules-1.3.57/kerneld/GOODIES/blanker_patch

  こうしたら新しいカーネルを再構築しインストールしてください。

  スクリーンセーバーが働くと、kerneld は "/sbin/screenblanker" を起動します。
これはシェルスクリプトでもいいのでお好みのスクリーンセーバーを起動することが
できます。

  カーネルがスクリーンに表示を行なおうとすると、カーネルは /sbin/screenblanker
プロセスに SIGQUIT シグナルを送ります。シェルスクリプトやスクリーンセーバーは
これを受け取って終了するようにしなければなりません。スクリーンをもとのテキス
トモードに戻すのを忘れないようにしてください!

----------------------------------------------------------------------------
 
一般的な問題と疑問

ifconfig を実行した時にどうして "Cannot locate module for net-pf-X" 
というメッセージが出るのか
====================================================================
  カーネルバージョン 1.3.80 くらいから、ネットワークコードが変更され、プロ
トコル群 (IPX, AX25, AppleTalk) をモジュールとしてロードできるようになりま
した。この変更に伴って、kerneld リクエスト net-pf-X が新たに加わりました。
X はプロトコルを表す番号です(番号の意味は 
/usr/src/linux/include/linux/socket.h を参照してください)。
  不幸なことに ifconfig が偶然にもこの(表題の)メッセージを表示してしまうこと
があります。すると、システムをブートして ifconfig でループバックを設定する
ときに2つのメッセージがログに残ってしまいます。このメッセージは無害で、以
下の行を /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 を無効にする行を加えて
はいけません。

kerneld が SCSI ドライバをロードしてくれない!
==============================================
  SCSI ホストアダプタを設定するエントリを /etc/conf.modules に加えてくださ
い。前述の scsi_hostadapter エントリについての記述を読みましょう。

modprobe が 'gcc2_compiled' が定義されていないと文句を言う
==========================================================
  これは modules ユーティリティのバグで、binutils 2.6.0.9 以降でのみ現れます。
このことは binutils のリリースノートにも書いてあります。それを読んでください。
または、Bjorn の modules-page からこれを解決するための modules ユーティリ
ティを取ってきてください。

サウンドドライバが音量などの設定を覚えていてくれない
====================================================
  モジュールはロードされた時に自分自身の中に設定を保存します。ですから
kerneld がモジュールを自動的にアンロードすると設定は消えてしまい、次にモ
ジュールをロードする時にはデフォルトの設定に戻ってしまいます。

  kerneld に指示することで、モジュールが自動的にロードされた後に特定のプロ
グラムを実行することができます。上の 'post-install' エントリを見てください。

DOSEMU が必要とするモジュールがある - kerneld にどのようにロードさせるのか
==========================================================================
  現在のところ、これはできません。0.60 公式リリースバージョンでも、0.63 開発
中バージョンでも、kerneld にモジュールをロードさせる機能はサポートされていま
せん。

なぜ "Ouch, kerneld timed out, message failed" メッセージが出るのか?
=====================================================================
  kerneld に対しリクエストを送ったカーネルは、1秒以内に返答があることを期待し
ています。もし kerneld がこの返答を送らないと、このメッセージがログに残ります。
リクエストは再送され、最終的には実行されるはずです。

  これは普通は非常に負荷の大きなシステムで起こります。kerneld はユーザモード
プロセスなので、システムの他のプロセスと同じように扱われているからです。負荷
が大きいと、kerneld の実行が遅れて返答できないうちに、カーネルが時間切れに
なってしまうこともあります。

  もしこの問題が負荷が軽い時にも起こるのであれば、kerneld を再起動してみてく
ださい (kerneld プロセスを kill して、/usr/sbin/kerneld コマンドで再び起動し
ます)。それでも問題が解決しないなら、linux-kernel@vger.rutgers.edu にメールで
バグリポートをしてください。ただし、この問題についてポストする前に、カーネル
と kerneld のバージョンが最新のものになっていることを確認してください。
[訳注 : kerneld は、デフォルトで /sbin/ にインストールされます。]

kerneld がファイルシステムモジュールをロードするのを mount が待ってくれない
===========================================================================
  kerneld がファイルシステムモジュールをロードするのを mount(8) コマンドが
待ってくれないという報告が多数寄せられています。lsmod すれば、 kerneld がモ
ジュールをロードしていると分かるでしょうから、もしすぐに mount コマンドを繰
り返せば成功するでしょう。これは modules ユーティリティバージョン 1.3.69f の
バグのようで、Debian のユーザの中には影響を受ける人もいるでしょう。この問題は
modules ユーティリティの新しいバージョンを入手することで解決できます。

kerneld が ncpfs モジュールのロードに失敗する
=============================================
  ncpfs ユーティリティを -DHAVE_KERNELD をつけてコンパイルする必要があります。
ncpfs の Makefile を見てください。

kerneld が smbfs モジュールのロードに失敗する
=============================================
  これは kerneld の問題ではなく、smbmount プログラムのバグです。smbmount は
kerneld をないがしろにしています。正しく言うと、smbmount は kerneld が広く普
及する前に書かれたもので、自分で smbfs モジュールをロードします。
  不幸なことに smbmount は間違った場所にモジュールを探しにいきます。
/lib/modules/x.y.z/smbfs.o を探そうとするのですが、実際には他のファイルシステ
ムモジュールと同じ場所に格納されており、/lib/modules/x.y.z/fs/smbfs.o です。
もし smbmount と kerneld を一緒に使おうと思うなら、smbmount.c に以下のパッチ
を当ててください。

--- smbmount.c.orig     Thu May 30 22:48:18 1996
+++ smbmount.c  Thu May 30 22:49:40 1996
@@ -297,6 +297,9 @@
 static int
 load_smbfs()
 {
+#ifdef HAVE_KERNELD
+       return 0;
+#else
        FILE *fver, *ffs;
        char s[1024];
        char modname[1024];
@@ -365,6 +368,7 @@
                 }
         }
         return status;
+#endif
 }

 /* Check whether user is allowed to mount on the specified mount point */

あらゆるものをモジュールとして構築したら、システムが起動しなくなった
kerneld がルートファイルシステムのモジュールのロードに失敗します
====================================================================
  なんでもモジュール化できるわけではありません。カーネルにはルートファイル
システムをマウントし、kerneld を起動するのに必要なプログラムを実行するのに
十分なドライバが組み込まれていなければなりません。従って、以下のものをモ
ジュールにすることはできません。

    * ルートファイルシステムがあるハードディスクのドライバ
    * ルートファイルシステムのドライバ自体
    * init や kerneld や他のプログラムが使うバイナリファイルローダ

[実際に、これはほとんど正しいというだけです。最近の 1.3.x のカーネルでは、
LILO や LOADLIN がロードする初期 RAM ディスクを利用することができます。
ですから、その RAM ディスクからルートファイルシステムのモジュールをロード
できるかもしれません。でも、どうすればいいかは聞かないで下さい。]

kernald が起動時にロードできない。libgdbm に関する文句を言う
============================================================
  kerneld の新しいバージョンは、実行するために GNU dbm library, libgdbm を
必要とします。このファイルはたいてい /usr/lib にインストールされますが、
普通 kerneld は /usr ファイルシステムがマウントされる前に実行されます。症状
は、起動時に(rc スクリプトから) kerneld が起動されないのに、システムが起動し
たあとに手で実行するとうまくいく、というものです。解決法は /usr がマウントさ
れたあとに kerneld を起動するか、例えば /lib などのルートファイルシステムに 
gdbm ライブラリを移動するかのどちらかです。

[訳注 : modules-2.0.0 では kerneld/README.kerneld を参照のこと。デフォルト
では gdbm は使いません。]

----------------------------------------------------------------------------
 
 著作権表示

 This document is Copyright (c) Henrik Storner, 1996. 
 この文書は (c) Henrik Storner 1996 に著作権があります。

 Unless otherwise stated, Linux HOWTO documents are copyrighted by their
 respective authors. Linux HOWTO documents may be reproduced and distributed 
 in whole or in part, in any medium physical or electronic, as long as
 this copyright notice is retained on all copies. Commercial redistribution
 is allowed and encouraged; however, the author would like to be notified of
 any such distributions. 

   特に断りのない限り、Linux の HOWTO 文書はその著者に著作権があります。Linux
 HOWTO 文書は、この著作権表示がなされている限り、全体でも一部分でも、あらゆる
 物理的、電子的手段によっても複製、再配布が可能です。商用の再配布も可能で、推
 奨します。しかし、そのような再配布の場合には著者までお知らせください。
 
 All translations, derivative works, or aggregate works incorporating
 any Linux HOWTO documents must be covered under this copyright notice.
 That is, you may not produce a derivative work from a HOWTO and impose 
 additional restrictions on its distribution. Exceptions to these
 rules may be granted under certain conditions; please contact the Linux 
 HOWTO coordinator at the address given below. 

   全ての翻訳、派生する作業、Linux HOWTO 文書の集成作業はこの著作権表示に従わ
 なければなりません。このことは、HOWTO から派生する作業を行ない、配布に関する
 制限を加えるようなことはできないということです。ある状況下ではこれらのルール
 に例外が認められる場合があります。以下のアドレスに示す Linux HOWTO コーディ
 ネータに連絡してください。
 
 In short, we wish to promote dissemination of this information through as 
 many channels as possible. However, we do wish to retain copyright on the 
 HOWTO documents, and would like to be notified of any plans to redistribute 
 the HOWTOs. 

   簡単に言えば、我々は可能な限りあらゆる手段を使って、この情報の配布を推進し
 ていきたいのです。しかしながら、我々は HOWTO 文書に関する著作権を保有したい
 し、HOWTO 文書の再配布についてのプランを知らせて欲しいのです。
 
 If you have questions, please contact Greg Hankins, the Linux HOWTO
 coordinator, at gregh@sunsite.unc.edu via email.

   もし質問があれば、Linux HOWTO コーディネータである Greg Hankins
 gregh@sunsite.unc.edu に電子メールで連絡してください。

----------------------------------------------------------------------------
 
 訳者付記

 この文書の翻訳は、JF-ML のサポートの下で小川と藤井が行いました。誤訳や誤
字・脱字などがありましたら訳者まで連絡をください。

最後に日本語版の作成に関し適切なアドバイスをしてくださった

 進藤さん <shu@pegasus.rim.or.jp>
 中野さん <nakano@apm.seikei.ac.jp>
 松本さん <shom@i.h.kyoto-u.ac.jp>
 みのうらさん <minoura@uni.zool.s.u-tokyo.ac.jp>

に深く感謝します。

次のページ 前のページ 目次へ