モジュールが全て正しくロードされれば、カードが全く挿入されていない時の
lsmod
コマンドの出力は以下のようになります:
Module Size Used by
ds 5640 2
i82365 15452 2
pcmcia_core 30012 3 [ds i82365]
システムログには、ソケットドライバが検出したホストコントローラとソケッ トの数も記録されるはずです。
cardmgr
の仕事は、PCMCIA ソケットの監視を行い、
必要に応じてクライアントドライバをロードし、ユーザレベルで動作する
スクリプトをカードの抜き挿しに応じて実行することです。cardmgr
は
自分自身の動作をシステムログに記録しますが、ビープ音を使ってもカードの
状態変更を知らせます。ビープ音の音色は、特定の設定段階における成功また
は失敗を示します。高いビープ音が二度鳴った時は、カードは正しく認識・設
定されたことが示されています。高いビープ音の後に低いビープ音が鳴った時
は、カードは認識はされたものの何らかの原因により設定できなかったことが
示されています。低いビープ音が一度だけ鳴った時は、カードが認識できなかっ
たことが示されています。
cardmgr
デーモンは、/etc/pcmcia/config
に置か
れている既知のタイプのカードのデータベースに基づいてカードを設定します。
このファイルは各種のクライアントドライバについて書かれています。それか
ら、各種カードの識別方法と、どのカードにどのドライバを使うかが書かれて
います。このファイルの書式の説明は、オンラインマニュアルの
pcmcia(5)
にあります。
cardmgr
は各ソケットについてのデバイス情報を
/var/state/pcmcia/stab
または
/var/lib/pcmcia/stab
に記録します(どちらが使われる
かはファイルシステムの配置によります)。以下に
stab
の例を示します:
Socket 0: Adaptec APA-1460 SlimSCSI
0 scsi aha152x_cs 0 sda 8 0
0 scsi aha152x_cs 1 scd0 11 0
Socket 1: Serial or Modem Card
1 serial serial_cs 0 ttyS1 5 65
デバイスの状態を示している行の最初の欄がソケット番号、2 つ目が
デバイスクラス、3 つ目がドライバ名、4 つ目がそのドライバが関係している
デバイスの数、5 つ目はデバイス名、最後の 2 つはそのデバイスの
メジャーデバイス番号とマイナーデバイス番号です(使用できる場合)。
詳しい情報については stab
のオンラインマニュアルを見てください。
cardctl
コマンドを使うと、ソケットの状態をチェック
することや、ソケットがどのように設定されているかを調べることができます。
このコマンドを使って、カードの設定状態を変更することもできます。
``cardctl config
'' コマンドの出力例を以下に示します:
Socket 0:
not configured
Socket 1:
Vcc = 5.0, Vpp1 = 0.0, Vpp2 = 0.0
Card type is memory and I/O
IRQ 3 is dynamic shared, level mode, enabled
Speaker output is enabled
Function 0:
Config register base = 0x0800
Option = 0x63, status = 0x08
I/O window 1: 0x0280 to 0x02bf, auto sized
I/O window 2: 0x02f8 to 0x02ff, 8 bit
``cardctl ident
''を実行することにより、カードの識別情報を得ること
もできます:
Socket 0:
no product info available
Socket 1:
product info: "LINKSYS", "PCMLM336", "A", "0040052D6400"
manfid: 0x0143, 0xc0ab
function: 0 (multifunction)
``cardctl suspend
'' コマンドと ``cardctl resume
'' コマンドを
使うと、対応するドライバを取り外すことなくカードを停止させることができ
ます。``cardctl reset
'' コマンドはカードのリセットと再設定を行お
うとします。``cardctl insert
'' コマンドと ``cardctl eject
''
コマンドは、カードを物理的に抜き挿しした時に実行する動作を疑似的に行い
ます。この動作にはドライバのロードとアンロード、デバイスの設定と停止が
含まれます。
X を実行していれば、cardinfo
を使って全ての PCMCIA
ソケットの現在の状態をグラフィカルに表示することができます。この内容は
``cardctl config
'' に似ています。cardinfo
を使うと、
cardctl
の他の機能のほとんどをグラフィカルに操作することもできま
す。
理論的には、PCMCIA カードはいつでも抜き挿しすることができます。 しかし、アプリケーションが使っている最中にカードを抜くのはよくありませ ん。1.1.77 より古いバージョンのカーネルは、シリアル/モデムカードを抜く と固まることがありましたが、この問題は既に修正されています。
一部のカードは安全にイジェクトできません。特に
ATA/IDE インタフェースカードと SCSI インタフェースカードは安全にホット
スワップできません。この問題を完全に解決するには Linux のブロックデバ
イスのモデルの大幅な変更が必要なので、この問題はおそらく修正されないで
しょう。また、CardBus カードはどんな種類のものであれ安全にホットイジェクト
できません。こちらの次第に改善していくでしょう。CardBus ドライバ中の
ホットスワップに関するバグの発見と修正が現在行われつつあるからです。
これらの種類のカードを使う場合は、カードをイジェクトする前に
必ず ``cardctl eject
'' を実行することをお勧めします。
APM (Advanced Power Management) に対応するように
カーネルを設定してあれば、カードサービスに APM 対応を組み込むことがで
きます。APM のカーネルドライバを管理しているのは
Stephen Rothwell さん (Stephen.Rothwell@canb.auug.org.au) です。
apmd
デーモンを管理しているのは Avery Pennarun さん
(apenwarr@worldvisions.ca) であり、詳しい情報は
http://www.worldvisions.ca/~apenwarr/apmd/ で入手できます。
システム上で互換バージョンの APM が検出されれば、PCMCIA モジュールは
自動的に APM 用に設定されます。
APM が設定されているかどうかに関わらず、ラップトップ機をサスペンドする
前に ``cardctl suspend
'' を使い、レジュームの後に
``cardctl resume
'' を使って、PCMCIA カードの停止と再起動を安全に
行うことができます。この操作は使用中のモデムに対しては行えません。なぜ
なら、シリアルドライバはモデムの動作パラメータの保存と復元を行うことが
できないからです。
システムによっては APM が不安定なことがあるようです。APM と PCMCIA を 組み合わせると問題が起きる場合には、バグ報告を行う前にどちらのパッケー ジに問題があるかを絞りこんでください。
一部のドライバ(特に PCMCIA の SCSI ドライバ)は、サスペンドすると
レジュームを行うことができません。PCMCIA の SCSI カードを使う場合には、
システムをサスペンドする前には必ず ``cardctl eject
'' を実行してく
ださい。
PCMCIA パッケージ全体をアンロードするには、rc.pcmcia
スクリプトを
以下のように実行します:
/etc/rc.d/rc.pcmcia stop
このスクリプトの実行には数秒かかります。これは、全てのクライアントドラ
イバが正常に停止するのを待つためです。あるデバイスが使用中の場合、停止
が完全には行われず、カーネルモジュールがアンロードされないことがありま
す。これを避けるには、rc.pcmcia
スクリプトを実行する前に
``cardctl eject
'' を実行して全てのソケットを停止させてください。
cardctl
コマンドの終了ステータスは、停止できなかったソケットがあ
るかどうかを示します。
PCMCIA デバイスはどのように設定され機能するかについていくつかの
「クラス」に分類できます。クラスは /etc/pcmcia/config
の
デバイスドライバと対応しています。現時点では I/O デバイスに 5 つの
クラス(network, SCSI, cdrom, fixed disk, serial)があり、メモリデバイス
には 2 つのクラス(memory, FTL)があります。それぞれのクラスごとに 2 つ
のスクリプトが /etc/pcmcia/config
に用意されています: 一つが
設定用のメインスクリプト(例えば SCSI デバイス用なら
/etc/pcmcia/scsi
)で、もう一つは設定オプションを指定する
スクリプト(/etc/pcmcia/scsi.opts
)です。デバイスを設定する
メインスクリプトは、カードが挿入された時にデバイスを設定するために起動
され、カードが抜かれた時にはデバイスを停止させるために起動されます。
複数のデバイスに対応しているカードが挿入された場合、このスクリプトは
デバイスごとに起動されます。
設定用のスクリプトは、デバイスについての情報のいくつかを
stab
ファイルから取り出します。各スクリプトは
「デバイスアドレス」を構築し、これを ADDRESS
というシェル変数に設定し
ます。この「デバイスアドレス」は、呼び出されたスクリプトの設定対象であ
るデバイスを一意に記述するものです。この「デバイスアドレス」は
*.opts
スクリプトに渡され、*.opts
スクリプトは、この
アドレスにあるデバイスをどのように設定すべきかの情報を返します。
いくつかのデバイスではデバイスアドレスは単なるソケット番号ですが、その
他のデバイスでは設定の仕方を決めるのに役立つ情報が含まれていることもあ
ります。例えば、ネットワーク用のデバイスはハードウェアイーサネット
アドレスをデバイスアドレスの一部として network.opts
スクリプトに
渡すので、ハードウェアアドレスによって異なる設定を行うことも可能です。
デバイスアドレスの最初の部分は、PCMCIA の現在の「スキーム(scheme)」を
示します。このパラメータを使って、一つの外部ユーザー変数によって複数
のデバイス設定を切り替えることが可能です。スキームの使い方の一つは、
``home'' スキームと ``work'' スキームの 2 種を用意して、それぞれに異な
るネットワークパラメータを設定することです。現在使っているスキームは
``cardctl
スキーム'' コマンドで変更できます。特にスキームを設定し
ない場合は、``default'' スキームが使われます。
一般論として、ラップトップ機の Linux の場合、PCMCIA デバイスは PCMCIA デバイス用のスクリプトでのみ設定すべきで、常設のデバイスと同じように [訳注: /etc/rc.d/rc.inet* などで] 設定してはいけません。しかし Linux ディストリビューションによっては、 ディストリビューション独自のデバイス設定ツールで PCMCIA パッケージの 設定を行うようになっています。このような場合には、これ以降の章の内容が 当てはまらないことがあります。理想を言えば、そういった部分の解説文書は ディストリビューションの管理者が用意すべきでしょう。
Linux ではイーサネットタイプのネットワークインタフェースは eth0
,
eth1
といった名前になっています。トークンリングのアダプタも同様で
すが、インターフェイス名は tr0
, tr1
となります。
ネットワークインタフェースの状態のチェックや変更を行うには
ifconfig
コマンドを使います。Linux の特徴として、ネットワーク
インタフェースが対応するデバイスは /dev
の下には無いので、
デバイスファイルが無くても驚かないでください。
PCMCIA イーサネットカードが検出されると、空いている最初のインターフェー
ス名が割り当てられます。これは多分 eth0
でしょう。
cardmgr
が自動的に /etc/pcmcia/network
スクリプトを実行
してインターフェースに関する設定を行いますが、ネットワークに関する設定は
/etc/pcmcia/network
から読み込まれます。network
スクリプト
と network.opts
スクリプトが実行されるのは、イーサネットカードが
実際に存在する時だけです。ネットワークの自動設定機能をシステムが備えて
いる場合、これが PCMCIA 対応であることもそうでないこともあります。
お使いの Linux ディストリビューションの文書や
個別ディストリビューションに関する注意
の節を見て、PCMCIA のネットワークデバイスの設定は自動化されたツールが
行うのか、それとも network.opts
を手で編集して行うのかを調べてく
ださい。
network.opts
に渡されるデバイスアドレスは、コンマで区切られた
4 つのフィールドから成っています。4 つのフィールドは、スキーム、
ソケット番号、デバイスインスタンス、カードのハードウェアアドレスです。
デバイスインスタンスは複数のネットワークインタフェースを持つような
カードの(付加的な)デバイス番号なので、通常は 0 になります。もし異なる
目的に使う複数のネットワークカードを持っているなら、ソケット番号によっ
て設定オプションを変えることが可能で、その場合の network.opts
は以下のようになります:
case "$ADDRESS" in
*,0,*,*)
# definitions for network card in socket 0
;;
*,1,*,*)
# definitions for network card in socket 1
;;
esac
あるいは、それぞれのカードのハードウェアアドレスを使って以下のように 設定することもできます:
case "$ADDRESS" in
*,*,*,00:80:C8:76:00:B1)
# definitions for a D-Link card
;;
*,*,*,08:00:5A:44:80:01)
# definitions for an IBM card
esac
network.opts
では以下のパラメータを定義することができます:
IF_PORT
イーサネットのトランシーバの種類を自動検出できない特定の 16 ビット
カードに対して、これを指定します。詳しくは ``man ifport
'' を見て
PUMP
値には y か n を指定します。このパラメータは、RedHat の pump
デーモンを用いて、ホストの IP アドレスと経路情報を BOOTP か DHCP を
使って取得するかどうかを指定します。
BOOTP
値には y か n を指定します。このパラメータは、bootpc
を使って、
ホストの IP アドレスと経路情報を BOOTP プロトコルを使って取得するかど
うかを示します。
DHCP
値には y か n を指定します。このパラメータは、ホストの IP アドレスと
経路情報を DHCP サーバから取得するかどうかを示します。ネットワーク
スクリプトは最初に dhcpcd
を探し、その次に dhclient
を探しま
す。
IPADDR
このインタフェースに対する IP アドレス。
NETMASK
, BROADCAST
, NETWORK
ネットワークの基本的なパラメータです。詳しくはネットワーク関連の HOWTO 文書をご覧ください。
GATEWAY
このホストが所属するサブネットのゲートウェイの IP アドレスです。 終点アドレスがこのサブネットの外部になっているパケットは、この ゲートウェイに送られます。
DOMAIN
このホストのローカルのネットワークドメイン名です。これは
/etc/resolv.conf
を生成する際に使います。
SEARCH
ホスト名参照の検索リストであり、/etc/resolv.conf
に追加されま
す。DOMAIN
と SEARCH
は互いに排他的です。詳しくは
``man resolver
'' をご覧ください。
DNS_1
, DNS_2
, DNS_3
このインタフェースが使うネームサーバのホスト名または IP アドレス。これ
は /etc/resolv.conf
に追加されます。
MOUNTS
このインタフェースがマウントに使う NFS マウントポイントを空白で 区切って並べたリストです。
IPX_FRAME
, IPX_NETNUM
IPX ネットワーク用のパラメータです。フレームタイプとネットワーク番号を
表し、ipx_interface
コマンドに渡されます。
指定例を以下に示します:
case "$ADDRESS" in
*,*,*,*)
IF_PORT="10base2"
BOOTP="n"
IPADDR="10.0.0.1"
NETMASK="255.255.255.0"
NETWORK="10.0.0.0"
BROADCAST="10.0.0.255"
GATEWAY="10.0.0.1"
DOMAIN="domain.org"
DNS_1="dns1.domain.org"
;;
esac
NFS ファイルシステムのマウントやアンマウントを自動的に行うには、まず
マウントするファイルシステムを全て /etc/fstab
に記述します。
ただし、マウント用オプションとして noauto
を指定してください。
network.opts
では、ファイルシステムのマウントポイントを
MOUNTS
変数に列挙します。NFS マウントを行っている最中は、
ネットワークを停止させるのに cardctl
コマンドや cardinfo
コマンドを使うことが特に重要です。ネットワークカードが予告無しに抜かれ
ると、NFS ファイルシステムが正常にアンマウントできないからです。
通常のネットワーク設定オプションに加えて、network.opts
では
インタフェースの設定が終わった直後やインタフェースを停止する直前に行う
追加の動作を指定することができます。network.opts
で start_fn
というシェル関数が定義されていれば、ネットワークスクリプトはインタフェース
を設定した直後にこの関数を呼び出します。この際には、インタフェース名が
最初の(そして唯一の)引き数として関数に渡されます。同様に、stop_fn
というシェル関数が定義されていれば、このシェル関数はインタフェースが停
止する直前に呼び出されます。
一部のカードでは、トランシーバの種類を IF_PORT
の設定で選べます。
これは数値で選ぶか、トランシーバの種類を表す
キーワードで選びます。全てのネットワークドライバのデフォルト動作は、
可能ならばインタフェースは自動検出し、検出ができなければ 10BaseT を
使うというものです。ifport
コマンドを使うと、トランシーバの種類
の現在値の確認や設定ができます。実行例を以下に示します:
# ifport eth0 10base2
#
# ifport eth0
eth0 2 (10base2)
現在(3.0.10 以降)の 3c589 用ドライバは、トランシーバの変化をいつでも即 座に自動検出するはずです。以前のバージョンの 3c589 用のドライバは、 トランシーバの自動検出アルゴリズムがいくぶん遅く、問題点もありました。 このようなバージョンでは、カードが設定されてから適切なネットワークケー ブルをカードに繋ぐか、以下のようなコマンドを実行して強制的に自動検出を 実行させなければなりません:
ifconfig eth0 down up
pcnet_cs
モジュールの mem_speed=#
オプションを使ってメモリへアクセスする時間を増やしてみてください。
指定例は標準の config.opts
ファイルにあります。
mem_speed=1000
(ナノセコンド単位)まで上げてみてください。io_speed=#
オプションで指定する必要があるかもしれませ
ん。このオプションは pcmcia_core
モジュールをロードする際に指
定します。起動スクリプト中の CORE_OPTS
を編集して、この
オプションを指定してください。ifconfig
が報告するハードウェアアドレスが全て 0 ならば、たぶん
メモリウィンドウの設定に問題があります。jt@hpl.hp.com
)が wireless HOWTO を書いています。これは
http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/ にあ
ります。
cardmgr
がカードを正しく認識し、ネットワーク
ドライバを起動しているか確認してください。もしだめならば、サポートされ
ているカードと「互換」と称していてもあなたのカードはまだ使えないのでしょ
う。これは、カードが「NE2000 互換」と称している時によく起きるようです。cardmgr
に正しく認識されてるのにうまく動かないという場合は、他の
デバイスと IRQ やポートが衝突しているのかもしれません。カードが使って
いるリソースをチェックして(ログファイルを調べて)、カードが別の IRQ や
ポートを使うように /etc/pcmcia/config.opts
を設定し、問題と
なる IRQ やポートを使わないようにします。/etc/pcmcia/network.opts
で指定
している経路情報に間違いがあります。このメッセージはどう考えても
経路情報エラーを示しているとしか考えられません。これに対して、カードの
設定ミスの場合は普通、うまく動作できなくてもエラーを表示しません。/etc/pcmcia/network.opts
の問題を見つけるためには、まず
同じサブネット上にある他のマシンに ping を打ってみましょう。マシンの指
定には IP アドレスを使います。次にゲートウェイに ping を打ち、それから
他のサブネット上にあるマシンに ping を打ちます。ホスト名を使って ping
を打つのは、以上の簡単なテストが終わってからです。/etc/pcmcia/network.opts
スクリプトを変更した部分があれば、そ
こを繰り返しチェックしてください。ケーブルや ``T'' 型ジャック、
ターミネータ等が正しく動作しているか確認してください。
Linux のシリアルデバイスは、/dev/ttyS*
と /dev/cua*
という特殊なデバイスファイルを経由してアクセスします。バージョン 2.2
より前のカーネルでは、ttyS*
デバイスは端末などを直接接続する
ための入力用デバイスであり、cua*
デバイスはモデム等で利用する
ための出力用デバイスでした。現在のカーネルでは cua*
デバイスを使
わないことが推奨されており、全てのアプリケーションで ttyS*
を使い
ます。シリアルデバイスの設定は、setserial
コマンドを使って確認、
変更できます。
シリアルカードあるいはモデムカードの挿入が検出されると、最初の空いてい
るシリアルデバイスに自動的に割り当てられます。通常、これはシステムに最
初から付いているシリアルポートの数によって /dev/cua1
(/dev/ttyS1
)か /dev/cua2
(/dev/ttyS2
)のどち
らかになります。/dev/ttyS*
デバイスは stab
に記録されます。デバイスを使いやすくするために、シリアルデバイス設定用
のデフォルトのスクリプト(/etc/pcmcia/serial.opts
)は、
/dev/modem
から適切なデバイスファイルにシンボリックリンクを張
ります。バージョン 2.2 より前のカーネルでは、このリンクは
cua*
デバイスに張られます。
PCMCIA モデムカードを設定するのに /etc/rc.d/rc.serial
を使っ
てはいけません。このスクリプトは抜き挿しをしないシリアルデバイスを設定
するためのものです。モデムにの設定を行う場合には、
/etc/rc.d/rc.serial
ではなく /etc/pcmcia/serial.opt
で設定してください。また、シリアルデバイスの I/O ポートと割り込みの変
更を行うのに setserial
を使ってはいけません。このコマンドは別の
アドレスにあるデバイスをシリアルドライバに探させるもので、カードの
ハードウェアに実際に設定されている情報を変えることはできないからです。
シリアル設定用のスクリプトを使うと、setserial
の別のオプションを
指定することができますし、このポート用に /etc/inittab
に行を
追加するかどうかを指定することもできます。
serial.opts
に渡されるデバイスアドレスは、コンマで区切られた 3
つのフィールドから構成されています。一つ目のフィールドはスキーム、二
つ目がソケット番号、三つ目がデバイスインスタンスです。複数のシリアルポート
をサポートしているカードではデバイスインスタンスが複数の値を持つ
ことがありますが、ポートが一つしかないカードの場合には、
デバイスインスタンスの値は必ず 0 です。普段から複数の PCMCIA モデムカード
を使っているなら、挿入するソケットによって設定を変えることが可能です。
その場合の設定は以下のようにします:
case "$ADDRESS" in
*,0,*)
# Options for modem in socket 0
LINK=/dev/modem0
;;
*,1,*)
# Options for modem in socket 1
LINK=/dev/modem1
;;
esac
起動時に既に PCMCIA モデムカードが設定されていると、ハードウェアに最初
から付いているシリアルポートと誤認される可能性があります。実害はありま
せんが、PCMCIA ドライバがモデムを制御する場合、デバイスが異なるスロット
に割り当てられる可能性があります。よって、アプリケーション側では
PCMCIA モデムが常に同じデバイス(/dev/cua*
)に割り当てられると
仮定せず、stab
を解析するかシンボリックリンク
/dev/modem
を使うのがいいでしょう。
基本のシリアルポートドライバをモジュールとしてロードするようにカーネル
の設定を行っている場合、/etc/pcmcia/config
を修正してシリアル
ポートドライバを予めロードするようにします。
/etc/pcmcia/config
のシリアルデバイスの項目を以下のように修正
してください:
device "serial_cs"
class "serial" module "misc/serial", "serial_cs"
以下のパラメータを serial.opts
で定義することができます:
LINK
「コールアウト用」デバイスに対して張られるシンボリックリンクのパスを指
定します(例: 2.2 より前のカーネルでは /dev/cua*
, 2.2 では
/dev/ttyS*
です)。
SERIAL_OPTS
setserial
コマンドに渡すオプションを指定します。
INITTAB
このパラメータを指定すると、その値を使って、対象となるデバイスの
inittab
用のエントリが作られます。
指定例を以下に示します:
case "$ADDRESS" in
*,*,*,*)
LINK="/dev/modem"
SERIAL_OPTS=""
INITTAB="/sbin/getty"
/usr/adm/messages
をチェックして cardmgr
がカードを
正しく識別し、serial_cs
ドライバを起動していることを確認して
ください。もし正しく識別されていない場合、/etc/pcmcia/config
ファイルに新しいエントリを加えて、正しく識別できるようにする必要がある
かもしれません。詳しくは
識別されないカードの設定の節を見てください。/usr/adm/messages
をチェックして、serial_cs ドライバの出力を
調べてください。もし ``register_serial() failed'' というメッセージが
出力されていれば、他のデバイスと I/O ポートが衝突している可能性があり
ます。デバイスが 8250 であると識別されることも I/O ポートが衝突してい
る徴候の一つです。というのも、最近の PCMCIA モデムは 16550A UART と識
別されるはずだからです。I/O ポートが他のデバイスと衝突している場合は、
/etc/pcmcia/config.opts
を修正して、モデム用に割り当てられてい
るポートを使わないようにしてみてください。setserial
コマンドを使って irq を 0 に
して動くかどうか確認してみてください。irq を 0 に設定すれば、シリアル
ドライバは割り込みのかわりに、より遅い「呼び出しモード(polled mode)」
を使うようになります。もしこれでうまく行くようなら、serial_cs の選んだ
IRQ を何か別のデバイスが使っている可能性があります。この割り込みを使
わないように /etc/pcmcia/config.opts
を設定してください。/etc/pcmcia/config
を修正して、serial_cs
の前に
serial
モジュールをロードするように設定しなければなりません。
Linux のパラレルポートドライバはレイヤ化されているので、
いくつかのタイプの高レベルデバイスは、ポート用の低レベルドライバについ
ては同じものを共有できます。プリンタデバイスは特殊デバイスファイル
/dev/lp*
経由でアクセスできます。プリンタデバイスの設定は、
tunelp
コマンドで試験と修正ができます。
parport_cs
モジュールは parport
ドライバと parport_pc
ドライバに依存しています。これらはカーネルに組み込んでも、モジュールと
して作成しても構いません。ドライバの構成がレイヤ化されているというこ
とは、トップレベルのパラレルドライバ(PLIP ドライバやプリンタドライバ等)
は全てモジュールとしてコンパイルしなければならないということです。
これらのドライバはモジュールの起動時しかパラレルポートを認識しないので、
PC カード用パラレルデバイスの設定を終えた後にモジュールをロードしなけ
ればなりません。
parport.opts
に渡されるデバイスアドレスは、コンマで区切られた 3
つのフィールドから構成されています。一つ目のフィールドはスキーム、
二つ目はソケット番号、三つ目はデバイスインスタンスです。
複数のパラレルポートに対応しているカードの場合はデバイスインスタンスが
複数の値を持つことがありますが、ポートが一つしかないカードの場合は
デバイスインスタンスの値は必ず 0 になります。普段から複数の PCMCIA
パラレルポートカードを使っているなら、挿入するソケットの位置によって設
定を変えることが可能です。その場合の設定は以下のようにします:
case "$ADDRESS" in
*,0,*)
# Options for card in socket 0
LINK=/dev/printer0
;;
*,1,*)
# Options for card in socket 1
LINK=/dev/printer1
;;
esac
Linux の基本のパラレルポートドライバをモジュールとしてロードするように
カーネルを設定しているならば、/etc/pcmcia/config
を編集して、
適切なモジュールが必ずロードされるようにしなければなりません。読み込ま
れるパラレルデバイスの項目を編集してください:
device "parport_cs"
class "parport" module "misc/parport", "misc/parport_pc", "parport_cs"
以下のパラメータを parport.opts
で定義できます:
LINK
プリンタポートに対して張られるシンボリックリンクのパスを指定します。
LP_OPTS
tunelp
コマンドに渡すオプションを指定します。
例を以下に示します:
case "$ADDRESS" in
*,*,*,*)
LINK="/dev/printer"
LP_OPTS=""
tunelp
を使って IRQ を 0 に変更
し、これで状況が改善するかどうかを見てください。この操作はドライバを
ポーリングモードに変えます。これで問題が解決するようであれば、
parport_cs が選んだ割り込みをシステム上の他の何らかのデバイスが使って
いると思われます。/etc/pcmcia/config.opts
に設定を追加して、
この割り込みを除外してください。parport_cs
モジュールがロードできないことを示すカーネルメッセージ
が出ている場合は、カーネルがパラレルデバイスをサポートしていないという
ことです。パラレルドライバをモジュールとして作ったのであれば、
/etc/pcmcia/config
を編集して、parport
モジュールと
parport_pc
モジュールを parport_cs
モジュールの前にロー
ドするように設定する必要があるでしょう。
現時点までにサポートされている PCMCIA SCSI カードは、 Qlogic, Adaptec
AHA-152X, Future Domain TMC-16x0 といった ISA バス用のカードと機能的に
同等な PCMCIA カードです。これらのカード用の PCMCIA ドライバモジュール
は PCMCIA 独自のコード(qlogic_cs.c
, aha152x_cs.c
,
fdomain_cs.c
)とLinux カーネルのソースコードから引っ張ってきた
通常の SCSI ドライバをリンクして作成されています。
Adaptec APA1480 CardBus ドライバは、カーネルの aic7xxx PCI ドライバを
ベースにしています。
Linux の SCSI ドライバの設計に由来する制限のため、取り外しができる
カードはドライバごとに 1 つずつしかサポートできません。
新しく SCSI カードが挿されたことを検出すると、SCSI ドライバはその
カードに接続されているデバイスを調べます。システムログをチェックして、
挿したデバイスが正しく検出されているかどうかを確認してください。検出さ
れた SCSI デバイスは、空いている最初の SCSI デバイスファイルに自動的に
割り当てられます。すなわち最初に見つかった SCSI ディスクは
/dev/sda
に、最初の SCSI テープは /dev/st0
に、 最初
の CD-ROM は /dev/scd0
になります。
このホストアダプタに接続されている SCSI デバイスのリストは
stab
に記録されます。また SCSI 設定スクリプト
(/etc/pcmcia/scsi
)が割り当てられたデバイスをごとに一度呼び出
され、そのデバイスの設定や停止を行います。デフォルトのスクリプトは、
SCSI デバイスの設定は全く行わず、カードが抜かれた時に SCSI デバイス上
のファイルシステムを正しくアンマウトする処理だけを行います。
SCSI アダプタには色々な機器が接続できるため、scsi.opts
に渡す
デバイスアドレスはかなり複雑です。フィールドはコンマで区切られた 6 個
あるいは 7 個のフィールドからできています:それぞれのフィールドは、
スキーム、デバイスタイプ、ソケット番号、SCSI チャンネル、ID、
論理ユニット番号、(これは省略可能ですが)パーティション番号です。
デバイスの種類は ``sd'' がディスク、``st'' がテープ、``sr'' が CD-ROM
で ``sg'' がジェネリック SCSI デバイスです。ほとんどの設定では SCSI
チャンネルと論理ユニット番号は 0 です。複数のパーティションを持つ
ディスクデバイスについては、まず scsi.opts
スクリプトが、5 つ
のフィールドを持つデバイスアドレスを使ってデバイス全体に対して呼ばれま
す。scsi.opts
スクリプトはパーティションのリストを
PARTS
変数に返します。次に scsi.opts
スクリプトがそ
れぞれのパーティションについて、7 個全てのフィールドを持つアドレスを使っ
て呼び出されます。
お使いのカーネルに、それぞれの SCSI デバイスに対応したディスクやテープ
を利用するためのトップレベルドライバが組みこまれていない場合、PCMCIA
ドライバからそれらのデバイスを設定することはできません。その副作用とし
て、stab
に残されるデバイス名は
"sd#nnnn
" のような形になります。ここで
"nnnn
"は 4 桁の 16 進数です。この現象は、
cardmgr
が SCSI デバイス ID を Linux の対応するデバイス名に
変換できなかった際に起きます。
トップレベルの SCSI ドライバ(SCSI ディスク用ドライバ、SCSI テープ用
ドライバなど)をモジュール化して、必要な時にロードすることも可能です。
そのためには、/etc/pcmcia/config
を修正して、アダプタを設定す
る時にロードする必要がある追加のモジュールを cardmgr
に教えてやる
必要があります。設定例を以下に示します:
device "aha152x_cs"
class "scsi" module "scsi/scsi_mod", "scsi/sd_mod", "aha152x_cs"
このようにすると、核となる SCSI モジュールとトップレベル SCSI ディスク ドライバ用のモジュールが、通常の PCMCIA ドライバモジュールより先に ロードされます。PCMCIA 設定スクリプトはモジュール化された SCSI ドライバ を自動検出しないので、SCSI のサポートを有効にするためには手動で設定を 行う必要があります。
ラップトップ機の電源を入れる前、あるいはアダプタカードを挿入する前には、
接続する全ての SCSI デバイスの電源を入れておき、アダプタが設定される
時にはきちんと SCSI バスがターミネート(終端)されているようにしましょう。
また、SCSI アダプタを抜く時には細心の注意を払いましょう。これを最も確
実に行う方法は、カードを物理的に抜く前に cardctl
か
cardinfo
を使ってカードを抜き出しの要求を出すことです。現状で
は、接続する全ての SCSI デバイスの電源を SCSI アダプタの挿入前に入れな
ければいけませんし、アダプタカードを抜くかラップトップ機の電源を落とす
までは SCSI デバイスの電源を切ってはいけません。
PCMCIA SCSI カードを使う場合、通常の ISA バスに接続するタイプのアダプタ では起こらない問題が生じることもあります。たいてい、パッシブ型の SCSI ターミネータを正しく作動させるためには、 SCSI バスにターミネータ用の 電力が必要です、PCMCIA タイプの SCSI アダプタはターミネータ用の電力を 供給しないので、もしこの電力が必要ならば、接続されている外部デバイスが 電力を供給しなければなりません。SCSI デバイスの中にはターミネータ用の 電力を供給するように設定できるものもありますし、Zip ドライブや Syquest 社の EX-Drive のようにアクティブ型のターミネータを使っているため、 ターミネータ用の電力には依存しないものもあります。時には、APS SCSI Sentry 2 のように外部から電流を供給するタイプの特別なターミネータ を使う必要があるかもしれません。SCSI デバイスをいくつも繋げて接続する 場合には、ターミネータ用の電力を必要とするデバイスや、電力を供給できる デバイスがあるかどうかに注意してください。
以下のパラメータを scsi.opts
で定義することができます:
DO_FSTAB
値には y か n を指定します。このデバイスのために /etc/fstab
の設定を追加するかどうかを指定します。
DO_FSCK
値には y か n を指定します。マウントを行う前に ``fsck -Ta
''
コマンドを使ってファイルシステムの検査を行うかどうかを指定します。
DO_MOUNT
値には y か n を指定します。カードを挿した時に自動的にマウントを行うか どうかを指定します。
FSTYPE
, OPTS
, MOUNTPT
fstab 用のエントリやデバイスのマウント時に使うファイルシステムの種類、 マウント時のオプション、マウントポイントを指定します。
例として、SCSI ID が 3 でパーティションを 2 つ持つディスクと SCSI ID が 6 である CD-ROM を設定するためのスクリプトを以下に示します:
case "$ADDRESS" in
*,sd,*,0,3,0)
# This device has two partitions...
PARTS="1 2"
;;
*,sd,*,0,3,0,1)
# Options for partition 1:
# update /etc/fstab, and mount an ext2 fs on /usr1
DO_FSTAB="y" ; DO_FSCK="y" ; DO_MOUNT="y"
FSTYPE="ext2"
OPTS=""
MOUNTPT="/usr1"
;;
*,sd,*,0,3,0,2)
# Options for partition 2:
# update /etc/fstab, and mount an MS-DOS fs on /usr2
DO_FSTAB="y" ; DO_FSCK="y" ; DO_MOUNT="y"
FSTYPE="msdos"
OPTS=""
MOUNTPT="/usr2"
;;
*,sr,*,0,6,0)
# Options for CD-ROM at SCSI ID 6
PARTS=""
DO_FSTAB="y" ; DO_FSCK="n" ; DO_MOUNT="y"
FSTYPE="iso9660"
OPTS="ro"
MOUNTPT="/cdrom"
;;
esac
/etc/pcmcia/config.opts
で I/O ポート領域を広げる必要があるか
もしれません。
aha152x_cs
ドライバ(Adaptec, New Media などで使用)の場合、
SCSI 切断/再接続のサポートがテープドライブにおいてよくトラブルの原因に
なるようです。この「機能」を無効にするには、
/etc/pcmcia/config.opts
に以下の行を追加します:
module "aha152x_cs" opts "reconnect=0"
aha152x_cs
ドライバの場合、特定のデバイスで起動時の待ち時間
を長くする必要があるようです。これはモジュールのパラメータ
reset_delay
で制御できます。Yamaha の 4416S CD-R ドライブは、この
ようなドライブの一例です。待ち時間を長く取らないと、デバイスの認識はう
まく行きますが、その後にシステムがハングしてしまいます。このような場合
には以下の設定を試してください:
module "aha152x_cs" opts "reset_delay=500"
CONFIG_SCSI_MULTI_LUN
を無効にしてください。CONFIG_SCSI
を
``m'' に設定した)場合には、使用する *_cs
ドライバがロードされ
る前に SCSI モジュールがロードされるように /etc/pcmcia/config
を修正しなければなりません。
memory_cs
ドライバは全ての種類のメモリカードを扱うことができます。
別の機能を持つカードの PCMCIA メモリのアドレス空間に直接アクセスすることも
できます。このドライバをロードする時には、キャラクタデバイスと
ブロックデバイスの組が生成されます。デバイスの命名規則の詳しい説明につ
いては、モジュールのオンラインマニュアルを見てください。ブロックデバイス
はディスクのようなアクセス(ファイルシステムの作成やマウント等)を行うた
めに使います。キャラクタデバイスは、任意の位置においてバッファ無しの読
み書きを行う "raw" デバイスとして用います。
memory.opts
に渡すデバイスアドレスには 2 つのフィールドがあります。
すなわちスキームとソケット番号です。オプションは、対応するメモリカード
の最初の共通メモリパーティションに適用されます。
一部の古いメモリカードや、ほとんどの単純な静的 RAM カードには
CIS(Card Information Structure, カード情報領域)がありません。CIS は
PCMCIA が自分自身を識別するために使います。cardmgr
は普通、CIS が
無いカードは全て単純なメモリカードとみなし、memory_cs
ドライバを
ロードします。したがって、一般にカードの識別の問題が起こった時には、
他の種類のカードが間違ってメモリカードと認識されるという副作用がありま
す。
memory_cs
は経験的手法を使ってカードの機能を推定します。経験的手
法は書き込み禁止のカードでは動作しませんし、他にも間違った推定を行って
しまうことがあります。カードが間違って認識された場合には、dd
や
mkfs
といったコマンドを使う時には、メモリの大きさを明示的に指定し
てください。
以下のパラメータは memory.opts
で指定することができます:
DO_FSTAB
値には y か n を指定します。このデバイス用に /etc/fstab
の
設定を追加するかどうかを指定します。
DO_FSCK
値には y か n を指定します。マウントを行う前に ``fsck -Ta
''
コマンドを使ってファイルシステムの検査を行うかどうかを指定します。
DO_MOUNT
値には y か n を指定します。カードを挿した時に自動的にマウントを行うか どうかを指定します。
FSTYPE
, OPTS
, MOUNTPT
fstab 用のエントリやデバイスのマウント時に使うファイルシステムの種類、 マウント時のオプション、マウントポイントを指定します。
ソケットに挿入されたメモリカードのマウントを自動的に行うためのスクリプ トの例を示します:
case "$ADDRESS" in
*,0,0)
# Mount filesystem, but don't update /etc/fstab
DO_FSTAB="n" ; DO_FSCK="y" ; DO_MOUNT="y"
FSTYPE="ext2" ; OPTS=""
MOUNTPT="/mem0"
;;
*,1,0)
# Mount filesystem, but don't update /etc/fstab
DO_FSTAB="n" ; DO_FSCK="y" ; DO_MOUNT="y"
FSTYPE="ext2" ; OPTS=""
MOUNTPT="/mem1"
;;
esac
以下の情報はいわゆる「リニアフラッシュ」メモリカードにしか当てはまりま せん。SmartMedia や CompactFlash を含む多くのフラッシュカードは、実際 は IDE ディスクデバイスをエミュレートする回路を持っています。したがっ て、こういったカードはメモリデバイスではなく IDE デバイスとして扱われ ます。
フラッシュメモリカードには有力なフォーマットが二つあります: FTL つまり ``flash translation layer'' 形式と Microsoft Flash File System 形式です。一般的には、FTL 形式 の方が柔軟性に優れています。というのも、FTL 形式のフラッシュカード上に は、通常のディスクデバイスと同様に任意の一般的な高レベルファイルシステム (ext2, MS-DOS 等)を作れるからです。FFS は全く独自のファイルシステムで す。現時点では、Linux は FFS でフォーマットされたカードを扱えません。
フラッシュメモリカードを普通のディスクのようなブロックデバイスとして使
うには、まず ftl_format
コマンドを使ってデバイス上
に FTL パーティションを作成します。このレイヤはフラッシュメモリ
のプログラミングにおけるデバイス固有の細かい部分を隠し、カードが単なる
ブロックデバイスに見えるようにします。以下にコマンドの例を示します:
ftl_format -i /dev/mem0c0c
このメモリは ``raw'' メモリカードインタフェース経由でカードにアクセス
します。一度フォーマットすると、このカードは ftl_cs
ドライバ経由
で通常のブロックデバイスとしてアクセスすることができます。操作例を以下
に示します:
mke2fs /dev/ftl0c0
mount -t ext2 /dev/ftl0c0 /mnt
FTL デバイスの命名規則はちょっと変わっています。マイナーデバイス番号が 3 つの部分に分かれています。すなわちカード番号、そのカード上での領域番号、 (省略可能な)領域内でのパーティション番号です。 ある領域はパーティションテーブルを持たない単独のブロックデバイスとして 扱うこともできますし(フロッピーと同様です)、ハードディスクデバイスのよ うにパーティションを切ることもできます。``ftl0c0'' デバイスはカード 0, 共通メモリ領域 0, 全領域を使うという意味です。 領域がパーティション分割されていれば、``ftl0c0p1'' から ``ftl0c0p4'' が基本パーティションの 1 番から 4 番を表します。
FTL パーティションの設定オプションは ftl.opts
で指定できます。
このファイルの構成は memory.opts
に似ています。
ftl.opts
に渡すデバイスアドレスは、3 個または 4 個のフィールドか
ら構成されます。すなわちスキーム、ソケット番号、領域番号、(省略可能な)
パーティション番号です。ほとんどのフラッシュカードはフラッシュメモリ領域
を 1 つしか持っていません。したがって領域番号は常に 0 となります。
Intel Series 100 フラッシュカードは、最初の 128K のフラッシュブロック
を使ってカードの設定情報を格納しています。この情報を誤って消してしまう
のを防ぐため、ftl_format
は自動的にこれを検出し、FTL パーティション
の作成時には最初のブロックをスキップします。
ATA/IDE ドライブのサポートは、カーネルの通常の IDE ドライバを基にして
います。SmartMedia デバイスと CompactFlash デバイスもサポート対象に含
まれています: こういったフラッシュメモリカードは、IDE インタフェースを
エミュレートするように設定されています。
このドライバの PCMCIA 固有の部分が ide_cs
です。
ATA/IDE カードを抜く前には、cardctl
や cardinfo
を使ってカード
を停止させてください。というのも、このドライバはホットスワップに対応し
ていないからです。
ide.opts
に渡すデバイスアドレスは 3 個または 4 個のフィールドから
構成されます。すなわち現在のスキーム、ソケット番号、デバイスのシリアル番号、
(省略可能な)パーティション番号です。ide_info
コマンドを使うと、
IDE デバイスのシリアル番号を得ることができます。SCSI デバイスと同様に、
ide.opts
はまずデバイス全体に対して呼び出されます。
ide.opts
がパーティションのリストを PARTS
変数に返した場合は、
次にこのスクリプトがそれぞれのパーティションに対して呼び出されます。
以下のパラメータを ide.opts
で指定することができます:
DO_FSTAB
値には y か n を指定します。このデバイス用に /etc/fstab
の
設定を追加するかどうかを指定します。
DO_FSCK
値には y か n を指定します。マウントを行う前に ``fsck -Ta
''
コマンドを使ってファイルシステムの検査を行うかどうかを指定します。
DO_MOUNT
値には y か n を指定します。カードを挿した時に自動的にマウントを行うか どうかを指定します。
FSTYPE
, OPTS
, MOUNTPT
fstab 用のエントリやデバイスのマウント時に使うファイルシステムの種類、 マウント時のオプション、マウントポイントを指定します。
任意の ATA/IDE カードの最初のパーティションを /mnt
にマウント
するための ide.opts
ファイルの例を示します:
case "$ADDRESS" in
*,*,*,1)
DO_FSTAB="y" ; DO_FSCK="y" ; DO_MOUNT="y"
FSTYPE="msdos"
OPTS=""
MOUNTPT="/mnt"
;;
*,*,*)
PARTS="1"
;;
esac
INVALID GEOMETRY: 0 PHYSICAL HEADS?
'' と報告するかもしれま
せん。これを修正するには、/etc/pcmcia/config.opts
を編集して、
衝突する範囲の I/O ポートを使わないようにしましょう。pcmcia_core
モジュール
を以下のようにしてロードする必要があるかもしれません。
CORE_OPTS="unreset_delay=400"
CONFIG_BLK_DEV_IDECD
オプションを有効にして構築しなければなりませ
ん。標準のカーネルではこのオプションは有効になっていますが、独自の
カーネルを作っている場合には注意が必要です。/dev/hde
ではなく
/dev/hde1
)。
一つの割り込みを複数のドライバ(例えばシリアルドライバとイーサネット ドライバ)で共有することができます。実際、PCMCIA の仕様では、カードの機 能全てが同じ割り込みを共有することを要求しています。普通は、カードの機 能は全てドライバを切り替えることなく利用できます。 ある程度最近の Linux カーネル(つまり 1.3.72 以降)は、こういった種類の 割り込みの共有をサポートしています。
カードの機能を 2 つ同時に使うには「細工」が必要で、色々なハードウェア
ベンダーがそれぞれ互換性の無い(場合によっては独自の)方法を使って割り込み
の共有を実装しています。一部のカード(Ositech Jack of Diamonds,
3Com 3c562 とその関連カード、Linksys 製カード)用のドライバは同時アクセ
スをうまくサポートしていますが、サポートできていないカード(特に古い
Megahertz 製カード)もあります。両方の機能を有効にしてカードを使うと問
題が起こる場合は、それぞれの機能を切り離して試してください。これを行う
には、明示的に ``ifconfig down
'' を実行してネットワークインタフェース
を停止させ、それから同じカードのモデム機能を使う必要があるかもしれませ
ん。