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

4. 使い方と機能

4.1 PCMCIA デバイスの設定と監視のためのツール

モジュールが全て正しくロードされれば、カードが全く挿入されていない時の lsmod コマンドの出力は以下のようになります:

Module                  Size  Used by
ds                      5640   2 
i82365                 15452   2 
pcmcia_core            30012   3  [ds i82365]

システムログには、ソケットドライバが検出したホストコントローラとソケッ トの数も記録されるはずです。

設定用デーモン `cardmgr'

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, cardinfo ユーティリティ

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 (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 システムの終了

PCMCIA パッケージ全体をアンロードするには、rc.pcmcia スクリプトを 以下のように実行します:

/etc/rc.d/rc.pcmcia stop

このスクリプトの実行には数秒かかります。これは、全てのクライアントドラ イバが正常に停止するのを待つためです。あるデバイスが使用中の場合、停止 が完全には行われず、カーネルモジュールがアンロードされないことがありま す。これを避けるには、rc.pcmcia スクリプトを実行する前に ``cardctl eject'' を実行して全てのソケットを停止させてください。 cardctl コマンドの終了ステータスは、停止できなかったソケットがあ るかどうかを示します。

4.2 PCMCIA 設定スクリプトの概要

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 パッケージの 設定を行うようになっています。このような場合には、これ以降の章の内容が 当てはまらないことがあります。理想を言えば、そういった部分の解説文書は ディストリビューションの管理者が用意すべきでしょう。

4.3 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 に追加されま す。DOMAINSEARCH は互いに排他的です。詳しくは ``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.optsstart_fn というシェル関数が定義されていれば、ネットワークスクリプトはインタフェース を設定した直後にこの関数を呼び出します。この際には、インタフェース名が 最初の(そして唯一の)引き数として関数に渡されます。同様に、stop_fn というシェル関数が定義されていれば、このシェル関数はインタフェースが停 止する直前に呼び出されます。

一部のカードでは、トランシーバの種類を IF_PORT の設定で選べます。 これは数値で選ぶか、トランシーバの種類を表す キーワードで選びます。全てのネットワークドライバのデフォルト動作は、 可能ならばインタフェースは自動検出し、検出ができなければ 10BaseT を 使うというものです。ifport コマンドを使うと、トランシーバの種類 の現在値の確認や設定ができます。実行例を以下に示します:

# ifport eth0 10base2
# 
# ifport eth0
eth0    2 (10base2)

現在(3.0.10 以降)の 3c589 用ドライバは、トランシーバの変化をいつでも即 座に自動検出するはずです。以前のバージョンの 3c589 用のドライバは、 トランシーバの自動検出アルゴリズムがいくぶん遅く、問題点もありました。 このようなバージョンでは、カードが設定されてから適切なネットワークケー ブルをカードに繋ぐか、以下のようなコマンドを実行して強制的に自動検出を 実行させなければなりません:

ifconfig eth0 down up

個別のカードに関するコメント

ネットワークアダプタにまつわる問題の診断

4.4 PCMCIA のシリアルデバイスとモデムデバイス

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"

特定のカードについてのコメント

シリアルデバイスにまつわる問題の診断

4.5 PCMCIA パラレルポートデバイス

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=""

パラレルポートデバイスで起こる問題の診断

4.6 PCMCIA SCSI アダプタ

現時点までにサポートされている 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 アダプタを抜く時には細心の注意を払いましょう。これを最も確 実に行う方法は、カードを物理的に抜く前に cardctlcardinfo を使ってカードを抜き出しの要求を出すことです。現状で は、接続する全ての SCSI デバイスの電源を SCSI アダプタの挿入前に入れな ければいけませんし、アダプタカードを抜くかラップトップ機の電源を落とす までは SCSI デバイスの電源を切ってはいけません。

PCMCIA SCSI カードを使う場合、通常の ISA バスに接続するタイプのアダプタ では起こらない問題が生じることもあります。たいてい、パッシブ型の SCSI ターミネータを正しく作動させるためには、 SCSI バスにターミネータ用の 電力が必要です、PCMCIA タイプの SCSI アダプタはターミネータ用の電力を 供給しないので、もしこの電力が必要ならば、接続されている外部デバイスが 電力を供給しなければなりません。SCSI デバイスの中にはターミネータ用の 電力を供給するように設定できるものもありますし、Zip ドライブや Syquest 社の EX-Drive のようにアクティブ型のターミネータを使っているため、 ターミネータ用の電力には依存しないものもあります。時には、APS SCSI Sentry 2 のように外部から電流を供給するタイプの特別なターミネータ を使う必要があるかもしれません。SCSI デバイスをいくつも繋げて接続する 場合には、ターミネータ用の電力を必要とするデバイスや、電力を供給できる デバイスがあるかどうかに注意してください。

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

個別カードに関するコメント

SCSI アダプタにまつわる問題の診断

4.7 PCMCIA メモリカード

memory_cs ドライバは全ての種類のメモリカードを扱うことができます。 別の機能を持つカードの PCMCIA メモリのアドレス空間に直接アクセスすることも できます。このドライバをロードする時には、キャラクタデバイスと ブロックデバイスの組が生成されます。デバイスの命名規則の詳しい説明につ いては、モジュールのオンラインマニュアルを見てください。ブロックデバイス はディスクのようなアクセス(ファイルシステムの作成やマウント等)を行うた めに使います。キャラクタデバイスは、任意の位置においてバッファ無しの読 み書きを行う "raw" デバイスとして用います。

memory.opts に渡すデバイスアドレスには 2 つのフィールドがあります。 すなわちスキームとソケット番号です。オプションは、対応するメモリカード の最初の共通メモリパーティションに適用されます。

一部の古いメモリカードや、ほとんどの単純な静的 RAM カードには CIS(Card Information Structure, カード情報領域)がありません。CIS は PCMCIA が自分自身を識別するために使います。cardmgr は普通、CIS が 無いカードは全て単純なメモリカードとみなし、memory_cs ドライバを ロードします。したがって、一般にカードの識別の問題が起こった時には、 他の種類のカードが間違ってメモリカードと認識されるという副作用がありま す。

memory_cs は経験的手法を使ってカードの機能を推定します。経験的手 法は書き込み禁止のカードでは動作しませんし、他にも間違った推定を行って しまうことがあります。カードが間違って認識された場合には、ddmkfs といったコマンドを使う時には、メモリの大きさを明示的に指定し てください。

メモリデバイスのパラメータ

以下のパラメータは 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 パーティション の作成時には最初のブロックをスキップします。

4.8 PCMCIA ATA/IDE カードドライブ

ATA/IDE ドライブのサポートは、カーネルの通常の IDE ドライバを基にして います。SmartMedia デバイスと CompactFlash デバイスもサポート対象に含 まれています: こういったフラッシュメモリカードは、IDE インタフェースを エミュレートするように設定されています。 このドライバの PCMCIA 固有の部分が ide_cs です。 ATA/IDE カードを抜く前には、cardctlcardinfo を使ってカード を停止させてください。というのも、このドライバはホットスワップに対応し ていないからです。

ide.opts に渡すデバイスアドレスは 3 個または 4 個のフィールドから 構成されます。すなわち現在のスキーム、ソケット番号、デバイスのシリアル番号、 (省略可能な)パーティション番号です。ide_info コマンドを使うと、 IDE デバイスのシリアル番号を得ることができます。SCSI デバイスと同様に、 ide.opts はまずデバイス全体に対して呼び出されます。 ide.opts がパーティションのリストを PARTS 変数に返した場合は、 次にこのスクリプトがそれぞれのパーティションに対して呼び出されます。

ATA/IDE 固定ディスクデバイスのパラメータ

以下のパラメータを 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

ATA/IDE アダプタにまつわる問題の診断

4.9 マルチファンクションカード

一つの割り込みを複数のドライバ(例えばシリアルドライバとイーサネット ドライバ)で共有することができます。実際、PCMCIA の仕様では、カードの機 能全てが同じ割り込みを共有することを要求しています。普通は、カードの機 能は全てドライバを切り替えることなく利用できます。 ある程度最近の Linux カーネル(つまり 1.3.72 以降)は、こういった種類の 割り込みの共有をサポートしています。

カードの機能を 2 つ同時に使うには「細工」が必要で、色々なハードウェア ベンダーがそれぞれ互換性の無い(場合によっては独自の)方法を使って割り込み の共有を実装しています。一部のカード(Ositech Jack of Diamonds, 3Com 3c562 とその関連カード、Linksys 製カード)用のドライバは同時アクセ スをうまくサポートしていますが、サポートできていないカード(特に古い Megahertz 製カード)もあります。両方の機能を有効にしてカードを使うと問 題が起こる場合は、それぞれの機能を切り離して試してください。これを行う には、明示的に ``ifconfig down'' を実行してネットワークインタフェース を停止させ、それから同じカードのモデム機能を使う必要があるかもしれませ ん。


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