FreeBSD ハンドブック : PC ハードウェアコンパチビリティ : 記憶装置 : SCSIとは?
Previous: ESDIハードディスクの使い方
Next: * ディスク/テープ コントローラ

10.5.2. SCSIとは?

原作:Wilko Bulte <wilko@yedi.iaf.nl>.
July 6, 1996.

訳: 内川 喜章 <yoshiaki@kt.rim.or.jp>.
4 November 1996.

SCSI は Small Computer Systems Interface (小規模コンピュータシ ステムインタフェース) の頭文字をとったものです. これはANSI標準でコンピュータ業界においては最もよく使われるI/O バスの一つになっています. SCSIはシュガート社 (ミニフロッピーディ スクを世界で最初に販売しました) の開発した SASI (Shugart Associates Standard Interface) バスが元になって規格化されました.

その後の業界の努力により,異なるベンダのデバイスが混在して使え るようにより厳密な規格へと規格化されました.この結果が ANSIの SCSI-1規格として認可されました. SCSI-1の仕様は (1985年ごろ に規格化されました 訳注: SCSI-1の最終案決定は1985年, ANSIの標準 規格としての認可は1986年です) すでに現在では時代遅れです. 現在の標準は SCSI-2 ( さらに詳 しい情報を参照してください) で, SCSI-3へ移行していくでしょう.

物理的な相互接続の規格に加えて, SCSIではディスクドライブに不可欠な 論理的な規格 (コマンドセット) も定義しています. この規格は標準コマンドセット (CCS : Common Command Set) と呼ばれ, ANSIのSCSI-1とほぼ同時期に制定されました. SCSI-2には (改定された) CCSが規格の一部として組み込まれました. コマンドはデバイスの種 類によって変わります. 例えばスキャナでは Writeコマンドは意味が ありません.

SCSIバスは多くの種類があるパラレルバスです. 最も古く, 最も利用 されているのが 8 bit 幅, シングルエンド (不平衡) 信号, 50線の信号線 のバスです. (もしシングルエンドの意味が分からなくても気にするこ とはありません. このドキュメントの中にその説明があります.) よ り新しい設計では 16 bit幅で平衡信号のバスを使います. この場合, 転送速度は 20Mbytes/second まで,ケーブルの長さは 25mまで可能です. SCSI-2では追加のケーブルを使った最大32 bitのバス幅までが含まれ ます. 早くも Ultra SCSI (Fast-20とも呼ばれます) と Ultra2 (Fast-40とも 呼ばれます) が現れています. Fast-20は1秒間に 2000万回の転送 (8bit バスで20Mbyte/sec), Fast-40は1秒間に 4000万回の転送 (8bitバスで 40Mbytes/sec) をおこないます.

訳注: ここでは電気的な用語としては平衡,不平衡を用いて,バ スの名称としては基本的にはシングルエンド,ディファレンシャルとしま した.

もちろん SCSIバスにはデータ信号だけではなく, 多くのコントロール信 号線があります. 複数のデバイスがバスを効率よく共有するための複 雑なプロトコルも規格の一部です. SCSI-2ではデータは常に独立した パリティ信号を使ってチェックされます. SCSI-2以前ではパリティは オプションでした.

SCSI-3ではさらに高速なバスタイプが導入され, それと共にケーブル の線数を減らし, より最大バス長を伸ばしたシリアルSCSIが導入されま す. SSAや Fiberchannelといった名前を聞いたことはありませんか? シリアルバスは現在ではまだいずれの方式も普及していません (特に一般的な FreeBSD環境では) . このためシリアルバスタイプについてはここでは これ以上は触れません.

今までの記述から想像されるように SCSIデバイスはインテリジェント です. これは SCSIの規格 (ところでこの文書は2インチ以上の厚さがあり ます) と切り離すことはできません. このため例えばハードディスク では特定のブロックをさすのに ヘッド/シリンダ/セクタ によって決 めるのではなく単に必要なブロック番号を指定します. 巧妙なキャッシュ動作や,不正ブロックは自動置き換えなど の機能はこの 「インテリジェントデバイス」のアプローチによって可 能になっています.

SCSIバスでは任意のデバイスの組で通信することが可能です. (訳注: 任意のデバイスがイニシエータになれるという意味です.) デバイスの機能がそれを許すかどうかは また別の問題ですが, 規格では 禁止されていません. 信号の衝突を防ぐために2つ のデバイスはバスを使う前に調停 (arbitrate) をおこなう必要があります.

SCSIの考え方として古い規格のデバイスと新しい規格のデバイスが同 じバスの上で動くように規格を作っています. したがって, 古い SCSI-1の デバイスは SCSI-2バスの上でも普通は動きます. 普通は, とことわった理 由は, ある古いデバイスが新しいバスでも問題ない程に (古い) 規格に 対して十分沿った実装になっているかどうかは絶対的に保証はできな いということです. 最近のデバイスは普通はよりうまく動作します. そ の理由は規格化はより厳密になり,デバイスの製造においてより支持 されるものになって来ているからです.

