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

3. 一般的な設定とカーネルモジュールの問題

3.1 カーネルモジュールのサポート

ここでリストアップされているドライバは、全てカーネル・モジュールとして リリースされています。従って、あなたはモジュールをサポートするカーネルを 持っていることが確実でなければなりません。 これに加えて以下で更に述べるように、カーネルとバージョンが一致しないモジ ュールの使用を援助するために「モジュール・バージョン」のサポートを可能に する必要があります。

合理的に最近の Linux ディストリビューションからカーネルを使うのであれば、 たぶんモジュール・サポートはすでに可能になっています。 カーネルをコンパイルするなら Kernel HOWTO 【訳注: 日本語訳が JF プロジェクト にあります。】 を通して、モジュールを可能にする方法を知っていなければなりません。 いずれにせよ、カーネル・コンフィギュレーションファイルに以下の設定が存在する ことを確認するためにチェックできます。 (これは通常 /usr/src/linux にあります):

CONFIG_MODULES=y
CONFIG_MODVERSIONS=y

3.2 ISA プラグ・アンド・プレイ

ISA のプラグ・アンド・プレイのモデム(私が持っている Thinkpad i1411 のような) をお持ちなら、たぶんリソースをモデム・カードに割り当てるために isapnptools を使う必要があります。これには、isapnptools をインストールし、モデム用に /etc/isapnp.conf ファイルにエントリーを持つ必要があります。 Plug-and-Play-HOWTO 【訳注: 日本語訳が JF プロジェクト にあります。】 を読まなければなりませんが、他に心配すべきいかなる ISA デバイスもないなら、 するべきことは基本的に以下のとおりです:

  1. ルート権限で pnpdump を実行して、現在のシステムのリソースの使用 状況に基づくプロトタイプの isapnp.conf ファイルを作成します。
  2. この出力からモデムを探し、モデム用に使いたい(または未使用の) IRQ と 一致する行のコメントを外してください。 例えば私の isapnp.conf は以下のようになっています:
    (CONFIGURE ACRd119/1 (LD 0                   
      (INT 0 (IRQ 11 (MODE +E)))                   
      (IO 1 (SIZE 8) (BASE 0x0100) (CHECK))       
      (NAME "ACRd119/1[0]{LT Win Modem        }") 
    # (ACT Y)                                    
    ))                                           
    
    不思議なことに、少なくとも私の場合は #(ACT Y) をコメントアウト したままにしておく必要があります。 これがあなたの環境で動作しない場合は、他方を試してください。
  3. ファイルを /etc/isapnp.conf へコピーしてください
  4. リブートしてください。ブート時のメッセージの途中で 'Initializing ISA PNP devices...OK' という行が表示されるはずです。これが うまくいかない場合は、たぶん既に使用中の IRQ/DMA の設定を選んだのでしょう。 pnpdump の出力にある他の選択肢を試してください (正しいフラグ付きで isapnp を実行すれば、たぶんリブートする必要は ないでしょう。但し、ここでは初心者にとって最も簡単なのは単にリブートする ことです)。

3.3 PCI モデム

cat /proc/pci で得られる PCI インタフェースカードの情報よりも 多くの情報が欲しいときは、pciutils ソフトウェアパッケージ内の scanpcilspci のようなユーティリティが役に立ちます。

【訳注】 以下に私の環境で /proc/pci, scanpci, lspci の各コマンドを 実行した結果(モデムに関する部分のみ)を示します。

# cat /proc/pci の場合

  Bus  0, device   9, function  0:
    Communication controller: Lucent (ex-AT&T) Microelectronics Unknown device (rev 1).
      Vendor id=11c1. Device id=442.
      Medium devsel.  Fast back-to-back capable.  IRQ 3.  Master Capable.  No bursts.  Min Gnt=252.Max Lat=14.
      Non-prefetchable 32 bit memory at 0xefffbf00 [0xefffbf00].
      I/O at 0xde00 [0xde01].
      I/O at 0xdc00 [0xdc01].

# scanpci -v の場合

pci bus 0x0 cardnum 0x09 function 0x0000: vendor 0x11c1 device 0x0442
 Device unknown
 CardVendor 0x13e0 card 0x0412
  STATUS    0x0290  COMMAND 0x0107
  CLASS     0x07 0x80 0x00  REVISION 0x01
  BASE0     0xefffbf00  addr 0xefffbf00  MEM
  BASE1     0x0000de01  addr 0x0000de00  I/O
  BASE2     0x0000dc01  addr 0x0000dc00  I/O
  MAX_LAT   0x0e  MIN_GNT 0xfc  INT_PIN 0x01  INT_LINE 0x03
  BYTE_0    0xff  BYTE_1  0xff  BYTE_2  0xff  BYTE_3  0xff

$ man lspci でコマンドの使い方が表示されます。
# /sbin/lspci -v の場合

00:09.0 Communication controller: Lucent Microelectronics 56k WinModem (rev 01)
        Subsystem: GVC Corporation LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
        Flags: bus master, medium devsel, latency 0, IRQ 3
        Memory at efffbf00 (32-bit, non-prefetchable)
        I/O ports at de00
        I/O ports at dc00
        Capabilities: [f8] Power Management version 2
