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

11.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とも呼ばれます) があります. また, SCSI-2には Ultra2 (Fast-40ともいいます) というものも定義されています. Fast-20は1秒間に2000万回の転送 (8bitバスで20Mbyte/sec), Fast-40は1秒間に 4000万回の転送 (8bitバスで 40Mbytes/sec) をおこないます. 最近売られているハードディスクの ほとんどは不平衡信号の Ultra SCSI (8ビットまたは 16ビット) です.

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

もちろん 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バスを占有してしまうデバイスもあります.)

11.5.2.1. SCSIの構成要素

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

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

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

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

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

11.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後 - 本当は電線中の信号の伝達は 光速よりも少し遅くなるのでもう少し時間がかかりますが - に返ってきます. 低速のバスの場合タイミング的な余裕があり, 反射を繰り返しているうちに反射波は減衰してしまうのですが 高速のバスの場合は, 反射波の影響が落ち着く前に信号の 読み込みなどを行うために波形の乱れが誤動作の原因に なる場合があります. このためターミネータを使用して反射波の発生をできるだけ おさえます.

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

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

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

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

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

ターミネータの位置は信号線ごとに決まることに注意して下さい. ナローとワイドのケーブルを両方コントローラにつないでいる場 合には, ケーブルの両端とともにコントローラ上ではバスの上位 8ビットをターミネートしないといけません.

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

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

ターミネータの電源

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

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

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

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

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

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

デバイス アドレッシング

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

これには SCSIではターゲットIDが使われます. それぞれのデバイ スは特定のターゲットIDを持ちます. デバイスの IDはジャンパや DIPスイッチなどで設定できます. ブート時のメニューからIDを 変更できるようになっているコントローラもあります. (また, IDを 7から変えることができないコントローラもあります.) より詳しい情報はデバイスのマニュアルを見てください.

複数のデバイスを使う場合は IDの重複に気をつけてください. 重複すると普通は混乱状態になります. 同じ IDを共有している デバイスのうちの一つがI/Oリクエストに答えられたりすると 非常にやっかいなことになります.

8 bitバスでは, 最大8台のターゲットまで可能です. 最大8台で ある理由は, バスの8本のデータ線がデバイスの選択に使われる からです. ワイドなバスでは使えるデバイスの数は増えます (通常は16になるわけです). ナローSCSIデバイスは8以上のターゲットIDを持つデバイスとは 通信できないことに注意してください. ですから, コントローラ のターゲットIDを8以上にするのはあまりいい考えとは いえません (CD-ROMが使えなくなったりします).

同時にバス使用の要求が発生した場合, 最も IDの大きいデバイス が優先されるという調停がおこなわれます. このことは SCSIホストアダプタの IDは通常7番が使われる理由でもあり ます. ただし, ワイドバスでは下位8ビットが上位8ビットより優 先度が高いことに注意してください. つまり, ワイドSCSIのシス テムではターゲットIDの優先度は高い順に [7 6 .. 1 0 15 14 .. 9 8] となります. (どうして下位8ビットの方が優先度が高いかは, 一つ前の段落を読んで考えてみて下さい.)

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

バスの形状

SCSIバスは直線状です. つまり, Y接続, スター接続, 円形, クモの巣状の接続などの直線以外の接続ではありません. 初心者が よくやる間違いとしてはワイドSCSIのコントローラの端子3つと もにケーブルをつないでしまうというものがあります. (外部, 内部ナロー, 内部ワイド.) よほど運がよければこんなトポロジー でもちゃんと動くように見えるかもしれませんが, えてしてこう いうシステムは一番大切な時に使えなくなったりするものです (これを「マーフィーの法則」といいます).

先に議論したターミネータの問題は直線状以外の場合では より困難になるだろうということに注意してください. また, 内部バス用のケーブルの端子の数よりデバイスの数の方が少ない場合には, 必ず両端の端子にはデバイスをつなぐようにしてください. 内側の端子を使ってケーブルの端を余らせておくと, ターミネータの効果が半減します.

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

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

11.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' とします. 簡単ですね?

訳注: BIOS で `No hard disk' という設定をおこなうのは SCSI ドライブから直接起動させるためのテクニックです. 現在のマザーボードでは SCSI ドライブから起動させるための オプションを持つ BIOS を使用しているものもあります. また, ブートセレクタを使って IDEドライブのブートブロックから SCSIドライブ上の FreeBSDをブートすることもできます.

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アドレス等に 合わせてカーネルコンフィグファイルを書か なければなりません. システムのブート時のメッセージは実際に 見つけたハードウェアの設定を表示します. ほとんどの EISA/PCI 用のドライバ (具体的には ahb, ahc, ncramdです) はブート時にコントローラから直接パラメータ を読むことに注意してください. これらについては, 何も引数をつ けずにただ "controller ahc0" のように書けば大丈夫で す.

例として FreeBSD 2.2.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!)
# amd: AMD 53c974 based SCSI cards (e.g., Tekram DC-390 and 390T)
# bt: Most Buslogic controllers
# nca: ProAudioSpectrum cards using the NCR 5380 or Trantor T130
# ncr: NCR/Symbios 53c810/815/825/875 etc based SCSI cards
# uha: UltraStore 14F and 34F
# sea: Seagate ST01/02 8 bit controller (slow!)
# wds: Western Digital WD7000 controller (no scatter/gather!).
#

[ Adaptec AHA274x/284x/294x/394x などのコントローラ]
controller	ahc0

[ NCR/Symbios 53c875 コントローラ]
controller	ncr0

[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 ncr0
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		[ncr0 上の SCSIディスク]
tape st1 at scbus0 target 6		[SCSI テープ は ターゲット (ID)6]
device cd0 at scbus?			[最初に見つけた CD-ROM, 固定にしない]

	  

上の例では カーネルは ahc (Adaptec 274x) コントローラをまず探し, その次に NCR/Symbios のボードというように順番に探して 行きます. その下の行の 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 テープのサポート]

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

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

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

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

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

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

options         SCSI_DELAY=15         #Be pessimistic about Joe SCSI device
	  
この行ではディレイタイムは 15秒です. 私のシステムでは, 信頼できる古い CD-ROMが認識できるように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 CD-ROM (訳注: 架空のメーカ のデバイスです) を接続した人がいないとしたら, どんな「ワザ」 を使ってそれを使うか自分で見つけないといけないかもしれません.

あなたの 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 にはないようです. ソースのコメントだけで も一度見ておいてもいいかもしれません.

11.5.2.4. 問題を突き止める

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

11.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: * ディスク/テープ コントローラ