一般的に言って, 単一のバス上で動かすデバイスは SCSI-2あるいはよ り新しいデバイスであればうまく動く可能性は高いと言えます. これは新しい 2GBのディスクを手に入れたとしたら古いデバイスを捨 ててしまわなければならないという意味ではありません. 私のシステ ムでは SCSI-1以前のディスク, SCSI-2の QICテープユニット,SCSI-1 のヘリカルスキャンテープユニット (訳注: VTRのような回転ヘッドを 持ったテープ装置のことです. DATテープドライブもその一つです) , 2台の SCSI-1 ディスクが一緒に問題なく動いています. ただし効率 の点から古いデバイスと新しい (= 速い) デバイスを分けたいかもしれ ません. (訳注: 古いデバイスの中には disconnectをサポートしな いために一連のコマンド実行中に SCSIバスを占有してしまうデバイス もあります.)

10.5.2.1. SCSIの構成要素

インテリジェント インタフェース

(訳注:原文では smart interface です)

先に述べたように, SCSIデバイスはインテリジェントです. つまりハードウェア細部にからむ知識は SCSIデバイス自身に 持たせてしまおうという考え方です. この考 え方では SCSIデバイスはそれ自身のハードウェアの詳細を知って います. この場合, ホストシステムはハードディスクがいくつのヘッ ドを持ち, テープデバイスがいくつのトラックを持つかというよう なことを知る必要がありません. もしあなたが知りたいのであれば, 規格で定義されているコマンド を使ってデバイスにハードウェアの詳細について質問することがで きます.

インテリジェントデバイスの利点は明らかです. ホストのデバイス ドライバはより一般的に書くことができ, 新しいデバイスを導入す る場合でも変更の必要がありません.

接続でおこなうべきこと, してはならないこと

ケーブルの接続には鉄則があります. よい部品を使うことです. バ スの速度を上げることができ, 多くの災難を防ぐことができます.

ですから, 金メッキのコネクタ, シールドケーブル, 固定器具付き の頑丈なコネクタカバーなどを選ぶのは正しいことです. 2つ目の 鉄則は, ケーブルを必要以上に長くしないことです. 私は以前にあるマシンでトラブルの 原因を探すのに 3日間悩んでいましたが, SCSIバスを 1m短 くすることで問題を解決したことがあります. もちろん, 元のバス の長さでもSCSIの仕様はきちんと満たしていたのですが.

10.5.2.2. SCSI バスのタイプ

電気的に互換性のない 2種類のバスのタイプがあります. シングルエ ンドとディファレンシャルのバスです. これは SCSI デバイスとコントローラは同一のバス上に混在することのできな い2つのグループにに大きく分けられるということを意味しています. しかし,特別なハードウェアを使えばシングルエンドバスをディファ レンシャルバスに (その逆も) 変換することはできます. これらのバ スのタイプの違いは次のセクションで説明します.

SCSI関連のドキュメントでは異なるタイプのバスを一種の用語とし て略語で表します. これを次の表に示します.

少し想像力を働かせればどのような意味であるかはわかるでしょう.

ワイド (Wide) はいくらか曖昧で, 16 または 32 bitのバスを示しま す. 私の知る限りでは, 32 bit のインタフェースは (まだ) 使わ れていませんので Wide は通常 16 bitを意味します.

高速 (Fast) はバスのタイミングがいくつかの点で異なり, ナロー (8 bit) バスでは 低速 (slow) SCSIバスの 5 Mbytes/sec に対して 10 Mbytes/sec の能力があります. 前にも述べたように, 20Mbytes/sec や 40Mbytes/sec のバス速度を持つものも現れてきています (Fast-20 == Ultra SCSI で Fast-40 == Ultra2 SCSI です).

データ線の上位 (> 8) はデータの転送とデバイスの指定だけに 利用されているという点を指摘しておきます. コマンドの送出とス テータスメッセージ等は下位側の 8 bitのデータ線のみを使います. この規格によりナローデバイスはワイドバス上でも動作する事がで きます. 利用できるバスの幅はデバイス間で調停 (ネゴシエーショ ン) されます. デバイスの IDについてはワイドとナローが混在する 時には気をつけなければなりません.

シングルエンドバス (不平衡バス)

シングルエンド SCSIバスは 5Vと 0Vの電圧 (実際はTTLレベルです) を信号として使い,それらは共通のグラウンド (GND) レベルを基準 にします. シングルエンド SCSI 8 bitバスは約25本のグラウンド線 を持ち, すべてのデバイスを「直線状」に接続しま す. 基準ではシングルエンドバスは最大の長さは 6mです. これ は Fast-SCSIデバイスを使う場合は最大長さは 3mに短くなります. Fast-SCSIでは 5Mbytes/sec ではなく 10Mbytes/sec の転送速度 が可能になります.

Fast-20 (Ultra SCSI) と Fast-40ではそれぞれ1秒間に2000万 (20M) ないしは 4000万 (40M) 回の転送ができます. したがって, Fast-20では 8bitバスで 20Mbytes/sec, 16bitバスで 40Mbytes/secとなりま す. Fast-20ではバスの最大の長さは 1.5m, Fast-40では 0.75mに なります. Fast-20は限界を相当に広げるものなので SCSIバス に雑音が多い場合はその影響を即座に受けます.

バス上のいずれかのデバイスが「高速の」転送を利用する場合は Fastバスの長さの制限を受けるということに注意してください.

最近の Fast-SCSI デバイスではバスの長さが実際の問題になり つつあるのが明らかになっています. これがデファレンシャル SCSIバスがSCSI-2の規格に導入された理由です.

