10.1. 擬似ドライバ

SCSI はコマンドの集まりと、そのコマンドの集まりを伝達するハードウェア バスの集まりとみなすことができます。これらのハードウェアバスは専用の SCSI (例えば ultra wide 用)として使われるもの、他のプロトコル(例えば USB や IEEE 1394)と共用されるもの、種々の SCSI 規格では定義されていないもの等に分けられ ます。最後のカテゴリには、ATAPI CD ライター、PC パラレルバス ZIP ドライブ などの興味深い例があります。 このようなデバイスは、SCSI ではないバスで SCSI コマンドセット(もしくは非常に 近いもの)を利用します。

このセクションでは、様々な擬似低レベルドライバをざっと見ていきます。 これらは、他の Linux サブシステムが制御しているデバイスに対して SCSI コマンド セットを送るため、必然的にそのサブシステムとやり取りすることになります。 この事が、主導権をどちらが握るのかという問題を引き起こす場合があり、これが ユーザを混乱させ、結果的にメンテナーに数多くの質問が来ることになっています。

IDE-SCSI. 設定の点からすると、ide-scsi は、「ネイティブの」ドライバ(ide-cd や ide-tape 等)が割り当てられていない ATA(別称 IDE)デバイスのすべてを取り込み、 制御しようとします。例えば ide-cd と ide-scsi 両方がカーネルに組み込まれて コンパイルしてあり、そのシステムに ATAPI CD-ROM があれば、ide-cd が制御を握る でしょう。ide-scsi だけが組み込まれていると、ide-scsi がそのデバイスを握り ます。カーネルブート時に、どのドライバがどのデバイスを制御するのか指定する パラメタもいくつかあります。

IDE サブシステムの選び方は、下記のカーネルブート時パラメタで上書き 可能です(このサブシステムにとって、最初のものが最も重要でしょう)。

(hdx という項目は、hda、hdb、hdc といった IDE(もしくは ATA)デバイスの 1 つを指します)。 2.4 系では「hdx=scsi」が追加されていますが、それほど便利ではありません。 Section 9.2.4を参照してください。

ドライバが動いていると、デバイスは SCSI デバイス (/dev/sda/dev/sr0 等)を使って アクセスでき、そのデバイスに対応する /dev/hdx を使って はアクセスできません。 その場合でも /dev/hdx デバイスは利用可能ですが、設定用のみです。

一般的な IDE の設定パラメタ(DMA の有効・無効、32 ビット I/O、unmasking IRQ 等) はすべて、/dev/hdx デバイスが使えます。 例えば DMA を有効にするには下記のようにします。 [1]

        hdparm -d1 /dev/hdx
cat /proc/ide/hdx/settings とすると、指定できる設定を表示 します。 汎用 IDE ドライバの設定すべてが使えます。下記の「ide-scsi 固有の」設定も使え ます。

ディスクドライブ(ZIP 等)の場合、はじめの 3 つはドライブが sd ドライバに 返す仮想ジオメトリを表しています。 「transform」は SCSI から ATAPI CDB へ変換するレイヤを設定したり、 有効にしたり、無効にしたりします。 【訳註:CDB とは、Command Descriptor Block の略称で、SCSI 命令のデータ 構造を指します】

「log」は、デバッグ情報を記録します。sg ドライバを使ったユーザ空間の プログラムをデバックするのにも役立ちます。というのも、発行されたコマンドに 対してはその終了状態も含めてリストするからです。 特定の設定を有効にしたり、無効にしたりするには、下記のようにします。

        echo "log:1" > /proc/ide/hdx/settings
「using_dma」フラグを無効にするには、下記のようにします。

        echo "using_dma:0" > /proc/ide/hdx/settings

PPA + IMM. IOMEGA の ZIP ドライブは、パラレルポート、SCSI、ATAPI といった さまざまな種類が売られています。パラレルポートタイプは、古い方が ppa ドライバ で、新しい方が imm ドライバで動作します。

パラレルポートの ZIP ドライブは、実は SCSI デバイスです。VPIO(古い)と VPI2(新しい)というインタフェースを使って、パラレルポートをトンネルし、 SCSI コマンドを流します。ppa ドライバは、VPIO ホストの実装、imm はVPI2 ホストで実装です。

HBA が ZIP ドライブ内部に搭載されて動作するので、ホスト・アダプタ と周辺機器が同一筐体にあることになります。

PPSCSI. パラレルポートケーブルを利用して SCSI を使用するアーキテクチャに ppscsi が あります。これは、まだ本体には統合されていない、新しいアーキテクチャです。 ppscsi モジュールはコードが定型化されているので、別のインタフェース向けの 実装を書くのも簡単です。

各 ppscsi のプロトコルモジュールは、自分自身を ppscsi モジュールと共に登録 し、プロトコル・ドライバすべてに共通する様々な操作のエントリーポイントを リストとして渡します。

PPSCSI ドライバの構造

ppscsi のアーキテクチャでは、ppa と imm ドライバとプロトコルモジュールが 統合される予定になっています。いまのところ VPI0 だけが書かれています。 www.torque.net/parport/ppscsi.html を見て ください。

USB. USB はあるデバイスのグループを「大容量記憶装置」(例えばディスク)として分類し、 それらと SCSI コマンドセットを使ってやり取りします。モジュール名は、 「usb-storage」です。 www.one-eyed-alien.net/~mdharm/linux-usb を 見てください。

Microtek X6 USB スキャナーを制御する usb/microtek ドライバもあります。 設定されると、SANE アプリケーションは sg ドライバを使って SCSI コマンドを USB を通じて送り、このスキャナーを制御します。

I2O. カーネルソースの /usr/src/linux/drivers/i2o/io2_scsi.c ファイルを見てください。

IEEE 1394. SBP-2 プロトコルを使っている IEEE 1394 デバイスが、つい最近利用可能 になりました(Linux カーネル 2.4.7)。後のセクション の IEEE 1394 の段落にさらに詳しい情報があります。

iSCSI. iSCSI が IETF のドラフトとしてまとまりつつあります。iSCSI は、SCSI コマンド セットを TCP のネットワークコネクションを通じて送ります。iSCSI は、一気に普及 しそうに見えますし、Linux でも複数の実装が行われつつあります。 sourceforge.net/projects/intel-iscsi/ に そのような実装の 1 つがあります。 お好みの検索エンジンを使って、他のプロジェクトも捜してみてください。

Notes

[1]

ディストリビューションによっては、hdparm コマンドが失敗するという報告が 挙がっています。そのような場合は "echo ... > /proc/ide/hdx/settings" 方式 を使ってください。