SCSIの基礎

デバイスドライバとは直接関係はないのですが、私が実際に作成したものが「SCSIターゲット・ドライバ」というものなので、SCSIについてあまりご存じない方のために、さわりだけご紹介します。

SCSIを使用する場合は、通常SCSIボードとドライバをインストールして、それにディスクやCD−ROMをバス接続(イモヅルで多くの機器がぶら下がる)します。ハードウェア的には、「イニシエータ」という親分(通常はSCSIボード)の下に、「ターゲット」という子分(ディスクなど)が複数ぶら下がっているような形態をしています。

SCSIのプロトコルとしては、だいたい以下のような流れとなります。

  1. イニシエータが「SCSIコマンド」をターゲットに送ります。
  2. READ系コマンドの場合、ターゲットは実際にディスクからデータを読み込み、イニシエータに「データ・イン」で返しします。
  3. WRITE系コマンドの場合、ターゲットは実際にディスクに書き込むべきデータをイニシエータから「データ・アウト」として受けとり、ディスクに書き込みます。
  4. いずれの場合も、ターゲットは結果を「ステータス」としてイニシエータに返します。

Linux には多くのSCSIドライバが添付されていますが、これらはすべて「SCSIイニシエータとして動作する」ドライバです。ところが今回私が作成したのは、この「ディスクなどの周辺装置として」動作する側のターゲット・ドライバというものです。目的は、SCSIプロトコルを通常の計算機間の通信プロトコルとして使うためです。

SCSIは、各装置をSCSI−IDで識別します。SCSI−IDは0〜7までが使えます。「イニシエータ」は通常ID=7(数字が大きいと、転送の優先度が高い)を割り当て、「ターゲット」は0から順番に割り当てます。SCSI−ID=0が割り当てられたハードディスクは、Linux では /dev/sda として認識されます。

また、1つのID(物理装置)の中に、8個までの論理装置を持つことができ、この識別子のことをLUN(Logical Unit Number)といいます。たとえば、SCSI−ID=0であるハードディスクのコントローラの下に、5個のディスク・ドライブ(LUN=0〜4)がつながっている、といった構成を取ることもできます。