コネクタのピン配置やコネクタの種類については SCSI-2の規格 ( さらに詳しい情報を ) を参照してください.コネクタ等について詳細なリ ストがあります.

非標準のケーブルを使うデバイスに気をつけてください. 例えば Apple (の Macintosh は) 25pin の D-type のコネクタ (シリア ルポートやパラレルプリンタに使われているコネクタ -- 訳注: 日本では一般的に D-sub 25pinと言っています) を使っています. 公式なSCSIバスでは50 pin が必要である事からこのコネクタで は 「独創的なピン配置」が必要な事が想像できるでしょう. ここ でおこなわれているようにグラウンド線の数を減らすことはよい考え ではありません. SCSIの規格通りの 50 pinの接続の方が望まし いです. Fast-20 や 40 でこのようなケーブルを使おうなんて 考えてはいけません.

ディファレンシャル (平衡) バス

ディファレンシャル SCSIバスは最大長が 25m です. シングルエ ンド Fast-SCSIバスの 3mとはまったく違います. 平衡信号の背景と なっている考え方は, それぞれのバスの信号はそ れぞれ独立したリターン信号線を持つというものです. つまり, それぞれの信号は (できればより線の) ペアの信号線で伝えられま す. これら2つの信号線の差分の電圧で信号が「真」(assert) で あるか「偽」(de-assert) であるか判定されます. かなりの電圧 がグラウンド電位と信号線ペアの間にかかったとしても影響があ りません (だからといって 10kVの電圧をかけてみたりしないでく ださい.. ).

なぜ平衡信号がよいのかについての説明はこのドキュメントの範 囲を越えています. 電気的に平衡信号はノイズマージンの点で 非常に優れたものとして利用されているということを受け入れて ください. ディファレンシャルバスは普通は外部接続に利用さ れています. これは低コストのシングルエンドバスが筐体内の短 い距離のバスでは非常に多く利用されているからです.

FreeBSDを使うにおいて, FreeBSDでサポートされているデバイス ドライバがあるのであればディファレンシャルバスの利用で問題 になることは何もありません. 例をあげれば, アダプテックの AHA1740はシングルエンドで, AHA1744はディファレンシャルで す. 双方のソフトウェアインタフェースはまったく同一です.

ターミネータ

SCSIにおける用語でのターミネータとはインピーダンスの マッチングを正確におこなうための抵抗ネットワークです. インピーダンス マッチングは反射やリンギングを抑え, バスの信号をきれいにす る重要なものです. たとえば,あまり状態のよくない回線で長距 離の電話をかけた時にあなたは反射をどんなものか感じるかもしれません. 20Mbytes/sec で信号の伝わる SCSIバスでは信号のエコーはあ りがたくありません.

訳注: 電気信号に限らずすべての波で反射 という現象は起きます. ここの例はあまり実感がわかないと思う ので簡単に書きますと, 3mのバスの端からパルスを入れた場合, 反対の端からの反射波は 20ns後 - 本当は電線中の信号の伝達は 光速よりも少し遅くなるのでもう少し時間がかかりますが - に帰ってきます. 10MHzのクロックは1:1のパルスだとすると幅 50nsのパルスで, 反射波がやってくる時間とそれほど変わりません. このため, 場合によっては反射波によってクロックや信号が異常 になってしまう可能性があります.

ターミネータはいろいろな - 洗練されたものもそうでないもの も - 実現方法があります. もちろん,内蔵のものと外部という 区別もあります. ほとんどすべての SCSIデバイスにはいくつかの ソケットがあり,その中には抵抗ネットワーク (集合抵抗) が入っ ているものもあるかもしれません (いや,おそらく間違いなくあ るでしょう). ターミネータを デバイスから外す時は大事にしまっておいてください. SCSIの接 続の変更をしようと思った時に必要になるかもしれません. ま た, それらしい抵抗ネットワークが見つからないこともあります. この場合, SCSIデバイスは内蔵ターミネータの有効と無効を切替 えるジャンパがあります. フラットケーブルに取り付ける特別 なターミネータもあります. 他には外部コネクタのような形をし たものやケーブルのないコネクタヘッドだけのものもあります. いろいろと見られるように多くの選択があります.

どのような場合に単純な抵抗 (パッシブ) ターミネータからアクティ ブターミネータへ切替えるかという問題があります.アクティブ ターミネータはいくらか精巧な回路が信号をよりきれいにするた めに入っています. 一般的に一致する意見としては, 長いバス を使ったり 高速なデバイスを使う場合はアクティブターミネー タの有効性は増加すると言えます. SCSI バスですでに問題が起 きているならアクティブターミネータを試すことを考えていいで しょう. まず借りることができないか探してみてください. ア クティブターミネータは非常に高価だそうですから.

ディファレンシャルとシングルエンドバスのターミネータは互換 性がないということを覚えておいてください. これらの2つの種 類を 混在させることはできません.

OK, ではあなたはターミネータをどこに入れればいいでしょうか? これは SCSIで最も多く誤解されているところです. しかし, これ は極めて単純なことです.. ここでのルールは すべての SCSI バスは 2個のターミネータをそれぞれの両端に入れるとい うことです. つまり 2個であって1個でも3個でもありませ ん. このルールを受け入れてしたがってください. そうすれば終りの ない苦しみから救われるでしょう. なぜなら間違ったターミネー ションは不可解なバグを引き起こす可能性が非常に高いから です.

