[2002/05/09更新]

HotPlug設定レシピ(murasaki編)


[2002/05/09] ドキュメントを更新しました

HotPlug機構とは、2.4系カーネルの隠れた目玉機能と言われている、各種デバイスの活線挿抜を管理する機構です。 実際にカーネルに組み込まれたのが、2.4のリリース直前だったこともあってあまり目立ってはいませんが、実際に2.4系カーネルでpcmcia-cs等を活用しようとすると、どうしても避けては通れないところがあります。

ここでは、カーネル2.4のHotPlug機構を、エージェントとしてmurasakiを利用して設定する方法を紹介します。


HotPlugとは

HotPlug機構とは、カーネルが各種デバイスの抜き差しを検出する機構です。 現在は、PCI(CardBus)とUSB、さらにその上のネットワークデバイスに対応しています。

HotPlugを有効にした状態で、PCIやUSBのデバイスの抜き差しが行なわれると、カーネルはこれを検出して、/proc/sys/kernel/hotplugで指定されたプログラム(以下エージェント、デフォルトでは/sbin/hotplug)を呼びます。 エージェントが見つからなければ何も行なわれません。

エージェントを呼び出す際には、パラメータや環境変数経由で各種情報が渡されますので、エージェントはこれを解析して、適宜ドライバをロードしたり、各種設定を行なうようになっています。

現在、エージェントとしては、Linux Hotpluggingmurasakiなどが開発されています。 ドライバの取り扱い、特にCardBusのNICとの親和性に関しては、murasakiの方が優れており、一方、Linux HotPlugging の方は、PCI系デバイスのドライバを全て自動認識して組み込むという特徴を持っています。 Linux HotPluggingは、RedHat7.1以降で、murasakiは、Vine2.5で、それぞれ標準採用されています。 ここでは、エージェントとしてmurasakiを利用します。


pcmcia-csとの競合

HotPlugは、CardBusのデバイス(現在はネットワークデバイスのみ)を扱いますが、これは従来pcmcia-csの管轄であったため、そのままでは両者が競合してしまいます。 このため、HotPlugを利用する場合は、pcmcia-csのバージョンを3.1.25以降にする必要があります。 pcmcia-cs-3.1.25以降では、HotPlugが扱えるデバイスを無視するようになっていますので、HotPlugと競合しません。


カーネルの設定

HotPlug機構を使うには、2.4.1以降のカーネルとmodutilsが必要です。 2.4.0以前では不具合があり、うまく動作しません。

カーネルのコンフィグ時に、"Support for hot-pluggable devices" (CONFIG_HOTPLUG)を有効にしておくと、HotPlug機構が有効になります。 その他には、特に設定が必要な項目はありませんが、PCカードまわりとの親和性を考えると、PCカード関係のドライバについては、カーネル側のものを用いたほうが無難でしょう。 この場合、PCカードのドライバ選択に若干のノウハウが必要です。 詳しくは別文書で述べておりますので、そちらも併せてご参照ください。


murasakiのインストールと設定

murasakiとは、Vine 2.1で採用されたusbmgrの後継にあたります。 2.2系カーネルではusbmgrを、2.4系カーネルではmurasakiを使用することになっているようで、実際、2.4系カーネルを利用するVine 2.5では、murasakiが採用されました。 もちろん、2.4系カーネルでusbmgrを使うこともできるのですが、これはHotPlugのエージェントではありませんので、本稿の主旨に反します :-)。

2002年5月9日現在、murasakiの最新安定バージョンは0.5.4で、配布サイトより入手できます。

murasakiのインストール自体は簡単です。 rootの権限で、展開したディレクトリ上でmakeおよびmake installを実行するだけで、必要なファイルが配置されます。 ただし、デフォルトのままでは、ログの出力レベルが非常に高くなっていますので(おそらくパラメータの設定ミス)、以下のファイルを変更しておくといいでしょう。

murasakiの構成ファイル群とインストール先は下記の通りです。

このうち、最後の初期化スクリプトは、RedHat系のシステムを前提とした構成になっています。 Slackware等、初期化スクリプトの構成が異なる場合は、このファイルが機能しません(そもそも、インストールすらされないと思います)。 ですので、手動で適切なところに配置して設定する必要があります。

なお、標準の初期化スクリプトでは、usbdevfsをマウントしてくれませんので、これを追加して、さらにRedHat依存部分を排除した汎用的なスクリプトをこちらに用意しておきます。 Slackware系では、/etc/rc.d以下に置いて、rc.local等から下記のようにして呼び出すようにすればよいでしょう。

# Initialize HotPlug devices.
if [ -x /etc/rc.d/rc.murasaki ]; then
    . /etc/rc.d/rc.murasaki start
fi

RedHatやDebian等では、/etc/rc.d/init.d以下に置いて、/etc/rc.d/rc2.d/Snnmurasaki(nnは適当な2桁の数値で置き換えてください)等からリンクを張るようにすればいいです。

こちらを用いる場合は、murasaki標準の初期化スクリプトがインストールされないよう、Makefileの最終行、

cd scripts;make install

をコメントアウトするか削除するかしておくといいでしょう。


murasakiとUSB

murasakiは、Xがインストールされているマシン上では、/dev/input/miceデバイスを常にオープンしておけるように、USBマウス用のデバイスを(USBマウスの有無に関係なく)常にロードしておくようになっています。 また、USBのホストコントローラドライバも自動的に検出します。

これらは、murasakiの初期化時に/etc/murasaki/auto_setupスクリプトが呼ばれて、その結果が/etc/murasaki/murasaki.preloadファイルに書き込まれることで行なわれます。 これによって、murasakiの初期化スクリプトは、USBスタックの初期化スクリプトとして利用できます。

なお、他に常に常駐させておきたいモジュールがある場合、murasaki.preloadファイルに書き込んでおけばいいのですが、これはmurasakiの初期化時に毎回auto_setupスクリプトが上書きしますので、murasaki.preloadファイルを手で編集した場合は、auto_setupスクリプトを削除するかリネームするかしておいてください。

murasakiは、デフォルトではUSBのHID系ドライバとしてhid.oを使用するように設定されています。 これは、auto_setupスクリプトにハードコーディングされていて、murasaki.preloadに書き込まれます。 usbmouse.o等、他のHIDドライバを使用したい場合は、auto_setupを修正するか、上記にならってauto_setupを無効化してからmurasaki.preloadを編集するかしてください。


murasakiとネットワーク

カーネルにネットワークデバイスが登録されたり削除されたりした場合、murasaki経由で対応するネットワークインターフェースの初期化および消去を行ないます。 これは、ネットワーク初期化エージェントであるmurasaki.netが、下記のコマンドを起動することで行なわれます。

ifupおよびifdownは、RedHat由来のネットワーク設定コマンドであるため、murasakiだけではRedHat以外のシステムのネットワークの設定を行なえません。 Slackware等、デフォルトでifup/ifdownを持たないシステムでは、拙作のnetscriptパッケージにこれらが含まれていますので、これを用いるといいでしょう。 標準ではSlackware用ですが、工夫すればDebian等でも利用可能でしょう。

なお、murasakiはCardBusやUSBのネットワークデバイスの挿抜を検出した場合のみを想定していますが、カーネルはPPP系やPCMCIAのネットワークカードなどのネットワークインターフェースを検出した際にもmurasakiを呼び出します。 このため、ifup側で適切に配慮していないと不具合が起きる可能性がありますが、上記netscriptでは問題は起きません。 しかし、RedHat系標準のifup/ifdownでは、PCMCIAのネットワークカードと干渉する可能性があります。

関連情報


関連リンク


Created by XEmacs Made with CSS