SCSI(4)

名称
SCSI, CAM - CAM SCSI サブシステム

書式
controller scbus0 controller scbus1 at ahc0 controller scbus3 at ahc1 bus 0 controller scbus2 at ahc1 bus 1 device cd0 device ch0 device da0 device pass0 device pt0 device sa0 device ch1 at scbus0 target 4 unit 0 options CAMDEBUG options CAM_DEBUG_BUS=-1 options CAM_DEBUG_TARGET=-1 options CAM_DEBUG_LUN=-1 options CAM_DEBUG_FLAGS=CAM_DEBUG_INFO|CAM_DEBUG_CDB options CAM_MAX_HIGHPOWER=4 options SCSI_NO_SENSE_STRINGS options SCSI_NO_OP_STRINGS options SCSI_DELAY=8000

解説
CAM SCSI サブシステムは、 各種の SCSI デバイスを制御するドライバや、ホストアダプタドライバを経由して異なる SCSI ホストアダプタを利用するドライバを実装するための、 均質でモジュール化されたシステムを提供します。 システムが SCSI バスをプローブし、発見したデバイスを適切なドライバにアタッチします。 pass(4) ドライバがカーネルに組み込まれていれば、すべての SCSI デバイスがアタッチされます。

カーネルの設定
CAM SCSI サブシステム用に一般的なカーネル設定オプションがいくつかあります:

CAMDEBUG
    このオプションは、CAM デバッグ用の printf コードを有効にします。 実際には、このオプションだけではデバッグ情報は出力されません。 出力するためには追加設定が必要です。詳細は下記を参照して下さい。

CAM_MAX_HIGHPOWER=4
    同時使用できる "high power" コマンドの最大数を設定します。 "high power" コマンドとは、 他のコマンドに比べて、実行するのにより多くの電力を必要とするコマンドです。 その一例は SCSI START UNIT コマンドです (現在のところ "high power" の烙印を押されている唯一のコマンドです)。 SCSI ディスクを起動するには、通常のディスク操作に比べて かなり大きな電力を消費します。 このオプションで、コンピュータの電源に負荷をかけ過ぎずに "high power" コマンドを同時にいくつまで発行できるかを指定できます。

SCSI_NO_SENSE_STRINGS
    SCSI Additional Sense Code と Additional Sense Code Qualifier の組についての 解説文をすべて除去します。 この文は本当に大きなテキストデータベースなので、 除去すれば、カーネルのサイズを少し削減できます。 このオプションは、主としてブートフロッピや、 他のディスク空間あるいはメモリ空間が小さい環境で必要となります。 他の環境でも、 多くの場合はこのオプションを有効にすべきです。 SCSI のエラーメッセージの解釈を速めることになるからです。 カーネルを無用に膨張 ("kernel bloat") させることばかりに熱中しないで、 あなたのカーネルに解説文を残さないようにしましょう!

SCSI_NO_OP_STRINGS
    SCSI opcode の解説文をすべて無効にします。 このオプションは、前述した sense 文字列と場合と同様、主として カーネルサイズが重要なブートフロッピのような環境で役に立ちます。 通常の使用環境でこのオプションを有効にすることは推奨されません。 SCSI の障害のデバッグを遅らせるからです。

SCSI_DELAY=8000
    SCSI のバスが安定するまでの遅延 ("bus settle delay") です。 CAM の場合、 ミリ秒 単位で指定します。 以前の SCSI 層で使われていた秒単位ではありません。 カーネルはブート時にバスリセットを各 SCSI バスに送り、各デバイスが転送ネゴシエーションやその他の設定を デフォルトの状態に自分自身でリセットするよう通知します。 ほとんどの SCSI デバイスは、バスリセットから復帰するのに、ある程度の時間を必要とします。 最近のディスクは 100ms 程度の短かい時間しか必要としませんが、 古くて遅いデバイスはもっと長い時間を必要とするかもしれません。 SCSI_DELAY を指定しなければ、デフォルトでは 2 秒になります。 SCSI_DELAY の最小値は "100"、すなわち 100ms です。 唯一特殊なケースは SCSI_DELAY に 0 を指定した場合で、"できるだけ小さい値" を意味します。 この場合、 SCSI_DELAY は 100ms にリセットされます。

すべてのデバイスおよび SCSI バスはブート時の割当てをサポートしているので、 上位の番号のデバイスおよびコントローラを設定する必要はありません; device da0 は任意の番号のディスクドライバに対して十分な記述です。

デバイスは、特定のデバイスユニットとして認識される wired (束縛される) か、 その次に有効な未使用ユニットとして認識される counted (数え上げられる) のどちらかです。

カーネル内のドライバがデバイスを束縛しないように設定するには、 device ch0 のような設定行を記述して、チェンジャドライバを組み込んで下さい。

