Linux SCSI HOWTO

Drew Eckhardt, <drew@PoohSticks.ORG>
(linuxdoc-sgml への変換は Dieter Faulbaum <faulbaum@bii.bessy.de>)

v2.30, 30 August 1996

日本語への翻訳、および SGML タグの打ち直し
水原 文 <mizuhara@acm.org> (1〜4章、6〜7章、10章〜11章担当)
中野 武雄 <nakano@apm.seikei.ac.jp> (5章・8章〜9章担当)
1997年4月7日

注意: この文書はかなり以前に書かれたものなので、 いまどきの Linux 環境にはあてはまらない箇所があります。 (JF Project)

1. はじめに

2. よくある問題

3. バグレポート

4. カーネルモジュール

5. ホストアダプタ

6. ディスク

7. CDROM

8. テープ

9. 汎用デバイス

10. 購入の手引き

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. まで連絡してください。

もしこの文書を出版する場合には、最新のバージョンに関して筆者 <drew@PoohSticks.ORG> に問い合わせてくださるよう お願いします。 もし古いバージョンが出版されてしまうと、私は新しいバージョンに答えが 載っている質問をユーザーから受けることになりますし、それは出版する側 にもうれしくないことだろうと思うのです。 また、フリー配布を行っているサイトや、競合するパッケージや製品に関する 記述を改変しないようにお願いします。

重要:

バグレポート セクションに記述された手順に 従わないバグレポートや問い合わせは無視されます。

この文書は、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 規格は ftp://ftp.symbios.com/pub/standards/io/x3t10/drafts/scsi2/ に あります。

ターミネータが接続されるケーブルの両端に十分な電力を供給するため、 ターミネータパワーは 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.cblacklist 変数にある、バグありデバイスのリストに そのデバイスを追加し、その情報を Linus Torvalds <Linus.Torvalds@cs.Helsinki.FI> に メールして下さい。

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 スクリプトを使うのが 普通です。/devcd し、作成したいデバイスを指定して 次のように 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 が表示する正確なメッセージ、 エラーが発生する場合、それにエラーが存在するソースコードの位置 など、なるべく多くの情報を書いてください。 メッセージの取得<tt>panic()</tt> の位置を特定する に記述されている手続きに従ってください。

最大限の情報が提供されないと、開発者が問題を誤って診断したり、 他の問題を修正することがより重要だと判断することになってしまうかも しれません。

要するに、我々がバグを再現させることができない場合、 どこがおかしいのかを具体的に指摘してくれなければ、 バグを修正することはできないということです。

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 *<your EIP>

例えば以下のように。

info line *0x19c905

これに対して gdb は次のような情報を出力します。

(gdb) info line *0x19c905
Line 2855 of "53c7,8xx.c" starts at address 0x19c905 <intr_scsi+641&>
   and ends at 0x19c913 <intr_scsi+655>.

この情報を記録して下さい。それから以下のように入力します。

list <line number>

次のような出力が得られるでしょう。