よく陥りやすい落し穴はマシンの内部 (フラット) ケーブルと外部 ケーブルがコントローラにつながっている場合です. よく見られ るのはコントローラのターミネータを外すのを忘れることで す. ターミネータは最後の外部デバイスで必要で, コントローラ には必要ありません! 一般的に, SCSIバスの接続の変更をする場 合はこのようなことに注意をしなければなりません.

私自身は, すべてのデバイスとコントローラのターミネータを外し ています. 2個の外部ターミネータをセントロニクスタイプ (訳注: 日本ではケーブルに対してこういう言い方はあまりしないのでは ないでしょうか) 外部ケーブルと内部フラットケーブルのコネク タの両端に接続しています. こうすることにより接続の変更はか なり簡単になります.

最近のデバイスは, ICターミネータが使われることもあります. コントロールピンにより無効/有効を設定できる特別のICがあり ます. これは物理的にデバイスから外す必要がありません. 新し いホストアダプタではセットアップツール等を使ってソフトウェ ア的に設定をおこなう場合があります. マニュアルを調べてくださ い.

ターミネータの電源

ここまでの章で議論したターミネータは正常に動作するためには 電源が必要です. SCSIバス上にはこの目的のために利用される線 があります. だから特に気にする必要はないと思いますか?

ところがそうではないのです. それぞれのデバイスはデバイス上 にあるターミネータソケットに電源を供給することはできま す. けれども外部ターミネータがある場合やSCSIバスにターミネー タの電源を供給するデバイスのスイッチがオフになっているよう な場合にはトラブルが起きるかもしれません.

イニシエータ (ここではバスの動作を開始-initiate-させるデバ イスを指します -- 訳注: 簡単に言えばホスト側のアダプタです がSCSIの規格によれば, 例えばディスク側がコマンドを発行する ようなシステムがあってもかまわないことになっているのでこう いう言い方をしています) はターミネータ電源を供給しなければ なりません. すべてのSCSIデバイスはターミネータの電源を供給す ることができます (必ずしも供給しなければならないというわけ ではありません).

スイッチがオフになっているデバイスがバス上に存在することを 許すために, ターミネータの電源はダイオードを通して供給され なければなりません. これはスイッチを切ったデバイスに電流 が逆流することを防ぐためです.

最悪の事態を避けるために, ターミネータの電源は普通はヒュー ズが入っています. 当然ヒューズは飛ぶかもしれません. この 場合でもバスが機能停止するとは限りません. 複数のデバイスが ターミネータの電源を供給しているのであれば, ヒューズが一つ 飛んでも全体の機能には影響しません. ただ一つの供給線のヒュー ズが飛んだのであれば確かに問題になるでしょう. 外部ターミネー タによっては LEDでターミネータ電源が与えられていることを示 すものもあります.

最新の設計ではある程度の時間がたつと 「リセット」され自動復 帰するヒューズが使われることもあります.

デバイス アドレッシング

SCSIバスでは接続された異なるデバイスを区別して指定できなけ ればなりません.

これには SCSIではターゲットIDが使われます. それぞれのデバイ スは特定のターゲットIDを持ちます. デバイスの IDはジャンパや DIPスイッチなどで設定できます. より詳しい情報はデバイスの マニュアルを見てください.

複数のデバイスを使う場合は IDの重複に気をつけてください. 重 複すると普通は混乱状態になります. 同じ IDを共有しているデバ イスがI/Oリクエストに答えようと処理をおこなうことが落し穴にな ります.

8 bitバスでは, 最大8台のターゲットまで可能です. 最大8台で ある理由は, バスの8本のデータ線がデバイスの選択に使われる からです. バス幅の広いバスでは使えるデバイスの数は増えます. 同時にバス使用の要求が発生した場合, 最も IDの大きいデバイス が優先されるという調停がおこなわれます. このことは (ナローバス では) SCSIホストアダプタの IDは通常7番が使われる理由でもあり ます.

さらにサブユニットとして, 規格では ロジカルユニット,短縮形 で LUNを持つことができます. 一つのターゲットIDが複数の LUNを 持つことができます. 例えば, テープチェンジャを持つテープ ドライブは LUN 0をテープドライブ自身, LUN 1をテープチェン ジャ に与えることができます. このようにして, ホストシス テムはテープチェンジャの目的のテープユニットの部分を指定す ることができます.

バスレイアウト

SCSIバスは直線状です. つまり, Y接続, スター接続, クモの巣 状の接続などの直線以外の接続ではありません.

先に議論したターミネータの問題は直線状以外の場合ではより困 難になるだろうということに注意してください.

電気的特性はそのノイズマージンや全体の信頼性において,直線 状のバスのルールに強く依存しています.

直線状バスであるというルールにしたがってください!

10.5.2.3. FreeBSD で SCSIを使う

トランスレーション, BIOS, そしてマジック...

まず始める前に, 電気的に問題のないバスであるか調べておいてく ださい.

SCSIディスクをPCでブートディスクとして使う場合に, PC BIOSに 関する気まぐれについて知っておく必要があります. PC BIOSは ハー ドディスクへの低レベル物理インタフェースを利用するように実 現されています. したがって, BIOSに (セットアップツールやBIOSビル トイン セットアップを使って) ディスクの物理パラメタを教えてや る必要があります. これはヘッドの数, シリンダの数, トラックあ たりのセクタなどがあり, プリコンペンセーションや書き込み電流を 減少させるトラック, などのあまりよく知られていないものもあります.