ユニットを束縛するには、 device ch1 at scbus0 target 4 unit 0 のような設定行を記述して、 チェンジャ 1 を SCSI バス 0 上の SCSI ID 4、SCSI 論理ユニット 0 の チェンジャに割り当てます。 各 SCSI バスを指定したコントローラに束縛するには、 controller scbus0 at ahc0 のように設定行を記述します。 これは、SCSI バス 0 を ahc ドライバを用いる最初のユニットに割り当てます。 複数のバスをサポートするコントローラの場合、 特定のバスを controller scbus3 at ahc1 bus 1 の形式で指定できます。 これは、SCSI バス 1 を ahc1 デバイス上で 2 番目にプローブされたバスに 割り当てます。

wired デバイスと counted デバイスが混在している場合、 そのデバイスタイプについての最初の非 wired ユニットから数え始めます。 すなわち、wired ディスク device da1 があると、最初の非 wired ディスクは da2 として認識されることになります。

アダプタ
このシステムでは、たくさんの種類の異なるアダプタに 共通のデバイスドライバを使用することが可能です。 アダプタは上位層から要求を受けて、 SCSI バスとシステムの間のすべての IO を実行します。 転送の最大サイズはアダプタによって支配されます。 ほとんどのアダプタが一度の操作で 64KB を転送できますが、 多くのアダプタはもっと大量に転送できるかもしれません。

ターゲットモード
いくつかのアダプタは、 ターゲットモード をサポートしています。 このモードでは、 システムをひとつのデバイスとして操作することが可能となり、 別のシステムが発行した操作に応答するようになります。 ターゲットモードは、いつくかのアダプタでサポートされていますが、 このバージョンの CAM SCSI サブシステムではまだ完全ではありません。

関連ファイル
他の SCSI デバイスのエントリを参照して下さい。

診断
カーネルが options CAMDEBUG 付きでコンパイルされている場合、 XPT_DEBUG CCB を用いれば、 任意の指定したデバイスに関して、さまざまな量のトレース情報を 取得可能になります。 トレースされていないデバイスはトレース情報を生成しません。 現在は 4 つのデバッグフラグをオンにできます:

CAM_DEBUG_INFO
    該当するデバイス (群) について一般的な情報の printf 出力が可能になります。

CAM_DEBUG_TRACE
    関数レベルでのコマンドフローのトレースが可能になります。 すなわち、関数の入口と出口でカーネルの printf 出力が発生します。

CAM_DEBUG_SUBTRACE
    関数内部でのデバッグ出力が可能になります。

CAM_DEBUG_CDB
    特定のデバイス (群) に送信されたすべての SCSI コマンドをカーネルが印字するようになります。

これらのフラグのうち、特に CAM_DEBUG_TRACE と CAM_DEBUG_SUBTRACE は膨大な量のカーネルの printf 出力を発生しますので、 あまり有益ではありません。 CAM_DEBUG_INFO のレベルでログ出力されるものは多くはありませんので、 これもそれほど有益ではありません。 最も有益なデバッグフラグは CAM_DEBUG_CDB フラグです。 以下のカーネルオプションを使用して、 カーネル設定ファイルからデバッグを有効にできます:

CAMDEBUG
    CAM のデバッグを有効にします。 このオプションなしでは、ユーザランドから camcontrol(8) を経由してデバッグを有効にすることもできません。

CAM_DEBUG_FLAGS
    上に述べたような各種のデバッグフラグを、 カーネル設定ファイルで設定することが可能になります。 フラグの論理和を取れば、 複数のデバッグレベルでの printf 出力を見ることもできます。

CAM_DEBUG_BUS
    デバッグの対象とするバスを指定します。 すべてのバスをデバッグするには、この値を -1 に設定します。

CAM_DEBUG_TARGET
    デバッグの対象とするターゲットを指定します。 すべてのターゲットをデバッグするには、この値を -1 に設定します。

CAM_DEBUG_LUN
    デバッグの対象とする論理ユニット番号を指定します。 すべての論理ユニット番号をデバッグするには、この値を -1 に設定します。

あるバス、ターゲット、もしくは論理ユニット番号を指定する場合には、 上述した 3 つのバス/ターゲット/論理ユニット番号のオプションを すべて指定することが必須となります。 ワイルドカードを使用すれば、 ほとんどの機器についてデバッグを有効にすることができます。

CAMDEBUG オプションを設定ファイルに含めていれば、 camcontrol(8) ユーティリティを使用して、起動中に printf デバッグを有効にすることもできます。 詳細は camcontrol(8) を参照して下さい。

関連項目
aha(4), ahb(4), ahc(4), bt(4), cd(4), ch(4), da(4), pass(4), pt(4), sa(4), xpt(4), camcontrol(8)

歴史
CAM SCSI サブシステムは FreeBSD 3.0 で初めて登場しました。

作者
CAM SCSI サブシステムは Justin Gibbs と Kenneth Merry によって書かれました。