(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 サポートされている/いないハードウェア

配布カーネルに含まれているドライバ

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。

MCA

MCA のカードのうち、上にあるサポートされているカードと互換性のあるもの (つまり Adaptec 1640 と BusLogic 640) は動作します。

アルファ版のドライバ

アルファ版のドライバの多くが以下のサイトに置かれています。

ftp://tsx-11.mit.edu/pub/linux/ALPHA/scsi

修正をすれば動作するドライバ

NCR53c8x0/7x0

NCR53c8xx のドライバは開発されていますが、このドライバは NCR53c700、 NCR53c710、NCR53c720 のチップに対してそのままでは適用できません。 これらのチップを動作させるには以下のような修正が必要です。 修正の難易度についても示しています。

訳注: カーネル 2.0.27 では、すでにこれらのチップはサポートされて いるようです。

NCR53c720 (簡単)

カードの検出部分の変更、初期化の変更、'810 のレジスタアドレスを '7xx 用にマッピングするためのコードの変更。

NCR53c710 (簡単)

カードの検出部分の変更、初期化の変更 (以上はアセンブラソースの変更)、'810 のレジスタアドレスを '7xx にマッピングするためのコードの変更、IID 割り 込みを扱うための割り込みハンドラを INTFLY 命令からそのエミュレーション に変更。

NCR53c700, NCR53c700-66 (非常に困難)

検出部分の変更、初期化の変更、 NCR のコードを DSA を使わないように変更、 Linux 本体のコードを変更し、コンテキストスイッチを扱えるようにする。

多分動作しない SCSI ホスト

パラレル->SCSI アダプタ全部、 Rancho の SCSI ボード、ジャンク品の SCSI カード。 Buslogic の FlashPoint ボード (BT-930/932/950 など) もま だサポートされていません。

絶対に動作しない SCSI ホスト

Adaptec と非互換で NCR53c8xx を使用していない DTC のボード (3270、 3280 など)。CMD の SCSI ボード。

DTC/CMD からプログラムに必要な情報をもらうには、秘密保持契約を結ぶ 必要があります。これはつまり Linux のドライバを書いても、そのドライバ を公開できない、ということになります。秘密保持契約に従えばソースは 公開できませんから、これは GPL に反します。また GPL に従う場合は ソースを公開しなければなりませんから、これは秘密保持契約に反する ことになります。

もしこれら以外のサポートされていないハードウェアを動かしたければ、選択 肢は二つあります。一つはあなた自身がドライバを書くことです (Eric Youngdale と私は Linux の SCSI ドライバに関する技術的な質問には通常喜んでお答え します)。もう一つはドライバの作成を依頼することです (個人での利用の場 合には契約料金が高く付きすぎるでしょうが)。

複数のホストアダプタ

ホストアダプタの中には、一台のシステムで同じ形式のアダプタを 複数使うことができるものがあります ( 購入の手引き: ドライバ機能の比較 を見てください)。 同じ形式のアダプタを一つのホストで複数使う場合は、通常最も低いアドレス のものが 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 よくある問題

SCSI がタイムアウトしてしまう

割り込みがちゃんと有効になっているか、他のボードとの IRQ、DMA、 IO アドレスなどの競合が起こっていないかを確認してください。

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, Western 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 カードに対応した節をご覧になってください。 不安定なシステム も見てください。

メモリマップ方式の I/O を用いたボードの障害

(Trantor T128 と Seagate のボードが該当します。 Adaptec、 NCR5380 汎用、PAS16、Ultrastor のボードには該当しません。)

この問題は、メモリマップされた I/O ポートが誤ってキャッシュされて いるときによく起こります。 BIOS 設定で、ボードの占有するアドレス空間をキャッシュ不可に設定して ください。

これができない場合は、キャッシュを全てオフにしてください。

ボードのアドレスをマニュアルで設定する場合は、Linux に必要なのは 16バイトセ グメントの値 (マニュアルにはたいていこちらが書いてあります) ではなく、 実際のアドレスであることに注意してください。

つまり 0xc8000 が正しい値であり、 0xc800 では正しく動作しません。後者 では恐らくメモリの内容が破壊されてしまうでしょう。

アルファ版のドライバでブートフロッピーを作ってブートさせると 「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 にしておきます (ブートデバイスがルートデバイスとなります)。

ddrawrite を用いてファイルをディスクに書き込んでください。 そのディ スクを A: のフロッピードライブに入れ、「ルートディスクを入れるように」 というプロンプトが出るのを待って、お使いの配布パッケージのルートフロッ ピーを入れてください。

標準カーネルに入っていないドライバをインストールするには

まずドライバの作者が使っているバージョンのカーネルを手に入れる必要があ ります。バージョンの情報は恐らくドライバと同時に配布されているドキュメ ントに記述があるでしょう。

最新のものを含め、様々なバージョンのカーネルは

ftp://nic.funet.fi/pub/OS/Linux/PEOPLE/Linus

にあります。名前は 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/linuxcd してから

patch -p1 < patches 

と打ち込みます。これで linux-new は無視されます。

パッチ当てが終わったら、失敗したパッチがないか調べてください。パッチが 失敗すると # という拡張子がついたファイルができているはずです。

訳注: 普通この拡張子は .rej ですが、patch のコンパイル時 のオプションによって、 # になることもあります。

find /usr/src/linux/ -name "*#" -print 

このようなファイルが存在したら、その中身を見てください。もしかしたら単 に RCS の識別子が違っているだけかもしれません。この場合は無害ですから 無視してかまいません。それ以外の場合は、手でパッチ当てをする必要がある かもしれません。diff ファイルの形式とパッチ当てに関してはこの文書の範 囲外です。

カーネルの設定と再構築 もご覧になってください。

パッチのないドライバをインストールするには

ときにはドライバの作者が自分の書いたドライバの .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
    
    カーネルの設定と再構築 の章も見てください。

Compaq のシステムで PCI のボードが動かない

Compaq のシステムの多くでは PCI デバイスを検出するための 32 ビット拡張 BIOS がメモリにマップされています。メモリレイアウトが特殊なために、 Linux では この BIOS をアクセスすることができません。 Linux は (サポー トされているはずの) PCI SCSI ボードの検出に失敗すると、以下のようなメッ セージが出力されます。

pcibios_init: entry in high memory, unable to access

以下のファイルを手に入れてください。

ftp://ftp.compaq.com/pub/softpaq/sp0921.zip

これは自己解凍型のアーカイブで、BIOS32 のコードを再配置するためのプロ グラムが入っています。

訳注: この zip ファイルを unzip すると、exe サフィックス を持った自己解凍型のアーカイブができます。

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 <linux/pci.h>
 
 #include <asm/segment.h>
+#include <asm/system.h>
 
 #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 を用いた製品 (標準)

可能な設定

BIOS アドレス : 0xd8000, 0xdc000, 0xd0000, 0xd4000,
                0xc8000, 0xcc000, 0xe0000, 0xe4000
IO ポート     : 0x140, 0x340
IRQ           : 9, 10, 11, 12
DMA           : 使用していません
IO            : ポートマップ方式

自動検出

BIOS が入っているボードではだいたいうまく動作するようです。入っていな いボード (Adaptec 1510、Sound Blaster16 SCSI など) では、カーネルのコ マンドラインオプションかコンパイル時の設定変更が必要になります。

自動検出の設定変更

コンパイル時

PORTBASEIRQSCSI_IDRECONNECTPARITY を 適当な値に定義してください。 「定義可能なパラメータ」のところを参考にしてください。

カーネルのコマンドライン

aha152x=<PORTBASE>[,<IRQ>[,<SCSI-ID>[,<RECONNECT>[,<PARITY>]]]]

SCSI-ID はホストアダプタの SCSI ID です。特に ID 7 が必要な他のデバイ スをつないでいない限り 7 にしておきましょう。

I/O アドレスを 0x340 に固定し、IRQ 11、SCSI-ID 7、 ディスコネクト/リコネクトを許可するようにするには、 以下のようなコマンドラインオプションを使うことになります。

aha152x=0x340,11,7,1

アップデートによって解決された問題

  1. VLB のボードでドライバが動かない問題。これは 1.0.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 (標準)

可能な設定

IO ポート      : 0x330 and 0x334 
IRQ            : 9, 10, 11, 12, 14, 15
DMA チャネル   : 5, 6, 7
IO             : ポートマップ方式、バスマスタ方式

自動検出

自動検出されるのは I/O アドレス 0x330 と 0x334 だけです。

自動検出の設定変更

aha1542=<PORTBASE>[,<BUSON>,<BUSOFF>[,<DMASPEED>]]

注意

  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 を複数回行なう必要があります。

アップデートによって解決された問題

  1. バージョン 0.99.10 以前のカーネルは 154?C のカードをサポート していません。
  2. バージョン 0.99.14k 以前のカーネルは、 154?C のカードのうち、 以下の機能をサポートしていません。
  3. バージョン 0.99.15e 以前のカーネルは 154?C の BIOS 機能のうち、 3 台以上のドライブを利用する機能を有効にすることができません。 また 1G 以上のディスクに関する拡張マッピング機能を無効にすることも できません。
  4. バージョン 0.99.14u 以前のカーネルは 154?CF のカードをサポート していません。
  5. バージョン 1.0.5 以前のカーネルでは、複数のデバイスに対するアクセスが 同時に起こると排他制御が失敗することがあります。

よくある問題

  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

可能な設定

スロット       : 1-8
IO ポート      : EISA ボードなので関係無し
IRQ            : 9, 10, 11, 12, 14, 15
DMA チャネル   : EISA ボードなので関係無し
IO             : ポートマップ方式、バスマスタ方式

自動検出

全ての設定で動作します。

自動検出の設定変更

ありません。

注意

  1. Adaptec はこのボードの生産を中止しています。

よくある問題

  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 もサポートする新しいバージョンは以下から入手できます。

ftp://ftp.ims.com/pub/Linux/aic7xxx

可能な設定

                 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             : ポートマップ方式、バスマスタ方式

自動検出の設定変更

カーネルのコマンドライン

拡張マッピングを強制するには以下のようにします。

aha274x=extended

注意

  1. BIOS を有効にしておく必要があります。
  2. 2742AT ボードの B チャンネルは無視されます。
  3. PCI ボードの場合には CONFIG_PCI を指定しておく必要があります。

5.7 Always IN2000 (標準)

可能な設定

IO ポート     : 0x100, 0x110, 0x200, 0x220
IRQ           : 10, 11, 14, 15
DMA チャネル  : 使用していない
IO            : ポートマップ方式

自動検出

BIOS は不必要。

自動検出の設定変更

ありません。

よくある問題

  1. IDE ドライブとスワッピングが設定されているシステムでは問題が あることが知られています。

5.8 BusLogic MultiMaster ホストアダプタ

(この節は Leonard N. Zubkoff <lnz@dandelion.com> に著作権があります。)
(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 サイトが ftp://ftp.buslogic.com に、BBS が 408/492-1984 にあります。 BusLogic の技術サポートには電子メール techsup@buslogic.com 、電話 408/654-0760、 FAX 408/492-1542 で 連絡をとることができます。 ヨーロッパおよび日本における連絡先は Web サイトから得ることができます。

サポートされているアダプタ

以下のリストは 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 の完全なクローンなので、 このドライバで動作させることができます。

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 と同じ順序で認識するようにしています。

BusLogic の広報用メーリングリスト

BusLogic の広報用メーリングリストは Linux ユーザに新しいドライバの リリースを知らせたり、 BusLogic SCSI ホストアダプタの Linux サポート関連の アナウンスを伝えるのに用いられています。 このメーリングリストに参加するには、本文に「subscribe」と書いたメールを BusLogic-announce-request@dandelion.com まで送ってください。

5.9 BusLogic FlashPoint ホストアダプタ

(この節は Leonard N.Zubkoff <lnz@dandelion.com> に 著作権があります)

現在のところ 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、 SmartCache IV、SmartRAID (標準)

サポートされているボード

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

可能な設定

スロット       : ALL
IO ポート      : ALL
IRQ            : 全レベル、エッジトリガ
DMA チャネル   : ISA のものは全て、EISA/PCI は関係無し
IO             : ポートマップ方式、バスマスタ方式
SCSI Channels  : ALL

自動検出

全ての設定で動作します。

EATA-DMA ドライバの最新バージョンは以下から入手できます。

ftp://ftp.i-Connect.Net:/pub/Local/EATA/

メーリングリスト

EATA メーリングリストは EATA-DMA および EATA-PIO ドライバを使用してい る Linux ユーザに議論の場と新バージョンその他のアナウンスの場を提供し ています。メーリングリストに参加するには、 メッセージ本文に「subscribe」と書いたメールを linux-eata-request@i-connect.net 宛に 送ってください。

/proc/scsi サポート

より詳細なコマンドの統計をとるには以下を実行してください。

echo "eata_dma latency" > /proc/scsi/eata_dma<driver_no>

これを再び off にするには以下のようにします。

echo "eata_dma nolatency" > /proc/scsi/eata_dma<driver_no>

よくある問題

  1. Slackware でコントローラを検出できない。

    解決法は、ascsi* のブートディスクを使うことです。

  2. 1.3.x 以前のカーネルで、IDE ドライバが EATA ボードの ST-506 イ ンターフェースを検出してしまう。
    1. 以下の 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 (あるいはその 両方) を変えてみてください。
    2. IDE のドライバが自分の扱うべきデバイス (つまり 504MB 以下のハー ドディスク) を検出すると、 IDE ドライバは IO ポートと IRQ を割り当てて しまうので、 eata のドライバはそれらを使えなくなります。この場合も IO ポートと IRQ (14、15 以外に) を変更してください。
  3. 古い SK2011 のボードにはファームウェアに問題がある場合があります。 DPT のカスタマーサポートに連絡してアップデートしてください。

注意

  1. もし PCI のボードを使っている場合は CONFIG_PCI をセットする必要 があります。

5.11 TMC-1800、TMC-18C30、TMC-18C50、TMC-36C70 のうちのどれかのチップ を使っている Future Domain の 16x0

可能な設定

<BIOS           : 2.0, 3.0, 3.2, 3.4, 3.5
<BIOS アドレス  : 0xc8000, 0xca000, 0xce000, 0xde000
<IO ポート      : 0x140, 0x150, 0x160, 0x170
<IRQ            : 3, 5, 10, 11, 12, 14, 15
<DMA チャネル   : 使用しません
<IO             : ポートマップ方式

自動検出

全ての設定で動作します。 BIOS がインストールされていることが必要です。

自動検出の設定変更

ありません。

アップデートによって解決された問題

  1. 古いバージョンでは TMC-18C50 チップに対応していません。 従って新しいボードでは動作しないでしょう。
  2. 古いバージョンは最近の BIOS シグネチャの自動検出情報を持っていません。
  3. 1.0.9 あるいは 1.1.6 カーネルに含まれているバージョンよりも古い ドライバでは、新しいチップや 3.4 版の BIOS に対応していません。

注意

  1. Future Domain の BIOS は SCSI 番号の大きい方からデバイスをスキャン します。これは他の SCSI BIOS とは逆になります。従って sda になるのは 「ドライブ番号」の最後 (つまり C:、D: とあったら D:) のディスクになります。 また LILO を使う際には disktab を使用する必要があります。

5.12 NCR5380 汎用 / T130B (標準)

可能な設定

IO ポート     : all
IRQ           : all
DMA チャネル  : DMA は使用しません
IO            : ポートマップ方式

自動検出

できません。

自動検出の設定変更

コンパイル時

GENERIC_NCR5380_OVERRIDE を IO ポート、IRQ、DMA、およびボード形式 からなる配列データとして定義します。

ポート 0x330、IRQ 5 の NCR5380 の場合は以下のようになります。

#define GENERIC_NCR5380_OVERRIDE {{0x330, 5, DMA_NONE, BOARD_NCR5380}}

ポート 0x350 の T130B の場合なら以下のようになります。

#define GENERIC_NCR5380_OVERRIDE {{0x350, 5, DMA_NONE, BOARD_NCR53C400}}

古いバージョンのコードでは BOARD_* のエントリが無視されるかもしれません。

IRQ の部分に IRQ_NONEIRQ_AUTO が使えます。

カーネルのコマンドライン

ncr5380=port,irq
ncr5380=port,irq,dma
ncr53c400=port,irq
                 
irq を使わない場合は 255、自動選択する場合は 254 にします。

よくある問題

  1. T130B で NCR5380 汎用の古いドライバ (パブリック リリース 6 以前) を使うと ncr53c400 コマンドラインオプションが使えない。

    NCR5380 互換レジスタのベースアドレスからのオフセットは 8 です。 従って、ベースアドレスが 0x350 ならば、カーネルのコマンドラインから 以下のように入力してください。

    ncr5380=0x358,254
    

アップデートによって解決された問題

  1. T130B 等の NCR53c400 を用いたボードで、カーネルがディスクアクセス中に フリーズする。

    パブリックリリース 6 以前の NCR5380 汎用ドライバは これらのボードの割り込みに対応していません。 バージョンアップして下さい。

注意

  1. このドライバはまだ DMA をサポートしていません。 擬似 DMA もサポートされていません。

5.13 NCR53c8xx (標準)

可能な設定

ベースアドレス : ALL
IRQ            : ALL
DMA チャネル   : PCI なので関係なし
IO             : ポートマップ方式、バスマスタ方式

自動検出

PCI BIOS が必要です。デバイスのスキャンやコンフィギュレーション空間の 読み出しには PCI BIOS のルーチンを使っています。

ドライバは初期化の際、いくつかのレジスタにプログラムされている値を用います。 従って BIOS がインストールされている必要があるのです。

アップデートによって解決された問題

  1. 古いバージョンのカーネルではスワップの際に問題が生じることがあります。 ディスク: スワップ時にシステムがハングする の 節を見て下さい。
  2. 古いドライバでは '815 と '825 を用いたボードを認識できません。
  3. 配布版のカーネルに入っているドライバはリリース 4 または 5 の ものです。これらにはまだ重要な機能が実装されていません。 例えばディスコネクト/リコネクト (これがないとテープの巻戻しや頭出しの ときに SCSI デバイスをフリーズさせてしまう原因になります) や複数の ホストアダプタへの対応、BIOS なしの動作などです。
    訳注: 最新のカーネル (2.0.27) では、ディスコネクト/リコネクトは サポートされています。

    ドライバの最新リリース版は以下のところから手に入ります。

    ftp://tsx-11.mit.edu/pub/linux/ALPHA/scsi/ncr53c810

    現在のところここには 1.2.10 以降へのパッチが置いてありますが、 次のリリースでは 1.3.x だけになります。これらのパッチはすべて 完璧に当たるとは限りません。ELF 対応パッチや他のパッチが開発 者である私のベースシステムには既に当たっているからです。 もしパッチの際の障害 (4つあります) を手動で訂正できない場合は、 これらのパッチは使わないで下さい。パッチは最新のものだけが必要です。 インクリメンタルなパッチではありません。

    次のリリースが待てず、NCR のドライバを 1.3.x カーネルで使いたいという方の ために、 Harald Evensen <Harald.Evensen@pvv.unit.no> が 1.3.x 用の パッチを公開しています。

    ftp://ftp.pvv.unit.no/pub/Linux/ALPHA/ncr

    これらのパッチは問題なく当たるはずです。

    まずこれらのディレクトリの README ファイルをすべて読んで下さい。 またアルファ版のコードを用いたい場合は NCR メーリングリストにも 入って下さい。ここでは暫定的なバグフィックスや次バージョンの リリース情報などがポストされます。

    参加するには以下のような内容をメール本文に書いて、 majordomo@colorado.edu に 送って下さい。

    subscribe ncr53c810
    

    参加をやめる場合にはメール本文に以下のような内容を書いて同じアドレスに 送って下さい。

    unsubscribe ncr53c810
    

よくある問題

  1. DOS ではうまく動いているのに、Linux では割り込み待ちの状態で タイムアウトしてしまう、という問題を多くの人が経験しています。 これはスロットのカードないしはマザーボードのジャンパによる IRQ の ハードウェア設定と、BIOS 設定の値が異なっているためで あることが多いようです。以下をよく確認して下さい。 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.cpci_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 になってしまいます。 ジャンパの位置を逆にしてみてください。

注意

  1. CONFIG_PCI を設定しておく必要があります

5.14 Seagate ST0x/Future Domain TMC-8xx/TMC-9xx (標準)

可能な設定

ベースアドレス : 0xc8000, 0xca000, 0xcc000, 0xce000, 0xdc000, 0xde000 
IRQ            : 3, 5
DMA チャネル   : 使用されません
IO             : メモリーマップ方式

自動検出

アドレスに関してのみスキャンを行ないます。 IRQ は 5 とみなされます。BIOS がインストールされている必要があります。

自動検出の設定変更

コンパイル時

OVERRIDE をベースアドレスに、CONTROLLERFD もし くは SEAGATE のどちらかに、IRQ をシステムの IRQ にそれぞれ 定義します。

カーネルのコマンドライン

st0x=address, irq または tmc8xx=address,irq 
(0.99.13b 以降のカーネルで動作します)

アップデートによって解決された問題

  1. カーネル 0.99.12 以前に添付されていたバージョン 1 以前の ドライバでは、遅いデバイスとのハンドシェイクに失敗することがあります。

    ハンドシェイクは以下のような手順で行われます。

    1. 1バイトのデータをデータレジスタに書き込み、データレジスタが バスにアサートされる
    2. 残り時間 = 12 us
    3. 残り時間 > 0 で、REQ がアサートされていない間待つ
    4. 残り時間 > 0 ならば ACK をアサートする
    5. 残り時間 > 0 で REQ がアサートされている間待つ
    6. ACK をデアサートする

    コマンドを読み込んで処理するのが遅いデバイスでは、 REQ/ACK ハンドシェ イクに 12us 以上の時間がかかってしまいます。するとドライバで指定されて いる経過時間が過ぎても REQ がデアサートされないので、 一つの REQ パルスに対して複数バイトのデータを送ってしまいます。

    カーネル 0.99.12 にはバグがあって、アービトレーションのコードを 書き換えた結果セレクションが失敗するようになっていました。 0.99.13 で修正されています。

よくある問題

  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_MSGSTAT_CD の定義を交換し、 カーネルを再コンパイルして下さい。 その際 CONTGROLLERSEAGATE に定義し、 IRQOVERRIDE を適当な値に設定して下さい。
  4. ドライブを fdisk しようとすると、HDIO_REQHDIO_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();
    

定義可能なパラメータ

FAST または FAST32

これらを定義すると 可能な場合にはブラインド転送を行ないます。

ARBITRATE

ホストアダプタが SCSI-II 互換の アービトレーションを行なうようにします (バスフリーフェーズを待って いきなりセレクションをはじめるのではなく)。 配布版のソースを再構成する時には、LUN 当たりひとつのコマンドを 実行するように変更する予定です (訳注: つまり今はそうなっていないと いうことか?)。

SLOW_HANDSHAKE

Seagate のソースコードのハンドシェイクの スピードについていけないイカレたデバイス (ある種の CD ROM など) を使う 時に定義してください。

SLOW_RATE=x

ハンドシェイクが正しく動作しないときに デフォルトの転送レートにする値を x に指定します。

5.15 PAS16 SCSI (標準)

可能な設定

IO ポート      : 0x388, 0x384, 0x38x, 0x288
IRQ            : 10, 12, 14, 15
        (重要) : IRQ はこのボードのサウンド機能が用いる IRQ とは
                 別にする必要があります。
DMA            : このボードの SCSI 機能では用いません。
IO             : ポートマップ方式

自動検出

BIOS は必要ありません。

自動検出の設定変更

コンパイル時

PAS16_OVERRIDE を IO ポートと IRQ の配列として定義して下さい。 ポート 0x388、IRQ10 の場合ならば以下のようになります。

#define PAS16_OVERRIDE ((0x388, 10))

カーネルのコマンドライン

pas16=port,irq 

定義可能なパラメータ

AUTOSENSE

定義されていると CHECK CONDITION ステータスを 返してくるコマンドに対して自動的に REQUEST SENSE が実行されます。

PSEUDE_DMA

擬似 DMA のハードウェアを使用できるようにします。 性能は I/O ポーリングを使ったものの 3-4 倍になります。

PARITY

パリティチェック機能を有効にします。 まだサポートされていません。

SCSI2

SCSI-II タグ付きコマンドキューイングをサポートします。 テストされていません。

UNSAFE

割り込みを許可したまま擬似 DMA 転送を行います。 高速シリアル通信でデータ落ちが生じる場合にだけ使って下さい。 その場合でも、転送サイズを変更する方が良い結果が得られるでしょう。

USLEEP

ディスコネクトを行なわないデバイスをサポートします。 テストされていません。

よくある問題

  1. コマンドがタイムアウトしたり強制終了してしまう 少し前に私がネットにポストした NCR5380 のパッチをインストールするのが 良いでしょう。このパッチは将来のアルファ版に統合されるはずです。このパッ チでは古い NCR5380 ドライバにあった排他制御の問題を修正しており、また NCR5380 を用いたボードの複数デバイスのサポートの部分もなおしてあります。 これで直らなければ、PSEUDO_DMA の定義を無効にして下さい。 drivers/scsi/pas16.c の中の #define PSEUDO_DMA #undef PSEUDO_DMA に修正します。 後者の方法は最後の手段と思って下さい。この方法を選ぶと著しく性能が落ち てしまいます。

5.16 Trantor T128/T128F/T228 (標準)

可能な設定

ベースアドレス :  0xcc000, 0xc8000, 0xdc000, 0xd8000
IRQ            : なし, 3, 5, 7  (全てのボード)
                 10, 12, 14, 15 (T128F のみ)
DMA            : 使用していません
IO             : メモリーマップ方式

自動検出

全ての設定において動作します。BIOS がインストールされている必要があります。

自動検出の設定変更

コンパイル時

T128_OVERRIDE をベースアドレスと IRQ からなる配列として定義します。 例えばアドレス 0xcc000、IRQ 5 のボードの場合には以下のようになります。 IRQ の指定には IRQ_NONEIRQ_AUTO も使えます。

#define T128_OVERRIDE ((0xcc000, 5))

カーネルのコマンドライン

t128=address,irq
IRQ を用いないときは -1 を、自動検出には -2 を指定します。

定義可能なパラメータ

AUTOSENSE

定義されていると CHECK CONDITION ステータスを 返してくるコマンドに対して自動的に REQUEST SENSE が実行されます。

PSEUDE_DMA

擬似 DMA のハードウェアを使用できるようにします。 性能は I/O ポーリングを使ったものの 3-4 倍になります。

PARITY

パリティチェック機能を有効にします。 まだサポートされていません。

SCSI2

SCSI-II タグ付きコマンドキューイングをサポートします。 テストされていません。

UNSAFE

割り込みを許可したまま擬似 DMA 転送を行います。 高速シリアル通信でデータ落ちが生じる場合にだけ使って下さい。 その場合でも、転送サイズを変更する方が良い結果が得られるでしょう。

USLEEP

ディスコネクトを行なわないデバイスをサポートします。 テストされていません。

よくある問題

  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) (標準)

可能な設定

IO ポート      : 0x130, 0x140, 0x210, 0x230, 0x240, 0x310, 0x330, 0x340
IRQ            : 10, 11, 14, 15
DMA チャネル   : 5, 6, 7
IO             : ポートマップ方式、バスマスタ方式

自動検出

ポートが 0x310 の場合は機能しません。BIOS は必要ありません。

自動検出の設定変更

コンパイル時のみです。PORT_OVERRIDE を定義します。

よくある問題

  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 のエミュレーションモードで 動作させているときに起こります。解決法は二つあります。
    1. Ultrastor をネイティブモードに切り替えます。こちらがお薦めです。 なぜなら SCSI ドライバは IDE ドライバより高速だからです。特にクラスタ 単位の read/write パッチが当たっている場合は高速で、ファイルシステムを 介して 2M/sec 以上の転送レートが得られているユーザもいるそうです。 もしハードディスク以外のデバイスを用いていたり、2 台以上のハードディ スクを Ultarstor に接続している場合は、こちらが唯一の選択肢となります。
    2. カーネルのコマンドラインオプションを用います。
      hd=cylinders,heads,sectors
      
      とするとデフォルト設定が上書きされ、ブートできるようになります。シリン ダ、ヘッダ、セクタの数はそれぞれ 2048、16、255未満にして、それらを 掛けた値が本来の値と等しくなるようにします。 Linux から fdisk を用いる際にも手動でディスクのジオメトリを指定する必 要があります。そうしないとパーティションエントリが正しく書き込まれない ため、 Linux では動作しますが DOS ではシリンダ/ヘッド/セクタ各エン トリの取得に失敗するので動作しなくなってしまいます。 一度 Linux が立ち上がってしまえば、include/linux/config.hHD_TYPE マクロを適当な値に定義して再コンパイルすることで、 手動ブートしなくてもすむようになります。

5.18 Western Digital 7000 (標準)

可能な設定

BIOS アドレス  : 0xce000
IO ポート      : 0x350
IRQ            : 15
DMA チャネル   : 6
IO             : ポートマップ方式、バスマスタ方式

自動検出

BIOS がインストールされている必要があります。

よくある問題

  1. チップやファームウェアにいくつかのバージョンがあります。おそら くバージョン 3 のボードは動作しません。バージョン 5 は大丈夫です。無印 のチップは動作せず、'A' が最後についているものは動作します。
  2. このボードは、ドライバでサポートしていない BIOS アドレスを使う ことができるようです。この場合ドライバがサポートしているアドレスを 使って下さい。また バグレポート に従って バグレポートを送って下さい。

5.19 AM53/79C974 (アルファ版)

ftp://tsx-11.mit.edu/pub/linux/ALPHA/scsi/AM53C974-0.3.tar.gz

にあります。

訳注: カーネル 2.0.27 には含まれています。

可能な設定

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 よくある問題

「シリンダが 1024 よりも多い」というメッセージ

パーティションを切るときに、「シリンダが 1024 よりも多い」という 警告メッセージが表示される。 あるいは、1024 以降の論理シリンダを含んだパーティションからブート できない。

これは、BIOS の制限によるものです。

詳しい説明は、 ディスクのジオメトリ および パーティションの作成 を参照してください。

/dev/hd* にパーティションが切れない

/dev/hd* は SCSI デバイスではありません。 SCSI デバイスは /dev/sd* です。

正しいデバイス名とパーティションの切り方については、 デバイスファイルディスクのジオメトリ、それに パーティションの作成 を参照してください。

リムーバブルメディアドライブからメディアを排出できない

Linux は、メディアがマウントされている時にはドライブのドアを ロックします。予期せぬメディアの入れ替えによって ファイルシステムが壊れるのを防ぐためです。

まずディスクをアンマウントしてください。

SCSI ディスクから LILO でブートできない

SCSI ドライバと BIOS との間で、使用すべき BIOS マッピングに関して 情報が食い違っていることがあります。 この場合、ブート時に LILO が「LI」まで表示してハングする などの問題を引き起こすことがあります。

この問題を回避するためには、DOS で使われる BIOS ジオメトリ マッピングを調べて、これを /etc/lilo/disktab に書き込む 必要があります。

あるいは、「linear」jfile 設定オプションを使うという方法も あります。

fdisk が以下のようなメッセージを出力する

You must set heads sectors and cylinders.
You can do this from the extra functions menu.

そして fdisk を再起動すると、変更したはずのディスクジオメトリが 変更されていない。

パーティションの作成 を参照して ください。

ブリッジボードに複数のドライブが接続されているのに、 ひとつのドライブしか検出されない。

Linux は ANSI SCSI リビジョン 1 以前の SCSI デバイスに対しては、 0 以外の LUN を探しに行きません。 0以外の LUN を認識させたければ、drivers/scsi/scsi.cscan_scsis() 関数を変更する必要があります。

スワップ時にシステムがハングする

この問題はすでに解決されています。 カーネルを 1.1.38 にバージョンアップしてください。

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`7<Y@,*`M`C-$PCD=3-14HC()#\PY.@R`.@J`%J(\/[`,.3H
M)0#H'0!8AL2Q!M+L0.@7`+K"`;0)S2'#NIP!ZR"ZQ0'K&[K5`>L6N]T!,=*Y
M"@#W\8#",$N(%PG`=>^)VK0)S2'#=7-A9V4Z(&1P87)A;2`P>#@P#0H@("!O
L<B`@9'!A<F%M(#!X.#$-"B1);G9A;&ED(&1R:79E#0HD("`D```````D``!O
`
end

このプログラムを実行すると、コマンドラインで指定した BIOS アドレス (0x80 が最初のディスク、0x81 が 2番目のディスク) のドライブについて、 セクタ数、ヘッダ数、シリンダ数をプリントします。

つまり、dparam 0x80 を実行して以下のように表示された場合、

60      17      1007

C: ドライブのセクタ数が 60、ヘッド数が 17、シリンダ数が 1007 で あることを示しています。

7. CDROM

ここでは、CDROM 特有の情報を示します。

7.1 対応している (いない) ハードウェア

ブロックサイズが 512 または 2048 バイトの SCSI CDROM は使えます。 これ以外のブロックサイズはサポートされていません。

7.2 よくある問題

CDROM がマウントできない

ISO-9660 CDROM をマウントするための正しいコマンドは以下の通りです。

mount -t iso9660 /dev/sr0 /mount_point -o ro

このコマンドが正しく動作するためには、SCSI のサポートと使用している ホストアダプタや SCSI CDROM のドライバ、それに iso9660 ファイル システムがカーネルに組み込まれている必要があります。

カーネル 1.1.32 では、CDROM のようなリードオンリーのデバイスは デフォルトの読み書き可能オプションではマウントできないことに 注意してください。

CDROM が排出できない。

Linux は、メディアがマウントされている時にはドライブのドアをロック します。予期せぬメディアの入れ替えによってファイルシステムが壊れる のを防ぐためです。

まずディスクをアンマウントしてください。

オーディオ CD が演奏できない

workman あるいは xcdplayer などのプログラムを使ってください。

workmanxcdplayer がうまく動かない

オーディオ機能の制御は SCSI-II のコマンドセットに含まれているので、 SCSI-II に準拠していないドライブでは動作しないでしょう。 また、多くの SCSI-I CDROM ドライブと SCSI-II CDROM ドライブの一部には、 SCSI-II コマンドセットではなく、独自のコマンドセットを使ってオーディオ 機能にアクセスするものがあります。 NEC のドライブについては、この種のコマンドセットを使うようにパッチが あたった xcdplayer があります。 ftp://tsx-11.mit.edu/pub/linux/BETA/cdrom を探してみて ください。

これらのプログラムは、SCSI 以外の CDROM にも使える可能性があります。 ドライバが SCSI ドライバと同様の ioctl を実装していることが 条件です。

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 した後も保持されます。

ほとんど全てのドライブが動作します。以下に一部を示します。

8.2 よくある問題

ブート時にテープドライブが認識されない

テープをドライブに入れてからブートしてみてください。

複数のファイルを含んだテープが正しく読み取れない

複数のファイルをテープから読み出すとき、最初の tar は成功し、その 次の tar はなにも出力せずに終わります。さらに次の tar を 行なうと二つめのファイルが読めます。

tar のようなユーザレベルのプログラムはファイルマークを認識しません。 最初の tar は先頭のファイルの最後まで読み込みます。 2 度目の tar はファイルマークの位置で読み込みを始めるのでなにも出力 しません。しかしこれによりテープは次のファイルの先頭に移動するので 3 度目 の tar は 2 番めのファイルを読み込みます。

次のファイルにスキップするためには、巻戻しをしないデバイス (/dev/nst?) に mt コマンドを用いて下さい。

圧縮が失敗する

圧縮プログラムはファイルの最終ブロックに追加される 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

他のシステムとテープでのデータのやり取りができない

他の OS で書き込んだテープを Linux で読み込むことができない。 または、Linux で書き込んだテープを他の OS で読み込むことができない。

システムが異なるとブロックサイズも異なることがあります。ブロックサイズが 固定のデバイスに、異なったサイズのブロックを読み込ませることはできません。

このようなテープを読むには、テープドライブのブロックサイズを書き込まれ たときのサイズに合わせてやるか、あるいは可変長にしてやる必要があります。

注意 : これはハードウェアのブロックサイズのことであって、tardump 等のコマンドのブロッキングファクターのことではありません。

ブロックサイズを変えるには mt コマンドを使います。

mt setblk <size>

可変長にするときには以下のようにします。

mt setblk 0
mtsetblk フラグは、 Linux の配布パッケージに入っている GNU 版の mt ではサポートされていません。代わりに BSD から移植 された mt コマンドを使う必要があります。ソースコードは以下の ところから入手できます。

ftp://tsx-11.mit.edu/pub/linux/ALPHA/scsi

またデフォルトでは、バッファサイズの最大値が 32K バイトに指定されてい ることに注意して下さい。これは /usr/src/linux/drivers/scsi/st_options.h (古いカーネルでは st.c) の ST_BUFFER_BLOCKS で定義されています。 32K 以上の ブロックを使う場合はこれを変更してカーネルを再構築する必要があります。

「No such device」というエラーメッセージが出る

テープにアクセスするたびに「No such device」といったような エラーメッセージが出てしまう場合です。

テープデバイスのタイプをチェックして下さい。テープデバイスはキャラクタ デバイスでなければならず、またデバイスのメジャー番号とマイナー番号が デバイスファイル に記述してあるような値に なっていなければなりません。

読み込みには密度を指定できるのに、書き込みではできない

多くのテープドライブでは古いハードウェアとの互換性を保つために、低密度 での読み込みをサポートしていますが、普通書き込みはできません。

特に QIC のドライブでこの問題が生じることが多いでしょう。例えば古い形 式の 60M テープが読めても、書き込みは 120, 150, 250, 525M のフォーマット でしかできない場合などです。

テープの頭出しをすると全ての 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/rst0c 9 0 となり、二台目は c 9 1 となります。 巻戻しをしないデバイスではマイナー番号の最上位ビットがセットされます。 つまり /dev/nrst0c 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 から作成するプログラムがあり、 ftp://tsx-11.mit.edu から 取ってくることができます。 ちょっと扱いづらい点もありますが、これによって問題の一部が軽減される ことは確かでしょう。

多分もっと良い解決法は、/proc/scsi 擬似ディレクトリを使うこと でしょう。現在作業が進行中なので、どのような方法になるかはまだ正確には 言えませんが、この問題を解決するためには有望だと思えます。