[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:17918] Re: pon が働かない時があります。



佐野@浜松です。

In article <19990919144806L.m5021212@xxxxxxxxxxxx>
 Yuusuke Tahara <m5021212@xxxxxxxxxxxx> さん writes:

> Ogiso> モジュールってダイナミックにロードされたりアンロードされたり
> Ogiso> するのでしょうか。私はてっきり一度ロードされたモジュールは
> Ogiso> rmmod しないとロードされたままだと思ってました。
> 
> oishi> /etc/cron.d/modutils にこう書いてあります。
> oishi> */20 * * * * root test -f /proc/modules && /sbin/rmmod -a
> 
> ということは,ダイナミックにロードされるけど,アンロードは行われないと
> いうことですね? (cron におまかせ)

 kerneld を使っている場合は

  === JF の Module-HOWTO から引用 ====
<sect1>究極のユーティリティ
<p>
さて、ここまで読んできて、もう十分に感動したことでしょう…。それではここ
で、ローダブルモジュールのインストールとリムーブをすっかり忘れる方法を教
えましょう。

<p>kerneld デーモンを使えば、これらの面倒なことを自動的にやってくれます。
<tt/make config/ 時に CONFIG_KERNELD に「Y」と答え、できるかぎりブート直
後に <tt>/sbin/kerneld</tt> を実行します。現在のカーネル用に 
<tt>/sbin/depmod -a</tt> されていなければなりません。(モジュールユーティ
リティにさらなる情報が書いてあります。)

<p>あるプログラムが、ローダブルモジュールでしか提供されていないカーネル
の機能を要求すると、そのモジュールが既にロードされていなければ、カーネル
は kerneld デーモンに良きにはからうように依頼します。

<p>次のようなことが行われます。
<itemize>
<item>  カーネルは、要求された機能がカーネル内に無いことを確認。
<item>  カーネルは、要求された機能を表すシンボルを添えて、kerneld 
        にメッセージを送信。
<item>  kerneld デーモンは、例えば modprobe に、そのシンボルに合うモ
        ジュールをロードするように依頼。
<item>  modprobe は、適合するモジュールがあるかどうか、内部<em/エイリ
        アス/テーブルを探す。このエイリアステーブルは <tt>/etc/conf.modules
        </tt> 内に <em/alias/ 行があれば展開および認識される。
<item>  insmod に、modprobe が kernel が必要としていると判断した
        モジュールをロードするよう依頼される。<tt>/etc/conf.modules</tt> 
        の <tt/optoions/ 行に従って、各モジュールが設定される。
<item>  modprobe は終了し、kerneld は要求が成功(もしくは失敗)したか
        どうか kernel に伝える。
<item>  kernel は、もともと設定されて<em/内蔵している/機能であるかの
        ように、新しくインストールされた機能を使用する。
</itemize>
さらにちょと嬉しいおまけも付いてきます。インストールされたモジュールが、
ある期間使用されずにいると(ふつうは 1 分)、自動的にカーネルから外されま
す。

これによって、kernel が使用するメモリの量はいつでも最小限に抑えられます。
使われていないコードに場所を喰わせておくよりも、もっと有効にメモリを活用
することができます。
  === 引用終了====
# なお、同様の記述が kernel source の Documentation/modules.txt にあります。

ということになっています。2.2 系列のカーネルで kmod を使う場合には

 === 2.2.10 カーネルの Documentation/kmod.txt から引用 ===
Kmod: The Kernel Module Loader
Kirk Petersen

Kmod is a simple replacement for kerneld.  It consists of a 
request_module() replacement and a kernel thread called kmod.  When the
kernel requests a module, the kmod wakes up and execve()s modprobe,
passing it the name that was requested.

If you have the /proc filesystem mounted, you can set the path of
modprobe (where the kernel looks for it) by doing:

        echo "/sbin/modprobe" > /proc/sys/kernel/modprobe

To periodically unload unused modules, put something like the following
in root's crontab entry:

        0-59/5 * * * * /sbin/rmmod -a

Kmod only loads modules.  Kerneld could do more (although
nothing in the standard kernel used its other features).  If you
require features such as request_route, we suggest that you take
a similar approach.  A simple request_route function could be called,
and a kroute kernel thread could be sent off to do the work.  But
we should probably keep this to a minimum.
   === 引用終了 ===

ということになっています。

# /etc/cron.d/modutils の
# */20 * * * * root test -f /proc/modules && /sbin/rmmod -a
# は、/etc/init.d/modutils と比較すると
# */20 * * * * root test -f /proc/sys/kernel/modprobe && /sbin/rmmod -a
# が正しいんじゃないか、という気がするんですが、、、

> また,2.0.X 系のカーネルでは,kerneld というデーモンが採用されて
> いましたが,あれはダイナミックにアンロードもやってくれていたのでしょうか?

今でも 2.0.x 系カーネルでは kerneld が使われるようになっているはずです。

 # cf /etc/rcS.d/S20modutils

-- 
     #わたしのおうちは浜松市、「夜のお菓子」で有名さ。
    <xlj06203@xxxxxxxxxxx> : Taketoshi Sano (佐野 武俊)