SCSIディスクはこれらのことをユーザは気にする必要がないはず だと考えるかもしれません. しかし, 不思議なことに (これらの項 目の) セットアップはいまだにあるのです. システム BIOSはブート 時にFreeBSDのカーネルを読み込むためにSCSIディスクに /ヘッド/シリンダ/セクタ を指定する方法でアクセスするため, パラメタを知る必要があるのです.

AT/EISA/PCIバスなどにあり,ディスクに接続される SCSI ホストア ダプタや SCSI コントローラは それ自身のオンボードBIOSを持っ ています. システムの起動時に, SCSI BIOSは システムBIOSのハー ドディスクのインタフェースルーチンを乗っ取ります. システ ム BIOSをごまかすために システムセットアップでは普通は `No hard disk' とします. 簡単ですね?

SCSI BIOS はドライブのトランスレーションと呼ばれる機 能を持ちます. これはPCがブートするために作られたドライブテー ブルをごまかすものです. このトランスレーションは多くは (すべて の場合ではありません) トラックあたり64あるいは32個のヘッドを 持つ仮想的なドライブを使います. シリンダの数を変更することで SCSI BIOS は実際のドライブのサイズに適合させます. 総セクタ数 を 32 * 64 / 2 で割った結果がメガバイト単位のドライブのサイズ になります. 2で割っているのは, 通常 512バイトのサイズのセク タを kByte 単位に変換するためです.

ではこれですべてうまくいくのでしょうか. いいえ, そういう訳で はありません. ブート可能なハードディスクのシリンダ数は 1024よ り多くすることはできないのです. トランスレーションを使った 場合でもディスクの 1GB以上の領域は見えません. ディスクの容量 がどんどん増加していくにつれこれは問題になってきました.

幸いにして, 単純な解決方法があります. 単に別のトランスレーショ ンを使えばよいのです. 例えば, 32個に代わり,128個のヘッドを使いま す. ほとんどの場合, 古いSCSIホストアダプタをアップグレードす るための新しいバージョンの SCSI BIOS が用意されています. 新しいアダプタではジャンパ やセットアップソフトによって SCSI BIOSの使うトランスレーショ ンが選択できる物もあります.

ここで非常に重要なことは, ディスク上のすべてのオペレー ティングシステムが 同一のトランスレーションにより正 しいパーティションを得ることです. つまり FreeBSDをインストー ルする時に, ヘッド/シリンダなどについての質問にあなたのホスト アダプタが使用しているトランスレートされた値を使わなくてはな りません.

トランスレーションによる失敗で見られるのは, ブートしないシス テムや他のパーティションを上書きしてしまうことです. すべてのシ ステムが見えるように fdiskを使うべきです.

あなたはデバイスについてこれとは食い違った話を聞いたことがあ るかもしれません. 古い FreeBSDのカーネルはブートする時に SCSI ディスクのジオメトリ情報を報告していました. 私のシステムの 一つの例を示しましょう.

	aha0 targ 0 lun 0: <MICROP  1588-15MB1057404HSP4>
	sd0: 636MB (1303250 total sec), 1632 cyl, 15 head, 53 sec, bytes/sec 512
          
最近のカーネルは, 普通はこのような情報を報告しません. たとえば, このようになっています.

	 (bt0:0:0): "SEAGATE ST41651 7574" type 0 fixed SCSI 2
	 sd0(bt0:0:0): Direct-Access 1350MB (2766300 512 byte sectors)
	  

なぜこのように変わったのでしょう?

この情報は SCSIディスク自身から得られます. 最近のディスクで はよくゾーンビット記録方式 (zone bit recording) という技術が使 われています. これはドライブの外側のシリンダは内側よりもスペー スが広いのでトラックあたりのセクタ数を増やすことができるとい うアイディアです. この結果, 外側のシリンダ上のトラックの容量 は内側のシリンダよりも大きくなり, 全体ではより大きな容量とな ります. この場合, ドライブにのジオメトリについての報告は, 最善のものかどうか疑わしく, ほとんどの場合誤解を招くものであ ることがわかるでしょう. ジオメトリを調べる場合, ほとんどの場合は BIOSの用い ている値を与える方がよい結果となり, BIOSがそのディスクに ついてまったく関知しないのであれば (例えばブートディスクで はないなら) 都合のよい仮想のジオメトリを与えればいいでしょう.

SCSI サブシステムの設計

FreeBSDでは階層的な SCSIサブシステムを用いています. 各々異な るコントローラカードのデバイスドライバが書かれています. この ドライバはコントローラのハードウェアの詳細を知っています. ド ライバは SCSIサブシステムのより上位の階層のコマンドを受け取り, ステータスを報告するインタフェースを持ちます.

カードのドライバの最上位には, デバイスのクラスのためのいくつ かの一般的なドライバがあります. 具体的にいうと, テープドライ ブのためのドライバ (略号は: st), 磁気ディスク (sd), CD-ROM (cd) などです. これらのソースコードは/sys/scsiにあり ます. マニュアルページ (man) のセクション 4 にはより詳しい内 容があるので見てください.

多階層の設計は低レベルとより高位のレベルを分離させることがで きます. 新たに他の種類のハードウェアのサポートを加えることを より処理しやすい問題にします.

カーネルコンフィグレーション

あなたのハードウェア構成にしたがって, カーネルのコンフィグファイ ルにホストアダプタについて 1行あるいは数行程度の記述をする 必要があります. これには I/O アドレスや割り込みなどについての内容も含 みます. あなたのアダプタのドライバについてのマニュアルページ にはより多くの情報があるのでよく読んでください. これとは別に /sys/i386/conf/LINT にはカーネルコンフィグファイルについての 概要があります. LINTには一般的なものについては可能なすべてのオ プションが含まれています. ただし, LINTでは実際に動作するカー ネルを作ることは できません.

おそらく何をするかは明らかでしょう. カーネルコンフィグファイ ルは実際のハードウェア構成を反映すべきです. そのように割り込 みやI/Oアドレス等に合わせてカーネルコンフィグファイルを書か なければなりません. システムのブート時のメッセージは実際に 見つけたハードウェアの設定を表示します.

例として FreeBSD 2.0.5-Releaseのいくつかのコメント ([]の中) をつけた LINTカーネルコンフィグファイルを示 します.

		
# SCSI host adapters: `aha', `ahb', `aic', `bt', `nca'
#
# aha: Adaptec 154x
# ahb: Adaptec 174x
# ahc: Adaptec 274x/284x/294x
# aic: Adaptec 152x and sound cards using the Adaptec AIC-6360 (slow!)
# bt: Most Buslogic controllers
# nca: ProAudioSpectrum cards using the NCR 5380 or Trantor T130
# uha: UltraStore 14F and 34F
# sea: Seagate ST01/02 8 bit controller (slow!)
# wds: Western Digital WD7000 controller (no scatter/gather!).
#

