Linux SCSI HOWTO Drew Eckhardt, (linuxdoc-sgml への変換は Dieter Faulbaum ) v2.30, 30 August 1996 日本語への翻訳、および SGML タグの打ち直し 水原 文 (1〜4章、6〜7章、10章〜11章担当) 中野 武雄 (5章・8章〜9章担当) 1997年4月7日 注意: この文書はかなり以前に書かれたものなので、いまどきの Linux 環境 にはあてはまらない箇所があります。 (JF Project) ______________________________________________________________________ 目次 1. はじめに 2. よくある問題 2.1 不安定なシステム 2.2 カーネルコマンドライン 2.3 SCSI デバイスがすべての ID に反応する 2.4 SCSI デバイスがすべての LUN に反応する 2.5 エラーフリーのはずのデバイスにセンスエラーが起こる 2.6 ネットワーク機能を組み込んだカーネルが動かない 2.7 デバイスは検出されるが、アクセスできない 2.8 SCSI システムがロックアップする 2.9 カーネルの設定と再構築 2.10 0 以外の LUN が使えない 3. バグレポート 3.1 メッセージの取得 3.2 panic() の位置を特定する 4. カーネルモジュール 4.1 一般的な情報 4.2 カーネル 1.2.N でのモジュールのサポート 4.3 カーネル 1.3.N でのモジュールのサポート 5. ホストアダプタ 5.1 サポートされている/いないハードウェア 5.1.1 配布カーネルに含まれているドライバ 5.1.2 MCA 5.1.3 アルファ版のドライバ 5.1.4 修正をすれば動作するドライバ 5.1.4.1 NCR53c8x0/7x0 5.1.5 多分動作しない SCSI ホスト 5.1.6 絶対に動作しない SCSI ホスト 5.1.7 複数のホストアダプタ 5.2 よくある問題 5.2.1 SCSI がタイムアウトしてしまう 5.2.2 BIOS 依存のボード自動検出ルーチンが失敗する 5.2.3 メモリマップ方式の I/O を用いたボードの障害 5.2.4 アルファ版のドライバでブートフロッピーを作ってブートさせると 「kernel panic : cannot mount root device」というメッセージ が出る 5.2.5 標準カーネルに入っていないドライバをインストールするには 5.2.6 パッチのないドライバをインストールするには 5.2.7 Compaq のシステムで PCI のボードが動かない 5.2.8 PCI の SCSI システムが %d Hosts というメッセージを 出した後にハングアップします。 5.3 Adaptec 152x、151x、1505、282x、Sound Blaster 16 SCSI / SCSI Pro、 Gigabyte、その他 AIC 6260/6360 を用いた製品 (標準) 5.3.1 可能な設定 5.3.2 自動検出 5.3.3 自動検出の設定変更 5.3.4 アップデートによって解決された問題 5.3.5 定義可能なパラメータ 5.4 Adaptec 154x、AMI FastDisk VLB、DTC 329x (標準) 5.4.1 可能な設定 5.4.2 自動検出 5.4.3 自動検出の設定変更 5.4.4 注意 5.4.5 アップデートによって解決された問題 5.4.6 よくある問題 5.5 Adaptec 174x 5.5.1 可能な設定 5.5.2 自動検出 5.5.3 自動検出の設定変更 5.5.4 注意 5.5.5 よくある問題 5.6 Adaptec 274x、284x (標準) 294x (アルファ版) 5.6.1 可能な設定 5.6.2 自動検出の設定変更 5.6.3 注意 5.7 Always IN2000 (標準) 5.7.1 可能な設定 5.7.2 自動検出 5.7.3 自動検出の設定変更 5.7.4 よくある問題 5.8 BusLogic MultiMaster ホストアダプタ 5.8.1 サポートされているアダプタ 5.8.2 BT-948/958/958D インストールの注意 5.8.3 BusLogic の広報用メーリングリスト 5.9 BusLogic FlashPoint ホストアダプタ 5.10 EATA: DPT SmartCache、SmartCache Plus、SmartCache III、 SmartCache IV、SmartRAID (標準) 5.10.1 サポートされているボード 5.10.2 可能な設定 5.10.3 自動検出 5.10.4 メーリングリスト 5.10.5 /proc/scsi サポート 5.10.6 よくある問題 5.10.7 注意 5.11 TMC-1800、TMC-18C30、TMC-18C50、TMC-36C70 のうちのどれかのチップ を使っている Future Domain の 16x0 5.11.1 可能な設定 5.11.2 自動検出 5.11.3 自動検出の設定変更 5.11.4 アップデートによって解決された問題 5.11.5 注意 5.12 NCR5380 汎用 / T130B (標準) 5.12.1 可能な設定 5.12.2 自動検出 5.12.3 自動検出の設定変更 5.12.4 よくある問題 5.12.5 アップデートによって解決された問題 5.12.6 注意 5.13 NCR53c8xx (標準) 5.13.1 可能な設定 5.13.2 自動検出 5.13.3 アップデートによって解決された問題 5.13.4 よくある問題 5.13.5 注意 5.14 Seagate ST0x/Future Domain TMC-8xx/TMC-9xx (標準) 5.14.1 可能な設定 5.14.2 自動検出 5.14.3 自動検出の設定変更 5.14.4 アップデートによって解決された問題 5.14.5 よくある問題 5.14.6 定義可能なパラメータ 5.15 PAS16 SCSI (標準) 5.15.1 可能な設定 5.15.2 自動検出 5.15.3 自動検出の設定変更 5.15.4 定義可能なパラメータ 5.15.5 よくある問題 5.16 Trantor T128/T128F/T228 (標準) 5.16.1 可能な設定 5.16.2 自動検出 5.16.3 自動検出の設定変更 5.16.4 定義可能なパラメータ 5.16.5 よくある問題 5.17 Ultrastor 14f (ISA)、24f (EISA)、34f (VLB) (標準) 5.17.1 可能な設定 5.17.2 自動検出 5.17.3 自動検出の設定変更 5.17.4 よくある問題 5.18 Western Digital 7000 (標準) 5.18.1 可能な設定 5.18.2 自動検出 5.18.3 よくある問題 5.19 AM53/79C974 (アルファ版) 5.19.1 可能な設定 5.20 qlogic (標準) 6. ディスク 6.1 対応している (いない) ハードウェア 6.2 よくある問題 6.2.1 「シリンダが 1024 よりも多い」というメッセージ 6.2.2 /dev/hd* にパーティションが切れない 6.2.3 リムーバブルメディアドライブからメディアを排出できない 6.2.4 SCSI ディスクから LILO でブートできない 6.2.5 fdisk が以下のようなメッセージを出力する 6.2.6 ブリッジボードに複数のドライブが接続されているのに、 ひとつのドライブしか検出されない。 6.2.7 スワップ時にシステムがハングする 6.2.8 Conner の CFP1060S ディスクの内容が壊れる 6.3 デバイスファイル 6.4 パーティションの作成 6.5 ディスクのジオメトリ 7. CDROM 7.1 対応している (いない) ハードウェア 7.2 よくある問題 7.2.1 CDROM がマウントできない 7.2.2 CDROM が排出できない。 7.2.3 オーディオ CD が演奏できない 7.2.4 workman や xcdplayer がうまく動かない 7.2.5 CD ROM チェンジャの2番目以降のドライブが動作しない 7.3 デバイスファイル 8. テープ 8.1 対応している (いない) ハードウェア 8.2 よくある問題 8.2.1 ブート時にテープドライブが認識されない 8.2.2 複数のファイルを含んだテープが正しく読み取れない 8.2.3 圧縮が失敗する 8.2.4 他のシステムとテープでのデータのやり取りができない 8.2.5 「No such device」というエラーメッセージが出る 8.2.6 読み込みには密度を指定できるのに、書き込みではできない 8.2.7 テープの頭出しをすると全ての SCSI デバイスがフリーズしてしまう 8.3 デバイスファイル 9. 汎用デバイス 9.1 対応しているハードウェア 9.2 よくある問題 9.3 デバイスファイル 10. 購入の手引き 10.1 転送のタイプ 10.2 スキャッタ/ギャザ 10.3 メールボックスインターフェース 10.4 バスのタイプ 10.5 複数のデバイス 10.6 SCSI-I、SCSI-II、SCSI-III、FAST および WIDE オプションなどについて 10.7 ドライバ機能の比較 10.8 ボードの比較 10.9 まとめ 11. マイナー番号の割り当て ______________________________________________________________________ 1. はじめに この文書はフリーです。再配布、変更は Free Software Foundation 発行の GNU General Public License (バージョン2またはそれ以降)にしたがって行う ことができます。 この文書は有用であることを目指して配布されていますが、何の保証もありま せん。商用性、あるいは特定の目的への適合性は暗黙にも保証されていませ ん。詳細については、GNU General Public Licence を参照してください。 GNU General Public Licence は、この文書に付随して配布されているはずで す。もし付随していなかった場合には、 Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. まで連絡してください。 もしこの文書を出版する場合には、最新のバージョンに関して筆者 に問い合わせてくださるようお願いします。もし古い バージョンが出版されてしまうと、私は新しいバージョンに答えが載っている 質問をユーザーから受けることになりますし、それは出版する側にもうれしく ないことだろうと思うのです。また、フリー配布を行っているサイトや、競合 するパッケージや製品に関する記述を改変しないようにお願いします。 重要: ``バグレポート'' セクションに記述された手順に従わないバグレポー トや問い合わせは無視されます。 この文書は、Linux カーネル 1.2.10 およびそれ以降のアルファコードに実装 された Linux の SCSI サブシステムについて説明しています。これ以前のリ ビジョンの SCSI コードはサポートされていませんし、実装されているドライ バや性能、利用できるオプションなどに関して大きく異なっていることがあり ます。 linux-scsi メーリングリストに参加すれば、より詳しい情報を得ることがで きます。参加するには、本文に以下のように書い て、majordomo@vger.rutgers.edu にメールを送ってください。 subscribe linux-scsi メーリングリストから脱退するには、本文に以下のように書いて、同じアドレ スへメールを送ってください。 unsubscribe linux-scsi メーリングリストに参加すると、以下のアドレスにメールが送れるようになり ます。 linux-scsi@vger.rutgers.edu この文書はあまりユーザーフレンドリーではありませんし、不正確な記述や、 書き落としていることもあるでしょう。これらの問題を解決するために何か建 設的なコメントがあれば、私にメールしてください。 2. よくある問題 このセクションでは、よくある問題について説明します。ここに質問の答えが 見つからなかったら、お使いのホストアダプタやデバイスのセクションも調べ て見てください。 2.1. 不安定なシステム 再現性のないエラーが発生する場合、ケーブルや終端に問題があることが多い のです。 最近の NCR チップを採用した製品などには、ディジタルフィルタリングやア クティブシグナルネゲーションなどの機能を持っているものがあり、これらは ケーブルにはそれほど敏感ではありません。 例えば Adaptec の 154xC や 154xCF、それに 274x など、それ以外の製品は ケーブルに非常に敏感で、他のシステムでは問題なく動作するケーブルでも動 かないことがあります。 もう一度繰り返します。一部のホストアダプタはケーブルやターミネーターの 問題に非常に敏感なので、問題が起こった時にはまずケーブルやターミネー ターを調べてみてください。 問題を最小限にするため、以下のようなケーブルを使うべきです。 1. SCSI-II 準拠をうたっていること。 2. 特性インピーダンスが 132 オームであること。 3. インピーダンスの不整合を避けるために、すべてのケーブルを同じメー カーのもので揃えること。 4. アンフェノールなどの有名メーカーの製品であること。 訳注: SCSI-2 規格では、同期転送を行なう場合のケーブルのイン ピーダンスは 90オームから132オームと規定されています。 SCSI-2 規格は にあります。 ターミネータが接続されるケーブルの両端に十分な電力を供給するため、ター ミネータパワーは SCSI バス上のすべてのデバイスから電流の逆流を防止する ダイオードを通して供給されなくてはなりません。バスが短絡された場合の損 傷を防ぐため、TERMPWR はヒューズなどの電流制限デバイスを通して供給され なければなりません。 訳注: SCSI-2 規格では、すべてのイニシエータデバイスはターミ ネーターパワーを供給しなければならないと規定されていますが、 ターゲットデバイスは供給しなくてもよいことになっています。 複数のデバイスや外部ケーブル、あるいは FAST SCSI 2 を使用する場合に は、 SCSI バスの両端にアクティブターミネータを使う必要があります。 アクティブターミネータについての詳しい情報は、 Comp.Periphs.Scsi の FAQ (tsx-11 の pub/linux/ALPHA/scsi にありま す) を参照してください。 2.2. カーネルコマンドライン この文書の中で「カーネルコマンドライン」について言及することがありま す。 カーネルコマンドラインとは、LILO : プロンプトに対してイメージ名の後 に、あるいは LILO 設定ファイルの append フィールドに指定するオプション 群のことです。 LILO 設定ファイルは LILO .14 以降では /etc/lilo.conf、 それ以前のバージョンでは /etc/lilo/config にあります。 プロンプトを表示させるには、LILO でブートし、起動中に Alt か Ctrl、ま たは Shift キーのいずれかを押して下さい。以下のプロンプトが表示されま す。 : ここで、ブートするカーネルイメージを選択します。また次のように ? を入 力すると、カーネルイメージのリストが表示されます。 :? ramdisk floppy harddisk 選択したコマンドラインオプションでカーネルをブートするには、カーネル名 の後にオプションのリストをスペースで区切って入力し、最後にリターンキー を押せば良いのです。 オプションは以下の形式で指定します。 variable=valuelist valuelist は単一の値、あるいはスペースを含まない値のリストをコンマで区 切ったものです。ルートデバイスは例外ですが、それ以外の値は10進または16 進で指定する数値です。 例えば、ブート時に認識されない Adaptec 1520 のクローンを持ったシステム で Linux をブートするには次のようにします。 :floppy aha152x=0x340,11,7,1 ブート時にこれらの値を入力するのが面倒ならば、次の例のように、 LILO 設 定ファイルの append オプションに指定することも可能です (LILO .13 以降 が必要です)。 append="aha152x=0x340,11,7,1" 2.3. SCSI デバイスがすべての ID に反応する この現象は、そのデバイスがコントローラと同じ ID を持っていることが原因 です。(コントローラの ID は普通は 7 ですが、ボードによっては違う ID を 使っている場合があります。例えば Future Domain のボードには 6 を使って いるものがあります。) ジャンパーの設定を変更してください。 2.4. SCSI デバイスがすべての LUN に反応する そのデバイスのファームウェアがバグっています。 暫定的な解決方法として、以下のカーネルコマンドラインオプションを試して みてください。 max_scsi_luns=1 これでうまくいったら、カーネルソースの drivers/scsi/scsi.c の blacklist 変数にある、バグありデバイスのリストにそのデバイスを追加し、 その情報を Linus Torvalds にメールして 下さい。 2.5. エラーフリーのはずのデバイスにセンスエラーが起こる この問題は、質の悪いケーブルや不適当なターミネータによって引き起こされ ることがあります。 ``不安定なシステム'' を参照してください。 2.6. ネットワーク機能を組み込んだカーネルが動かない 多くのネットワークドライバの自動検出ルーチンはレジスタへの書き込みを行 なうため、SCSI ドライバの動作と干渉することがあります。 2.7. デバイスは検出されるが、アクセスできない カーネルによって SCSI デバイスは検出されるが、アクセスすることができな い。 mkfs /dev/sdc とか tar xvf /dev/rst2 などのコマンドが失敗する。 そのデバイスに対するスペシャルファイルが /dev にないのでしょう。 Unix のデバイスにはブロックデバイスとキャラクタデバイスの区別があり、 それぞれのデバイスはメジャーデバイス番号とマイナーデバイス番号で区別さ れます。ブロックデバイスはバッファキャッシュを通してアクセスされます が、キャラクタデバイスはバッファキャッシュを通さずにアクセスされます。 メジャーデバイス番号は、使用されるドライバを表します。例えばメジャー番 号 8 のブロックデバイスは SCSI ディスクを表します。マイナーデバイス番 号は、そのドライバを通してどのユニットがアクセスされるかを表します。例 えばメジャー番号 4、マイナー番号 0 のキャラクタデバイスは最初の仮想コ ンソールを表し、マイナー番号 1 は次の仮想コンソールを表す、といった具 合です。しかし、この方法でデバイスをアクセスすることは、「すべてはファ イルとして表現される」という Unix/Linux のメタファにそぐわないため、 キャラクタデバイスとブロックデバイスのスペシャルファイルが /dev の下に 作成されており、例えば3番目の SCSI ディスクは /dev/sdc、最初のシリアル ポートは /dev/ttyS0 としてアクセスできるようになっています。 スペシャルファイルを作成するには、MAKEDEV スクリプトを使うのが普通で す。/dev に cd し、作成したいデバイスを指定して次のように MAKEDEV を実 行して下さい (root で)。 ./MAKEDEV sdc 訳注: パッケージによっては MAKEDEV はスクリプトではなく、バ イナリコードになっている場合もあります。 ワイルドカードも使える「はず」です。 ./MAKEDEV sd\* これによってすべての SCSI ディスクデバイスが作成される「はず」 (/dev/sda から /dev/sdp までと、それぞれに対して 15個のパーティション が作成されるはず) です。 ./MAKEDEV sdc\* これによって /dev/sdc 自身と /dev/sdc 上の15個のパーティションすべてが 作成される「はず」です。 カギカッコつきで「はず」といったのは、これが標準的な Unix の振舞いだか らです。インストールされている MAKEDEV スクリプトがこのように振舞うと は限りませんし、作成するデバイスの数が制限されているかもしれません。 MAKEDEV では望む結果が得られない場合、mknod コマンドを使って手動でデバ イスファイルを作成する必要があります。 各種 SCSI デバイスのデバイス種別 (ブロックデバイスかキャラクタデバイス か)、メジャーデバイス番号、マイナーデバイス番号は ``デバイスファイル'' に示してあります。 mknod コマンドの書式は次の通りです。 root で実行して下さい。 mknod /dev/device b|c major minor 以下は実行例です。 mknod /dev/sdc b 8 32 mknod /dev/rst0 c 9 0 2.8. SCSI システムがロックアップする ここに書かれている情報はごく限られたものです。使用しているホストアダプ タの項も参照してください。ここに書かれている以外の解決法が書かれている かもしれません。 複数のデバイスが同時にアクセスされる時にロックアップすると思われる場合 には、デバイスのメーカーに連絡して、ファームウェアをバージョンアップす ることで問題が解決できないか聞いてみるのがいいでしょう。可能な場合に は、SCSI ケーブルを換えてみたり、別のシステムで試してみてください。ま た、ディスクのバッドブロックや、マザーボードの DMA 処理 (DMA を行なう ホストアダプタの場合) が原因となっていることも考えられます。この種の問 題には、他にも多くの原因が考えられます。 同一バス上の複数のデバイスが同時にアクセスされる時にロックアップすると 思われる場合もあります。同時に複数のコマンド処理を行なえるホストアダプ タを使用している場合、この値を 1 に減らして様子を見てください。バス上 に低速のテープドライブや CDROM がある場合、これは現実的な解決とはなら ないでしょう。 2.9. カーネルの設定と再構築 カーネルメモリはページングされないので、使用しない SCSI ドライバは貴重 なメモリを消費してしまい、小さなシステムではメモリ不足の悪化にもつなが ります。 したがって、使用するシステム向けにチューンアップしたカーネルを構築し、 必要なドライバだけがインストールされるようにします。 cd /usr/src/linux 現在とは違うルートデバイス、あるいは 80x25 VGA 以外のディスプレイを使 いたい場合で、ブートフロッピーに書き込みを行なう場合には、makefile を 編集して ROOT_DEV = および SVGA_MODE = 以上の行にルートデバイスあるいはディスプレイの指定を行ないます。 パッチを当てた場合、すべてのファイルが再構築されるようにしたい場合があ ります。そのためには以下のように入力します。 make mrproper mrproper の結果がどうであれ、 make config として、コンフィギュレーションに関する質問に答えて下さい。それから make depend を実行し、最後に make を実行します。終了したら、lilo を設定し直すか、以下のようにしてブート フロッピーの作成を行ないます。 make zdisk 2.10. 0 以外の LUN が使えない SCSI デバイスにはまともに LUN をサポートしていないものが多く、 0 以外 の LUN にアクセスしようとしたとき SCSI バスをロックさせるなどの悪さを します。 そのため、最近の Linux カーネルはデフォルトでは 0 以外の LUN を見に行 かないようになっています。0 以外の LUN を使うためには、 max_scsi_luns command コマンドラインオプションを使うか、 CONFIG_SCSI_MULTI_LUN オプ ションを指定してカーネルを再コンパイルする必要があります。 普通は LILO コマンドラインに以下のように指定すればいいはずです。 max_scsi_luns=8 この変更を行なっても、マルチ LUN デバイスが正しく検出されないことがあ ります (SCSI から MFM、RLL、ESDI、SMD などへのブリッジボードに多くみら れます)。これは drivers/scsi/scsi.c 中の scan_scsis() にある、以下の コードのせいです。 /* Some scsi-1 peripherals do not handle lun != 0. I am assuming that scsi-2 peripherals do better */ if((scsi_result[2] & 0x07) == 1 && (scsi_result[3] & 0x0f) == 0) break; このコードを削除すれば、うまく行くはずです。 3. バグレポート Linux の SCSI 開発者たちは、古いコードを取っておいているとは限りませ ん。したがって、リリースされた最新の Linux カーネル以外では (MCC、SLS、 Yggdrasil などのパッケージは最新カーネルから1つから12個も 古い場合があります) 問題解決が不可能な場合があります。ですから、バグレ ポートを送る前に、リリースされた最新のカーネルでもその問題が起こるかど うか確かめて下さい。 カーネルをバージョンアップした後でも、またこの文書をよく読んだ後でも、 まだバグが存在すると信じられる場合には、Linux メーリングリストの SCSI チャネルにバグレポートを送ってください。ここには Linux SCSI ドライバの 作成に協力している多くの人々が参加しています。 バグレポートには、ハードウェア構成、ブート時に Linux が表示する正確な メッセージ、エラーが発生する場合、それにエラーが存在するソースコードの 位置など、なるべく多くの情報を書いてください。 ``メッセージの取得'' や ``panic() の位置を特定する'' に記述されている手続きに従ってく ださい。 最大限の情報が提供されないと、開発者が問題を誤って診断したり、他の問題 を修正することがより重要だと判断することになってしまうかもしれません。 要するに、我々がバグを再現させることができない場合、どこがおかしいのか を具体的に指摘してくれなければ、バグを修正することはできないということ です。 3.1. メッセージの取得 カーネルメッセージロギングシステムを実行していない場合: /proc ファイルシステムがマウントされていることを確かめてください。 grep proc /etc/mtab /proc ファイルシステムがマウントされていなければ、マウントしてくださ い。 mkdir /proc chmod 755 /proc mount -t proc /proc /proc カーネルのバージョンとメッセージをログファイルにコピーします。 cat /proc/version > /tmp/log cat /proc/kmsg >> /tmp/log 1秒から2秒後に CNTRL-C を打ってください。 ロギングシステムを実行している場合、適当なログファイル (ログファイルの 情報は /etc/syslog.conf にあります) を覗くか、 dmesg コマンドを使用し てください。 Linux が起動していない場合、DOS 上でフロッピーディスクをフォーマットし てください。RAM ドライブではなく、ルートディスケットを直接マウントする パッケージを使っている場合には、ルートとしてマウントされるドライブ以外 で読み書き可能なディスケットを用意するか、 ramdisk ブートオプションの 使用が必要であることに注意して下さい。 Linux をパッケージのブートフロッピーからブートします。できればシングル ユーザモードで RAM ドライブをルートとしてマウントしてください。そし て、 mkdir /tmp/dos とし、さっきフォーマットしたディスケットを挿入し、マウントしてくださ い。 mount -t msdos /dev/fd0 /tmp/dos あるいは mount -t msdos /dev/fd1 /tmp/dos とします。 ログファイルをフロッピーにコピーします。 cp /tmp/log /tmp/dos/log DOS フロッピーをアンマウントします。 umount /tmp/dos そして Linux をシャットダウンします。 shutdown now リブートして DOS を起動し、好みの通信ソフトを使ってログファイルをメー ルしてください。 3.2. panic() の位置を特定する 他の Unix と同じように、Linux は致命的なエラーが生じるとカーネルの panic() 関数を呼び出します。他の Unix とは違って、Linux はコアをスワッ プあるいはダンプデバイスにダンプして自動的にリブートすることはありませ ん。その代わり、ユーザが手で書き写すことができるように有用なステート情 報のサマリが表示されます。 Unable to handle kernel NULL pointer dereference at virtual address c0000004 current->tss,cr3 = 00101000, %cr3 = 00101000 *pde = 00102027 *pte = 00000027 Oops: 0000 EIP: 0010:0019c905 EFLAGS: 00010002 eax: 0000000a ebx: 001cd0e8 ecx: 00000006 edx: 000003d5 esi: 001cd0a8 edi: 00000000 ebp: 00000000 esp: 001a18c0 ds: 0018 es: 0018 fs: 002b gs: 002b ss: 0018 Process swapper (pid: 0, process nr: 0, stackpage=001a09c8) Stack: 0019c5c6 00000000 0019c5b2 00000000 0019c5a5 001cd0a8 00000002 00000000 001cd0e8 001cd0a8 00000000 001cdb38 001cdb00 00000000 001ce284 0019d001 001cd004 0000e800 fbfff000 0019d051 001cd0a8 00000000 001a29f4 00800000 Call Trace: 0019c5c6 0019c5b2 0018c5a5 0019d001 0019d051 00111508 00111502 0011e800 0011154d 00110f63 0010e2b3 0010ef55 0010ddb7 Code: 8b 57 04 52 68 d2 c5 19 00 e8 cd a0 f7 ff 83 c4 20 8b 4f 04 Aiee, killing interrupt handler kfree of non-kmalloced memory: 001a29c0, next= 00000000, order=0 task[0] (swapper) killed: unable to recover Kernel panic: Trying to free up swapper memory space In swapper task - not syncing EIP: 行の16進数 (この場合 19c905) を書き留め、 /usr/src/linux/zSystem.map を探してこのアドレス以下で最も大きな数字を 見つけてください。 0019a000 T _fix_pointers 0019c700 t _intr_scsi 0019d000 t _NCR53c7x0_intr これによってどの関数を実行中に panic() が呼ばれたかが分かります。この 関数を含むソースファイルをデバッグオプションつきでコンパイルし直すか、 /usr/src/linux/Makefile を編集して -g オプションを CFLAGS の定義に追加 してカーネル全体をコンパイルし直してください。 # # standard CFLAGS # つまり、次の行を CFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe このように変更します。 CFLAGS = -g -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe カーネルを再構築します。 make clean make /etc/lilo.conf にエントリを作成してカーネルをブートできるようにしま す。 image = /usr/src/linux/zImage label = experimental そして root で LILO を再実行するか、ブートフロッピーを作成します。 make zImage リブートし、エラー発生時の EIP を記録します。 script がインストールされている場合、これを起動して以下のデバッグの記 録をタイプスクリプトファイルに記録しておくのが良いでしょう。 次のように gdb を実行します。 gdb /usr/src/linux/tools/zSystem そして次のように入力します。 info line * 例えば以下のように。 info line *0x19c905 これに対して gdb は次のような情報を出力します。 (gdb) info line *0x19c905 Line 2855 of "53c7,8xx.c" starts at address 0x19c905 and ends at 0x19c913 . この情報を記録して下さい。それから以下のように入力します。 list 次のような出力が得られるでしょう。 (gdb) list 2855 2850 /* printk("scsi%d : target %d lun %d unexpected disconnect\n", 2851 host->host_no, cmd->cmd->target, cmd->cmd->lun); */ 2852 printk("host : 0x%x\n", (unsigned) host); 2853 printk("host->host_no : %d\n", host->host_no); 2854 printk("cmd : 0x%x\n", (unsigned) cmd); 2855 printk("cmd->cmd : 0x%x\n", (unsigned) cmd->cmd); 2856 printk("cmd->cmd->target : %d\n", cmd->cmd->target); 2857 if (cmd) {; 2858 abnormal_finished(cmd, DID_ERROR << 16); 2859 } 2860 hostdata->dsp = hostdata->script + hostdata->E_schedule / 2861 sizeof(long); 2862 hostdata->dsp_changed = 1; 2863 /* SCSI PARITY error */ 2864 } 2865 2866 if (sstat0_sist0 & SSTAT0_PAR) { 2867 fatal = 1; 2868 if (cmd && cmd->cmd) { 2869 printk("scsi%d : target %d lun %d parity error.\n", quit と入力して gdb から抜けます。 上の情報も記録してください。開発者のカーネルがあなたのカーネルと違って いる場合に役立つコンテキスト情報が得られます。 4. カーネルモジュール ここでは、ローダブルカーネルモジュールのサポート状況と SCSI との関係に ついて説明します。 4.1. 一般的な情報 ローダブルモジュールは、ユーザーやシステム管理者がカーネルのメモリーに ファイルをロードして、カーネルの能力を拡張することを可能にするもので す。ローダブルモジュールはハードウェアをサポートするドライバや、ファイ ルシステムをロードするためによく使われます。 SCSI にとってモジュールはいくつかの利点があります。ひとつは、多数のマ シンを管理するシステム管理者が、すべてのマシンに対して唯一のカーネルイ メージを使用し、マシン特有のハードウェアをサポートするためにはカーネル モジュールをロードするといった使い方ができることです。 配布パッケージの作成者が、どのモジュールをロードするか問い合わせるスク リプトをブートフロッピー上に用意することもできます。こうすれば、使われ ないドライバのためにメモリを浪費することはなくなりますし、存在しない ハードウェアを検出しに行って他のハードウェアをおかしくしてしまう可能性 も減らすことができます。 モジュールはラップトップコンピュータにも適しています。ラップトップコン ピュータはデスクトップマシンよりもメモリが少ないことが多く、なるべく カーネルイメージを小さくして、必要に応じてモジュールをロードすることが できるからです。また、モジュールによって PCMCIA SCSI カードのサポート も簡単になります。カードが挿入/抜出される時にドライバをロード/アンロー ドできるからです。 [ 注意: 現在のところ、PCMCIA をサポートしているのは qlogic と 152x のドライバです。] 最後に、カーネル開発者にとってドライバのデバッグやテストが簡単になると いう利点もあります。新しいドライバのテストのために、マシンをリブートす る必要がないからです (もちろん、ドライバのバグによってマシンがクラッ シュしてしまうことがなければ、の話ですが)。 モジュールには数々の利点がありますが、大きな制限もあります。ルートディ スクパーティションが SCSI デバイス上にある場合、ディスクアクセスに必要 な SCSI ドライバをモジュールとしてロードすることはできません。これは、 システムがディスクからモジュールをロードする前に、ルートパーティション をマウントしなければならないからです。ローダとカーネルを変更して、カー ネルがルートファイルシステムをマウントする前にモジュールをロードできる ようにしようと考えている人々がいますから、将来はこの制限もなくなること でしょう。 4.2. カーネル 1.2.N でのモジュールのサポート 1.2.N シリーズのカーネルでは、SCSI カーネルモジュールは部分的にサポー トされています。ハイレベル (ディスク、テープなど) のドライバはモジュー ルとして使用することはできませんが、ローレベル (1542、1522 など) のド ライバは必要に応じてロード/アンロードすることができます。ローレベルの ドライバはロードされるたびに、まずそのドライバがサポートしているカード を探しに行きます。次に、見つかったカードそれぞれに対して、 SCSI バスが スキャンされ、内部データ構造がセットアップされて、デバイスが使用できる ようになります。 使わなくなったローレベルドライバは、アンロードすることができます。マウ ント中のファイルシステムやオープン中のファイルなどについて使用中カウン タが保持されているため、ドライバが管理しているデバイスを使っている間は rmmod ユーティリティがデバイスが使用中であるという警告を発し、ドライバ はアンロードできないことに注意してください。ドライバがアンロードされる と、関連するデータ構造はすべて開放され、システムはモジュールがロードさ れる前の状態に戻ります。これは、ドライバはその後必要に応じて再びロード できるということを意味します。 4.3. カーネル 1.3.N でのモジュールのサポート 1.3 シリーズのカーネルでは、SCSI ドライバは完全にモジュール化されてい ます。つまり、まったく SCSI をサポートしていないカーネルでブートした後 にモジュールをロードすることによって SCSI をフルサポートすることもでき るということです。 お望みならば、SCSI ドライバの一部分をカーネルに組み込んでコンパイル し、その他の部分を後でロードすることもできます。どの部分を実行時にロー ドするか、どの部分をカーネルに直接リンクするかは、自由に選択することが できます。 まったく SCSI をサポートしていないカーネルでブートした場合、まず SCSI コアをカーネルにロードする必要があります。これは scsi_mod という名前の モジュールになっています。このモジュールをカーネルメモリにロードするま では、これ以外の SCSI モジュールをロードすることはできません。このモ ジュールにはローレベルドライバは含まれていませんから、このモジュールを ロードしても SCSI バスはスキャンされませんし、 SCSI ディスクやテープが 使えるようにもなりません。カーネルを構築する際 CONFIG_SCSI に「y」と答 えたのであれば、このモジュールをロードする必要はありません。 この後は、あまり順番を気にせずに必要な機能を実現するモジュールをロード することができます。使用中のモジュールがアンロードされてしまうことを防 ぐために、使用中カウンタによるインターロックがかかっているので、モ ジュールがビジーの場合には rmmod からメッセージが出力されます。 ディスク、CDROM、テープ、それに SCSI 汎用のハイレベルドライバは、それ ぞれ「sd_mod」、「sr_mod」、「st」、「sg」という名前になっています。ハ イレベルドライバがロードされると、接続されたすべてのホストアダプタのデ バイスリストが調べられ、サポートされているデバイスは自動的に有効になり ます。 ローレベルドライバのモジュールとしての使い方は、 ``カーネル 1.2 でのモ ジュールのサポート'' を参照してください。ローレベルドライバがロードさ れると、バスがスキャンされ、見つかったデバイスはハイレベルドライバに よってサポートされているデバイスとして認識できるかどうか調べられます。 認識されたドライバは自動的にアタッチされ、活性化されます。 5. ホストアダプタ この章では Linux でサポートされている各種のホストアダプタに対して、そ れぞれのホストアダプタに固有の情報を示します。 5.1. サポートされている/いないハードウェア 5.1.1. 配布カーネルに含まれているドライバ Adaptec 152x、Adaptec 154x (DTC 329x のボードも動くようですが、サポー トの対象にはなっていません)、 Adaptec 174x、Adaptec 274x/284x (294x を 利用するには新しいバージョンのドライバが必要です)、 BusLogic MultiMaster ホストアダプタ、EATA-DMA および EATA-PIO プロトコルを使う ボード (DPT PM2001、PM2011、PM2012A、PM2012B、PM2021、PM2022、PM2024、 PM2122、PM2124、PM2322、PM2041、PM2042、PM2044、PM2142、PM2144、PM2322、 PM3021、PM3122、PM3222、PM3224、PM3334、それに加えて NEC、AT&T、SNI、AST、Olivetti、および Alphatronix などのメーカーのボー ドのいくつか)、 Future Domain 850、885、950、および同社の他のシリーズ (ただし 840、841、880、881 のボードは適当なパッチを当てないと動作しま せん)、 Future Domain 16x0 (チップが TMC-1800、TMC-18C30、または TMC-18C50 のもの)、 NCR53c8xx、PAS16 の SCSI ポート、Seagate ST0x、 Trantor の T128/T130/T228 ボード、 Ultrastor 14F、24F および 34F、Western Digital 7000。 5.1.2. MCA MCA のカードのうち、上にあるサポートされているカードと互換性のあるもの (つまり Adaptec 1640 と BusLogic 640) は動作します。 5.1.3. アルファ版のドライバ アルファ版のドライバの多くが以下のサイトに置かれています。 5.1.4. 修正をすれば動作するドライバ 5.1.4.1. NCR53c8x0/7x0 NCR53c8xx のドライバは開発されていますが、このドライバは NCR53c700、 NCR53c710、NCR53c720 のチップに対してそのままでは適用できません。これ らのチップを動作させるには以下のような修正が必要です。修正の難易度につ いても示しています。 訳注: カーネル 2.0.27 では、すでにこれらのチップはサポートさ れているようです。 NCR53c720 (簡単) カードの検出部分の変更、初期化の変更、'810 のレジスタアドレスを '7xx 用にマッピングするためのコードの変更。 NCR53c710 (簡単) カードの検出部分の変更、初期化の変更 (以上はアセンブラソースの変 更)、'810 のレジスタアドレスを '7xx にマッピングするためのコード の変更、IID 割り込みを扱うための割り込みハンドラを INTFLY 命令か らそのエミュレーションに変更。 NCR53c700, NCR53c700-66 (非常に困難) 検出部分の変更、初期化の変更、 NCR のコードを DSA を使わないよう に変更、 Linux 本体のコードを変更し、コンテキストスイッチを扱え るようにする。 5.1.5. 多分動作しない SCSI ホスト パラレル->SCSI アダプタ全部、 Rancho の SCSI ボード、ジャンク品の SCSI カード。 Buslogic の FlashPoint ボード (BT-930/932/950 など) もまだサ ポートされていません。 5.1.6. 絶対に 動作しない SCSI ホスト Adaptec と非互換で NCR53c8xx を使用していない DTC のボード (3270、 3280 など)。CMD の SCSI ボード。 DTC/CMD からプログラムに必要な情報をもらうには、秘密保持契約を結ぶ必要 があります。これはつまり Linux のドライバを書いても、そのドライバを公 開できない、ということになります。秘密保持契約に従えばソースは公開でき ませんから、これは GPL に反します。また GPL に従う場合はソースを公開し なければなりませんから、これは秘密保持契約に反することになります。 もしこれら以外のサポートされていないハードウェアを動かしたければ、選択 肢は二つあります。一つはあなた自身がドライバを書くことです (Eric Youngdale と私は Linux の SCSI ドライバに関する技術的な質問には通常喜 んでお答えします)。もう一つはドライバの作成を依頼することです (個人で の利用の場合には契約料金が高く付きすぎるでしょうが)。 5.1.7. 複数のホストアダプタ ホストアダプタの中には、一台のシステムで同じ形式のアダプタを複数使うこ とができるものがあります ( ``購入の手引き: ドライバ機能の比較'' を見て ください)。同じ形式のアダプタを一つのホストで複数使う場合は、通常最も 低いアドレスのものが scsi0 になり、その次が scsi1... のようになりま す。 種類の違うホストアダプタなら、どんな場合でも複数のアダプタを同時に使う ことが可能です。ただしアドレスが競合していないことが条件です。 SCSI コ ントローラは drivers/scsi/hosts.c の中の builtin_scsi_hosts[] 配列の順 番で検索されます。現在の順番は以下の通りです。 BusLogic, Ultrastor 14/34F, Ultrastor 14F,, Adaptec 151x/152x, Adaptec 154x, Adaptec 174x, AIC7XXX, AM53C974, Future Domain 16x0, Always IN2000, Generic NCR5380, QLOGIC, PAS16, Seagate, Trantor T128/T130, NCR53c8xx, EATA-DMA, WD7000, debugging driver. ほとんどの場合 (Buslogic と Adaptec のドライバの両方を使っていない場 合) には、このエントリを入れ替えることで、検索の順番を都合の良いように 変えることができます。例えば新しい SCSI ホストをシステムに追加したとき に、元からのデバイス名を変更したくない場合などがあるでしょう。 5.2. よくある問題 5.2.1. SCSI がタイムアウトしてしまう 割り込みがちゃんと有効になっているか、他のボードとの IRQ、DMA、 IO ア ドレスなどの競合が起こっていないかを確認してください。 5.2.2. BIOS 依存のボード自動検出ルーチンが失敗する もしお使いの SCSI アダプタが以下のどれかの場合: Adaptec 152x, Adaptec 151x, Adaptec AIC-6260, Adaptec AIC-6360, Future Domain 1680, Future Domain TMC-950, Future Domain TMC-8xx, Trantor T128, Trantor T128F, Trantor T228F, Seagate ST01, Seagate ST02, West- ern Digital 7000 そしてアダプタがブートアップの時に検出されない場合、すなわち scsi : 0 hosts や scsi%d : type といったようなメッセージがシステムにインストールされている (サポート対 象の) SCSI アダプタそれぞれに対して表示されない場合は、自動検出のルー チンがそのボードを知らないために問題が起こっているものと考えられます。 BIOS を使って自動検出を行うドライバでは、BIOS が有効になっている必要が あります。よく調べてください。またほかの機器の BIOS と競合していないか もチェックしてください。 ボードのシグネチャや BIOS のアドレスがドライバに登録されているものと違 う場合も自動検出は失敗します。 訳注: シグネチャとは、BIOS の先頭部分に書き込まれている情報 のことです。 BIOS がインストールされている場合は、DOS と DEBUG を使ってボードのシグ ネチャを調べてください。 例えば 0xc8000 にあるボードに対しては、DOS から debug d c800:0 q として、結果を ASCII で Linux メーリングリストの SCSI チャネルに送って ください。メッセージの長さとベースアドレス (この場合 0xc8000) からのオ フセットも同時に送ってください。メッセージは完全に正確でなければなりま せん。またテキストには 16 進と ASCII の両方が含まれる必要があるでしょ う。 BIOS がインストールされていない場合、そしてお使いのドライバが Adaptec 152x、 Trantor T128、 Seagate のどれかである場合は、コマンドラインやコ ンパイル時に検出を強制するように設定を変更することができます。 お持ちの SCSI カードに対応した節をご覧になってください。 ``不安定なシ ステム'' も見てください。 5.2.3. メモリマップ方式の I/O を用いたボードの障害 (Trantor T128 と Seagate のボードが該当します。 Adaptec、 NCR5380 汎 用、PAS16、Ultrastor のボードには該当しません。) この問題は、メモリマップされた I/O ポートが誤ってキャッシュされている ときによく起こります。 BIOS 設定で、ボードの占有するアドレス空間を キャッシュ不可に設定してください。 これができない場合は、キャッシュを全てオフにしてください。 ボードのアドレスをマニュアルで設定する場合は、Linux に必要なのは 16バ イトセグメントの値 (マニュアルにはたいていこちらが書いてあります) では なく、実際のアドレスであることに注意してください。 つまり 0xc8000 が正しい値であり、 0xc800 では正しく動作しません。後者 では恐らくメモリの内容が破壊されてしまうでしょう。 5.2.4. アルファ版のドライバでブートフロッピーを作ってブートさせると 「kernel panic : cannot mount root device」というメッセージ が出る カーネルのバイナリイメージを (フロッピーにコピーする前/した後に) 編集 する必要があります。 2 バイトのフィールド (リトルエンディアンに注意) をいくつか修正すれば、お使いのシステムで動くようになります。 1. オフセット 502 バイト目にあるデフォルトのスワップデバイスの指定を 0x00 0x00 にセットします。 2. オフセット 504 バイト目にあるラムディスクのサイズはブートフロッピー のサイズ (キロバイト単位) にする必要があります。つまり 5.25 インチ の場合は 1200、 3.5 インチの場合は 1440 です。 バイト表現では以下のようになります。 3.5" : 0xA0 0x05 5.25" : 0xB0 0x04 3. オフセット 508 バイト目にはルートデバイスを設定します。これは 0x00 0x00 にしておきます (ブートデバイスがルートデバイスとなります)。 dd か rawrite を用いてファイルをディスクに書き込んでください。そのディ スクを A: のフロッピードライブに入れ、「ルートディスクを入れるように」 というプロンプトが出るのを待って、お使いの配布パッケージのルートフロッ ピーを入れてください。 5.2.5. 標準カーネルに入っていないドライバをインストールするには まずドライバの作者が使っているバージョンのカーネルを手に入れる必要があ ります。バージョンの情報は恐らくドライバと同時に配布されているドキュメ ントに記述があるでしょう。 最新のものを含め、様々なバージョンのカーネルは にあります。名前は linux-version.tar.gz となっているはずです。 これらは tsx-11 などの多くのサイトにもミラーさ れています。 ソースを手に入れたら /usr/src へ移動し、古い Linux のソースを削除しま しょう。バックアップとして残したい場合は以下のようにします。 mv linux linux-old アーカイブを展開します。 gunzip < linux-0.99.12.tar.gz | tar xvfp - パッチを当てます。パッチファイルで記述されているファイル名は、ファイル システムの適当なディレクトリを基準として、そこからの相対パスで記述され ています。パッチファイル中の出力ファイルの行を調べる (^--- を grep す れば表示されます) ことで、この基準ディレクトリがどこかわかります。例え ば --- ./kernel/blk_drv/scsi/Makefile --- ./config.in Wed Sep 1 16:19:33 1993 のような行がパッチファイルにあったら、基準ディレクトリは /usr/src/linux です。 ドライバのソースを適当な場所に展開します。アーカイブの中身を見るには以 下のようにします。 tar tfv patches.tar 展開したファイルは必要な場所に移動します。 SCSI のドライバファイルは /usr/src/linux/kernel/drivers/scsi に置く必要があります。 パッチファイル中の基準ディレクトリに移動して以下のようにタイプすること でパッチが当たります。 patch -p0 < patch_file パッチファイル中のファイル指定における、最初の方のディレクトリを無視す るように指定することもできます。例えば --- linux-new/kernel/blk_drv/scsi/Makefile のような指定がパッチファイル中にあり、これを /usr/src/linux 以下のファ イルにパッチ当てしたい場合は、まず /usr/src/linux に cd してから patch -p1 < patches と打ち込みます。これで linux-new は無視されます。 パッチ当てが終わったら、失敗したパッチがないか調べてください。パッチが 失敗すると # という拡張子がついたファイルができているはずです。 訳注: 普通この拡張子は .rej ですが、patch のコンパイル時のオ プションによって、 # になることもあります。 find /usr/src/linux/ -name "*#" -print このようなファイルが存在したら、その中身を見てください。もしかしたら単 に RCS の識別子が違っているだけかもしれません。この場合は無害ですから 無視してかまいません。それ以外の場合は、手でパッチ当てをする必要がある かもしれません。diff ファイルの形式とパッチ当てに関してはこの文書の範 囲外です。 ``カーネルの設定と再構築'' もご覧になってください。 5.2.6. パッチのないドライバをインストールするには ときにはドライバの作者が自分の書いたドライバの .c や .h ファイルへの パッチを提供していない場合もあります。またパッチ元のカーネルのバージョ ンが古すぎて、うまくパッチが当たらない場合もありえます。 1. 拡張子が .c や .h などのファイルを /usr/src/linux/drivers/scsi へコ ピーします。 2. 設定オプションに追加します。 /usr/src/linux/config.in を編集して * * SCSI low-level drivers * 以下のセクションに、使用するドライバの設定変数をブール値で追加します。 例えば以下のようになるでしょう。 bool 'Always IN2000 SCSI support' CONFIG_SCSI_IN2000 y 3. Makefile にエントリを追加します。 /usr/src/linux/drivers/scsi/Makefile を編集して、以下のような行を追 加します。 ifdef CONFIG_SCSI_IN2000 SCSI_OBS := $(SCSI_OBJS) in2000.o SCSI_SRCS := $(SCSI_SRCS) in2000.c endif これらの行は Makefile 中の scsi.a: $(SCSI_OBJS) の行の前に置きます。指定行の .c のファイルには先ほどコピーした .c の ファイルを、.o のファイルには .c のファイルの拡張子を .o に置き換えた ものを書きます。 4. エントリポイントを加えます。 /usr/src/linux/drivers/scsi/hosts.c を編集して、ヘッダファイルのた めの #include 行を追加します。設定ファイルに加えた CONFIG_SCSI の値 によってプリプロセッサの処理を変更できるようにしておくと良いでしょ う。例えば、 #ifdef CONFIG_SCSI_GENERIC_NCR5380 #include "g_NCR5380.h" #endif などの行の後に、以下のような行を加えることになります。 #ifdef CONFIG_SCSI_IN2000 #include "in2000.h" #endif 次に Scsi_Host_Template のエントリを scsi_host[] 配列に追加する必要が あります。 .h ファイルを見てみると例えば以下のような #define 行がある はずです。 #define IN2000 {"Always IN2000", in2000_detect, \ in2000_info, in2000_command, \ in2000_queuecommand, \ in2000_abort, \ in2000_reset, \ NULL, \ in2000_biosparam, \ 1, 7, IN2000_SG, 1, 0, 0} このマクロを scsi_hosts[] 配列に追加します。設定ファイルで定義したシン ボルによってプリプロセッサの動作を制御できるようにしておきましょう。 つまり #ifdef CONFIG_SCSI_GENERIC_NCR5380 GENERIC_NCR5380, #endif のような行の後に、追加するエントリを以下のように書くわけです。 #ifdef CONFIG_SCSI_IN2000 IN2000, #endif ``カーネルの設定と再構築'' の章も見てください。 5.2.7. Compaq のシステムで PCI のボードが動かない Compaq のシステムの多くでは PCI デバイスを検出するための 32 ビット拡張 BIOS がメモリにマップされています。メモリレイアウトが特殊なために、 Linux では この BIOS をアクセスすることができません。 Linux は (サポー トされているはずの) PCI SCSI ボードの検出に失敗すると、以下のような メッセージが出力されます。 pcibios_init: entry in high memory, unable to access 以下のファイルを手に入れてください。 これは自己解凍型のアーカイブで、BIOS32 のコードを再配置するためのプロ グラムが入っています。 訳注: この zip ファイルを unzip すると、exe サフィックスを 持った自己解凍型のアーカイブができます。 5.2.8. PCI の SCSI システムが %d Hosts というメッセージを 出した後に ハングアップします。 PCI のシステムの中には、BIOS 中で割り込みを禁止し、再び割り込みを可能 にせずに呼び出し元に制御を返してしまうものがあります。以下のパッチでな おるはずです。 --- bios32.c.orig Mon Nov 13 22:35:31 1995 +++ bios32.c Thu Jan 18 00:15:09 1996 @@ -56,6 +56,7 @@ #include #include +#include #define PCIBIOS_PCI_FUNCTION_ID 0xb1XX #define PCIBIOS_PCI_BIOS_PRESENT 0xb101 @@ -125,7 +126,9 @@ unsigned long address; /* %ebx */ unsigned long length; /* %ecx */ unsigned long entry; /* %edx */ + unsigned long flags; + save_flags(flags); __asm__("lcall (%%edi)" : "=a" (return_code), "=b" (address), @@ -134,6 +137,7 @@ : "0" (service), "1" (0), "D" (&bios32_indirect)); + restore_flags(flags); switch (return_code) { case 0: @@ -161,11 +165,13 @@ unsigned char present_status; unsigned char major_revision; unsigned char minor_revision; + unsigned long flags; int pack; if ((pcibios_entry = bios32_service(PCI_SERVICE))) { pci_indirect.address = pcibios_entry; + save_flags(flags); __asm__("lcall (%%edi)\n\t" "jc 1f\n\t" "xor %%ah, %%ah\n" @@ -176,6 +182,7 @@ : "1" (PCIBIOS_PCI_BIOS_PRESENT), "D" (&pci_indirect) : "bx", "cx"); + restore_flags(flags); present_status = (pack >> 16) & 0xff; major_revision = (pack >> 8) & 0xff; @@ -210,7 +217,9 @@ { unsigned long bx; unsigned long ret; + unsigned long flags; + save_flags(flags); __asm__ ("lcall (%%edi)\n\t" "jc 1f\n\t" "xor %%ah, %%ah\n" @@ -221,6 +230,7 @@ "c" (class_code), "S" ((int) index), "D" (&pci_indirect)); + restore_flags(flags); *bus = (bx >> 8) & 0xff; *device_fn = bx & 0xff; return (int) (ret & 0xff00) >> 8; @@ -232,7 +242,9 @@ { unsigned short bx; unsigned short ret; + unsigned long flags; + save_flags(flags); __asm__("lcall (%%edi)\n\t" "jc 1f\n\t" "xor %%ah, %%ah\n" @@ -244,6 +256,7 @@ "d" (vendor), "S" ((int) index), "D" (&pci_indirect)); + restore_flags(flags); *bus = (bx >> 8) & 0xff; *device_fn = bx & 0xff; return (int) (ret & 0xff00) >> 8; @@ -254,7 +267,9 @@ { unsigned long ret; unsigned long bx = (bus << 8) | device_fn; + unsigned long flags; + save_flags (flags); __asm__("lcall (%%esi)\n\t" "jc 1f\n\t" "xor %%ah, %%ah\n" @@ -273,7 +288,9 @@ { unsigned long ret; unsigned long bx = (bus << 8) | device_fn; + unsigned long flags; + save_flags(flags); __asm__("lcall (%%esi)\n\t" "jc 1f\n\t" "xor %%ah, %%ah\n" @@ -292,7 +309,9 @@ { unsigned long ret; unsigned long bx = (bus << 8) | device_fn; + unsigned long flags; + save_flags(flags); __asm__("lcall (%%esi)\n\t" "jc 1f\n\t" "xor %%ah, %%ah\n" @@ -303,6 +322,7 @@ "b" (bx), "D" ((long) where), "S" (&pci_indirect)); + restore_flags(flags); return (int) (ret & 0xff00) >> 8; } @@ -311,7 +331,9 @@ { unsigned long ret; unsigned long bx = (bus << 8) | device_fn; + unsigned long flags; + save_flags(flags); __asm__("lcall (%%esi)\n\t" "jc 1f\n\t" "xor %%ah, %%ah\n" @@ -322,6 +344,7 @@ "b" (bx), "D" ((long) where), "S" (&pci_indirect)); + restore_flags(flags); return (int) (ret & 0xff00) >> 8; } @@ -330,7 +353,9 @@ { unsigned long ret; unsigned long bx = (bus << 8) | device_fn; + unsigned long flags; + save_flags(flags); __asm__("lcall (%%esi)\n\t" "jc 1f\n\t" "xor %%ah, %%ah\n" @@ -341,6 +366,7 @@ "b" (bx), "D" ((long) where), "S" (&pci_indirect)); + restore_flags(flags); return (int) (ret & 0xff00) >> 8; } @@ -349,7 +375,9 @@ { unsigned long ret; unsigned long bx = (bus << 8) | device_fn; + unsigned long flags; + save_flags(flags); __asm__("lcall (%%esi)\n\t" "jc 1f\n\t" "xor %%ah, %%ah\n" @@ -360,6 +388,7 @@ "b" (bx), "D" ((long) where), "S" (&pci_indirect)); + restore_flags(flags); return (int) (ret & 0xff00) >> 8; } 5.3. Adaptec 152x、151x、1505、282x、Sound Blaster 16 SCSI / SCSI Pro、 Gigabyte、その他 AIC 6260/6360 を用いた製品 (標準) 5.3.1. 可能な設定 BIOS アドレス : 0xd8000, 0xdc000, 0xd0000, 0xd4000, 0xc8000, 0xcc000, 0xe0000, 0xe4000 IO ポート : 0x140, 0x340 IRQ : 9, 10, 11, 12 DMA : 使用していません IO : ポートマップ方式 5.3.2. 自動検出 BIOS が入っているボードではだいたいうまく動作するようです。入っていな いボード (Adaptec 1510、Sound Blaster16 SCSI など) では、カーネルのコ マンドラインオプションかコンパイル時の設定変更が必要になります。 5.3.3. 自動検出の設定変更 コンパイル時 PORTBASE、IRQ、SCSI_ID、RECONNECT、PARITY を適当な値に定義してく ださい。「定義可能なパラメータ」のところを参考にしてください。 カーネルのコマンドライン aha152x=[,[,[,[,]]]] SCSI-ID はホストアダプタの SCSI ID です。特に ID 7 が必要な他のデバ イスをつないでいない限り 7 にしておきましょう。 I/O アドレスを 0x340 に固定し、IRQ 11、SCSI-ID 7、ディスコネクト/リ コネクトを許可するようにするには、以下のようなコマンドラインオプ ションを使うことになります。 aha152x=0x340,11,7,1 5.3.4. アップデートによって解決された問題 1. VLB のボードでドライバが動かない問題。これは 1.0.5 以前のカーネルの タイミングの問題でした。 5.3.5. 定義可能なパラメータ AUTOCONF コントローラが報告してきた設定を使う (152x のみ) IRQ 割り込みチャネルの設定変更 (9,10,11 or 12) (デフォルト 11) SCSI_ID AIC-6260 の SCSI ID の設定変更 (0-7) (デフォルト 7) RECONNECT ターゲットからのディスコネクト/リコネクトの設定を変更する (0 以 外で許可、0 で禁止) DONT_SNARF ポートを登録しない (pl12 以下) SKIP_BIOSTEST BIOS シグネチャのテストを行わない (AHA-1510 または BIOS のない機 器) PORTBASE ポートのベースアドレスを指定し、検出を行わない。 訳注: カーネル 2.0.27 に付属のドライバでは、DONT_SNARF はな くなっています。また、PORTBASE は IOPORT に変更されていま す。 5.4. Adaptec 154x、AMI FastDisk VLB、DTC 329x (標準) 5.4.1. 可能な設定 IO ポート : 0x330 and 0x334 IRQ : 9, 10, 11, 12, 14, 15 DMA チャネル : 5, 6, 7 IO : ポートマップ方式、バスマスタ方式 5.4.2. 自動検出 自動検出されるのは I/O アドレス 0x330 と 0x334 だけです。 5.4.3. 自動検出の設定変更 aha1542=[,,[,]] 5.4.4. 注意 1. BusLogic のボードには Adaptec 1542 にソフトウェア互換のシリーズがあ り、 ISA、VLB、EISA、PCI の製品があります。 2. 無印 154? と、初期の 154?A のボードはスキャッタ/ギャザ機能をサポー トしていないので、これらは動作しないことになっています。しかし drivers/scsi/aha1542.h 中の AHA1542_SCATTER を 0 にすると、(動作す る、という言葉の定義によりますが) 無理矢理動作させることもできま す。 訳注: スキャッタ/ギャザについて補足説明。 Linux は仮想記憶を採用していることはご存知ですね。 CPU から 指定された仮想アドレスは、MMU によって物理アドレスに変換され ます。しかしこの変換が行われるのは CPU からのアドレスだけで あって、 DMA やバスマスタ転送を行う場合のアドレスは、物理ア ドレスを使用しなければなりません (PC/AT アーキテクチャの場 合。ちなみに Sun の SPARCstation などは DMA も仮想アドレスを 使います)。仮想アドレスから物理アドレスへの対応づけは、ペー ジと呼ばれる単位ごとに行われますから、プログラムから見て仮想 アドレスが連続していても、物理アドレスは飛び飛びになっている ということがあり得ます。このような場合にも、コントローラを一 度設定するだけで、飛び飛びの物理アドレスにデータを転送してく れるような機能のことを、スキャッタ/ギャザといいます。コント ローラがスキャッタ/ギャザをサポートしていない場合には、飛び 飛びになっている物理アドレスの個数分だけ、DMA を複数回行なう 必要があります。 5.4.5. アップデートによって解決された問題 1. バージョン 0.99.10 以前のカーネルは 154?C のカードをサポートしてい ません。 2. バージョン 0.99.14k 以前のカーネルは、 154?C のカードのうち、以下の 機能をサポートしていません。 o 1G 以上のディスクに対する拡張マッピングの BIOS 機能 o 3 台以上のドライブに関する BIOS 機能 o SCSI バスの自動検索に関する BIOS 機能 3. バージョン 0.99.15e 以前のカーネルは 154?C の BIOS 機能のうち、 3 台以上のドライブを利用する機能を有効にすることができません。また 1G 以上のディスクに関する拡張マッピング機能を無効にすることもできませ ん。 4. バージョン 0.99.14u 以前のカーネルは 154?CF のカードをサポートして いません。 5. バージョン 1.0.5 以前のカーネルでは、複数のデバイスに対するアクセス が同時に起こると排他制御が失敗することがあります。 5.4.6. よくある問題 1. 154xC や 1542xCF で予期しないエラーが出る。 154xC の初期のカードでは SCSI 信号の立ち上がりが速すぎるため、イン ピーダンスの正しくないケーブルを使うと信号の反射が起こってしまうこ とがありました。 新しいボードでは幾分改善されているようですが、それでもケーブルや ターミネーションに対しては非常に敏感です。 この章の「よくある問題」の``その2'' や ``その3''、それに ``よくある 問題''、 ``不安定なシステム''の章も参考にしてください。 2. 154xC や 154x に内蔵デバイスと外付けデバイスの両方を接続すると、予 期しないエラーが発生する。 おそらくターミネーションの問題でしょう。ソフトウェアでホストアダプ タのターミネーションを無効にするには、スイッチ 1 をオフにする必要が あります。この章の「よくある問題」の``その1'' や ``その3''、それに ``よくある問題''や ``不安定なシステム''の章も参考にしてください。 3. SCSI システムが完全に固まってしまう。 複数のデバイスが同時に使用されると、システムがフリーズしたように見 えることがあります。この場合はデバイスのメーカに連絡して見るとよい でしょう。ファームウェアのアップグレードによってこの問題は解決され ているかもしれません。最後の手段としては aha1542.h 中の AHA1542_MAILBOX を 1 に変更する方法があります。これは SCSI バスに同 時に出力されるコマンドを実効的に一つだけにするので、この状況を解決 できるかもしれません。しかし遅いテープドライブや CD-ROM デバイスを 用いている場合は、実用的な解決法にはならないでしょう。 この章の「よくある問題」の``その1'' や ``その2''、それに ``よくある 問題''、 ``よくある問題: SCSI システムがロックアップする'' などの項 も参考にしてください。 4. ブート時に「Interrupt received, but no mail」というメッセージが出力 されて、SCSI デバイスが認識されない。 BIOS の拡張機能のうち、 1G 以上のディスクに対する拡張マッピング、3 台以上のディスクのサポート機能、およびバスの自動スキャンを無効にし ます。あるいはカーネルを 0.99.14k 以上にアップグレードしましょう。 5. もし 154xC のボードでタイムアウトエラーが起こる場合には、 Adaptec setup プログラムを起動して同期転送交渉を有効にしてみてください。 6. カーネル 1.2.x で以下のメッセージが出る。 Unable to determine Adaptec DMA priority. Disabling board. これは古い BusLogic のドライバとの間で衝突が起こってしまうためです。 カーネルを再構築して BusLogic のドライバを含まないカーネルを作るか、 カーネルのコマンドラインオプションを用いて BusLogic のドライバに別のア ドレスを検出するようにさせます。もし使っている Adaptec のボードがポー トアドレス 0x334 を使っており、0x330 を使っているボードが何もないよう でしたら、以下のようなコマンドラインオプションになります。 buslogic=0x330 7. 1542C と 1540C でディスコネクト機能を有効にしておくと、複数のデバイ スへのアクセスが同時に起こったときにシステムがフリーズしてしまう。 Adaptec のファームウェアのあるバージョンにはバグがあります。 BIOS を v2.11 以上にするとこの問題は解決されているそうです。 5.5. Adaptec 174x 5.5.1. 可能な設定 スロット : 1-8 IO ポート : EISA ボードなので関係無し IRQ : 9, 10, 11, 12, 14, 15 DMA チャネル : EISA ボードなので関係無し IO : ポートマップ方式、バスマスタ方式 5.5.2. 自動検出 全ての設定で動作します。 5.5.3. 自動検出の設定変更 ありません。 5.5.4. 注意 1. Adaptec はこのボードの生産を中止しています。 5.5.5. よくある問題 1. Adaptec 1740 のドライバが以下のようなメッセージを出す aha1740: Board detected, but EBCNTRL = %x, so disabled it. 使用中のボードがエンハンストモードではないのでボードを有効にできないた めです。 1542 モードでボードを動作させることはできません。 5.6. Adaptec 274x、284x (標準) 294x (アルファ版) 訳注: カーネル 2.0.27 では、294x もサポートされています。 Adaptec 294x もサポートする新しいバージョンは以下から入手できます。 5.6.1. 可能な設定 274x 284x 294x EISA スロット : 1-12 N/A N/A IO ポート : N/A ALL ALL IRQ : ALL ALL ALL DMA チャネル : N/A ALL N/A IO : ポートマップ方式、バスマスタ方式 5.6.2. 自動検出の設定変更 カーネルのコマンドライン 拡張マッピングを強制するには以下のようにします。 aha274x=extended 5.6.3. 注意 1. BIOS を有効にしておく必要があります。 2. 2742AT ボードの B チャンネルは無視されます。 3. PCI ボードの場合には CONFIG_PCI を指定しておく必要があります。 5.7. Always IN2000 (標準) 5.7.1. 可能な設定 IO ポート : 0x100, 0x110, 0x200, 0x220 IRQ : 10, 11, 14, 15 DMA チャネル : 使用していない IO : ポートマップ方式 5.7.2. 自動検出 BIOS は不必要。 5.7.3. 自動検出の設定変更 ありません。 5.7.4. よくある問題 1. IDE ドライブとスワッピングが設定されているシステムでは問題があるこ とが知られています。 5.8. BusLogic MultiMaster ホストアダプタ (この節は Leonard N. Zubkoff に著作権があります。) (Buslogic のドライバの文書としてより詳細なものを望む方は README.BusLogic を見てください。) BusLogic MultiMaster SCSI Driver for Linux Version 1.2.2 for Linux 1.2.13 Version 1.3.2 for Linux 1.3.88 ftp://ftp.dandelion.com/BusLogic-1.2.2.tar.gz ftp://ftp.dandelion.com/BusLogic-1.3.2.tar.gz 16 April 1996 Leonard N. Zubkoff Dandelion Digital lnz@dandelion.com BusLogic Inc. は高性能な SCSI ホストアダプタを何種類も設計、生産してい ます。 MultiMaster ASIC 技術を用いることで、これらのホストアダプタでは 使用するバスが異なってもプログラミングのインターフェースは共通化されて います。このドライバは現存する全ての BusLogic MultiMaster ホストアダプ タをサポートしており、恐らく将来リリースされるシリーズ製品に対してもそ のまま (あるいはわずかな修正で) 対応できるでしょう。 FlashPoint アーキ テクチャに基づいたホストアダプタはこのドライバではサポートしていませ ん。こちらに関しては README.FlashPoint ファイルを参考にしてください。 Linux ではサポート外の FlashPoint LT から、サポート対象である BT-948 へアップグレードできる Linux ユーザ向けのキャンペーンに関する情報があ ります。 私がこの完全に新しい BusLogic のドライバを Linux 向けに書くに当たって は、以下のような事を目標にしました。まず BusLogic のホストアダプタおよ び SCSI 機器の性能を最大限に発揮させること、そして高い信頼性を持ち、高 性能が要求される重要な用途でも安心して使えるようにすることです。主要な SCSI 拡張機能やエラー回復機能は Linux カーネルのコマンドラインオプショ ンで設定できるようになっており、必要に応じてドライバの性能やエラー回復 機能の微調整が可能です。 BusLogic は私の仕事に非常に好意的でした。私は同社の製品を Linux コミュ ニティに強く推薦します。 1995 年の 11 月に、私は彼らの最新の MultiMaster 製品である BT-948 PCI Ultra SCSI ホストアダプタをβテスト することができました。また 1996 年の 9 月には BT-958 PCI Wide Ultra SCSI を同じく提供してもらいました。これによって BusLogic 社は、社内の テストグループでは行えなかったようなテストを質量ともに行なうことができ ましたし、 Linux コミュニティは Linux 向けによくテストされた高性能なホ ストアダプタを販売前に手に入れることができました。この際に私は同社の技 術スタッフと直接話し合うことができ、彼らの製品の内部動作に関してより深 く知ることができました。また逆に彼らには Linux コミュニティが必要とし ているものとその潜在的な需要について伝えることができました。彼らの Linux に対する関心と協力とに深く感謝します。 Linux で起こった問題についてメーカの技術サポートに問い合わせると「あな たの使い方はサポート対象外です」などと言われがちなものですが、 BusLogic ではそんなことはありません。彼らの最新製品の宣伝では 「BusLogic のホストアダプタは以下のような全ての主要な OS で用いること ができます:... Linux ...」とさえ記述されているのです。 BusLogic の所在地は 4151 Burton Drive, Santa Clara, California, 95054, USA で、電話番号は 408/492-9090、 FAX は 408/492-1542 です。 anonymous FTP サイトが に、BBS が 408/492-1984 にあり ます。 BusLogic の技術サポートには電子メール techsup@buslogic.com 、電 話 408/654-0760、 FAX 408/492-1542 で連絡をとることができます。ヨー ロッパおよび日本における連絡先は Web サイトから得ることができます。 5.8.1. サポートされているアダプタ 以下のリストは BusLogic 社のホストアダプタのうち、現在までにサポートさ れているものの一覧です。以下の表にない BusLogic 製品を購入しようと考え ている方には、その製品のサポートがされているか、あるいはされる予定があ るかどうかを筆者まで尋ねてからにすることをお勧めします。 "W" Series Host Adapters: BT-948 PCI Ultra Fast Single-ended SCSI-2 BT-958 PCI Ultra Wide Single-ended SCSI-2 BT-958D PCI Ultra Wide Differential SCSI-2 "C" Series Host Adapters: BT-946C PCI Fast Single-ended SCSI-2 BT-956C PCI Fast Wide Single-ended SCSI-2 BT-956CD PCI Fast Wide Differential SCSI-2 BT-445C VLB Fast Single-ended SCSI-2 BT-747C EISA Fast Single-ended SCSI-2 BT-757C EISA Fast Wide Single-ended SCSI-2 BT-757CD EISA Fast Wide Differential SCSI-2 BT-545C ISA Fast Single-ended SCSI-2 BT-540CF ISA Fast Single-ended SCSI-2 "S" Series Host Adapters: BT-445S VLB Fast Single-ended SCSI-2 BT-747S EISA Fast Single-ended SCSI-2 BT-747D EISA Fast Differential SCSI-2 BT-757S EISA Fast Wide Single-ended SCSI-2 BT-757D EISA Fast Wide Differential SCSI-2 BT-545S ISA Fast Single-ended SCSI-2 BT-542D ISA Fast Differential SCSI-2 BT-742A EISA Single-ended SCSI-2 (742A revision H) BT-542B ISA Single-ended SCSI-2 (542B revision H) "A" Series Host Adapters: BT-742A EISA Single-ended SCSI-2 (742A revisions A - G) BT-542B ISA Single-ended SCSI-2 (542B revisions A - G) AMI の FastDisk ホストアダプタは BusLogic の完全なクローンなので、この ドライバで動作させることができます。 5.8.2. BT-948/958/958D インストールの注意 BT-948/958/958D PCI Ultra SCSI ホストアダプタの機能には、Linux をイン ストールする際に (場合によっては) 注意しなければならない点があります。 PCI I/O ポートの割り当て 工場出荷時の設定では、BT-948/958/958D のボードはマザーボードの PCI BIOS が割り当てた I/O ポートのみを認識するようになっていて、 以前の BusLogic の SCSI ホストアダプタが応答した ISA 互換の I/O ポートには応答しません。このドライバは PCI の I/O ポート割り当て 機能をサポートしていますので、こちらの設定が望ましいでしょう。し かし何らかの理由 (パッケージのブートカーネルがこのドライバを使っ ていない場合など) で、古い BusLogic のドライバを使わなければなら ない場合には、 AutoSCSI の設定で古い ISA 互換の I/O ポートを用い るようにすることもできます。 この古い機能との互換性を持たせるオプションを有効にするには、シス テムのブート時に Ctrl-B を押して AutoSCSI を立ち上げ、「Adapter Configration」、「View/Modify Configration」と選んで、その中の 「ISA Compatible Port」を「Disable」から「Primary」か 「Alternate」に変えてください。このドライバがインストールされた 後には、I/O ポートの衝突を防ぐため、この「ISA Compatible Port」 は「Disable」に戻しておく必要があります。少々古い製品である BT-946C/956C/956CD にもこの設定オプションがありますが、工場出荷 時の設定は「Primary」になっています。 PCI スロットの検索順序 BusLogic の PCI ホストアダプタを複数枚備えたシステムでは、PCI ス ロットの検索の順番が BT-948/958/958D の場合と BT-946C/956C/956CD の場合とで逆になることがあります。 SCSI のディスクから正しくブー トさせるには、ホストアダプタの BIOS とカーネルの間で、ブートデバ イスと認識しているドライブが一致している必要があります。つまり PCI ホストアダプタの認識の順序が同じでなければならないのです。マ ザーボードの PCI BIOS は通常 PCI ホストアダプタを番号付けする標 準的な機能を持っており、 Linux のカーネルではこれを用いていま す。 PCI BIOS のインプリメントによって、PCI スロットをバス番号と デバイス番号の昇順にカウントするか降順にするかは異なっています。 不幸なことに Microsoft は Windows 95 で PCI スロットの番号付けを バス番号とデバイス番号の昇順に固定することにしてしまい、 Windows 95 対応の証明をもらうにはホストアダプタの BIOS はこの順序を守ら なければならなくなりました。したがって BT-948/958/958D の工場出 荷値ではバス番号とデバイス番号の昇順にホストアダプタの番号付けを することになっています。この機能を無効にするには、システムブート の際に Ctrl-B で AutoSCSI を起動し、「Adapter Configuration」 「View/Modify Configreation」を選んで Ctrl-F10 を押してくださ い。そして「Use Bus And Device # For PCI Scanning Seq」オプショ ンを OFF にしてください。 このドライバは PCI の検索手順のオプション設定を問い合わせて、ホ ストアダプタをアダプタの BIOS と同じ順序で認識するようにしていま す。 5.8.3. BusLogic の広報用メーリングリスト BusLogic の広報用メーリングリストは Linux ユーザに新しいドライバのリ リースを知らせたり、 BusLogic SCSI ホストアダプタの Linux サポート関連 のアナウンスを伝えるのに用いられています。このメーリングリストに参加す るには、本文に「subscribe」と書いたメールを BusLogic-announce- request@dandelion.com まで送ってください。 5.9. BusLogic FlashPoint ホストアダプタ (この節は Leonard N.Zubkoff に著作権があります) 現在のところ FlashPoint LT/DT/LW (BT-930/932/950) の Linux ドライバは ありませんし、将来にわたってリリースされるかどうかもはっきりしていませ ん。 FlashPoint のボードは MultiMaster のボードとはアーキテクチャが異 なっていて、オンボードの CPU は無く SCSI シーケンサのみが搭載されてい ます。 FlashPoint はデスクトップパソコン用の製品であり、 Linux のよう な高機能なマルチタスク OS に特に向いているというわけではありません。 MultiMaster BT-948/958 にはオンボードの CPU とメールボックスプログラム インターフェース機能があり、ホストの OS とアダプタの間で並列化とパイプ ライン化が可能になっています。一方 FlashPoint のボードではホストの CPU への割り込みが頻繁に起こります。システムの負荷が高くなるとこの割り込み が重荷になってしまい、 BT-948/958 が良い性能を維持するのに対し て、FlashPoint の性能は急速に低下します。さらに BT-948/958 のファーム ウェアには SCSI バスとの信号のやり取りに関する低レベルの命令がすでに含 まれています。 FlushPoint では Linux のドライバがこれらの命令を全て持 つ必要があるので、SCSI シーケンサとの間で命令をやり取りして仕事をする のに多くの時間がかかってしまいます。実売価格ではそれほど差がありません が、 Linux で用いるには BT-948 と BT-958 の方がはっきりと優れているの です。 < 引用はじめ > ANNOUNCEMENT BusLogic FlashPoint/BT-948 Upgrade Program 1 February 1996 十月終わりにリリースされて以来、BusLogic FlashPoint LT は Linux コミュ ニティのメンバーにとって問題の種になってきました。この Ultra SCSI 対応 の新製品には Linux ドライバがないためです。 FlashPoint はデスクトップ パソコン用の製品という位置づけにあり、Linux のような高性能のマルチタス ク OS に特に向いているというわけではありません。しかし PC のベンダは FlashPoint を最新製品と言って売り込み、ハイエンドのシステムにも MaltiMaster 製品ではなくこちらを付けてきました。その結果、 BusLogic の SCSI ホストアダプタは全て Linux でサポートされていると思ってうっかりこ のようなシステムを買ってしまった多くの人々が残念な思いをすることになっ てしまいました。 FlashPoint はまだサポートされておらず、将来されるにし ても相当先の事になるでしょう。 この問題が認識されて以来、BusLogic は主要な OEM 先と連絡を取り、 BT-946C/956C MultiMaster のカードを選択可能にすること、そして間違って FlashPoint を購入してしまった Linux ユーザに BT-946C へのアップグレー ドを可能とすることを申し合わせました。これで新規システムを購入する多く の人が救われるでしょうが、しかし Linux ユーザへの FlashPoint サポート の問題の一部を解決したにすぎません。 FlashPoint に対応している OS のた めに製品を買って、後に Linux への移行を決めた人や、対応していると思っ て FlashPoint LT を購入し、返品出来なくなってしまった人には何の助けに もならないのです. 12 月の半ばに私は BusLogic の上位管理職に会談を求め、FlushPoint への Linux やフリーソフトの対応に関して話し合いました。 Linux コミュニティ に対する BusLogic の態度について様々な噂が流れていたので、これらについ て直接聞くのがベストだと思ったのです。私は夜の 11 時に電子メールを送 り、翌日の午後に会合がもたれました。残念ながら会社における歯車と言うの は (特に会社が買収されようとしているときは) 回転が遅いもので、詳細まで がはっきり決定されて公式な声明が行われるのは現在となってしまいました。 BusLogic は現在のところ FlushPoint のドライバを書くために必要な情報を サードパーティに公開していません。現存している FlushPoint のドライバは 全て BusLogic のエンジニアによって直接書かれたものです。外部の開発者が 助力なしにドライバを書くために必要な、FlushPoint の詳細な情報を記した 文書はないのです。 BusLogic の社内には FlushPoint のアーキテクチャを公 開すべきでないという意見の人もおり、この議論はまだ決着していません。い ずれにしろ、もしドキュメントが今日入手できたとしても、まっとうに動作す るドライバを書くには長いことかかるでしょう。このドライバを書くのに必要 な努力がその価値に見合うとは私は納得していません。 しかし BusLogic は Linux コミュニティに高性能な SCSI を提供し続けるこ とを確約しており、FlashPoint LT を購入してしまったために Linux を動作 できないユーザを座視することは望んでいません。そこで BusLogic はアップ グレードキャンペーンを行ない、世界中の Linux ユーザに FlushPoint LT と 新製品 BT-948 MultiMaster PCI Ultra SCSI ホストアダプタとを交換できる ようにしました。 BT-948 は BT-946C の後継の Ultra SCSI アダプタであ り、BT-946C と FlashPoint LT の両方の利点を受け継いでいます。終端処理 の自動化やファームウェアのアップグレードが容易な flash PROM の採用、そ してもちろん現在の Linux ドライバへの互換性もあります。このアップグ レードに必要な価格は 45US$ で、 BusLogic のテクニカルサポートが実行し ています。連絡先は電子メールが techsup@BusLogic.com、電話が +1 408 654-0760、 FAX が +1 408 492-1542 です。 私は BT-948 のβテスタであり、私が書いた BusLogic ドライバの 1.2.1 と 1.3.1 にはこの BT-948 へのサポートが含まれています。 Ultra SCSI MultiMaster カードへの additional cosmetic サポートは続くリリースで追 加される予定です。 BusLogic との共同テストの結果、ファームウェアにあっ たいくつかのバグが発見・修正されました (ファームウェアのバージョンが 5.05R 以降であることを確認して下さい)。私が高負荷をかけて使用している Linux システムはエラー回復プロセスをテストするに理想的な環境です。エ ラー回復は製品のシステムではめったに用いられませんが、しかしシステム全 体の安定性には必要不可欠の機能です。ファームウェアのエンジニア達と直接 一緒に仕事ができ、ファームウェアのデバッグ環境下で障害を再現できたこと は特に便利でした。私が組込みのファームウェアで仕事していた頃とは大違い でした。私は現在性能のテストを行なっており、そう遠くない将来にまとまっ たデータを報告できる予定です。 BusLogic は私にこのアナウンスをするように言ってきました。 FlashPoint のサポートに関する質問の多くが私宛の電子メールや私の参加している Linux のニュースグループに寄せられているからです。まとめますと、BusLogic は Linux ユーザ向けに、サポート外の FlashPoint LT (BT-930) をサポートされ ている BT-948 へ $45 でアップグレードする道を提供しています。アップグ レードを受けるには、BusLogic のテクニカルサポート techsup@BusLogic.com か +1 408 654-0760 へ連絡してください。 Leonard N. Zubkoff lnz@dandelion.com <引用終わり> 5.10. EATA: DPT SmartCache、SmartCache Plus、SmartCache III、 Smart- Cache IV、SmartRAID (標準) 5.10.1. サポートされているボード EATA-DMA プロトコルを使っているもの全て。以下のようなものがあります。 DPT Smartcache (Plus) family: PM2011 ISA Fast Single-ended SCSI-2 PM2012B EISA Fast Single-ended SCSI-2 DPT Smartcache III family: PM2021 ISA Fast Single-ended SCSI-2 PM2021W ISA Wide Single-ended SCSI-2 PM2022 EISA Fast Single-ended SCSI-2 PM2022W EISA Wide Single-ended SCSI-2 PM2024 PCI Fast Single-ended SCSI-2 PM2024W PCI Wide Single-ended SCSI-2 PM2122 EISA Fast Single-ended SCSI-2 PM2122W EISA Wide Single-ended SCSI-2 PM2124 PCI Fast Single-ended SCSI-2 PM2124W PCI Wide Single-ended SCSI-2 PM2322 EISA Fast Single-ended SCSI-2 PM2322W EISA Wide Single-ended SCSI-2 DPT Smartcache VI family: PM2041W ISA Wide Single-ended SCSI-2 PM2041UW ISA Ultra Wide Single-ended SCSI-2 PM2042W EISA Wide Single-ended SCSI-2 PM2042UW EISA Ultra Wide Single-ended SCSI-2 PM2044W PCI Wide Single-ended SCSI-2 PM2044UW PCI Ultra Wide Single-ended SCSI-2 PM2142W EISA Wide Single-ended SCSI-2 PM2142UW EISA Ultra Wide Single-ended SCSI-2 PM2144W PCI Wide Single-ended SCSI-2 PM2144UW PCI Ultra Wide Single-ended SCSI-2 PM2322W EISA Wide Single-ended SCSI-2 PM2322UW EISA Ultra Wide Single-ended SCSI-2 DPT SmartRAID family: PM3021 ISA Fast Single-ended SCSI-2 PM3021W ISA Wide Single-ended SCSI-2 PM3122 EISA Fast Single-ended SCSI-2 PM3122W EISA Wide Single-ended SCSI-2 PM3222 EISA Fast Single-ended SCSI-2 PM3222W EISA Wide Single-ended SCSI-2 PM3224 PCI Fast Single-ended SCSI-2 PM3224W PCI Wide Single-ended SCSI-2 PM3334W PCI Wide Single-ended SCSI-2 PM3334UW PCI Ultra Wide Single-ended SCSI-2 この他、上記のボードに対応するディファレンシャル SCSI のボードもサポー トされています。 また以下のメーカのコントローラにもサポートされているものがあります。 NEC、AT&T、SNI、AST、Olivetti、Alphatronix 5.10.2. 可能な設定 スロット : ALL IO ポート : ALL IRQ : 全レベル、エッジトリガ DMA チャネル : ISA のものは全て、EISA/PCI は関係無し IO : ポートマップ方式、バスマスタ方式 SCSI Channels : ALL 5.10.3. 自動検出 全ての設定で動作します。 EATA-DMA ドライバの最新バージョンは以下から入手できます。 5.10.4. メーリングリスト EATA メーリングリストは EATA-DMA および EATA-PIO ドライバを使用してい る Linux ユーザに議論の場と新バージョンその他のアナウンスの場を提供し ています。メーリングリストに参加するには、メッセージ本文に 「subscribe」と書いたメールを linux-eata-request@i-connect.net 宛に 送ってください。 5.10.5. /proc/scsi サポート より詳細なコマンドの統計をとるには以下を実行してください。 echo "eata_dma latency" > /proc/scsi/eata_dma これを再び off にするには以下のようにします。 echo "eata_dma nolatency" > /proc/scsi/eata_dma 5.10.6. よくある問題 1. Slackware でコントローラを検出できない。 解決法は、ascsi* のブートディスクを使うことです。 2. 1.3.x 以前のカーネルで、IDE ドライバが EATA ボードの ST-506 イン ターフェースを検出してしまう。 a. 以下の 2 例のような状況となります。 hd.c: ST-506 interface disk with more than 16 heads detected, probably due to non-standard sector translation. Giving up. (disk %d: cyl=%d, sect=63, head=64) hdc: probing with STATUS instead of ALTSTATUS hdc: MP0242 A, 0MB w/128KB Cache, CHS=0/0/0 hdc: cannot handle disk with 0 physical heads hdd: probing with STATUS instead of ALTSTATUS hdd: MP0242 A, 0MB w/128KB Cache, CHS=0/0/0 hdd: cannot handle disk with 0 physical heads このために IDE ドライバに問題が生じたら (つまり実際の IDE デバイス にアクセスできなくなったら)、EATA ボードの IO ポートか IRQ (あるい はその両方) を変えてみてください。 b. IDE のドライバが自分の扱うべきデバイス (つまり 504MB 以下のハー ドディスク) を検出すると、 IDE ドライバは IO ポートと IRQ を割り 当ててしまうので、 eata のドライバはそれらを使えなくなります。こ の場合も IO ポートと IRQ (14、15 以外に) を変更してください。 3. 古い SK2011 のボードにはファームウェアに問題がある場合があります。 DPT のカスタマーサポートに連絡してアップデートしてください。 5.10.7. 注意 1. もし PCI のボードを使っている場合は CONFIG_PCI をセットする必要があ ります。 5.11. TMC-1800、TMC-18C30、TMC-18C50、TMC-36C70 のうちのどれかのチッ プ を使っている Future Domain の 16x0 5.11.1. 可能な設定 現在のところここには 1.2.10 以降へのパッチが置いてありますが、次のリ リースでは 1.3.x だけになります。これらのパッチはすべて完璧に当たると は限りません。ELF 対応パッチや他のパッチが開発者である私のベースシステ ムには既に当たっているからです。もしパッチの際の障害 (4つあります) を 手動で訂正できない場合は、これらのパッチは使わないで下さい。パッチは最 新のものだけが必要です。インクリメンタルなパッチではありません。 次のリリースが待てず、NCR のドライバを 1.3.x カーネルで使いたいという 方のために、 Harald Evensen が 1.3.x 用の パッチを公開しています。 これらのパッチは問題なく当たるはずです。 まずこれらのディレクトリの README ファイルをすべて読んで下さい。またア ルファ版のコードを用いたい場合は NCR メーリングリストにも入って下さ い。ここでは暫定的なバグフィックスや次バージョンのリリース情報などがポ ストされます。 参加するには以下のような内容をメール本文に書いて、 majordomo@colorado.edu に送って下さい。 subscribe ncr53c810 参加をやめる場合にはメール本文に以下のような内容を書いて同じアドレスに 送って下さい。 unsubscribe ncr53c810 5.13.4. よくある問題 1. DOS ではうまく動いているのに、Linux では割り込み待ちの状態でタイム アウトしてしまう、という問題を多くの人が経験しています。 これはスロットのカードないしはマザーボードのジャンパによる IRQ の ハードウェア設定と、BIOS 設定の値が異なっているためであることが多い ようです。以下をよく確認して下さい。 o 使用している IRQ はマザーボードの NCR チップもしくはスロットの NCR ボードだけが使っている。 o オンボードチップやスロットの IRQ を設定するマザーボード上のジャ ンパが BIOS の設定と合っている。 o PCI のマザーボードは自動割り当て機能を持っていることがあります が、うまく動くとは限りません。 PCI の INTA しかサポートしていないシステムで、INTB、 INTC、INTD な どが選択されているのが原因なこともあります。もしお使いの NCR のボー ドに PCI 割り込みラインを選択するジャンパがあったら INTA にしておく ようにして下さい。 最後に、PCI はエッジトリガではなく、レベルセンス割り込みを使わなく てはなりません。ボードにジャンパがある場合には、レベルセンスに設定 されていることを確認してください。それでもうまくいかない場合には、 もしかすると設定が逆になっているかもしれませんから、エッジトリガの 方を試してみてください。 この問題は特に Viglen のマザーボードによく見られます。Viglen のボー ドでは IRQ のジャンパ設定がマニュアルの記述とは違っているのです。マ ニュアルで IRQ5 と記述されているところが実は IRQ9 なのだそうです。 しかしあなたのボードではもしかしたらまた違うことになっているかもし れません。 2. S3 928 や Tseng ET4000W32 PCI 等のビデオカードを一緒に用いると、シ ステムフリーズなどの問題が生じる。 これらのチップの (少なくともいくつかのバージョンにおける) ハード ウェア上のバグのためです。これらは使わないようにしてください。 3. 『ベースアドレス 0 のビット 0..1 の内容にしたがって I/O マッピング を無効にする』といったメッセージがブート時に出る。 これはいくつかのシステムに存在するバグのためです。設定レジスタの 4 バイトの値を読んでくるとき、上位と下位の 16 ビットワードの値を逆に 返してしまうのです。 4. システムによっては PCI の遅延書き込みや CPU->PCI のバッファリングを 有効にすると問題が生じることがあります。問題が生じたら、これらの機 能はオフにして下さい。 訳注: 特に neptune や mercury チップセットは危ないようです。 5. ボード上の BIOS ROM とシステム BIOS の両方に NCR SDMS ソフトウェア を持っているようなシステムで、DOS をブートすることができない。 どちらかの BIOS を無効にすればこの問題は解決します。 6. 以下のようなメッセージが出てしまう "scsi%d: IRQ0 not free, detaching" あるいは次のような場合もあります。 "scsi%d: IRQ255 not free, detaching" 割り込みラインを設定する NCR のチップの PCI 設定レジスタが、すべて 0 または 1 にセットされてしまっています。設定に問題があるか (``よくある 問題: その1'' を見て下さい)、マザーボードの BIOS に欠陥があるのでしょ う。 drivers/scsi/ncr53c7,8xx.c の pci_init() 関数を変更するとこの問題を回 避することができます。 irq = my_irq; という行を以下の部分の前に追加して下さい。 return normal_init (tpnt, board, chip, (int) base, (int) io_port, (int) irq, DMA_NONE, 1, bus, device_fn, options); 7. いくつかのシステムでは BIOS チップの内容がひどくいかれている場合が あります。お使いのボードベンダーの最新の ROM を使っていない場合は、 バグレポートは送らないようにしてください。 8. コマンドラインオプションの ncr53c810=xxx などが機能しない 現在のカーネルでは init/main.c にこれらのオプションへのエントリポイ ントが無いためです。これは実は根拠があってのことです。 コマンドラインオプションが与えられていると、ドライバは必ずそのパラ メータでボードの自動検出を行ないます。もしコマンドラインの設定が PCI の設定ルーチンで得られるものと異なると、問題が生じることになり ます。 実際にコマンドラインによる指定が必要となるのは、PCI のハードウェア と BIOS が壊れている場合でしょうが、この場合はエラー復帰ルーチンも 機能しないので、コマンドラインオプションにはほとんど価値がないので す。 最後に。利用者がコマンドラインオプションを必要だと考えるのは、ドラ イバが設定などのエラーメッセージを出したときだけです。が、ドライバ が設定に問題があると言ってきたときは、システムの設定に問題がある か、あるいはシステムが壊れているかなのです。このような場合コマンド ラインオプションを使っても問題は解決しません。 init/main.c に適当なエントリポイントを追加すればコマンドラインオプ ションを有効にすることはできるかもしれませんが、これは完全にサポー トの範囲外であるだけでなく、おそらく動作もしないでしょう。 9. NCR BIOS を用いていないボード (特に Nexstor のもの) でタイムアウト が発生します。 この種のボードの ROM の中には、電源投入時の同期転送交渉を行うものが ありますが、Linux のドライバはその結果を知ることができません。この 状態で配布版の NCR のドライバが SCSI デバイスと通信しようとするとタ イムアウトしてしまい、SCSI バスのリセットや再交渉が実行できないので タイムアウトからの復帰ができません。 この問題が起こったら、ボードの設定プログラムで同期転送を無効にする か、最新のアルファ版ドライバを用いて下さい。最新版の NCR ドライバで は同期転送が行なえるようになっています。 訳注: 2.0.27 のドライバは、同期転送をサポートしています。 10. Tyan S1365 '825 ボードで、タイムアウトの際 (特にディスコネクトが有 効になっていると) 問題が生じる。 これらのボードの付属ドキュメントにおけるターミネーション設定ジャン パの記述は逆になっています。従って off にしたつもりが on に、on が off になってしまいます。 ジャンパの位置を逆にしてみてください。 5.13.5. 注意 1. CONFIG_PCI を設定しておく必要があります 5.14. Seagate ST0x/Future Domain TMC-8xx/TMC-9xx (標準) 5.14.1. 可能な設定 ベースアドレス : 0xc8000, 0xca000, 0xcc000, 0xce000, 0xdc000, 0xde000 IRQ : 3, 5 DMA チャネル : 使用されません IO : メモリーマップ方式 5.14.2. 自動検出 アドレスに関してのみスキャンを行ないます。 IRQ は 5 とみなされま す。BIOS がインストールされている必要があります。 5.14.3. 自動検出の設定変更 コンパイル時 OVERRIDE をベースアドレスに、CONTROLLER を FD もしくは SEAGATE のどちらかに、IRQ をシステムの IRQ にそれぞれ定義します。 カーネルのコマンドライン st0x=address, irq または tmc8xx=address,irq (0.99.13b 以降のカーネルで動作します) 5.14.4. アップデートによって解決された問題 1. カーネル 0.99.12 以前に添付されていたバージョン 1 以前のドライバで は、遅いデバイスとのハンドシェイクに失敗することがあります。 ハンドシェイクは以下のような手順で行われます。 a. 1バイトのデータをデータレジスタに書き込み、データレジスタがバス にアサートされる b. 残り時間 = 12 us c. 残り時間 > 0 で、REQ がアサートされていない間待つ d. 残り時間 > 0 ならば ACK をアサートする e. 残り時間 > 0 で REQ がアサートされている間待つ f. ACK をデアサートする コマンドを読み込んで処理するのが遅いデバイスでは、 REQ/ACK ハンド シェイクに 12us 以上の時間がかかってしまいます。するとドライバで指 定されている経過時間が過ぎても REQ がデアサートされないので、一つの REQ パルスに対して複数バイトのデータを送ってしまいます。 カーネル 0.99.12 にはバグがあって、アービトレーションのコードを書き 換えた結果セレクションが失敗するようになっていました。 0.99.13 で修 正されています。 5.14.5. よくある問題 1. カーネルがパーティションテーブルの読み込みなどのディスクアクセスを 行なおうとすると、コマンドのタイムアウトが起こる。 出荷時のボードのデフォルト設定は MSDOS 向けになっています。つまり割 り込みが無効になっているのです。割り込みを有効にするジャンパスイッ チは、 Seagate のボードではジャンパ W3 (ST01) または JP3 (ST02) で、IRQ 5 を選択するには F と G のピンをショートします。 2. ドライバが扱えないデバイス (特に安い SCSI テープドライブや CD-ROM など) がある。 Seagate のボードでは、 SCSI バスの REQ/ACK ハンドシェイクを ISA バ スの IO CHANNEL READY および 0WS シグナル (こちらはオプション) と関 連づけています。残念ながらこれではいつウォッチドッグタイマがタイム アウトしたのかを知ることができないため、REQ 信号の立ち下がりを確実 に知ることができず、結果としてひとつの REQ パルスを複数の REQ パル スとみなしてしまうおそれがあります。 これをちゃんと扱うには REQ 信号が low に変わるのをループで監視し、 割り込みなどによって信号の切り替わりをキャッチできなかったときのた めにタイムアウトを出すようにしなければなりません。この取り扱いをす ると性能が落ちてしまうので、全ての SCSI デバイスに適用するのは得策 ではありません。代わりに scsi_devices 配列の broken フィールドの値 を用いて、デバイスごとに選択するようにしています。もし問題が生じた ら、該当するデバイスを broken が 0 にリセットされないデバイスのリス トに登録してください。現在リストには TENEX CDROM ドライブのみが登録 されています。 3. Future Domain のボード (特に 840、841、880、881) が動作しない Future Domain のボードのいくつかでは Seagate のレジスタマッピングを 用いていますが、ステータスレジスタの MSG および CD のビットが逆転し ていることがあります。 seagate.h を編集して、STAT_MSG と STAT_CD の定義を交換し、カーネル を再コンパイルして下さい。その際 CONTGROLLER を SEAGATE に定義し、 IRQ と OVERRIDE を適当な値に設定して下さい。 4. ドライブを fdisk しようとすると、HDIO_REQ か HDIO_GETGEO ioctl が失 敗したというエラーメッセージや、以下のようなエラーメッセージが表示 される。 You must set heads sectors and cylinders. You can do this from the extra functions menu. ``パーティションの作成'' を見て下さい。 5. 手動でドライブのジオメトリを設定してからパーティションテーブルを読 み込もうとすると、『パーティションの境界がシリンダの境界と一致して いない』とか『物理的な境界と論理的な境界が一致していない』などと いったエラーメッセージが出る。 ``パーティションの作成'' を見て下さい。 6. 0.99.13 以前のカーネルでは動くが、新しいカーネルでは動かなくなるシ ステムがあるようです。 古いバージョンのカーネルでは CONTROL と DATA レジスタを Seagate の ドキュメントとは逆の順序で代入しており、いくつかのシステムでうまく 動かなくなることがありました。新しいバージョンでは正しい順序にしま したが、これによって他のシステムがうまく動かなくなってしまうことが あるようです。 seagate.c には以下のようなコードがあるはずです。 cli(); DATA = (unsigned char) ((1 << target) | (controller_type == SEAGATE ? 0x80 : 0x40)); CONTROL = BASE_CMD | CMD_DRVR_ENABLE | CMD_SEL | (reselect ? CMD_ATTN : 0); sti(); これを以下のように直せば解決するでしょう。 cli(); CONTROL = BASE_CMD | CMD_DRVR_ENABLE | CMD_SEL | (reselect ? CMD_ATTN : 0); DATA = (unsigned char) ((1 << target) | (controller_type == SEAGATE ? 0x80 : 0x40)); sti(); 5.14.6. 定義可能なパラメータ FAST または FAST32 これらを定義すると可能な場合にはブラインド転送を行ないます。 ARBITRATE ホストアダプタが SCSI-II 互換のアービトレーションを行なうように します (バスフリーフェーズを待っていきなりセレクションをはじめる のではなく)。配布版のソースを再構成する時には、LUN 当たりひとつ のコマンドを実行するように変更する予定です (訳注: つまり今はそう なっていないということか?)。 SLOW_HANDSHAKE Seagate のソースコードのハンドシェイクのスピードについていけない イカレたデバイス (ある種の CD ROM など) を使う時に定義してくださ い。 SLOW_RATE=x ハンドシェイクが正しく動作しないときにデフォルトの転送レートにす る値を x に指定します。 5.15. PAS16 SCSI (標準) 5.15.1. 可能な設定 IO ポート : 0x388, 0x384, 0x38x, 0x288 IRQ : 10, 12, 14, 15 (重要) : IRQ はこのボードのサウンド機能が用いる IRQ とは 別にする必要があります。 DMA : このボードの SCSI 機能では用いません。 IO : ポートマップ方式 5.15.2. 自動検出 BIOS は必要ありません。 5.15.3. 自動検出の設定変更 コンパイル時 PAS16_OVERRIDE を IO ポートと IRQ の配列として定義して下さい。 ポート 0x388、IRQ10 の場合ならば以下のようになります。 #define PAS16_OVERRIDE ((0x388, 10)) カーネルのコマンドライン pas16=port,irq 5.15.4. 定義可能なパラメータ AUTOSENSE 定義されていると CHECK CONDITION ステータスを返してくるコマンド に対して自動的に REQUEST SENSE が実行されます。 PSEUDE_DMA 擬似 DMA のハードウェアを使用できるようにします。性能は I/O ポー リングを使ったものの 3-4 倍になります。 PARITY パリティチェック機能を有効にします。まだサポートされていません。 SCSI2 SCSI-II タグ付きコマンドキューイングをサポートします。テストされ ていません。 UNSAFE 割り込みを許可したまま擬似 DMA 転送を行います。高速シリアル通信 でデータ落ちが生じる場合にだけ使って下さい。その場合でも、転送サ イズを変更する方が良い結果が得られるでしょう。 USLEEP ディスコネクトを行なわないデバイスをサポートします。テストされて いません。 5.15.5. よくある問題 1. コマンドがタイムアウトしたり強制終了してしまう 少し前に私がネットにポストした NCR5380 のパッチをインストールするの が良いでしょう。このパッチは将来のアルファ版に統合されるはずです。 このパッチでは古い NCR5380 ドライバにあった排他制御の問題を修正して おり、また NCR5380 を用いたボードの複数デバイスのサポートの部分もな おしてあります。 これで直らなければ、PSEUDO_DMA の定義を無効にして下さい。 drivers/scsi/pas16.c の中の #define PSEUDO_DMA を #undef PSEUDO_DMA に修正します。 後者の方法は最後の手段と思って下さい。この方法を選ぶと著しく性能が 落ちてしまいます。 5.16. Trantor T128/T128F/T228 (標準) 5.16.1. 可能な設定 ベースアドレス : 0xcc000, 0xc8000, 0xdc000, 0xd8000 IRQ : なし, 3, 5, 7 (全てのボード) 10, 12, 14, 15 (T128F のみ) DMA : 使用していません IO : メモリーマップ方式 5.16.2. 自動検出 全ての設定において動作します。BIOS がインストールされている必要があり ます。 5.16.3. 自動検出の設定変更 コンパイル時 T128_OVERRIDE をベースアドレスと IRQ からなる配列として定義しま す。例えばアドレス 0xcc000、IRQ 5 のボードの場合には以下のように なります。 IRQ の指定には IRQ_NONE と IRQ_AUTO も使えます。 #define T128_OVERRIDE ((0xcc000, 5)) カーネルのコマンドライン t128=address,irq IRQ を用いないときは -1 を、自動検出には -2 を指定します。 5.16.4. 定義可能なパラメータ AUTOSENSE 定義されていると CHECK CONDITION ステータスを返してくるコマンド に対して自動的に REQUEST SENSE が実行されます。 PSEUDE_DMA 擬似 DMA のハードウェアを使用できるようにします。性能は I/O ポー リングを使ったものの 3-4 倍になります。 PARITY パリティチェック機能を有効にします。まだサポートされていません。 SCSI2 SCSI-II タグ付きコマンドキューイングをサポートします。テストされ ていません。 UNSAFE 割り込みを許可したまま擬似 DMA 転送を行います。高速シリアル通信 でデータ落ちが生じる場合にだけ使って下さい。その場合でも、転送サ イズを変更する方が良い結果が得られるでしょう。 USLEEP ディスコネクトを行なわないデバイスをサポートします。テストされて いません。 5.16.5. よくある問題 1. コマンドがタイムアウトしたり強制終了してしまう 少し前に私がネットにポストした NCR5380 のパッチをインストールするの が良いでしょう。このパッチは将来のアルファ版に統合されるはずです。 このパッチでは古い NCR5380 ドライバにあった排他制御の問題を修正して おり、また NCR5380 を用いたボードの複数デバイスのサポートの部分もな おしてあります。 これで直らなければ、PSEUDO_DMA の定義を無効にして下さい。 drivers/scsi/pas16.c の中の #define PSEUDO_DMA を #undef PSEUDO_DMA に修正します。 後者の方法は最後の手段と思って下さい。この方法を選ぶと著しく性能が 落ちてしまいます。 5.17. Ultrastor 14f (ISA)、24f (EISA)、34f (VLB) (標準) 5.17.1. 可能な設定 IO ポート : 0x130, 0x140, 0x210, 0x230, 0x240, 0x310, 0x330, 0x340 IRQ : 10, 11, 14, 15 DMA チャネル : 5, 6, 7 IO : ポートマップ方式、バスマスタ方式 5.17.2. 自動検出 ポートが 0x310 の場合は機能しません。BIOS は必要ありません。 5.17.3. 自動検出の設定変更 コンパイル時のみです。PORT_OVERRIDE を定義します。 5.17.4. よくある問題 1. ポートアドレス 0x310 は自動検出されません。また、もしネットワーク機 能が有効になっていると衝突の原因になってしまいます。 別のアドレスを用いて下さい。 2. Ultrastor で 0x330 を用いると、サウンドドライバが自動検出を行なった 際にシステムがハングアップすることがあります。 別のアドレスを用いて下さい。 3. 他のドライバが行なう自動検出は必ずしも安全ではなく、また様々なアド レスが探索されます。もし検出に失敗したりシステムがブート時にハング アップするときは、別のアドレスを試してみてください。 おすすめのアドレスは 0x340 です。これは動くことがわかっています。 4. SCSI デバイスがひとつも検出されず、Ultrastor に接続されている SCSI ハードディスクが IDE ハードディスクとして認識されるが、 IDE ドライ バにはサポートされない。この場合以下のようなメッセージが出力される でしょう。 hd.c: ST-506 interface disk with more than 16 heads detected, probably due to non-standard sector translation. Giving up. (disk %d: cyl=%d, sect=63, head=64) これは Ultrastor のボードを WD1003 のエミュレーションモードで動作させ ているときに起こります。解決法は二つあります。 a. Ultrastor をネイティブモードに切り替えます。こちらがお薦めです。 なぜなら SCSI ドライバは IDE ドライバより高速だからです。特にク ラスタ単位の read/write パッチが当たっている場合は高速で、ファイ ルシステムを介して 2M/sec 以上の転送レートが得られているユーザも いるそうです。 もしハードディスク以外のデバイスを用いていたり、2 台以上のハード ディスクを Ultarstor に接続している場合は、こちらが唯一の選択肢 となります。 b. カーネルのコマンドラインオプションを用います。 hd=cylinders,heads,sectors とするとデフォルト設定が上書きされ、ブートできるようになります。シ リンダ、ヘッダ、セクタの数はそれぞれ 2048、16、255未満にして、それ らを掛けた値が本来の値と等しくなるようにします。 Linux から fdisk を用いる際にも手動でディスクのジオメトリを指定する 必要があります。そうしないとパーティションエントリが正しく書き込ま れないため、 Linux では動作しますが DOS ではシリンダ/ヘッド/セク タ各エントリの取得に失敗するので動作しなくなってしまいます。 一度 Linux が立ち上がってしまえば、include/linux/config.h の HD_TYPE マクロを適当な値に定義して再コンパイルすることで、手動ブー トしなくてもすむようになります。 5.18. Western Digital 7000 (標準) 5.18.1. 可能な設定 BIOS アドレス : 0xce000 IO ポート : 0x350 IRQ : 15 DMA チャネル : 6 IO : ポートマップ方式、バスマスタ方式 5.18.2. 自動検出 BIOS がインストールされている必要があります。 5.18.3. よくある問題 1. チップやファームウェアにいくつかのバージョンがあります。おそらく バージョン 3 のボードは動作しません。バージョン 5 は大丈夫です。無 印のチップは動作せず、'A' が最後についているものは動作します。 2. このボードは、ドライバでサポートしていない BIOS アドレスを使うこと ができるようです。この場合ドライバがサポートしているアドレスを使っ て下さい。また ``バグレポート'' に従ってバグレポートを送って下さ い。 5.19. AM53/79C974 (アルファ版) にあります。 訳注: カーネル 2.0.27 には含まれています。 5.19.1. 可能な設定 IO ポート : all IRQ : all DMA チャネル : 6 IO : ポートマップ方式、バスマスタ方式 (unintelligent) 5.20. qlogic (標準) ねえ Drew、この章はどこにあるの? 目次にしかないよ ;-) - by D.F. 6. ディスク ここでは、ディスクドライブに固有の情報を示します。 6.1. 対応している (いない) ハードウェア すべてのダイレクトアクセス SCSI デバイス (訳注: これは「ハードディス ク」を意味する SCSI 用語です) で、ブロックサイズが 256バイトか 512バイ ト、または 1024バイトのものは使えるはずです。これ以外のブロックサイズ は使えませんが、多くの場合ブロックサイズまたはセクタサイズは SCSI の MODE SELECT コマンドを使って変更できます。 セクタサイズとは、デバイスのセクタに割り当てられたデータバイト数のこと です。例えば、CDROM のセクタサイズは 2048 です。 ブロックサイズとは、デバイスとのインターフェースに使用される論理ブロッ クの大きさのことです。これは通常セクタサイズと等しいのですが、複数の小 さな物理セクタ (55M サイクエストドライブの場合には 256バイト) を大きな 論理ブロックにマップしたり、逆にひとつの物理セクタを複数の論理ブロック に分割する (例えば、SUN コンパチブルの CDROM ドライブのブロックサイズ は 512 バイトです) こともあります。 リムーバブルメディアデバイスには、Bernouli、フロプティカル、MO ドライ ブ、 Syquest などの種類があります。 理論的には、1テラバイトまでのドライブは使えるはずです。 9ギガバイトま での小さなドライブに関しては、まったく問題はありません。 6.2. よくある問題 6.2.1. 「シリンダが 1024 よりも多い」というメッセージ パーティションを切るときに、「シリンダが 1024 よりも多い」という警告 メッセージが表示される。あるいは、1024 以降の論理シリンダを含んだパー ティションからブートできない。 これは、BIOS の制限によるものです。 詳しい説明は、``ディスクのジオメトリ'' および``パーティションの作成'' を参照してください。 6.2.2. /dev/hd* にパーティションが切れない /dev/hd* は SCSI デバイスではありません。 SCSI デバイスは /dev/sd* で す。 正しいデバイス名とパーティションの切り方については、 ``デバイスファイ ル''や ``ディスクのジオメトリ''、それに ``パーティションの作成'' を参 照してください。 6.2.3. リムーバブルメディアドライブからメディアを排出できない Linux は、メディアがマウントされている時にはドライブのドアをロックしま す。予期せぬメディアの入れ替えによってファイルシステムが壊れるのを防ぐ ためです。 まずディスクをアンマウントしてください。 6.2.4. SCSI ディスクから LILO でブートできない SCSI ドライバと BIOS との間で、使用すべき BIOS マッピングに関して情報 が食い違っていることがあります。この場合、ブート時に LILO が「LI」まで 表示してハングするなどの問題を引き起こすことがあります。 この問題を回避するためには、DOS で使われる BIOS ジオメトリマッピングを 調べて、これを /etc/lilo/disktab に書き込む必要があります。 あるいは、「linear」jfile 設定オプションを使うという方法もあります。 6.2.5. fdisk が以下のようなメッセージを出力する You must set heads sectors and cylinders. You can do this from the extra functions menu. そして fdisk を再起動すると、変更したはずのディスクジオメトリが変更さ れていない。 ``パーティションの作成'' を参照してください。 6.2.6. ブリッジボードに複数のドライブが接続されているのに、 ひとつの ドライブしか検出されない。 Linux は ANSI SCSI リビジョン 1 以前の SCSI デバイスに対しては、 0 以 外の LUN を探しに行きません。 0以外の LUN を認識させたけれ ば、drivers/scsi/scsi.c の scan_scsis() 関数を変更する必要があります。 6.2.7. スワップ時にシステムがハングする この問題はすでに解決されています。カーネルを 1.1.38 にバージョンアップ してください。 6.2.8. Conner の CFP1060S ディスクの内容が壊れる 訳注: 現在 Conner は Seagate に買収されています。 これは、先読みとキャッシュに関するマイクロコードのバグのためです。 Soenke Behrens (Conner テクニカルサポート) からのメールより : 過去数週間の間に、Linux オペレーティングシステムを使用してい て Conner CFP1060x 1GB SCSI ドライブに深刻な問題が生じたとい う電話を何人かのお客様から頂きました。症状は、ファイルシステ ムの破壊 (inode の損傷) がシステムブート時に e2fsck によって 報告されるというものです。 CFP1060x (マイクロコードリビジョン 9WA1.62/1.66/1.68) と Linux を使用されているお客様には、マイクロコードの修正が御利 用頂けます。マイクロコードをバージョンアップするために は、DOS ブートディスクとハードディスクドライブにアクセスでき る ASPI ドライバが必要です。バージョンアップによって、新しい キューイングと先読みのコードがドライブの不揮発性 SCSI RAM に ダウンロードされます。 マイクロコードリビジョンが 9WA1.60 のディスクで問題が生じた 場合には、最寄りの Conner サービスセンターに連絡して、ディス クをバージョンアップしてもらう必要があります。マイクロコード のリビジョンは、ドライブ上のラベルと、ドライブの下側の IC の ひとつに貼られたラベルに書いてあります。 自分でバージョンアップできる自信のある方は、Conner テクニカ ルサポートに連絡して、最新のマイクロコードを入手してくださ い。ヨーロッパの Conner テクニカルサポートの電話番号は +44-1294-315333 です。アメリカの Conner テクニカルサポートの 電話番号は 1-800-4CONNER です。 敬具 Soenke Behrens ヨーロッパテクニカルサポート 6.3. デバイスファイル SCSI ディスクのブロックデバイスメジャー番号は 8 で、BSD のような 「ロー」デバイスは存在しません。 ひとつの SCSI ディスクには、16個のマイナー番号が割り当てられています。 minor % 16 == 0 はディスク全体を表し、1 <= (minor % 16) <= 4 は4つのプ ライマリパーティションを、5 <= (minor % 16) <= 15 は拡張パーティション (訳注: 正確には「拡張パーティション中の論理ドライブ」でしょう) を表し ます。 たとえば、以下のような構成では次のようにデバイス名が割り当てられます。 (ひとつのホストアダプタの場合) Device Target, Lun SCSI disk 84M Seagate 0 0 /dev/sda SCSI->SMD bridge disk 0 3 0 /dev/sdb SCSI->SMD bridge disk 1 3 1 /dev/sdc Wangtek tape 4 0 none 213M Maxtor 6 0 /dev/sdd 標準的なデバイス名の付け方は、次のようになります。 /dev/sd{letter} ディスクデバイス全体 ((minor % 16) == 0) /dev/sd{letter}{partition} そのデバイス上のパーティション (1 <= (minor % 16) <= 15) たとえば次のように。 /dev/sda block device major 8 minor 0 /dev/sda1 block device major 8 minor 1 /dev/sda2 block device major 8 minor 2 /dev/sdb block device major 8 minor 16 6.4. パーティションの作成 SCSI ディスクにパーティションを切るには、DOS、OS/2、Linux やその他の標 準的なパーティションの作成方法をサポートしている OS 上のパーティション 作成プログラムを使用することができます。 Linux の fdisk プログラムを起動する場合は、必ずデバイスをコマンドライ ンで指定してください。例えば最初の SCSI ディスクにパーティションを作成 する場合には、以下のように入力します。 fdisk /dev/sda デバイスを指定しなかった場合には、デフォルトの /dev/hda が使われてしま うことがあります。これは SCSI ディスクではありません。 fdisk が次のようなメッセージを出力することがあります。 You must set heads sectors and cylinders. You can do this from the extra functions menu. Command (m for help): あるいは HDIO_REQ または HDIO_GETGEO ioctl が失敗したというメッセージ が出力されることもあります。こういう場合には、``ディスクのジオメトリ'' での説明にしたがって、ディスクのジオメトリを入力しなければなりません。 また LILO を使ってそのディスクからカーネルをブートするには、 /etc/disktab にもディスクジオメトリを設定する必要があります。 ディスクジオメトリを入力した場合には、その後 fdisk を起動しようとする と同様のメッセージが表示されます。これは PC がディスクジオメトリ情報を パーティションテーブルに保存しないためで、異常ではありません。それ自体 は問題とはなりませんし、そのドライブに作成したパーティションを Linux でアクセスすることにも問題はありません。しかし、いくつかのメーカーの出 来の悪いインストールプログラムの中には、これをうまく処理できないものも あります。その場合にはメーカーに連絡し、プログラムを修正するよう要求し てください。 場合によっては、シリンダ 1024 以降に食い込んだパーティションに関する警 告メッセージが出力されることがあります。そのようなパーティションを作成 した場合、そのパーティションから LILO を使って Linux カーネルをブート することはできません。しかし、一部または全部がシリンダ 1024 以降にある ルートパーティションを作成できないわけではありません。シリンダ 1024 以 下に小さな /boot パーティションを作成するか、既存のパーティションから カーネルをブートすればよいからです。 6.5. ディスクのジオメトリ Linux では、ディスクは SCSI ホストアダプタから見える通りに、エラーのな い 0 から N-1 まで番号づけされた N 個のブロックとして認識されます。一 方 DOS や BIOS では賢いディスクにも過去の慣習が適用されてしまい、この ようなリニアなアドレッシングが恣意的にヘッド/シリンダ/セクタにマッピン グされてしまいます。 このことは、Linux でドライブにパーティションを切る場合に問題となるおそ れがあります。DOS や BIOS がどのようにジオメトリをマップするかを知る汎 用的な方法がないからです。多くの場合 HDIO_GETGEO ioctl() がこのマッピ ングを知るために使えます。残念ながら、一部のメーカー (Seagate) のよう に、ひねくれた、標準から外れた、しかも文書化されていない方法でマッピン グを行っている場合、この方法は使えず、ジオメトリをマニュアルで指定する 必要があります。 マニュアル指定には、いくつかの方法があります。 1. DOS を使うつもりがないか、LILO がインストールされているドライブから カーネルをブートする場合、ヘッド * シリンダ * セクタ * 512 < ドライ ブのサイズ (バイト数) となるようにそれぞれの値を設定する (メガバイ トは 2^20 バイトと定義されます)。 1 <= heads <= 256 1 <= cylinders <= 1024 1 <= sectors <= 63 2. BIOS マッピングを使う方法。場合によっては、ディスクの SCSI ID を 0 に設定し直し、2番目の IDE ドライブ (もしあるならば) をディセーブル する必要があります。 NU (訳注: Norton Utilities のことでしょう) のようなプログラムを使うこ ともできますし、次のプログラムも使えます。 begin 664 dparam.com MBAZ``##_B+^!`+N!`(H'0SP@=/D\,'5:@#]X=`6`/UAU4(!_`3AU2H!_`P!U M1(I7`H#J,(#Z`7L6N]T!,=*Y M"@#W\8#",$N(%PG`=>^)VK0)S2'#=7-A9V4Z(&1P87)A;2`P>#@P#0H@("!O L を探してみてください。 これらのプログラムは、SCSI 以外の CDROM にも使える可能性があります。ド ライバが SCSI ドライバと同様の ioctl を実装していることが条件です。 7.2.5. CD ROM チェンジャの2番目以降のドライブが動作しない たいていの CD チェンジャはディスクごとに一つの論理ユニットを割り当てま す。論理ユニットに対応するスペシャルファイルを作成してあるかどうか確か めてください (``デバイスファイル''を参照のこと)。また、``0 以外の LUN が使えない''も読んでください。 7.3. デバイスファイル SCSI CD ROM のメジャーデバイス番号は 11 です。 マイナー番号は動的に割り当てられます (``ディスク'' や ``デバイスファイ ル'' を見てください)。最初に見つかった CDROM のマイナー番号が 0、2番目 に見つかった CDROM のマイナー番号が 1、という具合になります。 標準的なデバイス名は /dev/sr{数字} ですが、パッケージによっては以下の 例のように /dev/scd{数字} を使っているものもあります。 /dev/sr0 /dev/scd0 /dev/sr1 /dev/scd1 8. テープ この章では SCSI のテープドライブに特有の情報を記述しています。 8.1. 対応している (いない) ハードウェア 固定長ブロックのドライブにも可変長ブロックにも対応しています。ただしド ライバで定義しているバッファよりもブロックは小さくなければなりません。 配布版カーネルのソースではドライバのバッファは 32K に設定されていま す。 ブロックサイズやバッファリング、記録密度などのパラメータは ioctl を 使って (通常は mt プログラムで) 設定されます。この設定はデバイスが close/reopen した後も保持されます。 ほとんど全てのドライブが動作します。以下に一部を示します。 o Archive Viper QIC ドライブ。150M のモデルも 525M も動作します。 o Exabyte の 8mm ドライブ o Wangtek 5150S ドライブ o Wangdat の DAT ドライブ製品群 8.2. よくある問題 8.2.1. ブート時にテープドライブが認識されない テープをドライブに入れてからブートしてみてください。 8.2.2. 複数のファイルを含んだテープが正しく読み取れない 複数のファイルをテープから読み出すとき、最初の tar は成功し、その次の tar はなにも出力せずに終わります。さらに次の tar を行なうと二つめの ファイルが読めます。 tar のようなユーザレベルのプログラムはファイルマークを認識しません。最 初の tar は先頭のファイルの最後まで読み込みます。 2 度目の tar はファ イルマークの位置で読み込みを始めるのでなにも出力しません。しかしこれに よりテープは次のファイルの先頭に移動するので 3 度目の tar は 2 番めの ファイルを読み込みます。 次のファイルにスキップするためには、巻戻しをしないデバイス (/dev/nst?) に mt コマンドを用いて下さい。 8.2.3. 圧縮が失敗する 圧縮プログラムはファイルの最終ブロックに追加される 0 のデータを正しく 扱うことができません。 警告やエラーを防ぐには、圧縮ファイルを .tar ファイルの中にまとめて下さ い。つまり tar cfvz /dev/nrst0 file.1 file.2 ... とするのではなく、以下のようにして下さい。 tar cfvz tmp.tar.z file.1 file.2 ... tar cf /dev/nrst0 tmp.tar.z 8.2.4. 他のシステムとテープでのデータのやり取りができない 他の OS で書き込んだテープを Linux で読み込むことができない。また は、Linux で書き込んだテープを他の OS で読み込むことができない。 システムが異なるとブロックサイズも異なることがあります。ブロックサイズ が固定のデバイスに、異なったサイズのブロックを読み込ませることはできま せん。 このようなテープを読むには、テープドライブのブロックサイズを書き込まれ たときのサイズに合わせてやるか、あるいは可変長にしてやる必要がありま す。 注意 : これはハードウェアのブロックサイズのことであって、tar や dump 等のコマンドのブロッキングファクターのことではありません。 ブロックサイズを変えるには mt コマンドを使います。 mt setblk 可変長にするときには以下のようにします。 mt setblk 0 mt の setblk フラグは、 Linux の配布パッケージに入っている GNU 版の mt ではサポートされていません。代わりに BSD から移植された mt コマンドを 使う必要があります。ソースコードは以下のところから入手できます。 またデフォルトでは、バッファサイズの最大値が 32K バイトに指定されてい ることに注意して下さい。これは /usr/src/linux/drivers/scsi/st_options.h (古いカーネルでは st.c) の ST_BUFFER_BLOCKS で定義されています。 32K 以上のブロックを使う場合はこ れを変更してカーネルを再構築する必要があります。 8.2.5. 「No such device」というエラーメッセージが出る テープにアクセスするたびに「No such device」といったようなエラーメッ セージが出てしまう場合です。 テープデバイスのタイプをチェックして下さい。テープデバイスはキャラクタ デバイスでなければならず、またデバイスのメジャー番号とマイナー番号が ``デバイスファイル'' に記述してあるような値になっていなければなりませ ん。 8.2.6. 読み込みには密度を指定できるのに、書き込みではできない 多くのテープドライブでは古いハードウェアとの互換性を保つために、低密度 での読み込みをサポートしていますが、普通書き込みはできません。 特に QIC のドライブでこの問題が生じることが多いでしょう。例えば古い形 式の 60M テープが読めても、書き込みは 120, 150, 250, 525M のフォーマッ トでしかできない場合などです。 8.2.7. テープの頭出しをすると全ての SCSI デバイスがフリーズしてしまう これは一度にひとつのコマンドしか処理できない SCSI ドライバで特に良く生 じる問題です。(内容については ``複数のデバイス'' を見て下さい。またど のドライバがそうかについては ``購入の手引: ドライバ機能の比較'' を見て 下さい。) しかし切断を拒否するテープドライブもいくつか存在しています。 訳注: SCSI ホストアダプタから見て、複数のコマンドを同時に実 行するには、ターゲットデバイスがディスコネクトをサポートして いることが必要です。 (つまりコマンドを受けとったら SCSI バス を解放し、データが準備できたらターゲット側からバスを要求して データ転送を行なう。それまでの間に別のデバイスに対するコマン ドの送出やデータ転送などが可能となる。) ディスコネクトをサ ポートしていないターゲットデバイスは、コマンドの実行を終るま で SCSI バスを放さないので、テープドライブの巻き戻しコマンド などを送ると悲惨なことになります。 drivers/scsi/st.c の先頭に以下の行を追加してカーネルを再構築すること で、この問題を回避できる場合もあります。 #define ST_NOWAIT この変更を行なった場合、エラー状態のレポートは次の SCSI コマンドが実行 されるまでされません。従って、mt などを使った頭出しがちゃんとできてい るかどうかを確認するには以下のようなコマンドを実行してみる必要がありま す。 mt status この確認をしておかないと、頭出しに失敗した場合にテープを上書きしてしま うことになります。 しかし複数ファイルをテープに書き込んでいて、この解決法を使わなければな らない場合は、よりサポートの良い SCSI ボードか、新しいドライブにする方 が良いかもしれません。 8.3. デバイスファイル SCSI テープはキャラクタデバイスのメジャー番号 9 を使います。 Linux では 16 ビットの dev_t を使っているので、マイナー番号には 8 ビッ トしか割り当てられていません。このため SCSI テープのマイナー番号は SCSI のホスト/ID/LUN の低い方から動的に割り付けされます。 巻戻しデバイスは 0 からはじまります。一台目の SCSI テープ /dev/rst0 は c 9 0 となり、二台目は c 9 1 となります。巻戻しをしないデバイスではマ イナー番号の最上位ビットがセットされます。つまり /dev/nrst0 は c 9 128 となります。 通常は以下のような名前が使われます。 /dev/nst{数字} 巻戻さないデバイス /dev/st{数字} 巻戻すデバイス 9. 汎用デバイス この章では汎用 SCSI デバイスのドライバに特有の情報について示します。 9.1. 対応しているハードウェア 汎用 SCSI ドライバは全ての SCSI デバイス (ディスク、テープ、 CDROM、メ ディアチェンジャーロボットなどなど) へ SCSI コマンドを送るインター フェースです。 お使いの SCSI ボードと電気的に :-) 互換性のあるものは全て動作するはず です。 9.2. よくある問題 ありません :-) 9.3. デバイスファイル SCSI の汎用デバイスはキャラクタデバイスのメジャー番号 21 を使います。 Linux では dev_t が 16ビットであるという制限から、マイナー番号は 0 か ら順番にデバイス毎に動的に割り当てられます。 /dev/sg0 は一枚目の SCSI ボードにおける最小の SCSI/LUN 番号のデバイスになりま す。 10. 購入の手引き 「Linux に対応しているたくさんのボードの中で、どの SCSI ホストアダプタ を買えばいいんでしょう?」という質問をよく聞きます。 答えは、どの程度の性能を期待するか (あるいは必要とするか) によって異な りますし、使用するマザーボードや接続を予定している SCSI 周辺機器によっ ても違ってきます。 10.1. 転送のタイプ 性能 (ここではスループットと SCSI I/O の応答時間を指しています) にもっ とも大きく影響するのは、転送のタイプです。以下、各種の転送タイプに対し て、性能に与える影響とどのような場合にお勧めかを示します。 純粋なポーリング 純粋なポーリングを行う I/O ボードは、 REQ/ACK ハンドシェークを含 むすべての SCSI 信号処理を CPU で行います。 高速な CPU であっても、単純なシーケンサよりも REQ/ACK ハンド シェークは遅いので、ピーク転送レートは高速のマシンで 150K/秒、低 速のマシンではおそらく 60K/秒程度になってしまうでしょう (ファイ ルシステムを介した転送レート)。 またドライバは SCSI バスがビジーである間ループしていなければなら ないので、SCSI I/O 中にはほぼ 100% CPU が使用され、応答が極端に 悪くなります。低速でディスコネクト/リコネクトに対応していない CDROM をこの種のボードに接続すると、使い物にならないほど応答性が 低下します。 この種のボードは、お勧めできません。 インターロックポーリング インターロックポーリングを使用したボードは、SCSI REQ/ACK ハンド シェーク信号が PC バスのハンドシェーク信号と連動していることを除 けば、純粋なポーリングのボードと本質的に変わりません。ハンド シェーク以外の SCSI 信号処理は、CPU によって行われます。 この種のボードのファイルシステムを介したピーク転送レートは、最大 で 500〜600K/秒程度です。 純粋なポーリング I/O ボードと同様に、ドライバは SCSI バスがビ ジーである間ループしていなければならないので、CPU の利用率はデバ イスの転送レートとディスコネクト/リコネクトを行う頻度によって変 化します。 CPU の利用率は 25% (ディスコネクト/リコネクトを適切に 行う等速 CDROM の場合) から 100% (高速のドライブ、またはディスコ ネクト/ リコネクトを行わないイカレた CDROM の場合) まで変化しま す。 筆者の 486-66 の場合、ヘッドレート 1080K/秒のドライブと T128 ボードで 547K/秒のスループットを得た時の CPU 使用率は 90% でし た。 コストを安く抑えることが最優先ならば、場合によって低速のテープや CDROM ドライブには使用可能でしょう。 FIFO ポーリング FIFO ポーリングを行うボードは、小さな (8K 程度の) バッファを CPU と SCSI バスの間に持っており、多少はインテリジェントな処理を行う ことができます。その結果 CPU は FIFO との間でフルスピードでデー タを転送することができ、データ転送と割り込み処理 (FIFO エンプ ティ、ディスコネクト/ リコネクト処理など) 以外には CPU を占有し ません。 ピーク転送レートは、ほとんどの SCSI デバイスに十分な値が得られま す。 FAST SCSI に対応した Seagate Barracuda と Adaptec 1520 の組 み合わせで、低レベルの SCSI コマンドを使って 64K ブロックの読み 出しを行った場合、転送レートは 4M/秒に達しました。 CPU の使用率は、デバイスの転送レートによって異なります。デバイス が高速になるほど、単位時間当たりに発生する割り込みが多くなり、よ り多くの CPU 処理時間を必要とします。高速なデバイスでは CPU 使用 率は高くなる (75% 程度) ものの、システムが使い物にならなくなるこ とは普通ありません。この種のボードは、ディスコネクト/リコネクト を行わないイカレたデバイス (安物の CDROM ドライブに多い) に対し ても、優れた応答性を示します。 予算が厳しい人にはお勧めです。 スレーブ DMA スレーブ DMA ボードのドライバは、 PC の DMA コントローラの 1チャ ネルを使ってデータ転送を行い、 CPU に制御を返します。 ピーク転送レートは、PC の DMA コントローラが低速なため、あまり高 くなりません。この種の 8bit ボードとあるマザーボードの組み合わせ では、 140〜150K/秒以上の転送レートでは問題が生じました。 CPU 使用率はかなり優秀で、FIFO ポーリング I/O ボードよりもわずか に低い程度です。この種のボードは、ディスコネクト/リコネクトを行 わないイカレたデバイス (安物の CDROM ドライブに多い) にも十分耐 えられます。 低速の CDROM やテープドライブには使用可能でしょう。 バスマスタリング DMA インテリジェントなボードです。この種のボードのドライバは、SCSI コマンド、ターゲットと LUN、それにデータへのポインタを構造体に セットして、ボードに処理を任せます。ドライバは他のプログラムに制 御を戻し、SCSI ボードは割り込みをあげて処理が終わったことを知ら せます。 インテリジェンスがドライバではなくファームウェアにあるため、この 種のボードのドライバは、同期転送、タグ付きコマンドキューイングな ど、より高度な機能をサポートすることができます。 単位のリード/ライトを行うパッチを当てると、ファイルシステムを介 したピーク転送レートは、ライトの場合でヘッドレートの 100%、リー ドの場合で 70% に達します。 CPU 使用率は I/O 負荷に関わらず最小で、Adaptec 1540 で倍速 CDROM をアクセス中に 5%、SCSI ディスクに 1.2M/秒で継続的にデータ転送し ている場合で 20% でした。 予算が非常に厳しい場合、マザーボードにバグがある場合 (バグのある マザーボードには、バスマスタが動作しないものもあります)、スルー プットよりもデータアクセス時間の方が重要なアプリケーションを使っ ている場合 (バスマスタのオーバヘッドは 1コマンドあたり 3〜4ms あ ります) を除き、常にお勧めできます。 10.2. スキャッタ/ギャザ 性能に大きな影響を与える 2番目に重要なドライバやハードウェアの機能はス キャッタ/ギャザ I/O です。 SCSI コマンドの実行に必要なオーバヘッドはか なり大きく、ミリ秒のオーダです。Adaptec 1540 のようなインテリジェント バスマスタは、ターゲットに SCSI コマンドを送る前の処理に 3〜4ms かかる 場合があります。バッファなしのデバイスの場合、このオーバヘッドは次のセ クタにアクセスするのに常にもう1回転待たなければならないほど大きいた め、一度に1ブロックの転送を行なう場合には、転送レートは 60K/秒 (3600rpm のドライブの場合) にまで低下してしまいます。したがって、性能 を上げるためには、与えられた大きさのデータを転送するのに必要な SCSI コ マンドの数を少なくすることが必要となってきます。これは、ひとつのコマン ドあたりに転送されるデータ量を大きくすることを意味します。 Linux の バッファキャッシュの設計により、ディスクブロックとして連続しているデー タであっても、メモリ上で連続しているとは限りません。クラスタごとのリー ド/ライトパッチがあたっている場合には、4K のバッファは連続しています。 したがって、SCSI コマンドあたり転送されるデータ量は最大で 1K * ス キャッタ/ ギャザ領域の数 (クラスタごとのリード/ライトパッチがあたって いない場合)、あるいは4K * スキャッタ/ギャザ領域の数 (クラスタごとの リード/ライトパッチがあたっている場合) となります。実験の結果、私たち はひとつの SCSI コマンドあたりに転送するデータの大きさは 64K が適当だ ろうという結論に達しました。これは、クラスタごとのリード/ライトパッチ が当たっている場合でバッファサイズの 16倍、そうでない場合には 64倍で す。 16K から 64K に転送サイズを増やした結果、Adaptec 1540 シリーズの ボードを使った場合でファイルシステムを介した読み書きがヘッドレートの 50% から 75% (リードの場合) および 100% (ライトの場合) にまで向上しま した。 10.3. メールボックスインターフェース Ultrastor や WD7000 や Adaptec 1540 や 1740、それに BusLogic のボード など、インテリジェントなホストアダプタの多くはメイルボックスインター フェースを持っています。これは、SCSI コマンドを実行する際、特定のメモ リアドレス (メイルボックス) に SCSI コマンド構造体を書き込み、ボードに 信号を送り (つまり、出すべきメールがあることを示すフラグを上げ)、結果 (返信) を待つものです。このような高レベルのプログラミングインター フェースを使用した場合、ソフトウェアの変更なしに FAST + WIDE SCSI のよ うな新しい機能を持ったボードにバージョンアップできることが多くなりま す。一般的な傾向としてドライバはシンプルな実装で機能が多く、安定したも のになります。 それに対して NCR53c7/8xx ファミリや Adaptec AIC-7770/7870 チップ (274x、284x、それに 2940 ボードに使われています) などのボードは、より 低レベルのプログラミングインターフェースを使います。この利点としては、 処理の多くがボード上のプロセッサからより高速なホスト CPU に移るため高 速化しやすいという点、柔軟性に富みある種の機能 (任意のデバイスに対する ターゲットモードなど) が実装しやすいという点、それに製造コストが低い (NCR のボードのように、消費者にとっても安く買えることにつながります) という点などがあげられます。一方欠点としては、ドライバが複雑になりがち (これはバグの入り込む余地も多くなることを意味します) だという点、それ に新しいチップの機能を生かすためにはドライバの変更が必要だという点があ げられます。 10.4. バスのタイプ バスのタイプは次に考慮すべき点で、ISA、EISA、VL、それに PCI などの選択 肢があります。マーケティングの連中は、バースト転送レートと空想に基づい たばかばかしい数値を宣伝していますが、こんなものは実際の役には立ちはし ません。そのかわりに私は各種の周辺機器について測定した結果をもとにし た、より実用的な数値を示すことにします。 ISA バンド幅は、バスマスタデバイスの場合、5M/秒よりも少し良い程度で す。ISA バスの調停は、いにしえの 8237 DMA コントローラによって行 われるので、バスの獲得にかかる時間は比較的長くなります。割り込み の検出はエッジトリガ方式なので、割り込みの共有はできません。通 常、ISA はバッファされていないため、転送中はホストバスとメモリバ スが占有されてしまいます。バスの占有を防ぐメカニズムは提供されま せん。 VL バンド幅はおよそ 30M/秒です。システムによっては規格から外れたタ イミングでバスを駆動しているものもあり、このようなシステムでは動 かないボードもありますから、返品保証のないハードウェアを購入する 場合にはこの点を考慮する必要があります。通常、VL バスはバッファ されていないため、転送中にはホストバスとメモリバスが占有されてし まいます。 EISA バンド幅はおよそ 30M/秒ですが、バスマスタ転送は通常 VL よりも高 速です。バスがバッファされているシステムでは、高速なホスト/メモ リバスへのバースト転送が可能で、CPU 性能への影響も最小限となりま す。 EISA の割り込み検出はエッジトリガにもレベルセンスにも設定で きるため、ドライバが対応していれば割り込みの共有が可能です。 EISA バスはボードごとに独立したアドレス空間を割り当てるため、ISA や VL に比べて資源の衝突が起こるおそれは少なくなります。 PCI バンド幅はおよそ 60M/秒です。PCI システムはたいていホストブリッ ジ上に遅延書き込みバッファを持っており、バス間のスピードの違いが バスや CPU の性能に与える影響を最小限に抑えることができます。 PCI の割り込みはレベルセンスなので、ドライバが対応していれば割り 込みを共有することが可能です。バスの占有を防ぐメカニズムが提供さ れており、マスタとスレーブのどちらからでもバスサイクルを中断する ことが可能です。 PCI は、書き込み可能な設定レジスタをボードごとに独立したアドレス 空間に持っており、プラグアンドプレイメカニズムを提供します。正し く実装された PCI システムはプラグアンドプレイ機能を持っていま す。 PCI はトレース長、負荷、機械的寸法などについて大変厳密に規定して いるので、VL や ISA よりも信頼性は高いはずです。 結論を言うと、PCI が最良の PC バスですが、弱点もあります。PCI は まだ製品が世に出てから日が浅く、大部分のメーカーはすでに問題を解 決しているとはいえ、まだ古いバグありの PCI ハードウェアやイカレ た BIOS が存在します。このため、筆者は返品保証付きのハードウェア を購入することを強くお勧めします。最近の PCI マザーボードは真の プラグアンドプレイを実現していますが、古いボードではジャンパとソ フトウェアによる設定が必要な場合もあります (例えば割り込みレベル の割当)。 PCI の問題を解決するには時間がかかることが多く、このた めシステムを動作させるまでの時間が非常に重要な場合にはおすすめで きません。 低速の SCSI デバイス、例えばヘッドレートが 2M/秒程度かそれ以下のディス クや CDROM、テープドライブに関しては、PC 側のバスインターフェースが 違ってもスループットはほとんど変化しません。最近のギガバイトクラスのハ イエンド SCSI ドライブのヘッドレートは 4-5M/秒に達し、あるメーカーは 14M/秒のヘッドレートを実現する並列ヘッドユニットのアルファテストを行っ ています。このようなドライブでは高速なバス上のコントローラが性能を発揮 します。あるユーザーは Adaptec 1542 ISA ボードから NCR53c810 PCI ボー ドに変えて、2.5倍性能が向上したそうです。 PCI の遅延書き込みや、同様のライトバッファ機構が使用される場合を除い て、システム中のひとつのバスがビジーのときは、すべてのバスがアクセス不 可能となります。したがって、バスのスピードが頭打ちになることは SCSI の 性能に影響しないとしても、システムの応答性には悪影響を与えるおそれがあ ります。つまり、ISA バス上で 4M/秒の SCSI ディスクを使用している場合、 バンド幅の 80% を失っていることになります。 ISA/VL システムでは画面描 画に使えるのは 6M/秒しかありません。たいていの場合、バックグラウンドで 実行中のジョブには同様の影響があります。 16M 以上のメモリーがあっても ISA バスマスタ SCSI ボードが使えないわけ ではないことに注意してください。他のイカレた OS と違って、Linux は ISA コントローラで 16M 以上の領域に DMA 転送する時にはダブルバッファリング を行います。これによる性能の低下はわずか 1.5% 程度で、まったく気になり ません。 最後に、バスインターフェースが違っても、バスマスタ方式のボードの値段は それほど変わらないことが多い、ということは覚えておいてください。 以上の議論を踏まえて、目的によってバスに順序をつけると次のようになるで しょう。 安定性を求める。インストールに必要な時間が EISA ISA VL PCI 重要。ボードが返品できない場合。 性能を求める。インストールには多少時間が PCI EISA VL ISA かかってもよい。 訳注: 現在の PCI は、少なくとも VL よりは安定していると思い ます。 すでに述べたように、バスマスタ方式が総合的なシステムの性能に与える影響 は非常に大きくなってきているので、SCSI コントローラを購入する際にはバ スのタイプよりもバスマスタであるかどうかの方を重視すべきです。 10.5. 複数のデバイス SCSI バス上に複数のデバイスが存在する場合、ホストアダプタやドライバが 同時に複数のコマンドを並列に処理できるかどうかが重要になってきます。こ の機能は、テープドライブを使用する場合にはほぼ必須となりますし、例えば CDROM とディスクドライブといった、スピードの異なるデバイスが存在する場 合には非常に望ましい機能と言えます。 Linux ドライバが1つのコマンドしか 同時には処理できない場合、テープドライブがテープを巻き戻したりメディア の最後を探している間 (おそらく 30分ほど)、ディスクドライブにアクセスで きなくなってしまいます。ディスクドライブが 2台ある場合、この問題は顕著 ではありませんが、スループットが 2台の転送レートの和ではなく、2台の転 送レートの平均になってしまいます。 10.6. SCSI-I、SCSI-II、SCSI-III、FAST および WIDE オプションなどにつ いて SCSI は年々進歩しています。新しいバージョンの規格には、より高い転送 レートやスループットを向上させるための方法、新しいデバイスに対するコマ ンドの標準化、すでにサポートされているデバイスに対する新しいコマンドの 追加などが規定されています。 SCSI のリビジョンレベルそれ自体には、実際には意味はありません。 SCSI- II が SCSI-I の単一イニシエータオプションを許さない、といった些細な点 を除けば SCSI は下位互換性を保っており、新しい機能は必須機能としてでは なく、オプション機能として導入されます。したがって、SCSI アダプタを SCSI、SCSI-II、あるいは SCSI-III と呼ぶのはマーケティング的な意味しか ないと言っても過言ではないでしょう。 10.7. ドライバ機能の比較 ドライバ機能の比較を以下の表に示します (そのドライバでサポートされてい るチップはカッコ内に示してあります)。 ドライバ名 同時発行可能な スキャッタ/ 複数 転送モード コマンド数 ギャザの制限 ボード 全体/LUN AM53C974 バスマスタリング DMA 12s/1s 255s Y aha152x FIFO(8k) ポーリング 7s/1s 255s N (AIC6260, AIC6360) aha1542 バスマスタリング DMA 8s/1s 16 Y aha1740 バスマスタリング DMA 32s 16 N aha274x バスマスタリング DMA 4s/1s 255s Y BusLogic バスマスタリング DMA 192/31 128s, 8192h Y (この値は BT-948/958/958D のもので、古いボードのサポートするコマンド数は もっと少ない) eata_dma バスマスタリング DMA 64s-8192h/2-64 512s, 8192h Y fdomain FIFO(8k) ポーリング 1s 64s N (TMC1800, TMC18c30 は 2k FIFO TMC18c30, TMC18c50, TMC36c70) in2000* FIFO(2k) ポーリング 1s 255s N g_NCR5380 純粋なポーリング 16s/2s 255s Y (NCR5380, NCR53c80, NCR5381, NCR53c400) gsi8* スレーブ DMA 16s/2s 255s (NCR5380) PAS16 純粋なポーリング 16s/2s 255s Y (NCR5380) またはインターロックポーリング (システムによっては動作しません!) seagate インターロックポーリング1s/1s 255s N wd7000 バスマスタリング DMA 16s/1s 16 Y t128 インターロックポーリング16s 255s Y (NCR5380) qlogic インターロックポーリング1s/1s 255s N ultrastor バスマスタリング DMA 16s/2s 32 Y 53c7,8xx バスマスタリング DMA (NCR53c810, NCR53c815, NCR53c820, NCR53c825) rel5 1s/1s 127s N rel10 8s/1s 127s Y 注: 1. 後ろに '*' の印が付いたドライバは配布版のカーネルには含まれておら ず、バイナリブートイメージは入手できないかもしれません。 2. 後ろに 's' のついた数字はソフトウェアによる恣意的な制限で、コンパイ ル時に define し直すことによって変更することができます。 3. 後ろに 'h' のついた数字はハードウェアによる制限で、Linux のドライバ によるソフトウェアの制限と一致しないことがあります。 4. 後ろに何も付いていない数字は、ハードウェアまたはソフトウェアのいず れかによる制限です。 5. NCR53c810 ドライバのリリース 5 は、カーネル 1.2.x および 1.3.x に含 まれています。リリース 10 は匿名 FTP によって入手可能です。 6. AM53C974 を例外として、バスマスタ DMA ボードはインテリジェントで す。NCR のチップはメインメモリ上のマイクロコードを実行しますが、 AIC7770 はオンチップ RAM 上のマイクロコードを実行します。それ以外の チップはメールボックス形式のインターフェースを持っています。 10.8. ボードの比較 ボード名 ドライバ バス 価格 備考 Adaptec AIC-6260 aha152x ISA ボードではなくチップ Adaptec AIC-6360 aha152x VLB ボードではなくチップ (VL/ISA の SCSI つきマルチ I/O ボードの多くと Zenon の マザーボードに使われています) Adaptec 1520 aha152x ISA Adaptec 1522 aha152x ISA $80 1520 + FDC Adaptec 1510 aha152x ISA ブート ROM なしの 1520 自動認識不可 Adaptec 1540C aha1542 ISA Adaptec 1542C aha1542 ISA 1540C + FDC Adaptec 1540CF aha1542 ISA FAST SCSI-II Adaptec 1542CF aha1542 ISA $200 1540CF + FDC Adaptec 1640 aha1542 MCA Adaptec 1740 aha1740 EISA 生産中止 Adaptec 1742 aha1740 EISA 生産中止、1740 + FDC Adaptec 2740 aha274x EISA Adaptec 2742 aha274x EISA FDC つき Adaptec 2840 aha274x VLB Adaptec 2842 aha274x VLB FDC つき Adaptec 2940 aha274x PCI Always IN2000 in2000 ISA BusLogic BT-948 BusLogic PCI $180 Ultra SCSI BusLogic BT-958 BusLogic PCI $230 Wide Ultra SCSI (BusLogic のボードの詳細については、 ``BusLogic MultiMaster ホストアダ プタ'' を参照してください。) DPT PM2011 eata_dma ISA FAST SCSI-II PM2012A eata_dma EISA FAST SCSI-II PM2012B eata_dma EISA FAST SCSI-II PM2021 eata_dma ISA FAST SCSI-II PM2022 eata_dma EISA FAST SCSI-II PM2024 eata_dma PCI FAST SCSI-II PM2122 eata_dma EISA FAST SCSI-II PM2322 eata_dma EISA FAST SCSI-II PM2124 eata_dma PCI FAST SCSI-II PM2124 eata_dma PCI FAST SCSI-II PM2124 eata_dma PCI FAST SCSI-II PM2124 eata_dma PCI FAST SCSI-II PM2124 eata_dma PCI FAST SCSI-II PM2124 eata_dma PCI FAST SCSI-II PM2041W eata_dma ISA Wide Single-ended SCSI-II PM2041UW eata_dma ISA Ultra Wide Single-ended PM2042W eata_dma EISA Wide Single-ended PM2042UW eata_dma EISA Ultra Wide Single-ended PM2044W eata_dma PCI Wide Single-ended PM2044UW eata_dma PCI Ultra Wide Single-ended PM2142W eata_dma EISA Wide Single-ended PM2142UW eata_dma EISA Ultra Wide Single-ended PM2144W eata_dma PCI Wide Single-ended PM2144UW eata_dma PCI Ultra Wide Single-ended PM3021 eata_dma ISA multichannel raid/simm sockets PM3122 eata_dma EISA multichannel/raid PM3222 eata_dma EISA multichannel raid/simm sockets PM3224 eata_dma PCI multichannel raid/simm sockets PM3334 eata_dma PCI Wide Ultra SCSI multichannel raid/simm sockets DTC 3290 aha1542 EISA 動作するはずですが、 ドキュメントリリース ポリシーのため、DTC の ハードウェアはサポート されません DTC 3130 53c7,8xx PCI '810 DTC 3130B 53c7,8xx PCI '815 DTC 3292 aha1542 EISA 3290 + FDC DTC 3292 aha1542 EISA 3290 + FDC Future Domain 1680 fdomain ISA FDC Future Domain 3260 fdomain PCI NCR53c810 53c7,8xx PCI $60 ボードではなくチップ。 (FIC、Chaintech、Nextor、Gigabyte (ボード) ボードには BIOS は などの SCSI ボードや AMI、ASUS、 含まれていませんが、 J-Bond などのマザーボードに使われ たいていのマザーボード ています。DEC PCI システムに には SDMS BIOS が 使われているのも普通これです。) ついています。 NCR53c815 53c7,8xx PCI $100 NCR53c810 + BIOS (Intel PCISCSIKIT NCR8150S など) NCR53c825 53c7,8xx PCI $120 NCR53c815 の WIDE 版。 現在の Linux ドライバは Wide 転送のネゴシエー ションを行なわないこと に注意。 Pro Audio Spectrum 16 pas16 ISA サウンドボード + SCSI Seagate ST01 seagate ISA $20 ドライブによっては BIOS は動作しません Seagate ST02 seagate ISA $40 ST01 + FDC Sound Blaster 16 SCSI aha152x ISA サウンドボード + SCSI Western Digital 7000 wd7000 ISA FDC つき Trantor T128 t128 ISA Trantor T128F t128 ISA T128 + FDC IRQ 10 以上をサポート Trantor T130B g_NCR5380 ISA Ultrastor 14F ultrastor ISA FDC つき Ultrastor 24F ultrastor EISA FDC つき Ultrastor 34F ultrastor VLB 注: 1. Trantor は最近 Adaptec に買収されました。いくつかの製品は Adaptec の名前で売られています。 2. Ultrastor は最近 Chapter 11 による破産を宣告されたため、現時点では テクニカルサポートを受けることはできません。 3. NCR53c810 ボードの値段は間違いではありません。これには DOS 用の標準 の ASPI/CAM ドライバパッケージを含んでいます。OS/2 や Windows (32 ビットアクセス) などのドライバも無料でダウンロードすることができま す。 この会社にコンタクトしてみてください。 SW (swt@netcom.com) (214) 907-0871 fax (214) 907-9339 1995年 12月 23日の時点で、ここでは '810 のボードを 53ドルで売っていま した。 4. Adaptec の最近の SCSI チップはケーブルやターミネーションの問題に非 常に敏感です。このため、私は Adaptec の 154x C および CF バージョン や 2xxx シリーズのホストアダプタをお勧めすることはできません。 この問題は、古い 154x B バージョンや 174x A バージョンのボード、そ れに私の知る限りでは AIC-6360/AIC-6260 チップを使ったボード (1505、1510、1520 など) などには当てはまらないことに注意してくださ い。 また、Adaptec のテクニカルサポートの質は最近とみに低下しました。長 い間待たされることはしょっちゅうですし、従業員は無知だったり (公開 されている文書を公開してはいけないかのように示唆したり)、敵意をあら わにしたり (自分が答えられない問題を他の従業員に渡すことを拒否した り) するのです。 政治的な発言をする場合には、この点を考慮に入れて下さい。この点を除 いては、Adaptec の 152x/1510/1505 ボードは、同価格帯の他の ISA ボー ドよりも優れていますし、中古や在庫処分品の 154x B や 1742 ボードを 安く手に入れることができれば、サポートの問題には目をつぶってもいい と私は思います。 5. DPT のボードはすべてキャッシュと RAID モジュールのアップグレードが 可能です。また多くのボードにはワイド/ディファレンシャルバージョンが あります。 6. NCR のボードには各種ありますが、まったく同じだというわけではありま せん。ASUS SC200 はアクティブターミネーションですが、他の NCR53c810 ボードの多くはパッシブターミネーションです。 '825 ボードの多くはア クティブターミネーションですが、ROM BIOS のものもあれば FLASH ROM のものもあるという具合です。 '825 ボードの多くは外部 WIDE コネクタ と内部 WIDE コネクタ、それに通常の内部コネクタを持っていますが、通 常の内部コネクタを持っていないもの (CSC の安価なモデルなど) もあり ます。 10.9. まとめ 性能、機能 (アクティブターミネーションなど)、Adaptec 1540 シリーズとの 互換性などの点から、BusLogic のMultiMaster ボードは ISA、EISA、 VL、PCI のいずれにもお勧めできます。 EISA、ISA、PCI、VL のバスインター フェースとシングルエンドやディファレンシャル、8/16 ビットの SCSI バス に対応したたくさんのモデルが用意されています。最新の Ultra SCSI PCI モ デル BT-948/958/958D はフラッシュ ROM により容易にファームウェアをバー ジョンアップでき、スマートターミネーション機能も持っています。 最高の I/O 性能を求める人には、DPT のボードがいいでしょう。 RAID と キャッシュ、複数の SCSI チャネルに対応したボードは他にありません。 PCI システムを使っている場合、NCR53c8xx チップを使ったボードは検討に値 します。バスマスタ SCSI コントローラが、53ドル (何と Adaptec 1520 より も安い!) という値段で手に入るのです。 C't マガジンによる DOS のベンチ マークでは Adaptec 2940 や BusLogic BT-946C を凌ぐ性能が出ています し、Linux でもかなりの性能 (ファイルシステムを介して 6M/sec) が得られ ています。これらのボードの BusLogic に対する弱点は、Adaptec 1540 互換 でないことと、アクティブターミネータがついているかどうかわからないこ と、ハードウェアの性能を発揮させるためには最新のドライバ (1.3.5x の カーネルには標準でついてきます。1.2.x のカーネル用のドライバは匿名 ftp で取ってくることができます) が必要だということ、それに BusLogic や DPT などのメールボックスインターフェースのボードに比べてドライバに問題が起 こりやすいという点です。 確実に動作させることが必要な場合には、BusLogic MultiMaster か DPT の ボードがおそらくベストでしょう。 NCR53c8xx や Adaptec AIC7xxx のような メールボックスインターフェースでないボードはドライバが複雑で問題が生じ やすいので、このような目的には適していません。 予算が限られていて、PCI 以外の SCSI カードが必要ならば、在庫処分品や中 古の Adaptec 154x B バージョンや 174x A バージョンのボードを見つける か、Adaptec 1520 互換のボード (新品で 80ドルくらいからあります) を探す のがいいでしょう。これらのボードのスループットと応答性はかなりのもの で、値段もまあまあです。 11. マイナー番号の割り当て Linux では、dev_t に 16ビットを使用しており、マイナー番号には 8ビット しか割り当てられていないため、SCSI ディスクやテープ、CDROM、それに汎用 デバイスのマイナー番号は、以下にしたがって動的に割り当てられます。 For すべての SCSI ホストアダプタ (scsi0 から scsiN まで) について For ホストアダプタ自身の ID を除く、すべての SCSI ID (0 から 7 まで) について For すべての LUN (0 から max_scsi_luns まで) について - TEST UNIT READY コマンドを発行して、バス、ターゲット、 LUN の組み合わせを探索する。あるバス上の SCSI ID に デバイスが存在しないと判断したら、そのバスと SCSI ID の 対しては LUN の探索を行わない。 - INQUIRY コマンドを発行して、見つかったデバイスに関する 情報を集める。デバイスタイプ、メーカー、モデル名、 ファームウェアのバージョンなど。 - この結果を特別な認識関数を通して、存在するハイレベル ドライバ (ディスク、テープなど) に通知する。 このデバイスを扱えるドライバのユニットとしてアタッチする。 汎用ドライバはすべてのデバイスをアタッチする。 - SCSI-I デバイスの場合、あるいは複数の LUN を扱えない デバイスのリストに載っているデバイスの場合は、 このバスのこの SCSI ID に対して LUN の探索を行わない。 - 複数の LUN を持っていることがわかっているデバイスの 場合は、max_scsi_luns を無視してすべての LUN を スキャンする。 この方法では、しばしば問題が生じる場合があるということが分かっていま す。ある時点でしか存在しないデバイスがあった場合、そのデバイスのマイ ナーデバイス番号は、ブート時に見付かったデバイスに依存して決まります。 この場合、rc スクリプトや /etc/fstab ファイルによってマウントされる パーティションのマイナー番号が異なってしまう可能性があるからです。 この問題は、まだ完全には解決されていません。 /dev/scsi 以下のデバイス 階層をホスト番号と SCSI ID および LUN から作成するプログラムがあり、 から取ってくることができます。ちょっと扱いづら い点もありますが、これによって問題の一部が軽減されることは確かでしょ う。 多分もっと良い解決法は、/proc/scsi 擬似ディレクトリを使うことでしょ う。現在作業が進行中なので、どのような方法になるかはまだ正確には言えま せんが、この問題を解決するためには有望だと思えます。