NetBSD/pc98(based on NetBSD 1.2) and later SCSIデバイス設定ガイド 最終更新 1998年 3月 19日 このドキュメントは、NetBSD/pc98 における、SCSI デバイスの使用法 について説明しています。はじめに、WD33C93用のSCSI driverである、 bs driverについて解説した後、マルチベンダー機能について紹介します。 1. bs driverについて 1-1. bs driverとは? bs は、高い信頼性(error recovery)と 多重アクセスの効率化を主眼と したSCSI ドライバーです。SunOS 4.1.4 lower level scsi driver 程度の レベルを目指しています。 現在の大きな違いは、QTAG messagesのサポートをしているか否かです。 現状では、一般的なPC98用のHDDで、QTAG messageをサポートした物が皆無 であるため、bs driverではサポートできないという訳です。 1-2. SCSIのトラブルについて bs driverはdisconnect reselectionを行いますが、これは、今まで1度も 使われていない機能のはずです。PC98では、MS-DOS,MS-Windows,386BSD(98) なででは使っていないと思われます。このことは、新たなトラブルが起きる可 能性が非常に大きい事を意味します。 実際、最新のHDDはほとんど問題ないのですが、古いHDDやMO CDROMなどでは、 サポートしなければならないSCSIコマンドをサポートしていないものがありま す。このため、トラブル回避のためのさまざまなSCSI flagsが用意されていま す。もしトラブルが発生した場合はconfig ファイルの SCSI flagsの意味を良 く見ていろいろflagsを変えてみてください。  SCSIの best flagsは 0x320c0003 です。このflags,optionsの意味は、 wd33c93a combination command 使用 scsi cmd link 機能使用 disconnection reselection 使用 parity check あり 同期転送5M/s(10M/sにも出来ますがC busでは全く意味がありません) なお、SCSI bus がハングアップしても、必ずSCSI busが resetされ、再試行 が行われます。386BSD(98),FreeBSD(98)等とは違って、バスがハングアップした ままどうにもならないという事はまずありません。そのため、HDDのランプが点 灯したままになっても必ず待つようにしてください。 ただし、ブート時にトラブルが発生した場合はpanicするようにしています。 これは、被害を最小限に納める為の対策です。 1-3. 16MB以上メモリを搭載している場合 16MB以上メモリを搭載した場合の使用も全く問題ありません。ただし、16MB以 上のメモリーを積むと外部DMA を自動的に使わないボードが存在します。使用し ているボードにあわせて、kernel configuration の bs の flags に flags 0x010000 : IO DATA SC98 SCSIボードを使用している場合 flags 0x020000 : TEXA HA-55BS[24W] SCSIボードを使用している場合 flags 0x030000 : ELECOM EIF-98AW SCSIボードを使用している場合 flags 0x040000 : SMIT転送可能なSCSIボードを使用している場合 flags 0x050000 : Logitec LHA-20B SCSIボードを使用している場合 を指定すると、これらのボードも外部DMAを強制的に使うようになります。 これはボードに依存しますので、TEXA type(sync regster addr 0x60 -> 0x67) もしくはELECOM type (sync register addr 0x38 -> 0x3f)以外ではこれらの flags を絶対に有効にしないで下さい。 現在、NetBSD/pc98 core teamで動作確認がなされているボードは ・TEXA 55BS2以降すべて ・IO DATA SC98 ・ELECOM EIF-AIW ・Logitech LHA-20B/301 です。これらは全て、同期転送&外部DMAで動作しています。 1-4. トラブルの起きた時の対処方法 flagsを変更した時に、良く起きると考えられるトラブルと、その時の対処法 についてです。 1) ある特定のデバイスを追加すると、全てのデバイスが selection phase で freeze もしくは、disconnectしたまま戻って来なく timeout -> bus reset となる場合。 -> wait for bus free フラグをONにします。 2) illegal request ASC 25 もしくは identify msg がreject される場合。 -> do not use combination cmd フラグをONにします。このフラグは、 wd33c93a特有のsatコマンドを使わないようにします。 3) CD-ROM等でsync negで同期転送になったにもかかわらず、CD-ROMの ハード ウェアが同期転送にならない場合。 -> sync offset を0にします。 4) parity errorが発生する場合。この場合、2つの原因が考えられます。 a) デバイスがparity line をサポートしていない場合 -> non parity フラグをONにします。 b) 本当にscsi bus が不安定で、parity errorが発生している場合。 -> ケーブルの長さを短くしたり、ターミネータを変更するなどして バスが安定するような対策をして下さい。 5) たまに bus resetがかかる場合。 -> use link cmd フラグをOFFにします。 6) disconnect をサポートしてない。もしくはATN lineをサポートしていな い場合。 -> NetBSD/pc98 では、これらをサポートしていないデバイスはサポート していません。NetBSD/pc98 を使用する時は、これらの機器を外して 下さい。 7) 起動時に、「bs(2:0) could not clear CA state」というような メッセージが出る場合。 -> これは、MOやCD-ROMなどのリムーバブルメディアを使用していて、 メディアが挿入されていない時に出るメッセージです。従って、 異常ではありません。 8) SMIT転送時に、MOなどの低速なデバイスで障害が出る場合 -> SMIT転送は、C-bus上で出来るだけ高速な転送をするために開発された 新しい手法です。このため、MOなどの低速なデバイスを使用すると、 障害が出る可能性があります。このような場合は、sd0などのflagsに 0x800 をor してやり、DMA転送に切替えると直る場合があります。 9) restore scsi pointer と言うメッセージが多数出る場合 -> 通常は、target側に何らかの異常が発生した時に、「restore scsi pointer msg」を発行する事で、前の転送の状態に戻してretryをする 時に出ます。しかし、disconnect処理に関して問題がある時も同様 のメッセージが出ます。disconnectを禁止にしてみてください。 メッセージが出なくなるようなら、firmwareのバグでしょう。 1-5. その他の注意 MO は必ず「光デバイスモード」で使用して下さい。「HD互換モード」など はbs driverではサポートしていないので、スイッチ等をこちらに切替えない ようにして下さい。 bs driverはerror messageを冗長なまでに吐きます。おもにdebugのためで す。errorが発生した時はこれを報告して頂ければほぼ対策をたてる事ができ ますので、このドキュメントに書かれていない現象に遭遇した場合は、NetBSD/ pc98 core teamまで報告をお願いします。 また、parity lineが有効なdeviceに対しては non parity flags を offに してください。offにすることにより、READ時においてparity errorが発生し た場合、完全なrecoverがおこなわれます。WRITE時のrecoverは、そのターゲッ トに依存するので、recoverされるかどうかは判りません。なお、ターゲット からのSCSI-2 プロトコルに準じたerror recoveryの要求には対応しています。 (参考までに、restore scsi data pointer msg もしくは save data pointer なしの disconnetと reconnect が SCSI-2で規定されています)。 GENERIC98 の設定ではparityを見ない設定になっています。古いデバイス でparity lineがサポートされていないものがあるからです。ただしSCSI BUS は非常に不安定で知らぬ間にPARITY ERRORが発生している事があります。こ れは、あとでfileが1bytesおかしいとか理由の不明な現象をひきおこし、 もっとも質が悪いものです。ですから、parityの有効化は是非行ってくださ い。 なお、運用上bus resetがたまに起きる程度であればデータが失われる事は ほぼありませんが、頻繁にresetがかかってまったくIOが進行しない場合は、 問題のターゲットの電源を切ってください。これで、他のターゲットは救わ れます。 2. マルチベンダー機能について 2-1. NetBSD/pc98のマルチベンダー機能について HDDのジオメトリ(トータルシリンダ数・ヘッド数・セクタ数)は SCSI I/FのBIOSによって、BIOSジオメトリに変換されます。しかし、 BIOSジオメトリはSCSI I/Fのメーカーによって値が違うため、ある 特定のメーカーのI/Fを用いてフォーマットされたHDDを別のメーカー のI/Fに繋ぐと、BIOSジオメトリが異なるため、アクセスした時に中身 がおかしくなったように見えたり、最悪ブートしないなどの障害が出 るといった事が起こります。 このような場合、今までは (1) 元のI/Fを使用して領域を開放する (2) 使用しようとするI/Fで領域を確保する という作業が必要だったため、非常に苦労する場合がありました。 しかし、最近では「マルチベンダー機能」と称して、他社製のI/F で領域確保されたHDDを、領域開放する事なしに接続する機能を持つ I/Fが登場しています。 原理は比較的簡単で、以前使用していたI/Fが用いていたBIOSジオ メトリを調査し、その値をI/Fが記憶して、その値を用いてアクセス する事により実現しています。 しかし、マルチベンダー機能を持っていないSCSI I/Fしか持って いない時はどうすれば良いのでしょうか? このような場合、先程紹 介したように、元のI/Fで領域開放し、もう1度領域確保すれば良い のですが、FreeBSD(98) や以前のバージョンのNetBSD/pc98を接続し ている場合、このような手段は使えません。 そこで、NetBSD/pc98では、カーネル内にマルチベンダー機能付き SCSI I/Fと同様な機能を搭載しました。NetBSD/pc98のマルチベンダー 機能は、汎用的な仕掛けになっているために、 (1) マルチベンダー機能を搭載していないSCSI I/Fで、他社製I/Fで フォーマット・領域確保されたHDDをそのまま接続する (2) SCSI I/Fを2枚挿し、フォーマットする事なしにアクセスする (3) PCMCIA SCSI cardの先に接続したHDDにアクセスする といった応用が可能となっています。 なお、当り前の事ですが、MS-DOSなどではMS-DOSの変換ルールが 適用されるため、NetBSD/pc98でアクセスする事の出来たHDDがMS-DOS では認識されないと言った事も起こり得ます。MS-DOSでも使いたい 場合は素直に領域確保し直す方が良いでしょう。 2-2. マルチベンダー機能の実現方法 マルチベンダー機能の変換テーブルは、1〜15までの15通り記述 する事ができ、また各パターン毎に複数の変換テーブルを記述する事 ができるため、例えば各SCSI ID枚に変換テーブルを持たせるといった 事も出来ます。次に具体例を示しながら、変換テーブルの記述方法に ついて解説します。 2-3. 変換テーブルの記述方法 例えば、HDDのジオメトリが、 3457 cyl, 6 head, 102 sec というHDDがあり、BIOS認識のジオメトリが 3778 cyl, 6 head, 94 sec となるHDDがあったとします。 ここで「HDDのジオメトリ」というのは、NetBSD/pc98をブートした 時に表示される値の事です。また、「BIOS認識のジオメトリ」という のは、MS-DOS上でHDDユーティリティのパラメータ表示機能などを 利用した時に表示される値や、FreeBSD(98)をブートさせた時に表示 される時の値の事です。BIOSジオメトリは、NetBSD/pc98の/sbin/diskinfo コマンドでも取得する事が出来ます。これらの値をまず記憶します。 /usr/src.skel/sys/arch/i386/conf/sdgsets.h が、変換テーブル のファイルです。例えば、sdgsets.hに、 ----------------------------------------------------------------- static struct sdg_conv_element sdg_element_array_set01[] = { { { 6, 102, }, { 6, 94, } }, }; static struct sdg_conv_table sdg_conv_table_set01 = { SDG_CONV_ELEMENT_SZ(sdg_element_array_set01), &sdg_element_array_set01[0] }; struct sdg_conv_table *sdg_conv_table_array[16] = { NULL, &sdg_conv_table_set01, }; ----------------------------------------------------------------- と書く事により、6 head, 102 secというジオメトリを持ったHDDを 6 head, 94 secというBIOSジオメトリに変換する事が出来ます。 最初の static struct sdg_conv_element sdg_element_array_set01[] = { { { 6, 102, }, { 6, 94, } }, }; という記述における、sdg_element_array_set01という部分が、変換 テーブル1である事を示しています。このテーブルは、名前を変える 事によりいくつでも持つ事が出来るのですが、実際に使用できるのは 最大15個ですのでset01からset15の名前をつければ良いでしょう。 { { 6, 102, }, { 6, 94, } }, は、既にわかるかもしれませんが、最初の1組の値がHDD ジオメトリ、 あとの1組の値がBIOSジオメトリを示しています。この値も複数持つ 事が出来ます。例えば、 ----------------------------------------------------------------- static struct sdg_conv_element sdg_element_array_set04[] = { { { 2, 96, }, { 8, 32, } }, { { 4, 65, }, { 4, 64, } }, { { 6, 102, }, { 6, 94, } }, }; ----------------------------------------------------------------- と書く事により、sdg_element_array_set04というテーブルを使用する 場合 2 head, 96 secにマッチしたHDDは、8 head, 32 secに変換する 4 head, 65 secにマッチしたHDDは、4 head, 64 secに変換する 6 head, 102 secにマッチしたHDDは、6 head, 94 secに変換する というルールが適用される事になります。 ----------------------------------------------------------------- static struct sdg_conv_table sdg_conv_table_set01 = { SDG_CONV_ELEMENT_SZ(sdg_element_array_set01), &sdg_element_array_set01[0] }; ----------------------------------------------------------------- という部分は、変換テーブルのサイズを指定する部分ですので、おまじ ないと思って下さい。またset01の部分は、適切な名前にして下さい。 ----------------------------------------------------------------- struct sdg_conv_table *sdg_conv_table_array[16] = { NULL, &sdg_conv_table_set01, &sdg_conv_table_set02, &sdg_conv_table_set03, }; ----------------------------------------------------------------- この部分は、sdgset.hに記述された変換テーブルのうち、どの テーブルを使用するかを決定しています。この例では、set01 からset03の値を使用する事を示しています。また最初は必ず NULLで始めて下さい。 なお、この例だと &sdg_conv_table_set01 : 1番 &sdg_conv_table_set02 : 2番 &sdg_conv_table_set03 : 3番 という番号が付けられます。この番号は後で使用するので覚え ておいて下さい。 2-4. コンフィグファイルの記述方法 先程記述した変換テーブルをどのように適用するかを次に説明します。 変換テーブルの番号は、flagsのbit12-15に対応するので、sdのflagsに テーブルの番号を記述します。例えば、sd4のHDDに対して、3番目の変換 ルールを適用する場合は、 sd4 at scsibus? target 4 lun 0 flags 0x320c3003 ^ と書いて下さい。例のように記述している場合なら、 sdg_element_array_set03をスキャンして、マッチしたパラメータに変換 されます。 このように記述されたコンフィグファイルを用いてカーネルを作成する 事により、マルチベンダー機能を用いたアクセスをする事が出来ます。 なお、マルチベンダー機能を使用しない場合は、 sd4 at scsibus? target 4 lun 0 flags 0x320c0003 ^ と、"0"を指定して下さい。 NetBSD/pc98 core team 連絡先 E-Mail:netbsd-98@njk.co.jp