[ Adaptec AHA274x, 284x などのコントローラ]
controller	ahc0	at isa? bio irq ? vector ahcintr # port??? iomem?

[ Adaptec AHA174x コントローラ]
controller	ahb0	at isa? bio irq ? vector ahbintr

[Ultrastor アダプタ]
controller	uha0	at isa? port "IO_UHA0" bio irq ? drq 5 vector uhaintr

# Map SCSI buses to specific SCSI adapters
controller	scbus0	at ahc0
controller	scbus2  at ahb0
controller	scbus1  at uha0

# The actual SCSI devices
disk sd0 at scbus0 target 0 unit 0	[SCSI ディスク 0 は scbus 0, LUN 0]
disk sd1 at scbus0 target 1		[unit を省略すると暗黙で LUN 0]
disk sd2 at scbus1 target 3		[uha0 上の SCSIディスク]
disk sd3 at scbus2 target 4		[ahb0 上の SCSIディスク]
tape st1 at scbus0 target 6		[SCSI テープ は ターゲット (ID)6]
device cd0 at scbus?			[最初に見つけた CDROM, 固定にしない]

	  

上の例では カーネルは ahc (Adaptec 274x) コントローラをまず 探し, その次に Adaptec 174x のボードというように順番に探して 行きます. その下の行の controller の記述ではデバイスの詳細 を記述して, 対応するバスでターゲット ID と LUN が指定された ものと一致する場合だけ 認識するようにカーネルに伝え ています.

固定された (Wired down) デバイスは 「最初に」ユニット番号が与え られるので, 「固定」されいないデバイスは同じ種類の「固定」され たユニット番号の最も大きい番号の1つ上の番号から割り当てられ ます. したがって, ターゲットID 2の SCSIテープを加えると, ターゲットID 6 のテープがユニット番号1に固定されているので, それはst2に設定 されるでしょう. ブート時に見つからなくても固定されたデバ イスにはユニット番号が常に割り当てられるということに注 意してください. 固定のデバイスに 割り当てられたユニット番号は,もしそのデバイスのスイッチがブー ト時に切られていてもそのデバイスにリザーブされています. これは, 電源を入れて接続した時のユニット番号が与えられます. デバイスのユニット番号は SCSIバスのター ゲットIDとは 何の関係もないことに注意してください.

下の例は FreeBSDのバージョン 2.0.5 以前の カーネルコンフィ グファイルです. 最初の例との違いはデバイスの「固定 (wired down)」がないことです. 「固定」によりどのSCSIターゲットをどの デバイスに割り当てるかを記述できるようになりました.

下のコンフィグファイルにより構築されたカーネルでは最初に見つ けた SCSIディスクが sd0になり, 次に見つけたディスクが sd1に, という具合に割り当てられます. もしディスクの削除や追加をおこなう と, 他の同じタイプのデバイス (この場合はディスク) のすべてが 「移動して」しまうかもしれません. これによりそのたびに /etc/fstab を変更する必要があります.

古いスタイルでも動きますが, 新しいスタイルを使うことが強 く 推奨されています. これにより SCSIバスのハードウェアを どのように変更した場合でもトラブルを避けることができます. ですから, 2.0.5.R以前の FreeBSDからアップグレードした後に古い 信頼できるコンフィグファイルを再利用する時はこの部分をチェッ クして直してください.