【訳注終わり】

3.4 コンパイル済みのモジュールとカーネルバージョン: insmod -f, Fixscripting, ppp.o

このドキュメントを書いている時点で、ソースコードが入手できるのは前記の 一覧にある Ambient Technology ドライバと Lucent LT のユーザ空間ツール だけです。残りのものは、コンパイル済みのバイナリ・ドライバだけがリリース されています。これらのモジュール/バイナリは、それらがコンパイルされた バージョンのカーネルのときだけ、素直に動作します。 Linux カーネルは動的に変化する獣なので、モデム・ベンダーが依然として 彼らのドライバのソースコード・バージョン(これは改良された Linux カーネル を使うために、これらのドライバを修正し再コンパイルする能力を保証します) をリリースするほうを選ばないことは非常に残念です。 一方、しかし、運が良ければ、以下に述べるようにバイナリ・モジュールを なだめて、少し新しいカーネル・バージョンで動作するかもしれません。

insmod -f

カーネル・モジュールは、通常 "insmod モジュール名" コマンドを使ってロードされるでしょう。モジュールが現在のものとは異なる カーネルの下でコンパイルされている場合、insmod はバージョンが 一致しないことを報告し、モジュールのロードは失敗するでしょう。 "insmod -f モジュール名" として、強制フラグ (-f) を つけて、バージョンの不一致にかかわらず、モジュールをロードすることも できます。 モジュールが使うカーネル・インタフェースが、本当にカーネル・バージョンで 変わらないなら、このようにモジュールを強制的にロードしてモジュールを動作 させることができます。 この例として、例えば 2.2.12 の下でコンパイルされた Lucent LT モデム・モ ジュール ltmodem.o はカーネル 2.2.14 の下で強制的に挿入し問題 なく動作します。しかし、 2.2.15-x より新しいカーネル・バージョンでこれを 動作させる場合は、以下で述べるように ppp.o モジュールをカーネル 2.2.14 のものに置き換える必要があります。

Fixscripting

Mark Spieth (mark(at)digivation.com.au) は、バージョン不一致のワーニング が出ないように、バイナリ・モジュールを編集するスクリプト(付録参照)の作成 に貢献しました。これは、強制フラグなしで(つまり単に "insmod モジュール名" とするだけで)モジュールを挿入できます。 このスクリプトファイルを fixscript という名前でセーブしたら、 それを chmod +x fixscript で実行可能にし、root 権限で次の例の ようにして、編集された ltmodem.o モジュールを生成します。

    ./fixscript ltmodem.o ltmodem14.o
そして、以下のようにすると 2.2.14 の下でも、不一致であるという文句を 言われずに挿入できます。
    insmod ltmodem14

しかし、このスクリプトは、モジュールをアップデートしてカーネル API の 不一致を現実に解消するわけではなく、単にモジュールを仮装して実際とは 異なるバージョンでコンパイルされたかのように見せるだけだということに 注意してください。 つまり、これはカーネル・バージョンの不一致の症状を抑制しますが、実際に 存在するかもしれない病気を治すようなことはしないのです。 いくつかの PCTel モジュールで提供される「ソースコード」(小さなC言語のファ イル)は、パッケージ内のバイナリ・ライブラリとともにコンパイルおよびリンク した時に同じような仮装を実行します。 しかし、これも変更されたカーネル・インタフェースには対応できません。

ppp.o と新しいカーネル

最初に 2.2.15-x 以降のカーネルで Lucent LT モデム用ドライバ ltmodem.o を使おうとすると、失敗します。 しかし、Christoph Hebeisen (cth(at)sfu.ca) は、 2.2.12 の下でコンパイルしたモデム・モジュールを、 2.2.14 の下でコンパイルした PPP モジュール(ppp.o)とともに、 カーネル・バージョン 2.2.16 上で使って成功したと報告しています。 Willie Green (willjr(at)lcc.net) は、これが ESS モジュールでも動作する ことを確認しています。 Marvin Stodolsky (stodolsk(at)erols.com) は、前述の 同じ fixscript が 2.2.14 から 2.2.16 までの ppp.o モジュールを以下のようにして バージョン-マスカレード【訳注:バージョンをごまかすこと】に使うことが できると指摘しています。

    ./fixscript ppp.o ppp14to16.o
このように、カーネル・バージョン 2.2.16 の下で Linmodem を動作させる ための、ltmodem と ppp モジュールの両方の"ソフトな挿入"が可能です。

更新されないモジュールをこのように修繕しながら使い回すやり方は、おそらく いずれは破綻するでしょう。例えば、古いモジュールをいろいろ複雑に組み合わ せることで、こうしたバイナリドライバが、リリースされたカーネル 2.4 でも 動いたとしたら、驚きとしか言えません。 最良の解決策は、もちろんオープン・ソース・ドライバを持つことでしょう。 少なくとも、より最近のカーネル・バージョン用のバイナリ・モジュールでの ベンダーのサポートは、役に立つでしょう。読者は、そのような開発をサポート し、促進するために彼(女)の全力を尽くすことが奨励されます。


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