[Adaptec 174x用のドライバ]
controller      ahb0    at isa? bio irq 11 vector ahbintr
[Adaptec 154x用のドライバ ]
controller      aha0    at isa? port "IO_AHA0" bio irq 11 drq 5 vector ahaintr
[Seagate ST01/02インタフェースのドライバ]
controller      sea0    at isa? bio irq 5 iomem 0xc8000 iosiz 0x2000 vector seaintr
controller      scbus0

device          sd0	[4台のSCSI ディスクのサポート, sd0 から sd3]

device          st0	[2台の SCSI テープのサポート]

[cdromのドライバ]
device          cd0     #Only need one of these, the code dynamically grows
          

両方の例で SCSIディスクがサポートされています. ブート中に 「固定」の記述がされているタイプ(例えば sd ディスク) のデバ イスで記述より多くのデバイスが見つかると, システムは単純に最後の「固定」のデバイスの番号より 1つずつ増加させた番号をデバイスに割り当てて行きます. もし 「固定」のデバイスがなければユニット番号は0から始まります.

man 4 scsi によって SCSIサブシステムの最新の情報を チェックしてください. より詳細なホストアダプタドライバの使い 方は, たとえば Adaptec 154xドライバの場合はman 4 aha にあります.

カーネルセットアップでの SCSI チューニング

経験的に SCSIバスリセット (ブート時におきます) 後のINQUIRYコマ ンドに対して応答が遅くなるデバイスがあります. INQUIRYコマン ドは ブート時にカーネルがどの種類のデバイス (ディスク, テープ, CDROMなど) がどのターゲットIDに接続されているかを調べるために 発行します. ちなみにこのプロセスをデバイスプロービング (デバ イス検出) と言います.

「応答の遅いデバイス」の問題を解決するために, FreeBSDは SCSIバ スをリセットした後に SCSIデバイスの検出をおこなうまでのディレ イタイムを調整することができます. カーネルコンフィグレーショ ンファイルの下に示すような行にディレイタイムを設定してくださ い.

options         SCSI_DELAY=15         #Be pessimistic about Joe SCSI device
	  
この行ではディレイタイムは 15秒です. 私のシステムでは, 信頼 できる古い CDROMが認識できるように3秒の値を使っています. もし デバイスの認識で問題が起きる時は大きな値 (30秒であるとか) から 始めてください. うまく動いたら,値を減らしてちょうどよい値に にチューニングしてください.

Rogue な SCSI デバイス

(訳注: rogue は有名なゲーム, ではなくて 悪党, 群から離れた, 凶暴 な, という意味)

SCSIの規定は完全で簡潔なものにしようという努力はされましたが, 複雑な規定となり, 正確に実現するのは簡単なことではありません. いくつかのベンダは他よりもよい仕事をしています.

ここで 「イカレた」デバイスが現れることになります. このような デバイスは FreeBSD のカーネルにいくらか標準的 ではない振舞をするものと認識されます. 「イカレた」デバイスは ブート時にカーネルによって報告されます. 次の例は私の2つのカー トリッジテープユニットです.

Feb 25 21:03:34 yedi /kernel: ahb0 targ 5 lun 0: <TANDBERG TDC 3600       -06:>
Feb 25 21:03:34 yedi /kernel: st0: Tandberg tdc3600 is a known rogue

Mar 29 21:16:37 yedi /kernel: aha0 targ 5 lun 0: <ARCHIVE VIPER 150  21247-005>
Mar 29 21:16:37 yedi /kernel: st1: Archive  Viper 150 is a known rogue
	 

例えば, あるターゲットIDから実際には1つのデバイスしかないの にすべての LUNからの応答があるようなデバイスがあるとします. カー ネルはその特定のターゲットIDに8個の LUNがあると誤解してしまう かもしれません. このような混乱の起きる原因については読者へ の課題にしておきます.

FreeBSDの SCSIサブシステムは 検出時の INQUIRYの応答を見て 悪い習慣を持つデバイスの認識をしています. INQUIRYの応答にはデ バイスのファームウェアのバージョン番号が含まれるため, 異なる 動作をするファームウェアのバージョンを区別することも可能です. 例えば, /sys/scsi/st.c や /sys/scsi/scsiconf.c を見てくださ い. どのように行っているか, より多くの情報があります.

この方法はうまく行きますが, もちろん既知のデバイスがつながっ ている場合だけうまくいくということに気をつける必要があります. もしあなた以前に Mumbletech SCSI CDROM (訳注: 架空のメーカ のデバイスです) を接続した人がいないとしたら, どんな「ワザ」 を使ってそれを使うか自分で見つけないといけないかもしれません.

あなたの Mubletech を動かすことができたらその成果を FreeBSDの 次のリリースへ含めるために FreeBSD開発チームへ送ってくださ い. 他の Mumbletechの利用者たちはあなたに感謝するでしょう.

複数の LUNを持つデバイス

単一の SCSI ID上に複数の論理ユニット (LUN) を持つデバイスを使う ような場合もあるかもしれません. 多くの場合では FreeBSDは LUN 0 のみを検出します. このような例としては2台の SCSIではないハード ディスクを SCSIバスにつなぐブリッジボード (例えば古い Sunシステ ムに見られる Emulex MD21) があります.

LUN が0ではないデバイスは普通はシステムブート時の検出では 見つかりません. この問題にうまく対処するには /sys/scsi/scsiconf.c に適切なエントリを加えてカーネルを再構築 しなければなりません.

以下のように初期化されている構造体を探します.

         {
                T_DIRECT, T_FIXED, "MAXTOR", "XT-4170S", "B5A",
                "mx1", SC_ONE_LU
         }
         

LUNが複数あるあなたの Mumbletech BRIDGE2000 はハードディスク として働きます. またファームウェアのリビジョン123などを次のよ うに書き加えます.

         {
                T_DIRECT, T_FIXED, "MUMBLETECH", "BRIDGE2000", "123",
                "sd", SC_MORE_LUS
         }
         

訳注: 複数 LUNに対応するためには構造体の最後の要素を SC_MORE_LUSにします. エントリを作る必要がある場合は scsiconf.c にある MBR-7等のエントリを参考にするといいでしょう.

カーネルは INQUIRYに一致するデータをブート時にテーブルから探し てこれにしたがって振舞います. より多くの情報はソースコードを見て ください.

タグ コマンド キューイング

最近の SCSI デバイス, 特に磁気ディスクではタグ コマンド キュー イング (tagged command queuing: TCQ) がサポートされています.

要約すれば, TCQは複数のI/Oリクエストを同時に受けることを可能 にすることです. デバイスはインテリジェントですから,リクエスト キューにある処理 (ヘッドのポジショニングなど) の最適化をおこなうこ とができます. RAID (Redundant Array of Independent Disks) のようなSCSIデバイスではTCQ機能はデバイスの持つ並列性の 利点を生かすために不可欠です.

各々の I/O リクエストは単一の `tag' (タグ コマンド キューイン グの名前の由来) が与えられます. FreeBSDはこの tagによりデバ イスドライバのキューの中のどの I/Oリクエストが完了したかの識 別をおこないます.

TQCのリクエストはデバイスドライバがサポートしていたとしても あるデバイスのファームウェアではインプリメントが正しくないかもし れません. このような問題に出会うと非常に不可解な問題につ ながります. このような場合は TCQ を無効にしてみてください.

バスマスタ ホストアダプタ

すべてではありませんが多くの SCSIホストアダプタはバスマスタコ ントローラです. これはホストCPUにデータ転送の負荷をか けず, ボード自身がI/Oをおこないます.

これは FreeBSDのようなマルチタスクのオペレーティングシステム では大きな利点になります. しかし, 何らかの問題の起きることも あります.

例えば Adaptec 1542 コントローラは ホストバス (ここではISAま たはATバス) を異なった転送速度に設定できます. コントローラが 異なるレートに設定できるのはすべてのマザーボードで高速な転送が できる訳ではないからです. マザーボードに合っていない高速の データ転送速度を用いた時には, ハングアップやデータの損傷等の 問題が起きるかもしれません.

これを解決する方法は明らかです. より低いデータ転送速度に設定 してうまく動くか確かめることです.

Adaptec 1542の場合, 可能な限り高速な転送レートを動的に読み取って, 正しい決定をおこなうためのオプションをカーネルコンフィグファイルに 追加することができます. このオプションはデフォルトでは無効に なっています.

options        "TUNE_1542"             #dynamic tune of bus DMA speed
	  

あなたの使うホストアダプタについてのマニュアルページをチェッ クしてください. また最終的な手段としては究極のドキュメントを 使ってください (つまりドライバのソースを読んでくださいというこ とです).

訳注: 2.1.5Rの時点ではすべてのドライバに関してマニュアルページ があるわけではありません. また上の例の TUNE_1542のオプション も man aha にはないようです. ソースのコメントだけで も一度見ておいてもいいかもしれません.

10.5.2.4. 問題を突き止める

以下は SCSI で一般的に問題が起きた場合に解決をするためのチェッ クリストの試みです. これは完全な物ではありません.

10.5.2.5. さらに詳しい情報

もしあなたがいくらかは本気で SCSIハッキングをする気があるなら たぶん正規の規格を持っていたくなるでしょう.

承認ずみのアメリカ工業規格は ANSI から購入できます. 住所と電話 番号は11 West 42nd Street, 13th Floor, New York, NY 10036, Sales Dept: (212) 642-4900 です. また, ANSIの規格および委員会の規格案 (ドラフト) のほとんどはGlobal Engineering Documentsより買うことができます. 連絡先は 15 Inverness Way East, Englewood, CO 80112-5704, Phone: (800) 854-7179, Outside USA and Canada: (303) 792-2181, FAX: (303) 792- 2192です.

X3T10のドラフトの多くは電子的に利用できる形で SCSI BBS (719-574-0424) と ncrinfo.ncr.com の Anonymous FTP (誰でも ファイルを取ってくることができるFTPサービス) サイトから得るこ とができます.

最新の X3T10委員会のドキュメントは:

追加情報を得ることのできる出版物は:

Usenet のニュースグループ comp.periphs.scsicomp.periphs は特により多くの情報を得るには注目すべき場所です. また定期的に ポストされる SCSI-FAQをここから得ることができます.

多くの主要な SCSIデバイスとホストアダプタの供給元は FTP サイト や BBSを開いています. これらはあなたの持っているデバイスに関す る貴重な情報源となるでしょう.


FreeBSD ハンドブック : PC ハードウェアコンパチビリティ : 記憶装置 : SCSIとは?
Previous: ESDIハードディスクの使い方
Next: * ディスク/テープ コントローラ
FreeBSD Home Page
www@freebsd.org
Updated May 23, 1997