The Linux 2.4 SCSI subsystem HOWTO Douglas Gilbert 高橋聡 - 日本語訳 Copyright ? 2001, 2002, 2003 Douglas Gilbert 2003-05-04 Revision History Revision 2.0 2003-05-04 Revised by: dpg カーネル 2.4.20対応。linuxdoc から tldp に移行。raw デバイスの最終セク タについて。blockdev について。 Revision 1.9 2002-11-20 Revised by: dpg xml に変換。カーネル 2.4.19 対応。スペル修正。 Revision 1.8 2002-05-05 Revised by: dpg scsihosts の区切り文字にカンマ。grub と lilo について。 Revision 1.7 2002-04-27 Revised by: dpg mkinitrd と scsi_debug について。カーネル 2.4.18 対応。ATAPI を詳細に。 Revision 1.6 2002-01-26 Revised by: dpg ATAPI の CD-ROM セクション。 Revision 1.5 2001-12-21 Revised by: dpg 16 バイトの SCSI コマンド。SCSI_IOCTL_GET_PCI。 Revision 1.4 2001-08-26 Revised by: dpg スペル修正。dd_rescue。mkinitrd の例。カーネル 2.4 対応。1394。 Revision 1.3 2001-08-26 Revised by: dpg ATAPI の CD-ROM のセクション。タイトル変更。U320 と iSCSI。 Revision 1.2 2001-03-25 Revised by: dpg scu と dt についての情報。「Alt」シーケンス。注釈増やす。 Revision 1.1 2001-01-22 Revised by: dpg osst について解説。_EXTRA_DEVS の制限。 このドキュメントは、Linux カーネルが 2.4 系になった時点での SCSI サブ システムを解説します。 SCSI サブシステムを概観していくのが主な目的です 。 Linux の SCSI サブシステムをシステム管理していくのに役立つ資料が掲載 してあります。またサブシステムを利用するアプリケーションを書く人に参考 となるよう、ioctl() やインターフェースについても簡単に説明します。 Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. For an online copy of the license see www.fsf.org/copyleft/fdl.html . 【訳註:GNU Free Documentation License, Version 1.1 については、 GNU フリー文書利用許諾契約書 を 参考にしてください】 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Table of Contents 1. はじめに 2. 構成を概観する 3. 名前とアドレス 3.1. SCSI のアドレスの付け方 3.2. デバイス名 3.3. devfs でのデバイス名 3.4. scsidev におけるデバイス名 4. カーネルの設定 5. ブート時のパラメタ 6. モジュールとそのパラメタ 7. Proc 擬似ファイルシステム 8. 中間レベル、統合レイヤ 8.1. ブート時のパラメタ 8.2. モジュールのパラメタ 8.3. proc インタフェース 9. 高レベルのドライバ 9.1. ディスクドライバ(sd) 9.2. CDROM ドライバ(sr もしくは scd) 9.3. テープドライバ(st) 9.4. 汎用ドライバ(sg) 10. 低レベルのドライバ 10.1. 擬似ドライバ 11. raw デバイス 12. devfs 擬似ファイルシステム A. 一般的なバスの種類(SCSI 等) B. Linux カーネル 2.2 と現状のカーネル 2.4 間の変更 B.1. 中間レベルの変更 B.2. sd の変更 B.3. sr の変更 B.4. st の変更 B.5. sg の変更 B.6. Linux カーネル 2.4 系での変更 C. トラブルシューティング D. パフォーマンス、テスト、デバッグ用のツール E. コンパイルオプションとシステムコール(ioctls を含む) E.1. 中間レベル E.2. sd ドライバ E.3. sr ドライバ E.4. st ドライバ E.5. sg ドライバ F. 参考文献と謝辞、訂正について ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Chapter 1. はじめに このドキュメントは、Linux カーネルが 2.4 系になった時点での SCSI サブ システムを解説します。 SCSI サブシステムを概観していくのが主な目的です。 Linux の SCSI サブシ ステムのシステム管理に役立つ資料が含まれています。また、サブシステムを 利用するアプリケーションを書く人向けに、ioctl()のインターフェースにも触 れています。しかし、内部のデータ構造とその設計上の問題は扱っていません( W2を参照)。説明が混乱しないように、コンパイルオプションとシステムコール (ioctl()を含む)は、Appendix E に記述します。raw デバイスは厳密には SCSI サブシステムの一部ではありませんが、これについての説明もChapter 11にあ ります。 SCSI サブシステムに興味がない方や ATAPI CD ライターを動作させたいだけ なら、 Section 9.2.4を見てください。 Chapter 2に目を通すのも役に立つか もしれません。 このドキュメントは、5 年前に Drew Eckhardt 氏が書いた SCSI-HOWTO (W7を 参照)を引き継いだものです。 SCSI-HOWTO では、Linux カーネルの 1.2 と 1.3 系の SCSI サブシステムを説明しています。Linux Documentation Project (LDP。W8 を参照)からまだ得られますが、「更新なし(unmaintained)」セクシ ョンに置かれています。この文書も SCSI-HOWTO も似たような構成になってい ますが、Drew 氏のドキュメントにはアダプタやドライバについてたくさんの情 報が記述してあります。 【訳註:Drew Eckhardt 氏が書いた SCSI-HOWTO の日本語訳は、 SCSI-HOWTO の日本語訳 を 参照してください】 このドキュメントは電子形式で www.tldp.org/HOWTO/SCSI-2.4-HOWTO にあります。ホームサイト(およびおそ らくこのドキュメントの最新版が見られるところ)は、 www.torque.net/scsi/ SCSI-2.4-HOWTO です(これはマ ルチページ html 形式)。このサイトでは、ドキュメントが txt や ps、pdf、 マルチページ html とシングルページ html(長い)などの形式があります(例え ば postscript 版は www.torque.net/scsi/SCSI-2.4-HOWTO.ps ) です。 このドキュメントを最後に更新したのは、2003 年 5 月 4 日です。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Chapter 2. 構成を概観する SCSI サブシステムは 3 レイヤから構成されていて、「高」レベルはユーザー 空間やカーネル空間のインタフェースに、「低」レベルはハードウェアに接し ています。高レベルのドライバは、一般に 2 文字の短い略語で知られています (例えば「sd」は SCSI ディスクドライバ)。対応するモジュールドライバの名 称は下記の図表の{}内を見てください。歴史的な理由により、モジュールドラ イバの名称と組み込みドライバの名称が異なる場合があります。 [scsi-arch] SCSI サブシステムの 3 レベルのドライバ構造 高レベルのサブシステムは、ユーザとカーネルの界面をサポートしています。 sd と sr はブロックデバイス、st と sg はキャラクタ・デバイスのインタフ ェースです。 SCSI サブシステムを使ったどんな操作(例えばディスクからセク タを読み出す) も、3 レイヤのドライバをそれぞれ 1 つずつ使います(例えば sd と SCSI の中間レベルのドライバ、aic7xxx ドライバ)。 図を見てわかるように、SCSI の中間レベルはすべての操作で共通です。 SCSI の中間レベルは、内部インタフェースを定義しており、高レベル、低レベルの ドライバに共通のサービスを提供します。中間レベルが提供する ioctl は、フ ァイルディスクリプタが高レベルの 4 つのドライバのどれに属していても有効 です。 ブロックデバイスに対して最もよく行われる操作は、ファイルシステムの「マ ウント」です。通常 sd デバイスがあるパーティションをマウントしたり (例 mount -t ext2 /dev/sda6 /home)、sr デバイスがデバイス全体をマウントした りします (例 mount -t iso9660 /dev/sr0 /mnt/cdrom)。ブロックデバイスか らの読み書きには dd コマンドが使えます。この場合は、ブロックの大きさを 表す引数(「bs」)として、そのデバイスのブロックの大きさ(例えばディスクの 場合はたいてい 512 バイト)を設定するか、そのブロックの大きさの整数倍(例 えば 8192 バイト)を設定する必要があります。最近ブロックデバイスサブシス テムは、1 つのデバイス(もしくはパーティション) を何回にも渡って、多重マ ウントできるようになりました。 sd は汎用ディスクの 1 つで、IDE サブシステムの hd に相当します。 sd デ バイスをマウントから外せば、fdisk コマンドを使ってディスクのパーティシ ョンテーブルを見たり、修正したりできます。 hdparm は、もともと ATA ディ スク(IDE や EIDE ディスクとして知られている)を扱うコマンドですが、SCSI ディスクに対して機能するオプションもあります。 sr は CD-ROM サブシステムの 1 つです。ファイルシステム(例えば iso9660) をマウントできるほか、オーディオ CD を読むこともできます。オーディオ CD を読む際は、ファイルシステムをマウントしませんが、普通は ioctl が何回か 実行されます。dd のような一般的な Linux コマンドは、オーディオ CD には 使えません。 st はキャラクタデバイスで、テープを読み書きします。データの転送やその 他の制御には、通常 mt コマンドを使います。 sg はキャラクタデバイスのインタフェースを使うデバイスに SCSI コマンド をそのまま渡します。汎用的な Linux コマンドでは、sg デバイスを 使わない 方が良いでしょう。sg を利用しているアプリケーションは、SANE(スキャナー) や cdrecord、 cdrdao (CD ライター)、cdparanoia (オーディオ CD をデジタ ルに読み込む)などです。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Chapter 3. 名前とアドレス このセクションでは、Linux と SCSI の分野で使われている呼称と、それぞれ の関係を説明します。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.1. SCSI のアドレスの付け方 Linux では、SCSI デバイスに対して、4 レイヤの階層的なアドレス付けをし ています。 ・ SCSI アダプタ番号 [host] ・ チャネル番号 [bus] ・ ID 番号 [target] ・ LUN [lun] 「LUN」は、SCSI の Logical Unit Number の略称です。[]の中の単語は、 擬似デバイスファイルシステム(devfs)が便宜上使用する名前です。以降の説明 では、「チャネル」よりも「バス」を主に用います。 SCSI アダプタ番号は、通常はコンピュータの内部入出力バス(PCI、PCMCIA、 ISA など) にあるアダプタカードに対して、ある並びで付けられた番号です。 このようなアダプタを HBA(host bus adapter)と言う場合もあります。 SCSI アダプタの番号は、カーネルが 0 から昇順に発行します。 HBA はそれぞれ、SCSI バスを 1 つ以上制御します。様々なタイプの SCSI バ スをAppendix Aに挙げています。 SCSI バスにはそれぞれ複数の SCSI デバイスが接続できます。SCSI 用語では HBA を「イニシエータ」と呼び、HBA は SCSI ID 番号(通常は 7)を 1 つ [1] 取ります。イニシエータは SCSI デバイスと呼ばれるターゲット(例えばディス ク) とやり取りします。 SCSI のパラレルバスでは、ID の数は SCSI の幅と関 連があります。 8 ビットのバス(「narrow」と呼ぶことがあります)は、8 つの SCSI ID を持ち、その内 1 つは HBA に、残りの 7 つは SCSI デバイスになり ます。wide SCSI バスは 16 ビット幅で、最大で 15 個の SCSI デバイス(ター ゲット)を接続できます。 SCSI 3 規格のドラフトでは、もっとたくさんの ID を SCSI バス上に置けます。 各 SCSI デバイスは、複数の Logical Unit Number (LUN)を保持できます。こ のような複数の LUN は、複数個の媒体をサポートしている、高級なテープ装置 や CD-ROM 装置で使います。 というわけで、Linux における SCSI のアドレス付けの特徴は、4 レイヤの階 層となります。 devfs の名前の付け方に習うと、これは下記のようになります。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.2. デバイス名 デバイス名は、デバイスそのものというより、それを制御するカーネルドライ バへの入口と考えられます。したがって、複数のデバイス名が同一のデバイス を指す時もあり、その場合は少々異なる特性を提供するものが混ざることにな るでしょう。 /dev ディレクトリには、さまざまな SCSI デバイス名があります。これまで Linux では、SCSI デバイスを識別するのに SCSI のバス・アドレス(例えば SCSI のターゲット ID や LUN)ではなく、そのメジャー、マイナー番号を使っ てきました。擬似デバイスファイルシステム(devfs)は、そのメジャー、マイナ ー番号を使った方式から、SCSI のバス・アドレスに基づいたデバイス名を使う 方式に移行しました(後ほどSection 3.3で議論します。W5も参照)。別の方法と して、scsidev というユーティリティがあります。このユーティリティでは、 変更点を Linux の SCSI サブシステムの内部で扱いますので、 devfs のよう にシステム全体に影響を及ぼしません。 scsidev は後にSection 3.4で議論し ます。 W6も参照してください。 SCSI ディスクにはブロックメジャー番号が 8 つ割り当てられています。8、 65、 66、67、68、69、70、71 がその番号です。メジャー番号はそれぞれ 256 のマイナー番号を保有でき、SCSI ディスクの場合は下記のように分割されます 。 [b,8,0] /dev/sda [b,8,1] /dev/sda1 .... [b,8,15] /dev/sda15 [b,8,16] /dev/sdb [b,8,17] /dev/sdb1 .... [b,8,255] /dev/sdp15 数字が後ろに付かないディスクデバイス名(例えば /dev/sda) は、ディスク全 体を指しています。これに対して数字が後ろに付いているディスクは、そのデ ィスク内のパーティション (15 個まで認められている) [2] の内の 1 つを指 しています。 残りの 7 つのSCSI ディスクブロックのメジャー番号は、同じようなパターン をとります。 [b,65,0] /dev/sdq [b,65,1] /dev/sdq1 .... [b,65,159] /dev/sdz15 [b,65,160] /dev/sdaa [b,65,161] /dev/sdaa1 .... [b,65,255] /dev/sdaf15 [b,66,0] /dev/sdag [b,66,1] /dev/sdag1 .... [b,66,255] /dev/sdav15 .... [b,71,255] /dev/sddx15 したがって、最大 128 個のディスクがあり(つまり /dev/sda から /dev/sddx まで)、それぞれ、15 個までのパーティションを持てます。これに対して IDE サブシステムは、20 個のディスク(10 個のコントローラそれぞれにマスター 1 つ、スレーブ 1 つ)を持ち、それぞれが 63 パーティションを持てます。 SCSI の CD-ROM デバイスには、ブロックメジャー番号の 11 が割り当てられ ています。従来は sr がデバイス名でしたが、おそらく scd の方がなじみ深い でしょうし、最近のディストリビューションのいくつかはこちらを選んでいま す。256 個の CD-ROM デバイスが付けられます。 [b,11,0] /dev/scd0 [or /dev/sr0] [b,11,255] /dev/scd255 [or /dev/sr255] SCSI テープは、キャラクタメジャー番号の 9 が割り当てられています。 32 個のテープデバイスをサポートしており、各デバイスには 4 つのモード (0、1 、2、3)のどれかでアクセスでき、さらにリワインドの有無を指定できます。デ バイスは次のように割り当てます。 [c,9,0] /dev/st0 [tape 0, mode 0, rewind] [c,9,1] /dev/st1 [tape 1, mode 0, rewind] .... [c,9,31] /dev/st31 [tape 31, mode 0, rewind] [c,9,32] /dev/st0l [tape 0, mode 1, rewind] .... [c,9,63] /dev/st31l [tape 31, mode 1, rewind] [c,9,64] /dev/st0m [tape 0, mode 2, rewind] .... [c,9,96] /dev/st0a [tape 0, mode 3, rewind] .... [c,9,127] /dev/st31a [tape 31, mode 3, rewind] [c,9,128] /dev/nst0 [tape 0, mode 0, no rewind] .... [c,9,160] /dev/nst0l [tape 0, mode 1, no rewind] .... [c,9,192] /dev/nst0m [tape 0, mode 2, no rewind] .... [c,9,224] /dev/nst0a [tape 0, mode 3, no rewind] .... [c,9,255] /dev/nst31a [tape 31, mode 3, no rewind] SCSI 汎用デバイス(sg)には、キャラクタメジャー番号の 21 に割り当てられ ています。最大 256 個の SCSI 汎用デバイス(sg)が持てます。 [c,21,0] /dev/sg0 [c,21,1] /dev/sg1 .... [c,21,255] /dev/sg255 SCSI 汎用デバイスの名前の最後に文字が付くもの(例えば /dev/sgc )は、旧 い形式です。 SCSI ディスクと SCSI CD-ROM、SCSI テープは、何らかの sg デバイスにマッ プされています(ただしディスクの各パーティションはマップされていません) 。この 3 つのカテゴリいずれでもない SCSI デバイス(例えばスキャナー)も、 sg デバイスとして見えます。 擬似デバイス(Section 10.1を参照)は、通常 SCSI とは見なさないデバイスを SCSI デバイス名として表示します。例えば ATAPI CD-ROM は ide-scsi 擬似ド ライバで動作し、/dev/scd0 にマップされます。 Linux のデバイス名とそれに対応したメジャー、マイナー番号の割り当てにつ いては、カーネルソースとともに配布されている linux/Documentation/ devices.txt が信頼できるリファレンスになっています。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.3. devfs でのデバイス名 デバイス擬似ファイルシステムは /dev にマウントでき、こうすると従来の Linux デバイスのサブディレクトリに置き換わります。あるいは別の場所(例え ば /devfs)にマウントすることも可能で、既存のデバイス構造へ追加も可能で す。 devfs を使わないと、通常デバイス名はルートパーティションの dev ディレ クトリ内で扱われます。したがって、デバイス名 (およびそのパーミッション) は、ファイル・システムと同じ永続性を持ちます。デバイス名があっても、必 ずしもデバイス(もしくはそのデバイスのドライバさえ)がその時に存在するわ けではありません。ユーザがデバイス名のエントリーを作成する手間(mknodを 使って)を省くため、ほとんどの Linux ディストリビューションには何千もの デバイス名が /dev ディレクトリに入っています。アプリケーションがデバイ ス名を open() しようとした時にerrno 値 ENODEV が返された場合は、対応す るデバイス(もしくはドライバ)がその時に利用できないことを示します。 devfs は違った方法をとります。デバイス名が存在すれば、すなわち対応する デバイス(とドライバ)が存在することを意味します。 devfs を /dev にマウントしている場合、SCSI デバイスのプライマリーデバ イス名はこのようになります。 /dev/scsi/host0/bus0/target1/lun0/disc [ディスク全体] /dev/scsi/host0/bus0/target1/lun0/part6 [パーティション 6] /dev/scsi/host0/bus0/target1/lun0/generic [sg デバイスのディスク] /dev/scsi/host1/bus0/target2/lun0/cd [CD リーダーもしくは CD ライター] /dev/scsi/host1/bus0/target2/lun0/generic [sg デバイスの CD] /dev/scsi/host2/bus0/target0/lun0/mt [テープ モード 0 リワインド] /dev/scsi/host2/bus0/target0/lun0/mtan [テープ モード 3 リワインドなし] /dev/scsi/host2/bus0/target0/lun0/generic [sg デバイスのテープ] 3 行目の sg デバイスは、1 行目にある「ディスク全体」に対応しており、こ の両者は同じアドレス(つまり host0/bus0/target1/lun0)を指します。 sg ド ライバがモジュールでまだロードされていない(もしくはアンロードされてい る)場合、上記のリストにある「generic」デバイス名は現れません。 (「disc」というスペルに注意。devfs の開発者は、米語のこの綴りがお気に 入り)。 devfs の名前付け規則は、Section 3.1で論じている SCSI のアドレス 付けにぴったりマッチしていることがわかるでしょう。IDE サブシステムが同 じような(「scsi」という単語を「ide」に置き換えた)規則で devfs デバイス を名付けている点も覚えておくと良いと思います。devfs はChapter 12 でさら に論じます。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.4. scsidev におけるデバイス名 scsidevと呼ばれているユーティリティプログラムは、デバイス名を /dev/ scsi ディレクトリに追加します。そのデバイス名は、各デバイスの SCSI アド レスを反映しています。最初の 2 文字は上位レベルの SCSI ドライバの名前 (例えば sd や sr、st、sg)です。「h」の後の数字はホスト番号で、その後の 「-」はホスト識別用の番号です。 PCI のアダプタではこの数字は常に 0 のよ うですが、ISA アダプタではその IO アドレスになります。(おそらくこのフィ ールドには、さらに情報が入るかもしれませんし、無くなるかもしれません)。 「c」や「i」、「l」の後にある数字は、それぞれチャネル(バス)とターゲット ID、LUN の値になります。raw ディスクは「p」とパーティション番号が付きま せん。その内部に含まれる各パーティションには、「p」とパーティション番号 が付きます。 【訳註:図にすると下記のようになります sd h0 - 0 c0 i0 l0 p1 == == = = == == == === | | | | | | | | | | | | | | | パーティション番号は 1 | | | | | | | | | | | | | LUN は 0 | | | | | | | | | | | ターゲット ID は 0 | | | | | | | | | バス(チャネル)番号は 0 | | | | | | | PCI なら 0, ISA なら I/O アドレス | | | | | 固定 | | | ホスト番号は 0 | 上位レベルの SCSI ドライバの名前 】 scsidev は、ブートシーケンスの一部として動くのが普通です。SCSI の設定 が変更になった後に動かすのも良いでしょう(例えば低レベルのドライバモジュ ールを追加・削除したり、add/remove-single-device コマンドを使ったりする 時)。scsidev を私のシステムで実行した時に /dev/scsi ディレクトリへ追加 された名前を挙げます。私のシステムには、ディスク 2 つ、CD-R ドライブ 1 台、スキャナー 1 台が付いています。 $ ls -l /dev/scsi/ # abridged total 0 brw------- 8, 0 Sep 2 11:56 sdh0-0c0i0l0 brw------- 8, 1 Sep 2 11:56 sdh0-0c0i0l0p1 ... brw------- 8, 8 Sep 2 11:56 sdh0-0c0i0l0p8 brw------- 8, 16 Sep 2 11:56 sdh0-0c0i1l0 brw------- 8, 17 Sep 2 11:56 sdh0-0c0i1l0p1 ... brw------- 8, 24 Sep 2 11:56 sdh0-0c0i1l0p8 crw------- 21, 0 Sep 2 11:56 sgh0-0c0i0l0 crw------- 21, 1 Sep 2 11:56 sgh0-0c0i1l0 crw------- 21, 2 Sep 2 11:56 sgh1-0c0i2l0 crw------- 21, 3 Sep 2 11:56 sgh1-0c0i5l0 crw------- 21, 4 Sep 2 11:56 sgh1-0c0i6l0 br-------- 11, 0 Sep 2 11:56 srh1-0c0i2l0 br-------- 11, 1 Sep 2 11:56 srh1-0c0i6l0 SCSI 汎用デバイス名(sg)と、そのデバイスが他の高レベルドライバ(例えば sd 、sr、 st)で制御された場合の名前との対応は、2 番目の文字を無視してマッ チする名前を探せばわかります。消去法でいくと、「sgh1-0c0i5l0」というフ ァイル名はスキャナーとわかります。このデバイスには sg インタフェース経 由でしかアクセスできないからです。 scsidev パッケージは /etc/scsi.alias という設定ファイルを扱い、/dev/ scsi/scannerというような名前を付ける機能もあります。パッケージには、 rescan-scsi-bus.sh という便利なユーティリティもあります。 scsidev につ いてのさらに詳しい情報は W6を見てください。私のシステムでは、devfs と scsidev は何の問題も無く共存しています。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Chapter 4. カーネルの設定 Linux カーネルの設定は、通常カーネルソースの /usr/src/linux/.config と いうファイルにあります。このファイルは直接いじるのではなく、下記のカー ネル設定オプションのどれかを利用することをお勧めします。 ・ make config−キャラクタベースで質問形式で行う ・ make menuconfig−端末指向の設定ツール (ncurses を使用)で行う ・ make xconfig−X ベースの設定ツールで行う 選択肢の説明は、それぞれのヘルプボタンで表示されます。この内容は ASCII ファイル /usr/src/linux/Documentation/Configure.help に含まれています。 詰まるところ、これらの設定ツールは .config ファイルを編集しています。 選択肢は、ドライバがカーネルに組み込まれる(「=y」)、モジュールとして作 成される(「=m」)、選択しない、のどれかです。選択していない状態には、行 の先頭に「#」(例えば「# CONFIG_SCSI」は未設定を表す) がある場合と 、.config ファイルに関連する行が無い場合とがあります。 SCSI サブシステム(正確には SCSI の中間レベルのドライバ)の主なオプショ ンは、下記の 3 つのいずれかです。この中の 1 つだけが実際に .config ファ イル中にあるはずです。 CONFIG_SCSI=y CONFIG_SCSI=m # CONFIG_SCSI is not set その他、一般的な SCSI の設定オプションは下記の通りです。 CONFIG_BLK_DEV_SD [ディスク(sd)ドライバ] CONFIG_SD_EXTRA_DEVS [追加で入れるディスク用の増設スロット] CONFIG_BLK_DEV_SR [SCSI CD-ROM(sr)ドライバ] CONFIG_BLK_DEV_SR_VENDOR [CD-ROM のベンダー独自コマンドを許可] CONFIG_SR_EXTRA_DEVS [追加で入れる CD-ROM 用の増設スロット] CONFIG_CHR_DEV_ST [テープ(st)ドライバ] CONFIG_CHR_DEV_OSST [OnSteam 社 テープ(osst) ドライバ] CONFIG_CHR_DEV_SG [SCSI 汎用ドライバ(sg)] CONFIG_DEBUG_QUEUES [複数のキューのデバッグ用] CONFIG_SCSI_MULTI_LUN [0 以上の LUN のプルーブの許可] CONFIG_SCSI_CONSTANTS [SCSI のエラー記号の復号] CONFIG_SCSI_LOGGING [実行時選択のログ収集許可] CONFIG_SCSI_ [種々の低レベルのアダプタドライバ] CONFIG_SCSI_DEBUG [デバッグ用低レベルドライバ] CONFIG_SCSI_PPA [旧式のパラレルポート zip ドライバ] CONFIG_SCSI_IMM [新式のパラレルポート zip ドライバ] CONFIG_BLK_DEV_IDESCSI [ide-scsi 擬似アダプタ] CONFIG_I2O_SCSI [I2O バス経由の SCSI コマンド・セット] CONFIG_SCSI_PCMCIA [PCMCIA バス経由の SCSI HBA] CONFIG_USB_STORAGE [USB「大容量」タイプ] CONFIG_MAGIC_SYSRQ [緊急時の sync 用 Alt+SysRq+S] [緊急時の ro 再マウント用 Alt+SyrRq+U] ルートファイルシステムが SCSI ディスクなら、カーネルに SCSI の中間レベ ルのドライバ、sd ドライバ、そのディスクがつながっているアダプタのドライ バを必ず組み込んでください。たいていの場合、sr、st、sg などのドライバは モジュールとして作成してかまいません。それらのドライバは必要になるとロ ードされます。スキャナーのようなデバイスが別のアダプタに接続されている なら、そのドライバはモジュールとして作成した方が良いでしょう。この場合 アダプタ・ドライバは、スキャナーが認識される前にロードしなければなりま せん。 Linux ディストリビューションには、SCSI サブシステムのドライバがモジュ ールとしてたくさん入っています。理由は、すべてをカーネルに組み込むと巨 大になってしまい、ブートローダーの能力を越えてしまうかもしれないからで す。これは、「鶏が先か、卵が先か」問題の原因になります。ルートファイル システムをロードするには SCSI ドライバが必要になりますが、ドライバをロ ードするにはルートファイルシステムをマウントしなければいけません。この 問題には、ロード時に 2 段階を踏む initrd デバイスで対処ができます。 (詳 細は、Chapter 6を参照)。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Chapter 5. ブート時のパラメタ PC では、マザーボード上の BIOS と SCSI ホストアダプタの大部分が提供し ている SCSI BIOS とが協調し、SCSI ディスク上にあるブートローダーのイメ ージをメモリにロード・実行する処理を行っています。こうするには、マザー ボード上の BIOS の設定を何かしら変更する必要があるかもしれません。 1 つ 以上の SCSI アダプタがある場合には、SCSI BIOS の設定を変更して、ブート イメージがあるディスクがつながっているアダプタを示してやる必要があるか もしれません。ブートイメージが ATA(IDE)ディスクやブータブルな CD-ROM、 フロッピー・ディスクに存在する場合もあります。 Linux のブートローダーで良く使われるのは、lilo と grub です。設定ファ イルは、それぞれ /etc/lilo.conf と /etc/grub.conf です。 [3] 両者の違い の 1 つは、lilo で設定を変更した後、その設定を有効にするために lilo コ マンドを実行する点です(grub ではそのような作業は不要)。使い方は man ペ ージを見てください。 lilo と Linux のブートシーケンスについては素晴らし い論文があります。 ftp://icaftp.epfl.ch/pub/people/almesber/booting/ bootinglinux-0.ps.gz です。 grub については以下を御覧下さい。 www.gnu.org/software/grub 。 SCSI サブシステムに関連したブート時のパラメタは、下記の通りです。 single [シングルユーザーモードへ] [ランレベルを {0..6} へ] root=/dev/sda6 [*] root=/dev/scsi/host0/bus0/target0/lun0/part6 [*] root=/dev/sd/c0b0t0u0p6 [*] devfs=mount [CONFIG_DEVFS_MOUNT=n を上書き] devfs=nomount [CONFIG_DEVFS_MOUNT=y を上書き] init= [init ではなく、 の実行] quiet [ブート時コンソール出力メッセージの抑制] debug [ブート時コンソール出力メッセージの詳細化] nmi_watchdog=0 [SMP マシン上での NMI watchdog を停止] max_scsi_luns=1 [LUN が 0 に対してのみ SCSI バススキャンを行う] * devfs を使っている場合、最初にリード・オンリーでルートパーティション をマウントする時は、これまでの /dev/sd という表記とともに新しい devfs の表記も使用できます(ここでは両方示してあります)。「root=/dev/ sda6 single」という組み合わせは、ディスクもしくはアダプタの変更によって 、カーネルブート時のロードがおかしくなった時に役に立つでしょう。 「root=」の引数は 16 進数でも指定できます。例えばルートパーティション が /dev/sda3 にあれば、「root=803」が適切な表記となります。後の 2 桁が 以前の節で述べたマイナーデバイス番号です。 「init」パラメタのデフォルトの引数は /sbin/init です(man 8 の init を 参照)。/etc/fstab のようなファイルに間違った項目があった場合は、「init= /bin/bash」でシェルに直接落ちた方が便利でしょう。しかし共有ライブラリの ファイルやそのパスが適切でないと、これも失敗するかもしれません。そうい う場合は、「init=/sbin/sash」としましょう。これは静的にリンクされたシェ ルで、システムの修復に役立つ様々なコマンドが入っています(man 8 sash を 参照)。 Linux は次のようなメッセージを出してブートに失敗することがあります。 VFS: Cannot open root device 08:02 これは、カーネルが /dev/sda2 デバイスにルートパーティションがあることを 期待したのに、そこにはなかったことを意味します。エラーメッセージ中の数 字は、デバイスのメジャー、マイナー番号(16 進数) です(デバイス名のマッピ ングについてはSection 3.2を参照)。このような場合は「root」ブート・オプ ションが便利です(ブートイメージがルートパーティションを探す場所を変更す るには rdev コマンドも使えます)。 lilo の設定ファイル /etc/lilo.conf で「root=」オプションを指定するには 2 つの方法があります。通常は「root=/dev/sda2」という行を入れます。この 場合、lilo コマンドを実行した時のシステムの状態に基づいて、/dev/sda2 は メジャー、マイナー番号に変換されます。これは特にハードウェア構成を変更 する場合にはやっかいなことになりかねません。もう一つの方法は、「append= "root=/dev/sda2"」という行を入れる方法です。この場合、/dev/sda2 はカー ネルが次に起動する時に渡されます。これはカーネルブート時に「root=/dev/ sda2」文字列をコマンドラインのプロンプトに渡すのと同じです。起動時にカ ーネルが解釈しますので(HBA と HBA に接続しているデバイスが認識されてい れば)、より柔軟に扱えます。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Chapter 6. モジュールとそのパラメタ SCSI 関連のモジュールはたくさんあります。中間と上位レベルのモジュール を次に挙げます。 ・ scsi_mod.o ・ sd_mod.o ・ sr_mod.o ・ st.o [osst.o] ・ sg.o 最初の 3 つは、通常のドライバ名に「_mod」が付いている点に注意してくだ さい。低レベルのドライバには、HBA の製造メーカーの名前またはその略称(例 えば advansys)に加えて、主要な制御用チップのチップ番号が付くこともあり ます (例えば sym53c8xx は NCR 53c8?? 系のチップが載っている symbios の コントローラ)。 SCSI モジュールはすべて、中間レベルのドライバに依存しています。 SCSI の中間レベルドライバがカーネルに組み込まれておらず、かつ scsi_mod.o が ロードされていない場合、 modprobe st のようなコマンドが実行されると、 scsi_mod.o モジュールがロードされることになります。おそらく他にも依存関 係があるはずで、例えば modprobe sr_mod とすれば、CD-ROM のモジュールが (まだロードされていなければ)ロードするでしょう。また、SCSI の中間レベル がモジュールなら、SCSI サブシステムのその他すべてのドライバもモジュール でなければいけません(これはカーネル構築の設定ツールで強制されます)。 modprobe コマンドは、 をロードする場合、同 時に が依存しているモジュールすべてを自動的にロードしよう とします。また、 を指定する際、末尾の「.o」拡張子は不要で す。なければそのように想定されます。【訳註:modprobe のモジュール名指定 には、パス ('/') や末尾の '.o' を含めてはいけません。man modprobe して ください】 insmod をロードしようとします が、そのモジュールが依存しているモジュールを先にロードしません。モジュ ールをロードする規則、つまりあるモジュールがその他のモジュールを(適切な パラメタをつけた上で)どのようにロードするのかは、通常 /etc/modules.conf に記述してあります。(初期の Linux カーネルでは、このファイルを /etc/ conf.modules と呼んでいたことに注意)。このファイルの形式についてのさら に詳しい情報については、 man modules.conf してみてください。 どのモジュールにもコマンドラインで利用できるパラメタがあり、これは modinfo -p コマンドを使って調べられます。 高レベルのドライバが初期化され、アクティブなホストが存在しない場合は、 中間レベルが「scsi_hostadapter」というモジュールをロードしようとします 。ここで「alias」を使うと、「scsi_hostadapter」と実際の低レベル(アダプ タ) ドライバの名前とを結び付けられます。例えば /etc/modules.conf に「 alias scsi_hostadapter aic7xxx」という行を置けば、aic7xxx モジュールが ロードされます(既にアクティブな低レベルのドライバがなければ)。 [4] モジュールのパラメタ(alias)である「scsi_hostadapter」と initrd ファイ ルシステムには特別な関係があります。さらに詳しいことは、 man initrd と man mkinitrd してください。 [5] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Chapter 7. Proc 擬似ファイルシステム proc 擬似ファイルシステムは、SCSI サブシステムについて役立つ情報を提供 します。「proc_fs」を選択するカーネルの設定オプションは、CONFIG_PROC_FS で、たいての場合は選択されているはずです。SCSI 固有の情報は、 /proc/ scsi にあります。おそらく一番よくアクセスされる項目は、接続している SCSI デバイスをリストアップする cat /proc/scsi/scsi です。詳細は Section 8.3 を見てください。 低レベルのドライバは、次の形で proc_fs に割り当てられています。 /proc/scsi// は「aic7xxx」や「BusLogic」などになります。 (ホスト番号とも呼ぶ)は、 Section 3.1で論じたものと 同じ番号です。1 つのドライバが複数のホストを制御する場合もあるので、注 意してください。このファイルに記録されている内容は、低レベルドライバに よって変わります (このファイルを通してパラメタを設定できるアダプタドラ イバもあります)。ニュースグループやメンテナーに障害の報告をする際には、 このファイルの出力を添付すると役に立ちます(例えば cat /proc/scsi/ aic7xxx/0 )。 CD-ROM ドライバは、接続している CD-ROM デバイスの情報を /proc/sys/dev/ cdrom ディレクトリで提供しています。ここには、SCSI デバイス(つまり sr ドライバが制御しているもの)と IDE デバイス (つまり ide-cd ドライバが制 御しているもの)が入っています。 Section 9.2.3を見てください。 sg ドライバは、ドライバの状態と接続されているホストおよびデバイスの情 報を /proc/scsi/sg ディレクトリで提供しています。 proc 擬似ファイルシステムについてのより一般的な情報は、カーネルソース のファイルである /usr/src/linux/Documentation/filesystems/proc.txt にあ ります。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Chapter 8. 中間レベル、統合レイヤ SCSI の中間レベルは、SCSI サブシステムを使う場合は必ず利用されます。お そらく最も重要な機能は、その他すべての SCSI ドライバが使用する内部イン タフェースと内部サービスとを定義することです。これら内部のしくみについ ては、このドキュメントでは論じません(W2を参照)。 大元のカーネル設定パラメタである「CONFIG_SCSI」によって、中間レベルが 組み込みか(=y)、モジュールなのか(=m)が決まります。「CONFIG_SCSI=m」なら 、その他すべての SCSI サブシステムのドライバもモジュールになっていなけ ればいけません。 中間レベルがモジュールとして構築されている場合、これをわざわざロードす る必要はまずありません。「modprobe」を使って他の SCSI サブシステムのモ ジュールをロードすれば、中間レベルが(既にロードされていなければ)ロード されるからです。 高レベルと低レベルのドライバには、そのドライバが制御するデバイスが 1 つもなければ、(完全には)ロードされないものもあります。時にはおおげさに 報告されるケースもあります。例えば次に示すように、パラレルポートに接続 している zip ドライバを制御する imm ドライバがそうです。 $ modprobe imm imm.o: init_module: No such device lsmod は「imm」モジュールがロードされたとは表示しません。もっと微妙な結 果になる場合もあります。例えば sg ドライバがシステムにSCSI デバイスが (実際にあるものもしくは擬似にせよ)何もない状態でロードされると、/proc/ scsi/sg ディレクトリは出現しません (SCSI デバイスが認識されてはじめて作 成されます)。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.1. ブート時のパラメタ カーネルに組み込まれた SCSI ドライバは、あらかじめ決められた順番で、制 御する HBA があるかどうか調べられます。ユーザはこの順番を制御することは 一切できません。この順番はどうでも構わない場合がほとんどですが、古い ISA アダプタでは誤認識を防ぐために調べるのを止めなければならないものも あります。 [6] . scsi_logging= が 0 だとログは取らない。 が 0 でなければログを取る。 max_scsi_luns= は 1 から 8 の値(< lk 2.4.7)で、カーネル 2.4.7 以上は上限 をさらに増やせる。 scsihosts=host0:hosts1::host3 最近公開された devfs では、「scsihosts」というブート時パラメタを定義し ており、ユーザがこの順序を制御できるようになっています。devfs のドキュ メント (W5を参照)の説明を見てください。ブート時オプションの「scsihosts 」に渡すリストに指定するホスト名は、低レベルのドライバ名です(例えば「 scsihosts=advansys:imm::ide-scsi」)。 [7] [8] 「scsihosts」の利用に devfs は必要ありません。「scsihosts」パラメタは、指定されればブート時の メッセージに出力されます。例えば scsi: host order: advansys:imm::ide-scsi また、複数の HBA がシステムにあると、決まった順序でスキャンされます(補 注を参照)。「scsihosts」パラメタは、これらの HBA がどのように順序付けさ れるか (つまりカーネルがどの SCSI アダプタ番号とどの HBA を関係付けてい るか) だけに影響します。上記の例では、「imm」ドライバがブート時に見つか らなければ、SCSI アダプタ番号「1」は割り当てられません。「imm」ドライバ が後にモジュールとしてロードされると、それに SCSI アダプタ番号「1」が割 り当てられます。「scsihosts」に載っていないドライバが見つかると、次に利 用可能な SCSI アダプタ番号が使用されます(例えば上記の例なら、組み込みの aic7xxx ドライバは、SCSI アダプタ番号の「2」になる)。 カーネルパラメタの全リストとその説明は、 /usr/src/linux/Documentation/ kernel-parameters.txt ファイルにあります。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.2. モジュールのパラメタ システムに SCSI ディスクがある場合、通常は中間レベルのドライバをカーネ ルに組み込む方が望ましいでしょう。SCSI サブシステムを時折使うだけなら (例えば ATAPI CD ライターで CD-R を焼く)、中間レベルをモジュールとして 構築した方が良いと思います。モジュールロード時のオプションは、組み込み のものと同じです。 scsi_logging_level= はロギングレベルのマスク(0 がロギングしない) max_scsi_luns= scsihosts=host0::host2 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.3. proc インタフェース 現在 SCSI サブシステムに接続している(認識されている) SCSI デバイスを表 示するには、cat /proc/scsi/scsi としてください。 出力は下記のようになります。 Attached devices: Host: scsi0 Channel: 00 Id: 02 Lun: 00 Vendor: PIONEER Model: DVD-ROM DVD-303 Rev: 1.10 Type: CD-ROM ANSI SCSI revision: 02 Host: scsi1 Channel: 00 Id: 00 Lun: 00 Vendor: IBM Model: DNES-309170W Rev: SA30 Type: Direct-Access ANSI SCSI revision: 03 「Attached devices:」行に続き、認識されているデバイスそれぞれについて 、3 行ずつが表示されます。これらのうちの最初の行は、Section 3.1で論じた SCSI アドレスの情報です。あとの 2 行は、デバイスの接続時に実行された INQUIRY コマンドから得たデータです。これらのデバイスの順序と sg ドライ バでの順序との関係については、 Section 9.4を見てください(たいていの場合 は同じ)。 既存のデバイスは、 echo "scsi remove-single-device " > /proc/scsi/scsi を使って削除できます。引数は、ホストとバス(チャネル)、 ターゲット(SCSI ID)、 LUN です。このコマンドが成功したかどうかは、その コマンドの後に cat /proc/scsi/scsi を実行すればわかります。デバイスが busy だと(例えばデバイスがファイルシステムにマウントされていれば)削除は 失敗するでしょう。 新規のデバイスは、 echo "scsi add-single-device " > / proc/scsi/scsi を使って追加できます。引数は、ホストとバス(チャネル)、タ ーゲット(SCSI ID)、 LUN です。このコマンドが成功したかどうかは、そのコ マンドの後に cat /proc/scsi/scsi を実行すればわかります。 [9] SCSI サブシステムは、SCSI デバイスのホットプラグをサポートしていません (SCSI パラレルバスに関連した電気的な問題もある)。 add+remove-single-device して、接続し直そうとする場合は、その SCSI バス 上の他のデバイスも間違いなく停止させてください。 内部 SCSI コマンドをまとめてリスト出力するには、 echo "scsi dump " > /proc/scsi/scsi を使ってください。 の数値は何でもかまいません。数 値に興味を持つのは、恐らく SCSI サブシステム内部のバグを追跡する方だけ でしょう。 ロギング情報をコンソールやログに出したり止めたりするには、 echo "scsi log " > /proc/scsi/scsi を使用してください。 には、 「all、none、error、timeout、scan、mlqueue、mlcomplete、 llqueue、 llcomplete、hlqueue、hlcomplete、ioctl」のどれか 1 つを指定します。 は、0 から 7 の数字です。「all」と「none」は、 引数をとりません。接 頭辞の意味は下記の通りです。 hl 高レベルのドライバ(例外:sg は「timeout」を使う] ml 中間レベル ll 低レベルのドライバ (アダプタドライバには独自のフラグがあることがよくある) 「0」という値はロギングを無効にし、「7」は出力をできるだけ詳細にします 。ロギング情報は、カーネル構築の際に CONFIG_SCSI_LOGGING を選択した場合 のみ出力されます。 ┌──────────────────────────────────┐ │ Warning │ ├──────────────────────────────────┤ │警告:「scsi log all」(および同様の他の指定)とすると、ログファイル │ │(たいてい /var/log/messages)が SCSI ディスクにある場合、ログの無限ル│ │ープを引き起こすかもしれません。カーネルのロギングデーモンを無効にす│ │るか、出力を SCSI デバイスではないデバイスへ向けてください。 │ └──────────────────────────────────┘ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Chapter 9. 高レベルのドライバ 高レベルのドライバは、デバイスの論理クラス(例えばディスク)において、OS インタフェースのカーネル側を管理します。また高レベルのドライバは、カー ネルメモリや SCSI コマンド構造といった、カーネルや SCSI サブシステムの リソース管理も担当しています。ユーザ空間で動くアプリケーションは、スペ シャルファイル(ブロックもしくはキャラクタ)をオープンし、これらのドライ バにアクセスします。このスペシャルファイルは、通常 /dev ディレクトリツ リーにあります。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.1. ディスクドライバ(sd) sd ドライバを経由してアクセスできる SCSI デバイスは、2 種類あります。 ・ 「直接アクセス」デバイス。通常は磁気ディスクを指す。 (SCSI 周辺装置 コードは 0) ・ 「光メモリデバイス」。MOD ディスクと呼ばれることが多い。 (SCSI 周辺 装置コードは 7) sd ドライバはブロックデバイスで、密接にブロックサブシステムと結びついて います。パーティションの概念もサポートしています (man sdは 1992 年から 存在します)。 sd ドライバは、カーネルのブート時、もしくはブートした後にモジュールと してロードされた時に、128 個のディスクを認識できます。しかし一度ロード されると、増設分のディスクは一定個数のみ認識されます。この増設ディスク の個数は、カーネル設定パラメタである CONFIG_SD_EXTRA_DEVS によって設定 します。デフォルトの値は 40 です。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.1.1. sd のブート時のパラメタ ありません。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.1.2. sd モジュールのパラメタ sd ドライバは、モジュールとしてロードされた場合、何もパラメタをとりま せん。モジュール名は sd_mod.o であることをお忘れなく。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.2. CDROM ドライバ(sr もしくは scd) CD-ROM と DVD ドライブ(と WORM デバイス)は、高レベルのデバイスドライバ である sr 経由でアクセスできます。デバイスドライバの名前は「sr」ですが 、モジュール名は「sr_mod」です。デバイスファイル名は /dev/sr もしく は /dev/scd です。 下記の図表は、sr を含む CD-ROM サブシステムの説明です。 [cdrom] CD-ROM サブシステムの構造 この図表では、プロトコルスタック間の違いは隠れています。CD-ROM デバイ ス名は CD-ROM レイヤが統一して面倒を見ているわけではなく、むしろ個々の プロトコルスタックが面倒を見ています。 IDE サブシステムでは、中心にある 「ide」ドライバがデバイス名の面倒を見ている (つまり、ide-cd ドライバで はない)のに対し、SCSI サブシステムでは sr ドライバが行っています。USB や IEEE1394 の cd デバイス名は、おのおののスタックが面倒を見ています。 これは、/dev/cdrom が適切なサブシステムのデバイス名へのシンボリック・リ ンクになっている理由の一部と言えるかもしれません。 sr ドライバ経由でアクセスできる SCSI デバイスには、2 つのタイプがあり ます。 ・ CD-ROM デバイス(DVD プレイヤーを含む) (SCSI 周辺機器コードは 5) ・ WORM と呼ばれる「追記型」デバイス (SCSI 周辺機器コードは 4) sr ドライバは、カーネルのブート時、もしくはモジュールとしてブート後に ロードされた時に、256 個の CD-ROM もしくは DVD を認識できます。しかし、 一度ロードされると、増設分のドライブは一定個数のみ認識します。この増設 ドライブの個数は、カーネル設定パラメタである CONFIG_SR_EXTRA_DEVS で設 定します。デフォルトの値は 2 です。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.2.1. sr のブート時のパラメタ ありません。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.2.2. sr モジュールのパラメタ CD-ROM ドライブが XA モード(モード 2)をサポートしているかどうかを調べ るテストを行うと、ドライブによってはファームウェアのバグを招く場合があ ります。そのため XA モードのサポートのチェックは、デフォルトで無効にな っています。次のようなモジュールパラメタがあります。 xa_test=<0|1> デフォルトを変更します。(sr ドライバがカーネルに組み込まれていると、現 状では XA モードのテストを有効にする方法が無いようです)。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.2.3. sr proc インタフェース 下記のファイルは誰も読め、ASCII で出力されます。 /proc/sys/dev/cdrom/autoclose /proc/sys/dev/cdrom/autoeject /proc/sys/dev/cdrom/check_media /proc/sys/dev/cdrom/debug /proc/sys/dev/cdrom/info /proc/sys/dev/cdrom/lock これらのファイルは、CD-ROM サブシステムの現在の状態を表わしています。こ れらは procfs 領域の一部で、sysctl の設定機構に通じています (man sysctl を参照)。info 以外は、スーパーユーザが書き込めます。info には、システム にある CD-ROM と DVD プレーヤーそれぞれの列が存在しています (SCSI デバ イス以外も含む)。 例として、スーパーユーザが echo "1" > /proc/sys/dev/cdrom/autoeject と すると、オートエジェクト機能が有効になります。こうするとアンマウント時 にドライブから CD-ROM がイジェクトします。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.2.4. ATAPI CD-ROM Linux ユーザの多くは、SCSI デバイス(もしくはアダプタ)を持っていません 。そのようなユーザは、CD ライターのソフトウェア(例えば cdrecord や cdrdao))や音楽 CD を聞くプログラム(例えば cdparanoia)が、なぜ Linux の SCSI サブシステムを使用するのか、少々戸惑います。答えは、それらのプログ ラムがデバイスへアクセスするのに、低レベルのドライバを必要としているか らです。 ATAPI(ATA Packet Interface)は、基本的に ATA 転送越しにSCSI コ マンドセットを送り出しています [10] (このセクションでの議論は、ATAPI テ ープドライブと ATAPI フロッピードライブにも適用できます)。 現状 cdrecord と cdparanoia はともに SCSI 汎用ドライバ(sg) と接続して います。また ATAPI CD デバイスの場合は、ハードウェアにアクセスするのに ide-scsi 擬似デバイスを利用しています。カーネル 2.4 系列で ioctl のパケ ットインタフェースが、統合 CD-ROM レイヤに追加されたので(上記の Section 9.2 の図を参照)これは今後変更されるかもしれません。 [11] Linux の IDE サブシステムのデフォルト動作は、組み込みのドライバがすべ ての ATA デバイスの管理権限を要求します。 ATAPI CD ライターなら、組み込 みの ide-cd ドライバが要求を出します。一度こうなると、SCSI サブシステム は ATAPI デバイスの制御ができなくなります。 ide-scsi(擬似低レベル SCSI) ドライバは、IDE サブシステムによって要求されなかった ATAPI デバイスだけ を SCSI サブシステムに登録できます。 前段落の組み込みという条件に注意してください。 ide-cd と ide-scsi ドラ イバがモジュールなら、最初にロードされたものが ATAPI CD デバイス(例えば CD-ROM もしくは DVD のリーダーやライター)を要求します。さらに、ドライバ モジュールを rmmod したり、他のモジュールを modprobe したりして、制御を 切り替えられます。 /dev/hddにある CD ライターを cdrecordからアクセス可能とするよう IDE の コアドライバに対して命令するには、カーネルブート時のオプションである「 hdd=ide-scsi」を利用する方法が最も柔軟でしょう。これで ide-cd ドライバ は /dev/hdd を無視します(ide-cd ドライバが組み込みであってもモジュール であっても関係ありません)。ide-scsi ドライバが組み込みもしくはモジュー ルとして存在すれば、/dev/hdd にある CD ライターを「横取り」します(要求 されると、IDE のコアとなるドライバは ide-scsi モジュールをロードします) 。 ide-cd ドライバモジュールには、特定の ATA デバイスを無視するよう、次の ように命令できます。 modprobe ide-cd ignore='hdc hdd' この場合、ide-cd ドライバは /dev/hdc と /dev/hdd にあるデバイスを無視し ます。 /etc/modules.conf ファイルに「options ide-cd ignore=hdd」という 行を追加することによって同じ効果が得られます。 カーネル 2.4 系列に追加された新しいオプションに「hdd=scsi」があります 。このオプションは、上記で述べた「hdd=ide-scsi」と同じような機能に見え ます。さらに「hdd=scsi」は、SCSI 中間レベルと ide-scsi ドライバが両者と もカーネルに組み込まれた時にだけ利用できます(これ以外の場合には ide_setup 関数が「BAD OPTION」を報告します)。 SCSI サブシステムが ATAPI CD デバイスを「管理」しているかどうかを見る には、cat /proc/scsi/scsi の出力をチェックしてください。もう 1 つの方法 は、cat /proc/sys/dev/cdrom/info の「drive name:」を見て、「sr」という 項目に注目する方法です。下記は私のシステムの出力です。 $ cat /proc/sys/dev/cdrom/info CD-ROM information, Id: cdrom.c 3.12 2000/10/18 drive name: sr1 sr0 drive speed: 16 0 drive # of slots: 1 1 Can close tray: 1 1 Can open tray: 1 1 Can lock tray: 1 1 Can change speed: 1 1 Can select disk: 0 0 Can read multisession: 1 1 Can read MCN: 1 1 Reports media changed: 1 1 Can play audio: 1 1 Can write CD-R: 1 0 Can write CD-RW: 1 0 Can read DVD: 0 1 Can write DVD-R: 0 0 Can write DVD-RAM: 0 0 /dev/hdd にある ATAPI CD ライターが一度でも SCSI サブシステムへ登録さ れると、 CD-ROM は「scd」というデバイス名を使ってマウントされるはずです 。CD プレーヤーも「scd」デバイスを使わなければいけません。妙なことに、 hdparm コマンドは、まだ /dev/hdd デバイスファイルを使用することになって います (もしくは、「echo ... > /proc/ide/hdd/settings」という方法で)。 [12] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.3. テープドライバ(st) テープドライバのインタフェースについては、 /usr/src/linux/drivers/scsi /README.st ファイルか、 st(4) の man ページ(man stと入力)にまとめられて います。 README.st には、様々なドライバの様々なパラメタやオプション、ド ライバが使っている基本的なしくみも記述してあります。 テープドライバは、通常 mt コマンド(man mt を参照)でアクセスします。mtx は、テープオートローダーの制御に対応しているプログラムです ( mtx.sourceforge.net を参照)。 st ドライバは、周辺機器タイプが「シーケンシャルアクセス」(コード番号が 1)である SCSI デバイスを検出します(ドライバが「reject_list」にあるもの は除く)。 (現状 reject_list にある項目は OnStream のテープドライブ[次の セクションで説明]だけです)。 st ドライバは 32 台のテープドライブを認識できます。テープドライブそれ ぞれに 8 つのデバイスファイル名があります。4 つのモード(番号は 0 から 3 まで)それぞれに、リワインドあり、リワインドなしのバリエーションがありま す。テープデバイスのファイル名は、Section 3.2に例があるので見てください 。テープドライブは st ドライバのロード後にいくつでも追加できます (限度 の 32 個まで)。 このドライバは、ide-scsi 擬似アダプタのドライバをともに用いれば、ATAPI テープドライブを制御できます。Section 9.2.4で論じたことは、 ATAPI テー プデバイス(と ATAPI フロッピー)にも当てはまります。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.3.1. st のブート時のパラメタ st=xxx[,yyy] の xxx は下記の内の 1 つを取ります。 buffer_kbs: write_threshold_kbs: max_buffers: max_sg_segs: (以前のブート時のパラメタである st=aa[,bb[,cc[,dd]]] もサポートされていますが、 推奨されません) デフォルトのドライバのバッファサイズ(buffer_kbs)は 32(つまり 32 KB)で す。デフォルトの非同期書き込み閾値は 30(つまり 30 KB)です。デフォルトで 初期化時に確保するバッファの数(max_buffers)は 4 です。デフォルトで使用 する scatter/gather セグメントの数(max_sg_segs)は 32 です。 【訳註:Scatter/Gather(スキャッタ・ギャザー) とは、DMA、バス・マスター 等、高速な転送を行う場合に、分散してしまっているメモリ上のデータをまと めて連続転送する機能です】 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.3.2. st のモジュールのパラメタ buffer_kbs= write_threshold_kbs= max_buffers= max_sg_segs= ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.3.3. st の proc インタフェース ありません。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.3.4. OnStream デバイス用 osst ドライバ OnStream が製造したテープドライブには、別のドライブがあります。付加的 な高レベルのドライバで、st ドライバと共存できます。このドライバは「osst 」です(モジュール名も同じ)。 OnStream の SC-x0 SCSI テープドライブは、標準の st ドライバでは動作し ません。そのかわりに、特別な osst ドライバと /dev/osst キャラクタデ バイスノード(メジャー番号 206)が必要になります。 ( は Section 3.2 に あるような、st デバイスと同様な命名規則に従います)。 usb-storage と ide-scsi を用いれば、USB-x0 と DI-x0 ドライブが動作するかもしれません。 OnStream には、第二世代のテープドライブ(ADR-x0)が存在することに注意して ください。これは、テープ(QIC-157)用の標準 SCSI-2 コマンドをサポートして おり、st の標準ドライバで動作します。さらに詳しい情報は、カーネルソース のファイルである /usr/src/linux/drivers/scsi/README.osst を見てください 。 OnStream ドライバ情報をさらに知りたければ、 linux1.onstream.nl/test / にあります。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.4. 汎用ドライバ(sg) あらゆる種類の SCSI デバイスは、sg ドライバ経由でアクセスできます。つ まり、 CD-ROM ドライブなら、sr と sg ドライバいずれでもアクセスできます 。スキャナーのようなその他の SCSI デバイスは sg ドライバを使ってのみア クセスできます。 sg ドライバは、256 個の SCSI デバイスを認識できます。 デバイスは sg ドライバのロード後にいくつでも追加できます(ただし限度の 256 まで)。 SCSI 汎用(sg)ドライバのドキュメントはW4を参照してください(sg_utils パ ッケージにも入っています)。 SCSI 規格については、W1や SCSI のプログラミ ングが主題となっている書籍を参照してください。しくみを勉強したければ、 B3を参照してください。 カーネル 2.4 における sg ドライバは「バージョン 3」で、インタフェース 機構の追加と新しい ioctl() が加わりました。新規の ioctl() で一番おもし ろいのは、 SG_IO で、SCSI コマンドを送り出し、その応答を待ちます。 Linux Documentation Project サイトにある www.tldp.org/HOWTO/ SCSI-Generic-HOWTO/ に は、sg ドライバについての完璧な解説があります。このドキュメントの(おそ らくより新しい)バージョンは、 www.torque.net/sg/p/sg_v3_ho.html にあります。 カーネル内で使用されている「sg」という略語には、SCSI 汎用ドライバを指 す場合と、最近の入出力デバイス(普通は DMA 対応)の多くが提供している、 scatter-gather 機能を指す場合に使われています。どちらを意味するのかは、 文脈次第です。例えば、SG_GET_SG_TABLESIZE という分りにくい sg の ioctl ()は、2 番目の「SG」が scatter-gather を指しています。 sg の公開インタフェースは /usr/src/linux/include/scsi/sg.h にあります 。ディストリビューションにもよりますが、これは GNU ライブラリのメンテナ ーが管理している /usr/include/scsi/sg.h と同じ内容かもしれませんし、違 うかもしれません。この 2 つのファイルの内容が同じでなければ、前者のヘッ ダーファイルを使ってください。 sg ベースでアプリケーションを書く場合は 、sg の文書を見て、この問題をより深く理解する方が良いでしょう。 sg ドライバは、現在ある SCSI デバイスすべてを登録しています(現状の最大 数は、 256 個)。新しく登録する SCSI デバイスそれぞれに、次に利用可能な マイナー番号が確保されます。少なくとも最初の内は、cat /proc/scsi/scsi で表示される中間レベルのものと同じ順番です。sg デバイスのマッピングは、 cat /proc/scsi/sg/devices もしくは cat /proc/scsi/sg/device_strs でわか ります。 cat /proc/scsi/scsi と sg の順序の違いが生じるのは、低レベルの ドライバが削除された時(例えば rmmod aha1542)やデバイスが remove-single-device で削除された時です。 sg ドライバは、残っている SCSI デバイスを変更すること無く、マイナーデバイス番号にマッピングし続け ます。これは sg のマッピングに「欠番」を残すことになります。下記がその 例です。 $ cat /proc/scsi/scsi Attached devices: Host: scsi0 Channel: 00 Id: 00 Lun: 00 Vendor: IBM Model: DNES-309170W Rev: SA30 Type: Direct-Access ANSI SCSI revision: 03 Host: scsi1 Channel: 00 Id: 02 Lun: 00 Vendor: PIONEER Model: DVD-ROM DVD-303 Rev: 1.10 Type: CD-ROM ANSI SCSI revision: 02 Host: scsi1 Channel: 00 Id: 06 Lun: 00 Vendor: YAMAHA Model: CRW4416S Rev: 1.0g Type: CD-ROM ANSI SCSI revision: 02 $ cat /proc/scsi/sg/device_strs IBM DNES-309170W SA30 PIONEER DVD-ROM DVD-303 1.10 YAMAHA CRW4416S 1.0g $ echo "scsi remove-single-device 1 0 2 0" > /proc/scsi/scsi $ cat /proc/scsi/scsi Attached devices: Host: scsi0 Channel: 00 Id: 00 Lun: 00 Vendor: IBM Model: DNES-309170W Rev: SA30 Type: Direct-Access ANSI SCSI revision: 03 Host: scsi1 Channel: 00 Id: 06 Lun: 00 Vendor: YAMAHA Model: CRW4416S Rev: 1.0g Type: CD-ROM ANSI SCSI revision: 02 $ cat /proc/scsi/sg/device_strs IBM DNES-309170W SA30 YAMAHA CRW4416S 1.0g sg ドライバが「device_strs」の出力において、残っているデバイスの並び位 置をどのように管理しているかをよく見てください。Pioneer の DVD プレーヤ ーが削除されると sg デバイスのマッピングには欠番ができますが、 cat / proc/scsi/scsi には現れません。この「欠番」は /dev/sg1 に該当します。 新しい sg_io_hdr インタフェースには、未転送データ量をカウントするため の「resid」というフィールドがあります。低レベルのアダプタのいくつかだけ がこの機能をサポートしており、その場合でのみこのフィールドに 0 以外が入 ります。このドキュメントの執筆時では、advansys、aha152x、sym53c8xx ドラ イバがこの機能をサポートしています。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.4.1. sg のブート時のパラメタ sg ドライバは、オープンしているファイルディスクリプタそれぞれに対して 、予約済みのバッファを管理しています。この目的は、アプリケーションのデ ータ転送に際してカーネルのメモリが足りなくなっても、予約バッファの大き さに達するまでは転送が失敗しないことを保証することです。これは、 cdrecord のような ENOMEM エラーから簡単には復旧できない(CD-R なので) ア プリケーションにとっては重要です。 ブート時のパラメタに「sg_def_reserved_size」がなかったり、sg モジュー ルのパラメタである「def_reserved_size」がなかったりすると、sg のファイ ルディスクリプタがオープンする度に、include/linux/sg.h に定義してある SG_DEF_RESERVED_SIZE をそのまま使います。 SG_DEF_RESERVED_SIZE の値は、下記のカーネルブート時のオプションで変更 可能です。 sg_def_reserved_size= ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.4.2. sg のモジュールのパラメタ sg モジュールがロードされる時、SG_DEF_RESERVED_SIZE で定義してある値は 下記のオプションで変更できます。 def_reserved_size= ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.4.3. sg の proc インタフェース 次のファイルは誰もがすべて読み出し可能で、ASCII 形式で出力されます。「 def_reserved_size」は root が書き込み可能です。ASCII 出力は、人間とマシ ン両者が読める形式になっています(そのため読みやすさは犠牲になっていま す)。表出力を見るには、 cat device_hdrs devices という Unix コマンドを 使ってください。 /proc/scsi/sg/debug [sg ドライバの内部状態] /proc/scsi/sg/def_reserved_size [ブート時もしくはモジュールをロードした時の パラメタと同じ] /proc/scsi/sg/devices [数字表現のデバイスのデータテーブル] /proc/scsi/sg/device_hdr [sg と デバイスのカラムヘッダー] /proc/scsi/sg/device_strs [INQUIRY からの文字列のテーブル] /proc/scsi/sg/hosts [ホストデータ(数字)のテーブル] /proc/scsi/sg/host_hdr [sg と ホストのカラムヘッダー] /proc/scsi/sg/host_strs [ホスト ID(文字列)のテーブル] /proc/scsi/sg/version [sg のバージョン番号と日付] 上記のファイルすべては root がオーナーになっていて、どのユーザも読み込 み可能です。 def_reserved_size は root が書き込み可能です。 devices と device_strs 各ファイルは、最初の列が /dev/sg0 に対応しており(sg のマイ ナーデバイス番号 0)、2 番目の列は /dev/sg1 に対応しています (以下同様) 。 hosts と host_strs 各ファイルは、最初の列がホスト(アダプタ番号)の 0 に対応しています(以下同様)。数字で書いてあるテーブルでは、見つからない デバイスやホストはその列に「-1」という値が表示されます。文字列で書いて あるテーブルでは、見つからないデバイスもしくはホストはその列に「という「readme」ファイルに情報があります。その他の ドライバも、各「.c」ファイルの先頭にたくさんの情報が書かれています。こ の情報として、バージョン番号、変更履歴、カーネルブート時やモジュールロ ード時のオプションなどが含まれる場合がよくあります。オプションに関する 情報は、様々な Linux ディストリビューションのインストールガイドにもあり ます。ドライバのメンテナーが、Web サイトを立ち上げていて、そこに最新の バグフィックス情報があるケースもあります。オフィシャルなメンテナーの方 々は、 /usr/src/linux/MAINTAINERS ファイルに列挙してあります。そこに挙 がっていなければ、SCSI サブシステムのディレクトリにある、該当する「.c」 ファイルを見てください。古いドライバの中には、アクティブなメンテナーが いないものもあります。そのような場合は、linux-scsi ニュースグループに投 稿すれば、助けてもらえるかもしれません (N1を参照)。 カーネルのソースツリーが提供するドライバの全体像を掴むには、カーネルの 設定プログラム(例えば cd /usr/src/linux; make menuconfig) のどれかを利 用してください。それぞれのセクションに対応したヘルプ情報は、 1 つの(巨 大な)ファイル、 /usr/src/linux/Documentation/Configure.help にあります 。ドライバは他の所からも取得できます。カーネル 2.2 系(もしくはそれ以前) 用に作成したドライバは、カーネル 2.4系では構築や動作ができる可能性はわ ずかです。 (プログラムの面からは、変更が必要なところは多いとはいえませ ん)。ドライバにはバイナリ形式だけが利用可能なものもあるでしょう。この場 合、提供者を信用して、しっかり指示に従ってください。 低レベルのドライバは、2 種類あるエラー処理のどちらかをサポートできます 。古い方法は時代遅れとみなされており、新しい方法は「new_eh」と呼ばれて います。「new_eh」の長所は、独立したカーネルスレッドをホスト(「scsi_eh_ 」という名前が付きます。 はホスト番号)単位で使用し、エラーからの 復旧機能を持たせている点にあります。どちらのエラー回復の方法もカーネル 2.2 系で利用可能でしたが、アダプタドライバで「new_eh」を使っているもの はほとんどありません。カーネル 2.4 系では、より多くのドライバが new_eh を使用しており、来たるカーネル 2.5 開発版では、旧式のエラー回復方法の中 間レベルにおけるサポートは打ち切りになります。 Drew Eckhardt 氏の SCSI-HOWTO ドキュメント(W7 を参照)では、低レベルの (アダプタの)ドライバについて、このドキュメントよりもさらに詳細に踏み込 んでいます。ただ SCSI-HOWTO は、5 年も前のものなので、その後の変更も多 く、ドライバもさらに増えています。 scsi_debugという低レベルのドライバがあります。このドライバは、コンピュ ータのメモリを利用して、複数の「direct access」デバイス (例えばディス ク)をシミュレートします。カーネル 2.4.17 からは、「ram disk」として動作 します。Linux には色々な ram disk の実装がありますが (例えば ramfs)、 scsi_debug は、設定上の問題で障害がある SCSI ドライバを切り分けするのに 役立つでしょう。scsi_debug.c にさらに情報があります。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 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=ide-scsi ・ hdx=ide-cdrom ・ hdx=ide-floppy (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 を有効にする には下記のようにします。 [13] hdparm -d1 /dev/hdx cat /proc/ide/hdx/settings とすると、指定できる設定を表示します。汎用 IDE ドライバの設定すべてが使えます。下記の「ide-scsi 固有の」設定も使え ます。 ・ bios_cyl ・ bios_head ・ bios_sect ・ transform ・ log ディスクドライブ(ZIP 等)の場合、はじめの 3 つはドライブが sd ドライバに 返す仮想ジオメトリを表しています。「transform」は SCSI から ATAPI CDB へ変換するレイヤを設定したり、有効にしたり、無効にしたりします。【訳註 :CDB とは、Command Descriptor Block の略称で、SCSI 命令のデータ構造を 指します】 ・ 0 ビット目: sg ドライバから発生していないコマンドの変換の有効(1)も しくは無効(0)。 ・ 1 ビット目: sg ドライブを使って発行したコマンドの変換の有効もしくは 無効。 「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 ドライバの構造 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 つがありま す。お好みの検索エンジンを使って、他のプロジェクトも捜してみてください 。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Chapter 11. raw デバイス raw デバイスは、現在あるブロックデバイス(例えばディスク)に接続でき、そ れらで「raw(手を加えない)」IO を行うのに利用できます。このような「raw」 IO は、通常ブロックデバイスに通常付属するキャッシュを迂回します。したが って raw デバイスは、物理的なデバイスへの経路がより「直結」しているので 、アプリケーションからその物理デバイスに対する、IO のタイミングを細かく 制御できます。このため raw デバイスは、自身でキャッシュを持つことが多い データベース管理システムのような、複雑なアプリケーションに適しています 。 raw デバイスは、キャラクタデバイス(メジャー番号 162)です。最初のマイナ ー番号(つまり 0)は、制御用インタフェースとして予約されていて、普通は / dev/rawctl にあります。raw と呼ばれるユーティリティ(man rawを参照)は、 raw デバイスを今あるブロックデバイスに接続するのに利用できます。これら の「今あるデバイス」としては、ディスクや CD-ROM、DVD などのうち、下層の インタフェースが Linux でサポートされている(例えば IDE(ATA)や SCSI)もの が該当します。 私のシステムで実行した下記の一連のコマンドは、まず raw デバイスをリス トし、 SCSI ディスクのパーティションを接続し、ついでにディスク全体を接 続しています。 $ ls -lR /dev/raw* crw-r--r-- 1 root root 162, 0 Dec 6 06:54 /dev/rawctl /dev/raw: total 0 crw-r--r-- 1 root root 162, 1 Dec 6 06:54 raw1 crw-r--r-- 1 root root 162, 2 Dec 6 06:54 raw2 crw-r--r-- 1 root root 162, 3 Dec 6 06:54 raw3 crw-r--r-- 1 root root 162, 4 Dec 6 06:54 raw4 $ $ raw -qa $ $ raw /dev/raw/raw1 /dev/sda3 /dev/raw/raw1: bound to major 8, minor 3 $ raw /dev/raw/raw2 /dev/sda /dev/raw/raw2: bound to major 8, minor 0 $ raw -qa /dev/raw/raw1: bound to major 8, minor 3 /dev/raw/raw2: bound to major 8, minor 0 キャラクタデバイス用の通常のシステムコール群は、raw デバイスでも利用で きます。read(2)と write(2)が転送する大きさは、物理的なデバイスブロック サイズの整数倍でなければいけません。これはディスクではセクタの大きさに 該当し、普通は 512 バイトです。read()と write()システムコールに与えられ るデータバッファは、ブロックの大きさに合わせたものでなければいけません 。lseek(2) システム・コールも、ファイルの読み書きオフセットをブロックの 境界にあわせなければいけません。pread(3)(man preadを参照)は、 read()と lseek()を兼ね備えたシステムコールで、raw デバイスで便利に使えます (pwrite()も同様)。32 ビットアーキテクチャ (つまり off_t 型が 32 ビット 長) で 2 GB(あるいは 4 GB)以上のオフセットを用いる場合には注意が必要で す。解決方法のひとつは、_llseek()システムコールを用いることです (man llseekを参照)。 最近のバージョンの dd や lmdd(lmbench に入っているプログラム)のような Unix ユーティリティは、上述のブロックアラインメントを行えるので、「raw 」デバイスとデータをやり取りできます。sg_util パッケージに入っている最 近のバージョンの sg_dd コマンドは、raw デバイスにも sg デバイスにもアク セスできます。 物理デバイスのセクタ数が奇数だと(blockdev --getsize /dev/raw/raw*)でわ かります)、raw 入出力では最後のセクタにアクセスできません。 ┌──────────────────────────────────┐ │ Warning │ ├──────────────────────────────────┤ │あるブロックデバイスに対して、そのデバイスに対応している raw デバイ │ │ス経由でアクセスし、かつ通常のブロックインタフェース経由でもアクセス│ │すると、2 つのアクセス機構間でキャッシュの一貫性が保てません。例えば│ │/dev/sda1 が両者でマウントされ、接続している raw デバイス経由でアク │ │セスされると、データに不整合が発生するかもしれません。 │ └──────────────────────────────────┘ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Chapter 12. devfs 擬似ファイルシステム devfs の中核的なドキュメントは、W5を参考にしてください。 SCSI サブシス テムにおける devfs の命名規則の概要は、 Section 3.3にあります。 devfs は、カーネル構築オプションの CONFIG_DEVFS_FS で選択します。ブート時に(/ dev として)マウントされるかどうかは、カーネル構築オプションの CONFIG_DEVFS_MOUNT で決まります。後者のオプションは、カーネルブート時の オプションである「devfs=mount」もしくは「devfs=nomount」の好きな方どち らによっても変更できます。 devfs の SCSI ノード名と、デフォルトのパーミッションは下記の通りです。 disc rw------- whole disk including mbr part1 rw------- first partition {...p1} ... part15 rw------- 15th partition {...p15} cd rw-rw-rw- cd or dvd devices mt rw-rw-rw- tape mode 0 with rewind {...m0} mtl rw-rw-rw- tape mode 1 with rewind {...m1} mtm rw-rw-rw- tape mode 2 with rewind {...m2} mta rw-rw-rw- tape mode 3 with rewind {...m3} mtn rw-rw-rw- tape mode 0 with no rewind {...m0n} mtln rw-rw-rw- tape mode 1 with no rewind {...m1n} mtmn rw-rw-rw- tape mode 2 with no rewind {...m2n} mtan rw-rw-rw- tape mode 3 with no rewind {...m3n} generic rw-r----- これらのノード名は、対応しているデバイス(もしくはデバイスのサブエント リー (例えばパーティション))とドライバが存在する時にだけ現れます。例え ば sg ドライバがなければ「汎用」デバイス名は存在しません。上記の{}中 の文字列は、下記で説明する「c0b0t0u0」という簡略表記の後ろに適宜追加さ れます。 ブロックスペシャルファイルやキャラクタスペシャルファイルになっている devfs ファイル名を、ここではプライマリデバイス名と呼びます。devfs のデ ーモン devfsd は、これらのプライマリデバイス名に対してたくさんのシンボ リックリンクを張っています。これは下位互換性と利便性のためです。これら のシンボリック・リンクは、セカンダリデバイス名と呼びます。 セカンダリデバイス名は、devfsd の設定ファイルで制御されます。設定ファ イルは通常 /etc/devfsd.conf です。デフォルトの devfsd.conf ファイルを使 うと、セカンダリデバイス名は下記のリストになります。 セカンダリ名 プライマリデバイス名へのシンボリックリンク -------------------------------------------------------------- /dev/sda /dev/scsi/host0/bus0/target2/lun0/disc /dev/sda1 /dev/scsi/host0/bus0/target2/lun0/part1 /dev/sd/c0b0t2u0 /dev/scsi/host0/bus0/target2/lun0/disc /dev/sd/c0b0t2u0p1 /dev/scsi/host0/bus0/target2/lun0/part1 /dev/sr0 /dev/scsi/host0/bus0/target4/lun0/cd /dev/sr/c0b0t4u0 /dev/scsi/host0/bus0/target4/lun0/cd /dev/st0 /dev/scsi/host1/bus0/target0/lun0/mt /dev/nst0a /dev/scsi/host1/bus0/target0/lun0/mtan /dev/st/c1b0t0u0m0 /dev/scsi/host1/bus0/target0/lun0/mt /dev/st/c1b0t0u0m3n /dev/scsi/host1/bus0/target0/lun0/mtan /dev/sg0 /dev/scsi/host0/bus0/target2/lun0/generic /dev/sg1 /dev/scsi/host0/bus0/target4/lun0/generic /dev/sg2 /dev/scsi/host1/bus0/target0/lun0/generic /dev/sg/c0b0t2u0 /dev/scsi/host0/bus0/target2/lun0/generic /dev/sg/c0b0t4u0 /dev/scsi/host0/bus0/target4/lun0/generic /dev/sg/c1b0t0u0 /dev/scsi/host1/bus0/target0/lun0/generic SCSI CD-ROM 用として良く使われる /dev/scd0 系がサポートされていないこ とに気づきましたか。/dev/discs、 /dev/cdroms、/dev/tapes といった、その カテゴリに入るデバイスすべて(つまり、SCSI デバイスに限らない) に対する シンボリックリンクを集めたディレクトリも存在します。 セカンダリ名 プライマリデバイスへのシンボリックリンク ------------------------------------------------------------ /dev/discs/disc0 /dev/ide/host0/bus0/target0/lun0 * /dev/discs/disc1 /dev/scsi/host0/bus0/target2/lun0 * /dev/cdroms/cdrom0 /dev/ide/host0/bus1/target1/lun0/cd /dev/cdroms/cdrom1 /dev/scsi/host0/bus0/target4/lun0/cd /dev/tapes/tape0 /dev/scsi/host1/bus0/target0/lun0 * 「*」がついた項目は、プライマリデバイスがあるディレクトリです。 IDE (ATA)デバイスは SCSI デバイスの前にリストされます。これらセカンダリデバ イス名の永続性は、プライマリデバイス名と同じ規則に従います。したがって 、SCSI デバイス(?)もしくはその低レベルもしくは高レベルのドライバが削除 されると、対応していたプライマリ・セカンダリデバイス名も削除されます。 devfs が /dev でマウントしてある場合でも、以前の /dev/sda6 もある状況 下では利用できます。これはカーネルブート時に入力が必要な場合に便利でし ょう。例えばユーザが「devfs」を使っているマシンのルートパーティションを 変更したい場合は、下記のブート時オプションのいずれも使えます。 root=/dev/sda6 root=/dev/scsi/host0/bus0/target0/lun0/part6 root=/dev/sd/c0b0t0u0p6 プログラムの中には、デバイスをスキャンする際に devfs 以前のデバイス名 を想定しているものがたくさんあります。それらのプログラムが devfs を認識 するまでにはしばらく時間がかかりるでしょう。また、sg ドライバのロード (モジュールになっていて、まだロードされていない場合)を、(例えば) /dev/ sg0のオープンによって行うようなプログラムもあります。これについては / etc/devfsd.conf の次の項目で調整できます。 LOOKUP sg.* MODLOAD そして /etc/modules.devfs は下記のようになります。 probeall /dev/sg scsi-hosts sg alias /dev/sg* /dev/sg sg デバイスのパーミッションは、/etc/devfsd.conf ファイルの項目で調整で きます。 REGISTER scsi/host.*/bus.*/target.*/lun.*/generic PERMISSIONS 0.0 rw-rw-rw- 詳しくは、「man devfsd」を見てください。 アプリケーションから devfsd が動作中かどうかを判断するのに、 /dev /.devfsd の有無が使えます。 永続的なファイルシステム(例えば ext2)に基づく /dev ディレクトリの特徴 のひとつに、デバイスファイル名とパーミッションとを関係付け、それをブー トとブートの間にも維持する機能が挙げられます。上記で述べたように、devfs のデフォルトの動作では、マシンがブートするごとにデバイスファイル名のパ ーミッションを割り当てます。/etc/devfsd.conf の PERMISSION 動作をパーミ ッション指定に使えますが、これは少々面倒だと思います。 devfs のドキュメ ント(W5)では、一石二鳥な方法を記述されています。このテクニックは Linux カーネル 2.4 に最近追加された、複数の場所に同じファイルシステムをマウン トする機能によるものです。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Appendix A. 一般的なバスの種類(SCSI 等) この付録で触れる様々なバスの種類(SCSI もその他も)の概観としては、 www.pctechguide.com/04disk2.htm が非常に優れています。 (注: リンク切れ です。- 2006-08-06 JF Project) SCSI. オリジナルの SCSI 1 規格(ANSI 規格 X3.131-1986)は、8 ビットのパラ レルバスです。非同期で 1.5 MB/sec、同期で 5 MB/sec までの転送ができるこ とになっていました。SCSI コマンドは非同期で送られます。SCSI データは非 同期(最悪の場合)もしくは、ネゴシエーションをして同期(最善で 5 MB/sec)で 送られます。 FAST SCSI. SCSI 2 規格は、最大同期速度が 10 MB/sec まで上がりました。 SCSI 2 ではパラレルバスがいくつか定義してあります。シングルエンド(SCSI 1 で使用)と、新規のディファレンシャルバスです。ディファレンシャルバスは 、耐ノイズ性に優れ、最大バス長が 25 m になりました(これに対してシングル エンドは 6 m)。タグキューのコマンドも SCSI 2 で追加されました。 WIDE SCSI. SCSI 2 規格ではバス幅も広がり、16 と 32 ビットの(wide)な変種 が認められました。 32 ビット幅はほとんど使われていませんので、「wide」 は通常 16 ビット幅のデータパスを指します。パラレルバスに接続できる SCSI デバイスの最大数は、バス幅に密接に関連しており、「wide」バスには最大 16 個の SCSI デバイスが接続可能です。(デバイスの内少なくとも 1 つは SCSI「 イニシエータ」でなければいけませんい。通常イニシエータはホスト・アダプ タ)。 ULTRA SCSI. これまで同期式のバスは、クロック(通常は方形波)の立ち上がり と立ち下がりどちらかで同期を取ってきましたが、最近はクロックの立ち上が りと立ち下がり両方でクロックを取り、利用できる帯域幅を倍にする傾向にあ ります。この方法によって、ULTRA SCSI は SCSI 2 を「高速」にして 20 MB/ sec となりました。 ULTRA WIDE SCSI. 「ULTRA」と同じ技術を(16 ビット)の wide SCSI パラレル バスに適用し、帯域幅を 40 MB/sec にしています。 ULTRA 2 WIDE SCSI. このタイプは、新しい「低電圧」版のディファレンシャル な信号形式(LVD)で、同期クロック速度を倍にし、(16 ビット)wide バスを使っ て 80 MB/sec にしています。この場合の、SCSI バス長は最長 12 m です。 ultra wide との下位互換性のため、「シングルエンド」での操作も可能になっ ています。これには、LVD/SE という略語がアダプタ製造メーカーによって使わ れています。この取り組み方の欠点の 1 つに、U2W バス上に UW デバイスが存 在していると、他の U2W デバイスの速度が遅くなって(つまり、UW になって) しまう点があります。アダプタには、論理的には同一の SCSI バス上でありな がら、物理的に LVD と SE を独立したバスに載せ、この欠点を補っているもの もあります。 ULTRA 160 SCSI. ULTRA 160 は、パラレル SCSI のバス幅をさらにまた倍にし ています。16 ビット幅のデータバスに LVD の信号形式(先の項目を参照)を使 っています。さらに DT(Double Transition)クロックにより、同期帯域幅は最 高で 160 MB/sec になります。追加機能として巡回冗長検査(CRC)が加わり、デ ータの整合性が(パリティビットと比べて)向上しています。またエラー率があ まりに高くなると、転送速度を調整するドメインバリデーション(domain validation)も加わっています。 " 【訳註:ULTRA 160 までの SCSI 一般につ いての説明は、 adaptec 社の SCSI HAND BOOK(日本語) を参照してください】 " ULTRA 320 SCSI. まもなく ULTRA 320 アダプタが登場します(このインタフェ ースを持ったディスクはすでに市場に出ています)。この規格も 16 ビット幅の LVD バスです。古いデバイスに対する互換性を保つために速度を落とせます。 クロック速度を倍にして、Ultra 160 の能力を向上させています。コマンドと ステータスを (5MB/sec ではなく) バンド幅のフル速度で送る、 Packetized SCSI という機能も含まれます。その他の改良点として、「quick arbitration and selection(QAS)」や「read and write data streaming」、データと同様に コマンドブロックを保護する CRC プロテクションがなどがあります(Ultra 160 はデータに対してだけ CRC プロテクションが有効)。このような速度になると 、PCI バスをボトルネックにしないためには、64 ビット PCI (さらに良いのは PCI-X) カードが必要とされます。さらに詳しい情報は、 www.scsita.org を見てください。最近になって Ultra 320 の HBA ベンダーは、秒あたりの入出力操作が 105,000 にまで達したと言っています。 これは、コマンド当たりの SCSI バスのオーバーヘッドが 10 ms 以内というこ とになります。ULTRA 640 規格のドラフトもありますが、シリアルアタッチド SCSI に取って代わられるでしょう。 " 【訳註:「quick arbitration and selection(QAS)」と「read and write data streaming」については、米 adaptec 社の Ultra320 SCSI: New Technology-Still SCSI を参照してください】 " シリアルアタッチド SCSI(SAS). シリアルアタッチド SCSI(SAS)は、シリアル ATA(sATA)と同じ転送技術を、さらに拡張して使うものです。(sATA については 後述)。SAS では、外部エクスパンダを使って、4096(?)個のデバイスをひとつ の HBA 回路で制御できます。データ転送は全二重で、1.5 Gbps の「束」をま とめ、帯域を広げられます。ケーブル長は 6 m までです。SAS ディスクはデュ アルポートになっています。 sATA ディスクは、SAS HBAに接続できます(ただ し、SAS ディスクは sATA HBA には接続できません)。 SAS は、最近 CeBit(国 際事務情報/通信技術見本市)でデモが行われましたが、 2004 年までは市場に は出ないでしょう。 " 【訳註:外部エクスパンダについては、 adaptec 社の SCSI HAND BOOK(日本語) を参 照してください】 " FC-AL. これは、ファイバチャネルアービトレイトループを意味し、2 GB/sec のシングルモード光ファイバーをデュアルで接続し、10 Km の経路で 400 MB/ sec の流量を流します。 storage area network(SAN)と連携するケースがよく あります。ループには 126 デバイスまで接続できます。public loop モードに するとさらに拡張が可能で、 1600 万もの接続が可能になります。転送媒体に は光ケーブルでなくても構いません。低速で経路が短かければ、メタルケーブ ル(同軸ケーブル)も使用できます。 IEEE 1394. この規格は、「Fire Wire」(APPLE の商標)とも「iLink」(SONY の 商標)とも呼ばれています。シリアルバスで、400 MB/sec まで動作します。USB と似ていますが、より汎用的な構造になっています。IEEE 1394 規格では、 SCSI コマンドセットを 1394 バスに載せています。Linux の IEEE 1394 スタ ックとしては、「sbp2_1394」ドライバが利用可能になりました。この sbp2_1394 ドライバは、 SCSI サブシステムの低レベルなドライバでもありま す(よって機能的には ide-scsi ドライバと似ています)。つまり、SBP-2 プロ トコルを使用した IEEE 1394 デバイス(例えばディスク、 CD-RW、DVD ドライ ブ、MO ドライブ、スキャナー)には、SCSI サブシステムを通じてアクセスしま す。 Linux1394.sourceforge.net に詳 しい情報があります。 sbp2 ドライバは、Linux カーネル 2.4.7 に取り込まれ ました。 iSCSI. これは SCSI コマンドセットを TCP 接続(もしくはそれらの内のいくつ か)で送る、新たな IETF 規格です。これは SCSI デバイス(ターゲットはディ スクのようなもの) をネットワーク機器とし、ホストマシンからローカルに(も しくは遠距離から) アクセスすることを可能とします。 SCSI 以外のバス. これから述べるバスは SCSI 規格では定義されていませんが 、SCSI コマンドセットも運べること、ある面で Linux の SCSI サブシステム に関連していること、SCSI 製品と同様の機能を提供することなど、本文書の対 象となりうるものです。 IDE/ATA (ATAPI). IDE は、PC システムで現在最も普及しているタイプのディ スクです。頭文字は、 Integrated Drive Electronics を表しています。名前 が示す通り、IDE では IO の「知能」をディスクコントローラカードに集中さ せています。これに対し、例えば SCSI では、IO 機能をデバイス(たいていは ディスク)とコントローラ(HBA) 間に分散させています。 IDE は、1980 年代に ST506 と ESDI 規格からはじまりました。EIDE(extended IDE) は、同類の略語 です。このバスアーキテクチャを指す最近の規格は ATA として知られており、 www.t13.org で見られます。ATA のパケットインタフ ェース(ATAPI)は、ディスク指向のコマンドセットを拡張して、CD-ROM やテー プドライブをサポートしています。ATAPI のコマンド・セットは、SCSI コマン ドセットと非常に似ています。最新の ATA 技術については、次の節で紹介しま す。 ATA 133. IDE デバイスが使用する ATA 規格も、形容詞(例えば fast や ultra)や数字(例えば 2、33、66、100、133)が並んできました。最も新しく加 わったのは ATA 133 で、バーストで 133 MB/sec の速度とバス当たり 2 つま でのデバイスをサポートしています。(PC には通常、2 本または 4 本の ATA バスがあります)。 ATA 66、 100、133 には、専用のケーブルが必要になりま す。 ATA ケーブルはかなり短く、コンピュータ外部に IDE デバイスが置けな いのはこのせいです。ケーブル長はこれまで 46 cm が限度でしたが、最近にな って 1 m のものが出てきました。133 MB/sec という値は、おおかたの PC の 最大転送速度でもあります。より高速(かつ帯域も広い)バージョンの PCI もあ りますが、まだそれほど普及しているわけではありません。 シリアル ATA (sATA). シリアル ATA はディファレンシャルのペアを 2 組使い 、1 つはディスクからデータを sATA ディスクとデータを交換します。1 m 以 内の距離で 1.5 G ビット/sec で転送します。1 組はデータをディスクに送り 、もう 1 つはディスクからデータを受けます。データ速度は、 150 MB/sec ま で可能です(データ転送は半二重)。 sATA はポイント‐ポイント接続で、バス 接続ではありませんので、ATA のマスターとスレーブという関係は存在しませ ん。sATA の配線はすっきりしていて、プラグやソケットの形状もパラレル ATA (と SCSI パラレルインタフェース) より小ぶりです。sATA デバイスは市場に 出はじめたところです。sATA-2 はドラフト規格で、シリアルのデータ転送量が 3 G ビット/sec になっています。 USB. ユニバーサルシリアルバス(USB)は、帯域幅が 1.5 から 12 M ビット/sec (後者の速度は USB 1.1)です。ハブそれぞれに最大 7 つのデバイスが接続でき 、ハブを複数用いて 127 個までのデバイスが接続できます(長さの限界は 5 m) 。 USB は、低消費電力デバイス向けに、 5 V 0.5 A を供給します。USB は「 プラグアンドプレイ」で、ホットプラグができ、同期転送をサポートします(最 低帯域幅保証が必要なオーディオやビデオデバイスに適しています)。 PC パラレルポート. もともと PC についているパラレルポートは片方向(プリ ンター向き)で、約 10 KB/sec の能力がありました。1994 年の IEEE 1284 規 格では、データ転送方法が 5 種類ありました。 ・ 互換モード(順方向) ・ ニブルモード(逆方向) ・ バイトモード(逆方向) ・ EPP モード(双方向) ・ ECP モード(双方向) エンハンスドパラレル・ポート(EPP)は、転送速度が 500 KB/sec から 2 MB/ sec の間になり、CD-ROM、テープ、ハードドライブをターゲットにしています 。エクステンデッドケイパビリティポート(ECP)は、ラン・レングス符号化を取 り入れ、DMA をサポートしています。 ECP は高速なプリンターやスキャナーを ターゲットにしています。 I2O. 「I2O(Intelligent Input/Output)仕様は、インテリジェントな入出力の ための標準的なアーキテクチャで、制御されるデバイスやホストのオペレーテ ィングシステム(OS)から独立しています」(www.i2osig.org から引用)。 I2O は「分割ドライバ」モデルを定義しており、 それによると OS Services Module(OSM)が、ホスト OS のデバイスインタフェ ースと I2O コミュニケーション層の間に入り、一方 Hardware Device Module (HDM)が、I2O コミュニケーション層とハードウェアの間に入ります。HDM は、 恐らく専用プロセッサ(IOP)上で動作するでしょう。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Appendix B. Linux カーネル 2.2 と現状のカーネル 2.4 間の変更 特筆すべき作業としては、Linux カーネル 2.2 では SCSI コマンドキューが ひとつしかなかったのに対し、デバイスごとにひとつのキューが使えるように なりました。 SCSI サブシステムが SMP により親和性が高くなるように、ロッ クの粒度がさらに細かくなっています。linux カーネル 2.2 では、基本的にサ ブシステム全体が 1 つのロックを使っていました。 SCSI サブシステムの一部ではありませんが、devfs が対応することで、SCSI デバイスが以前抱えていたアドレス付け問題が多数解決します。 devfs に関連 して、devfs が無い場合にとても便利なのが、カーネルブート時 (およびモジ ュールロード時)の「scsihosts」オプションです。ユーザはこのオプションに よって、複数の SCSI ホストの順序付けを制御できます。 Linux カーネル 2.4(とその開発ブランチ)で効果が明らかになった機能やドラ イバは、Linux カーネル 2.2 系の新しいリリースにバックポートされる傾向に ありますので、この付録の更新は容易ではありません。 現在(Linux カーネル 2.4.2)、MO デバイスのサポートがおかしくなっていま す。ブロックサイズが 2048 バイトである古い DOS ファイル・システムもおか しいとの報告が上がっています。ブロックサブシステムが使用している 1 KB の論理ブロックサイズよりも、物理ブロックサイズが大きいメディアで起こる 問題のようです。 sd ドライバにだけ問題があります(幸いなことに、2048バイ トのセクタが標準である sr ドライバは、問題ありません)。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ B.1. 中間レベルの変更 SCSI_IOCTL_GET_IDLUN {ioctl, changed} ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ B.2. sd の変更 HDIO_GETGEO_BIG {ioctl, new} ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ B.3. sr の変更 sr の変更は報告されていません。関連事項として、「hdx=scsi」というカー ネルブート時のオプションが追加されています。詳細はSection 9.2.4 を参照 してください。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ B.4. st の変更 インタフェースに変更はありません。Linux カーネル 2.2 では、ブート後に 追加できる最大テープデバイス接続数が 3 に制限されていました。この制限は 無くなりました(先に述べた通り、テープデバイスの最大数は 32 個のまま)。 st ドライバの仲間である「osst」は、OnStream の初期モデルのテープドライ ブを対象にしており、Linux カーネル 2.4 で追加されました。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ B.5. sg の変更 主な変更は、「sg_io_hdr」という新しいインタフェース構造体の追加です。 これまでの(「sg_header」と呼ばれていた)インタフェース構造体は、read() と wite() コマンドにおいて、raw データとメタデータを連結する必要があっ た点、柔軟さに欠けていました。 sg_io_hdr {新しいインタフェース構造体} SG_IO {新しい ioctl} direct IO {存在しているが、コメントアウトしてある。ALLOW_DIOを参照} procfs output {/proc/scsi/sg directory の新しい情報} boot/module parameters {新規} sg_io_hdr インタフェース構造体からは、64 バイトまでのセンスデータが取 得できます。またデータ転送における残り分の数も取得できるようになってい ます (低レベルのドライバがサポートし、残り分が 0 でなければ)。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ B.6. Linux カーネル 2.4 系での変更 Linux カーネル 2.4 系は「安定版」ですが、バグフィックスだけでなく、か なりの変更があります。下記のリストには低レベル(アダプタ)の変更は入って いません。リストそれぞれの項目の先頭部分は、その変更がアナウンスされた カーネルバージョンです。 [14] ・ [2.4.4] SCSI_IOCTL_GET_PCI ioctl() 追加。 ・ [2.4.7] デバイスへの INQUIRY で SCSI レベルが SCSI_2 より上位であ るとわかった場合、今後「LUN」ビット(SCSI 1 と SCSI 2 規格では 3 ビ ットで LUN の値は 0 から 7) による SCSI コマンドの 2 バイト目のマス クは行わない。 ・ [2.4.7] カーネル(と scsi_mod モジュール)オプション max_scsi_luns が取る値は 1 から 7 だったが、より大きな値がとれるようになった。(ス キャンアルゴリズムは、まだ REPORT_LUNS を利用せずにシーケンシャルス キャンを行う)。 ・ [2.4.7] scsi_unregister_host() と scsi_unregister_module() が int を返すようになった(以前は、void を返した)。0 が成功で、-1 が失敗(た いていは busy 状態)。 ・ [2.4.7] 高レベルのドライバが、接続している SCSI デバイス名を正しく 返すようになった。(「Detected ...」ではじまるログのメッセージが、時 としておかしなデバイス名を返していた(例えば sdb ではなく sdc という ように))。カーネルのブート時のメッセージに「Attached ...」のように 、SCSI デバイスが出るようになった。 ・ [2.4.7] Scsi_Host 構造体に「max_sectors」が追加された。 ・ [2.4.8] 中間レベルのロジックが変更され、センスバッファで論理ユニッ トが準備完了(ASC=4, ASQ=1)を示すと、コマンドをリトライするようにな った。 ・ [2.4.9] st のメジャーアップデート。 ・ [2.4.9] 低レベル(アダプタ)が DID_RESET を返すとコマンドをリトライ するよう、中間レベルが変更された。 ・ [2.4.10] 中間レベルが REQUEST SENSE を発行すると、元々の結果(SCSI の状態を含む)が保存されるようになり、後で復元できるようになった。 ・ [2.4.10] BLKGETSIZE64、BLKBSZSET、BLKBSZGET 各 ioctl が sd と sr へ追加された。 ・ [2.4.10] sg の競合が修正され、open 時に access_count を増加(および 解放時に減少)するようになった。 ・ [2.4.11] MODULE_LICENSE("GPL")であるほとんどのドライバへ MODULE_LICENSE マクロを追加。 ・ [2.4.11] 各コマンドの scsi_pid が 1 増えた(なんで?)。 ・ st が更新され、access_count が増えた。これで高レベルのドライバは、 すべて open 時に access_count を増やし、解放時に減らす。 ・ [2.4.13] scatterlist 構造体の拡張(alt_address が削除され、page と offset が追加)。 ・ [2.4.13] ターゲット <= SCSI_2 なら、8 以上の LUN はスキャンしない 。 ・ [2.4.14] scatterlist 構造体の変更に関したチューニング(バグ修正)(st が壊れた?) ・ [2.4.15] 16 バイトの SCSI コマンドを許可(MAX_COMMAND_SIZE が 12 か ら 16 に変更)。中間レベルが 16 バイトの SCSI コマンドを扱うには、 HBA ドライバは Scsi_Host::max_cmd_len を 16 に設定する必要がある。 ・ [2.4.15] SCSI サブシステムから、BLKGETSIZE、BLKGETSIZE64 各 ioctl ()の実装が削除された(ブロックサブシステムに移動)。 ・ [2.4.15] st の大幅なアップデート。 ・ [2.4.15] Linux カーネル 2.5.0 が分岐し、Linux カーネル 2.4.15 == Linux カーネル 2.5.0 になる。 ・ [2.4.17] scsi_wait_req()に generic_unplug_device()が追加。これで SCSI_IOCTL_SEND_COMMAND における長い wait が解消。 ・ [2.4.17] デバイスをスキャンする際に scsi_level(つまり SCSI 規格へ の対応レベル) を間違えるバグがあった。 ・ [2.4.17] sg ドライバの大幅な更新。mmap()-ed IO の追加。 ・ [2.4.18] 高レベルのドライバが、「init()」関数を許可(例えば sd_init ())を、きちんと手続きを踏んだ上で失敗できるようになった。 (Scsi_Device::detected と scsi_unregister_module()が追加)。 ・ [2.4.18] MO デバイスでの SCSI コマンドのクラスタリングを修正。 ・ [2.4.18] st ドライバの更新(圧縮アルゴリズム)。 ・ [2.4.18] Documentation/scsi.txt と scsi-generic.txt の更新。 ・ [2.4.18] scsi_debug ドライバの修正。 ・ [2.4.19] SCSI の予約機能とリセット機能を追加。予約によって、複数マ シンが同じデバイスを(予約・解放機構により)共有できるようになった。 予約しているのに反応の無いマシンを「中断」するには、(sg 経由の)SCSI をリセットが必要とされる。 ・ [2.4.19] BLIST_LARGELUN を導入し、SCSI 2 と認識しても 7 より大きい LUN を扱うようにした。 ・ [2.4.19] sd と sr を変更し、RECOVERED_ERROR をハードエラーと扱わな いようにした。ログもしくはコンソールに警告を送る。 ・ [2.4.19] 使用前に sg のバッファをゼロに設定する。(sg のバージョン が 3.1.22 から 3.1.24 へアップグレードしたが、sg.h には(表面的には) 反映されていない)。 ・ [2.4.20] ハイメモリ(HIGHMEM)入出力のサポート追加。aic7xxx や 3w-xxxx、esp、 megaraid、qlogicfc、sym53c8xx_2 LLD。 ・ [2.4.20] st にブート時及びモジュールロード時の「blocking_open」パ ラメタを追加。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Appendix C. トラブルシューティング SCSI の問題の多くは、ケーブルの取り回しと終端処理(がされていない、もし くは不適切)が原因です。これによって SCSI バスのリセットが発生し、パリテ ィや CRC エラーが起こり、時には転送速度が低下します。SCSI の終端の方法 については、素晴らしいチュートリアルが次のサイトにあります。 www.scsita.org/aboutscsi/SCSI_Termination_Tutorial.html 。そのサイトに は他にも、ためになる SCSI の情報があります (W9を参照)。 SCSI の「FAQ」サイトもあります(W10参照)。設定とトラブルシューティング をいろいろと扱っています。このサイトの焦点は Windows(とその ASPI インタ フェース)にありますが、多くは Linux や他の Unix の実装における SCSI に も関連しています。 システムのどこかが固ったように見える時、問題の原因を見つけ出すには、 ps コマンドが役立ちます。下記のオプションは、カーネルのどの部分が問題を 起こしているのかを特定するのに便利です。この情報をメンテナーに送ってみ てください。 ps -eo cmd,wchan ps -eo fname,tty,pid,stat,pcpu,wchan ps -eo pid,stat,pcpu,nwchan,wchan=WIDE-WCHAN-COLUMN -o args 「ハング」している所を見つけ出すのに最も大事なオプションは、「wchan」で す。これがカーネルのアドレスならば、ps は /proc/ksyms を使って、最も近 いシンボルの位置を見つます。「nwchan」オプションは、数字で現した「ハン グ」したアドレスです。 キーを打ってもシステムが反応しない場合、テキストモードで とすればスタックトレースが出力され、 とすればすべてのプロセスの一覧が出力されるはずです。ログ機能がまだ動い ていれば、出力はログとコンソールにも送られます。 CONFIG_MAGIC_SYSRQ を設定してカーネルを構築してあれば、テキストモード で を押すと、使用できるコマンドがリストされます。 は、緊急時に sync する場合に役立ち、 は、リ ードオンリーでファイルシステムをマウントし直すのに便利です。これを行っ たら、次は でマシンをリブートすることになるでしょう。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Appendix D. パフォーマンス、テスト、デバッグ用のツール scu. SCSI Command Utility(SCU)には、SCSI 機器の日常のメンテナンスや診断 に必要な様々な SCSI コマンドが用意されています。含まれている機能は、フ ォーマット、不良ブロックのスキャン(とブロックの再配置)、新しいファーム ウェアのダウンロード、診断の実行、パフォーマンス情報の取得などがありま す。Unix プラットフォーム(と NT)のいくつかで利用可能ですが、現状ではバ イナリ形式のみの提供です。詳細は www.bit-net.com/~rmiller/scu.html を見てください。 dd. ディスクや CD-ROM、DVD で、ストリーミング性能のテストにとても便利で す。詳細は man dd してみてください。例として、0 ブロックからはじまる 1 GB(10**9 バイト)のデータをディスクから読み取るのにどのくらいかかるのか 調べる例を挙げておきます。 $ time dd if=/dev/sda of=/dev/null bs=512 count=1953126 /dev/sda の raw デバイスが /dev/raw/raw1 なら、上記の行は下記と等しくな ります。 $ time dd if=/dev/raw/raw1 of=/dev/null bs=512 count=1953126 一度に 1 セクタ 512 バイトを読んでいるので、期待していた程速くないかも しれません。dd の最後 2 つの引数を「bs=8k count=122071」に変更すれば、 「raw」への dd はより高速になるはずです。 dt. Data Test(DT)プログラムは、dd の書式を雛形にしています。しかし、dt にはシーケンシャルなコピーの他にも、いろいろな機能があります。ディスク やテープ、 CD-ROM、DVD のような SCSI デバイス向けの総合的なデータテスト プログラムです。 Unix プラットフォーム(と NT)のいくつかで利用が可能で、 ソースも利用可能です (これが前出の「scu」と異なります)。 www.bit-net.com/~rmiller/dt.html に詳しい情報があります。 lmdd. このコマンドは、lmbench に入っているプログラムの 1 つで、dd コマ ンドと同系列のプログラムです。入出力の測定用になっていて、完了時にかか った時間と転送量を出力します。つまり time コマンドと電卓は必要なくなり ます。 blockdev. ブロックデバイス(通常はディスク)のセクタサイズとセクタ数、先 読み状態を取得します。バッファをフラッシュするのにも利用でき、パーティ ションテーブルの再読み込みも可能です。man blockdev を参照してください。 sg_dd. このコマンドは sg_utils パッケージの一部(W4を参照) です。dd コマ ンドの仲間で、入出力両方もしくはいずれか一方を sg もしくは raw デバイス に対して行います。ブロックサイズの引数(「bs」) は、その物理デバイスのも のと合致している必要があります。引数の「skip」と「seek」は、32 ビットア ーキテクチャでは 2**31 - 1 まで設定でき、1 TB(2G * 512)のディスクにアク セスできます。64 ビットのファイルの読み書きオフセットのシークには、 Linux のシステムコマンド llseek() が用いられます。lmdd は、2 GB より大 きい場合は扱えませんし、dd コマンドは複数の相対的な seek を行うとまとも な結果は返りません。sg_dd には、「bpt」(転送当たりのブロック数)引数があ り、入出力それぞれにおける読み書きのブロック数を制御します。 sg_utils パッケージにはその他にもプログラムがあります。SCSI バスをスキ ャンする(sg_scan と sg_map)、SCSI バスの転送量を計測する(sg_rbuf と sg_turs)、 SCSI の INQUIRY コマンドからのデータを表示する(sg_inq)、媒体 をスピンアップしたりダウンしたりする(sg_start)があります。 dd_rescue + scsiinfo. この dd 系コマンドは、SCSI(もしくは IDE)ディスク や CD-ROM (W6を参照)といった媒体を障害から復旧するために作られました。 scsiinfo は、モードページ情報を表示したり変更したりするユーティリティで 、同じ所から入手できます。 sard. このユーティリティは、System V Release 4 の sar -dを参考にし、マ ウントしているデバイスとパーティションの入出力状態を見られるようにしま す。Stephen Tweedie 氏が作成し、sard ユーティリティが入っています。 / proc/partitions に出力するよう拡張するにはカーネルパッチが必要です。 ftp.uk.linux.org/pub/linux/sct/fs/profiling から入手できます。 vmstat(「man vmstat」を参照) のようなプログラムと比べて、比較的低レベル(例えば SCSI の中間レベル)の 状態を収集します。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Appendix E. コンパイルオプションとシステムコール(ioctls を含む) この付録では、コンパイル時のオプションのうち、システム管理者が変更した くなるであろうものについて述べます。デフォルトではユーザの期待通りの選 択がされているので、大多数は何も変更する必要はないでしょう。カーネル構 築時オプションの設定によっては、カーネルブート時のパラメタとモジュール ロード時のパラメタが、ドライバのコンパイル時オプションと同じ効果を持つ 場合もあります。 システムコールは、アプリケーションプログラムとカーネルとそのドライバ間 のインタフェースとして動作します。SCSI サブシステムが採用しているレイヤ 化されたドライバのアーキテクチャでは、システムコールの大半は高レベルの ドライバが処理しています。 SCSI サブシステムは「下層に通知していく」ioctl 構造になっています。ま ずオープンしているファイルディスクリプタに対応した高レベルのドライバが ioctl を解釈しようとします。それができないと、ioctl は中間レベルに渡り ます。中間レベルでも駄目な場合、ファイルディスクリプタに対応した低レベ ルのドライバに渡ります。低レベルのドライバも駄目なら、EINVAL エラーが生 じます。 関連しているサブシステムに処理を任せる ioctl もあります。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ E.1. 中間レベル カーネルソースにある下記のヘッダファイルは、中間レベルに関連しています 。 /usr/src/linux/include/scsi/scsi.h /usr/src/linux/include/scsi/scsi_ioctl.h これらのファイルは、アプリケーションから用いるためのものです (__KERNEL__ 条件内部のコンパイルブロック以外の部分)。これらは /usr/ include/scsi ディレクトリにもありますが、そちらは glibc ライブラリとと もにメンテナンスされており、カーネルのバージョンに追随していないので、 信じない方が賢明です。 Linux システムでは、 /usr/include/linuxがカーネ ルソースの include 領域にシンボリックリンクされています(普通は、 /usr/ src/linux/include/linux)。このシンボリックリンクを使うと、#include という技によって、正確なscsi_ioctl.hをイン クルードできます。 この /usr/src/linux/drivers/scsi/scsi.h は、SCSI サブシステムの鍵とな る内部ヘッダーファイルです。同名の(ただし、別ディレクトリに存在する)フ ァイル名があり、それはこのセクションの最初で注目したファイルであるとい う点だけ指摘しておきます。これはときどき混乱の原因になります。 中間レベルのファイル drivers/scsi/scsi_scan.c には、既知の SCSI デバイ スの多くが特徴ある記述方法で載っています。(これは「ブラックリスト」とし て知られていましたが、あまりに断定的とみなされていました)。この配列の名 前は「デバイスリスト」です。次のようにいろいろな値があります。 ・ BLIST_NOLUN LUN の 0 だけを検査する ・ BLIST_FORCELUN 8 つすべての LUN を強制的に検査 ・ BLIST_BORKEN 低レベルのドライバに故障フラグを渡す ・ BLIST_KEY ロックを外すドライバに即効果が出る MODE SENSE (pc=0x2e)を 送る ・ BLIST_SINGLELUN は、一度に 1 つの LUN にしか入出力を許可しない ・ BLIST_NOTQ タグキューを無効 ・ BLIST_SPARSELUN LUN が見つからなくても動き続ける ・ BLIST_MAX5LUN LUN を探るのを最大 5 まで ・ BLIST_ISDISK INQUIRY タイプを強制的にディスク (直接アクセス)に ・ BLIST_ISROM INQUIRY タイプを強制的に ROM に ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ E.1.1. 中間レベルのコンパイルオプション ありません。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ E.1.2. 中間レベルの ioctl 次のファイルを見てください。 /usr/src/linux/include/scsi/scsi.h include/scsi/scsi.h で定義してある SCSI の状態定数は、SCSI 規格で定義 してある値に比べて、1 ビット右にシフトしている点に注意してください。 scsi.h 定数 値 SCSI 2 規格の値 ---------------------------------------------------- CHECK_CONDITION 0x1 0x2 CHECK_GOOD 0x2 0x4 BUSY 0x4 0x8 .... ioctl()の概要は下記の通りです。 SCSI_IOCTL_SEND_COMMAND このインタフェースは旧方式です。かわりに汎用 SCSI(sg)インタフェース を利用してください。汎用 SCSI(sg)インタフェースを使った方が、デバイス をより柔軟に扱えます。 これまで触れて来ませんでしたが、構造体は下記のようになります。 struct sdata { unsigned int inlen; [i] デバイスに書き込んだデータ長 unsigned int outlen; [i] デバイスから読み込んだデータ長 unsigned char cmd[x]; [i] SCSI コマンド(6 <= x <= 16) [o] デバイスから読み込んだデータはここから開始 [o] エラー時には、センスバッファはここから開始 unsigned char wdata[y]; [i] デバイスに書き込んだデータはここから開始 }; 注意: ・SCSI コマンド長は、コマンドの最初のバイトでわかります。これを上書き する方法はありません。 ・データ転送は、PAGE_SIZE(i386 で 4 K、alpha で 8 K)に制限されます。 ・(x + y)の長さは、エラーが起こった時にセンスバッファ用に、 最低 OMAX_SB_LEN バイトなければなりません。センスバッファは OMAX_SB_LEN (16)バイトに縮められているので、古いコードでも支障はでません。 ・Unix でエラーが発生した場合(例えば ENOMEM)、ユーザは負の返り値と 「errno」にある Unix のエラーコードを受け取ります。 SCSI コマンドが成功すると 0 が返ります。正の数を受け取ると、それは SCSI のエラーコードの集まりになっています(4 バイトが int ひとつにまとめ られている)。下位バイトが SCSI の状態を表しています。詳しい情報は drivers/scsi/scsi.h ファイルを見てください。 SCSI_IOCTL_GET_IDLUN この ioctl は 3 番目の引数として「struct scsi_idlun」オブジェクト へのポインタをとります。「struct scsi_idlun」の定義は、 にあります。これには、そのデバイスの SCSI ホスト、チャネル、デバイス ID、 LUN データが入っています。 あいにく、ヘッダファイルは構造体を「#ifdef __KERNEL__」ブロックで 「隠して」います。これを利用するには、構造体をユーザのプログラムにコピー しなければなりません。 このようになります。 typedef struct my_scsi_idlun { int four_in_one; /* 4 つの独立したバイトを 1 つの int にまとめてある */ int host_unique_id; /* 同じメーカー製カードと区別 */ } My_scsi_idlun; 「four_in_one」は、下記のように構成されています。 (scsi_device_id | (lun << 8) | (channel << 16) | (host << 24)) これら 4 つの部分はそれぞれ 1 バイトである(でマスクしてある)ことが 前提になっています。 SCSI_IOCTL_GET_BUS_NUMBER Linux カーネル 2.2 以前では、この ioctl にはホスト番号が必要でした。 Linux カーネル 2.3 開発版になって、SCSI_IOCTL_GET_IDLUN ioctl が変更に なり、この情報が入るようになりました。したがって、この ioctl は下位互換性 のためにだけ必要です。 SCSI_IOCTL_TAGGED_ENABLE おそらく、中間レベルが以前扱っていた時の名残りです。現状この機能は、 低レベルのドライバが制御しています。無視するのが一番です。 SCSI_IOCTL_TAGGED_DISABLE SCSI_IOCTL_TAGGED_ENABLE のコメントを見てください。 SCSI_IOCTL_PROBE_HOST この ioctl は 3 番目の引数に下記のような共用体へのポインタを要求します。 union probe_host { unsigned int length; /* [i] ASCII 文字列出力の最大長 */ char str[length]; /* [o] 注意。'\0' を加える必要があるかも しれない */ }; デバイスの fd に対応したホストは、ホストに依存した情報の文字列か、 それがなければホストの名前が与えられた構造体に出力されます。出力は与えられた 構造体の先頭から出力が行われることに注意してください(入力の length は上書き される)。「注意」出力文字列が length に切り詰められた場合は、末尾に「\0」を 加える必要があるかもしれません。返り値が 1 の場合はホストが存在することを 表し、0 の場合はホストが存在しないことを表します(どのような場合?)。負の値 はエラーを意味します。 SCSI_IOCTL_DOORLOCK SCSI_IOCTL_DOORUNLOCK SCSI_IOCTL_TEST_UNIT_READY ユニット(デバイス)が準備できていれば 0 が返り、準備ができていなければ 正の値が返り、OS のエラーが発生した場合は負の値が返ります。 SCSI_IOCTL_START_UNIT SCSI_IOCTL_STOP_UNIT SCSI_EMULATED_HOST {SG_EMULATED_HOST と同じ} SCSI_IOCTL_GET_PCI 低レベル(アダプタ)に対応したPCI のスロット名(pci_dev::slot_name)のうち、 現在デバイスを制御しているものを表示します。最大 8 文字が「引数」で指定 された場所に出力されます。現在のデバイスが PCI デバイスによって制御されて いなければ、errno に ENXIO が設定されます。(この ioctl()は、Linux カーネル 2.4.4 で導入されました)。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ E.2. sd ドライバ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ E.2.1. sd のコンパイルオプション MAX_RETRIES {5} SD_TIMEOUT {30 seconds} SD_MOD_TIMEOUT {75 seconds} ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ E.2.2. sd の ioctl とユーザインタフェース 関連するファイルは下記の通りです。 include/linux/hdreg.h include/linux/genhd.h include/linux/fs.h ioctl()のリストは下記の通りです。 HDIO_GETGEO_BIG HDIO_GETGEO [ディスクのジオメトリを取得] BLKGETSIZE [デバイスのセクタ数] BLKROSET [リードオンリーフラグの設定] BLKROGET [リードオンリーフラグの取得] BLKRASET [先読み値の設定] BLKRAGET [先読み値の取得] BLKFLSBUF [SCSI サブシステムにバッファをフラッシュするように命令] BLKSSZGET [デバイスのブロックサイズを取得] BLKPG [パーティションテーブルの操作] BLKELVGET [elevator パラメタの取得] BLKELVSET [elevator パラメタの設定] BLKRRPART [パーティションテーブルの再読み込み] open() (フラグすべて無視) close() ioctl() (上記のリストを参照) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ E.3. sr ドライバ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ E.3.1. sr のコンパイルオプション ありません。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ E.3.2. sr の ioctl とユーザインタフェース 下記のファイルを見てください。 /usr/src/linux/include/linux/cdrom.h /usr/src/linux/drivers/cdrom/cdrom.c [revision history section] /usr/src/linux/Documentation/cdrom/cdrom-standard.tex 下記の ioctl のいくつかは、cdrom-standard.tex で記述されています。 CDROMCLOSETRAY CDROM_SET_OPTIONS CDROM_CLEAR_OPTIONS CDROM_SELECT_SPEED CDROM_SELECT_DISC CDROM_MEDIA_CHANGED CDROM_DRIVE_STATUS CDROM_CHANGER_NSLOTS CDROM_LOCKDOOR CDROM_DEBUG CDROM_GET_CAPABILITY DVD_READ_STRUCT DVD_WRITE_STRUCT DVD_AUTH CDROM_SEND_PACKET CDROM_NEXT_WRITABLE CDROM_LAST_WRITTEN scd デバイスの open()に使われる O_NONBLOCK フラグは重要です。これがな いと、媒体がデバイスに入いるまで、open()がリターンをずっと待つことにな ります。 open() O_NONBLOCK close() read() write() ioctl() ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ E.4. st ドライバ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ E.4.1. st のコンパイルオプション 下記のコンパイルオプションの大部分は、ブート時もしくはモジュールロード 時のパラメタと実行時の設定(例えば ioctl)の両方もしくはどちらか一方で上 書き可能です。 下記のパラメタは、linux/drivers/scsi/st_options.h で定義されています。 ST_NOWAIT {0} ST_IN_FILE_POS {0} ST_RECOVERED_WRITE_FATAL {0} ST_DEFAULT_BLOCK {0} ST_BUFFER_BLOCKS {32} ST_WRITE_THRESHOLD_BLOCKS {30} ST_MAX_BUFFERS {4} ST_MAX_SG {16} ST_FIRST_SG {8} ST_FIRST_ORDER {5} ST_TWO_FM {0} ST_BUFFER_WRITES {1} ST_ASYNC_WRITES {1} ST_READ_AHEAD {1} ST_AUTO_LOCK {0} ST_FAST_MTEOM {0} ST_SCSI2LOGICAL {0} ST_SYSV {0} 下記のパラメタは、linux/drivers/scsi/st.c に定義されています。 ST_TIMEOUT {900*HZ} ST_LONG_TIMEOUT {14000*HZ} ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ E.4.2. st の ioctl とユーザインタフェース Linux のテープインタフェースは、 /usr/src/linux/include/linux/mtio.h . で定義されています。 下記の ioctl()はアルファベット順にリストしてあり、簡単な説明が右側にあ ります。 (st のドキュメント(特に man 4 st) を参照。) MTIOCTOP [テープコマンドを実行し、ドライブやドライバのオプションを設定] MTIOCGET [ドライバの状態を取得] MTIOCPOS [現在のテープ位置を取得] open() O_RDONLY, O_RDWR close() read() write() ioctl() ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ E.5. sg ドライバ カーネルソースにある下記のヘッダファイルが、sg ドライバに関連していま す。 /usr/src/linux/include/scsi/sg.h Section E.1で指摘した通り、アプリケーションからの利用にあたっては、 #include のようにインクルードするのが最善です。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ E.5.1. sg のコンパイルオプション ここでは sg.h に定義してある内、ユーザが変更したいと思われるものをいく つか挙げてあります。現状のデフォルトの値は、右側の{}内に表示してありま す。 SG_SCATTER_SZ {32768} SG_DEF_RESERVED_SIZE {SG_SCATTER_SZ} SG_DEF_FORCE_LOW_DMA {0} SG_DEF_FORCE_PACK_ID {0} SG_DEF_KEP_ORPHAN {0} SG_MAX_QUEUE {16} SG_DEFAULT_RETRIES {1} # i.e. don't retry SG_BIG_BUFF {SG_DEF_RESERVED_SIZE} SG_DEFAULT_TIMEOUT {60 seconds} SG_DEF_COMMAND_Q {0 *} SG_DEF_UNDERRUN_FLAG {0} * 新しい sg_io_hdr 構造体に基づく write()が検出されると、ファイルごとの ディスクリプタにおけるコピーは、すぐ 1 に変わります(つまり、コマンド キューが有効になる)。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ E.5.2. sg の ioctl とユーザインタフェース 下記の ioctl()はアルファベット順にリストしてあり、簡単な説明が右側に書 いてあります。(sg のドキュメントを参照)。 SG_EMULATED_HOST [アダプタが ide-scsi かどうかを示す] SG_GET_COMMAND_Q [コマンドキューフラグの状態] SG_GET_KEEP_ORPHAN [中断された SG_IO keep orphan フラグの状態] SG_GET_LOW_DMA [「low dma フラグ」(i386 で <= 16 MB)の状態] SG_GET_NUM_WAITING [read()待ち応答数] SG_GET_PACK_ID [次に read()する pack_id 応答(無い場合は -1)] SG_GET_REQUEST_TABLE [実行されたリクエストの配列を生成] SG_GET_RESERVED_SIZE [予約バッファの現状の大きさ] SG_GET_SCSI_ID [中間レベルの SCSI_IOCTL_GET_IDLUN ioctl よりも少し 詳しい情報] SG_GET_SG_TABLESIZE [ホストの scatter gather テーブルの最大エントリー数] SG_GET_TIMEOUT [タイムアウトの生成(単位:ジフィー(jyffy。i386 で 10ms)] SG_GET_TRANSFORM [ide-scsi transform フラグの状態] SG_IO [SCSI コマンドを送り、応答を待つ] SG_NEXT_CMD_LEN [次のコマンドのコマンド長を変更] SG_SCSI_RESET [SCSI バス、デバイス、ホストにリセットを送る] SG_SET_COMMAND_Q [コマンドキューの状態を設定{old=0, new=1}] SG_SET_DEBUG [デバックレベルの設定{0}] SG_SET_KEEP_ORPHAN [SG_IO keep orphan フラグの設定 {0}] SG_SET_FORCE_LOW_DMA [DMA buffer を low に強制(i386 で <= 16 MB) {0}] SG_SET_FORCE_PACK_ID [pack_id で read()を実行{0}] SG_SET_RESERVED_SIZE [デフォルトのバッファサイズを変更 {SG_DEF_RESERVED_SIZE}] SG_SET_TIMEOUT [現在のタイムアウトを変更{60 secs} ] SG_SET_TRANSFORM [ide-scsi の ATAPI transform フラグ {0}] open() [認識する O_ フラグ: O_RDONLY, O_RDWR, O_EXCL, O_NONBLOCK] close() read() write() ioctl() poll() [O_NONBLOCK モードの時に使用] fasync() [read() に対する SIGIO シグナル生成を有効に] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Appendix F. 参考文献と謝辞、訂正について WEB. 下記の参考文献は Web で見られます。リンクが古くなっていたら、著者 まで報告してください。 [W1] SCSI(ドラフト)規格、情報源。 www.t10.org [W2] Eric Youngdale 氏は SCSI サブシステムのチーフアーキテクトです。 www.andante.org/scsi.html [W4] 著者の scsi generic(sg)サイトは、 www.torque.net/sg . Linux Documentation Project のサイトに、 www.tldp.org/HOWTO/SCSI-Generic-HOWTO/ . があります。ドキュメントの(最新の)バージョンは、 下記にあります。 www.torque.net/sg/p/sg_v3_ho . sg_utils と sg3_utils パッケージも tarball とバイナリ とソース、rpm で、このページにあります。これらのパッケージやその他 sg ドライバで利用できるものは下記で論じます。 www.torque.net/sg/ u_index.html . [W5] Richard Gooch 氏の devfs サイトは、 www.atnf.csiro.au/~rgooch/ linux/docs/devfs.html [W6] Kurt Garloff 氏のサイト(scsidev と scsiinfo ユーティリティを含む) は、 www.garloff.de/kurt/linux/ . Kurt 氏は壊れた媒体を復旧するプログラム dd_rescue をこのサイトで用意し ています。 www.garloff.de/kurt/linux/ddrescue [W7] Drew Eckhardt 氏の 1996 年の SCSI-HOWTO(ASCII形式)は、 metalab.unc.edu/pub/Linux/docs/HOWTO/unmaintained/SCSI-HOWTO [W8] Linux Documentation Project (LDP): tldp.org [W9] SCSI Trade Association サイトには、たくさんの役立つ情報があります 。 www.scsita.org [W10] SCSI FAQ サイト−役立つ情報源とリンク集。 www.scsifaq.org ニュースグループ. 下記のエントリーはニュースグループではなく、ニュース グループのリフレクタ (内容を ML へ流しているもの)です。これらは web の いろいろな場所 (例えば marc.theaimsgroup.com )でアーカイブされています。 [N1] Linux SCSI reflector: < linux-scsi@vger.kernel.org >. 比較的投稿 量が少ない(月当たり約 200 通)Linux SCSI 専用のグループで、SCSI サブシス テムのメンテナーの多くが見ています。 [N2] Linux kernel reflector: < linux-kernel@vger.kernel.org >. 比較的 投稿量が多い(月当たり約 5000 通)グループで、Linux カーネル全般について 扱っています。まずはじめに Linux SCSI リフレクタを試してみてください。 書籍. ここでは、著者が役に立つと思われる書籍をあげました。 [B1] "Linux Device Drivers" Second edition by Alessandro Rubini and Jonathan Corbet [O'Reilly 2001 ISBN 0-596-00008-1] この書籍は、SCSI サ ブシステムの情報を含む、Linux デバイス・ドライバについて信頼が置けます 。ブロックサブシステムと同様、キャラクタデバイスについても、たくさんの 例が載っています。Linux 2.4 系のカーネルに追随しており、 Linux 2.2 と 2.0 の情報も載っています。この書籍を強くお勧めできます。著者と出版社は 寛大で、この書籍を GNU フリー文書利用許諾契約書 (バージョン 1.1)として 利用できるようにしました。html 形式で、 www.oreilly.com/catalog/ linuxdrive2/chapter/book に置いてあります。 【訳註:「Linux Device Drivers」の日本語訳が出版されています。 「 Linux デバイスドライバ第 2 版」 】 [B2] "Running Linux" 3rd edition by M. Welsh, M. K. Dalheimer & L. Kaufman [O'Reilly 1999 ISBN 1-56592-469-X] これは SCSI の設定情報を含む Linux 大全の傑作です。 【訳註:「Running Linux」の翻訳本が出版されています。 「Running Linux 第 4 版」 】 [B3] "The Programmer's Guide to SCSI" by Brian Sawert [Addison Wesley 1998 ISBN 0-201-18538-5] これは、SCSI のトピックをたくさん載せていて、 Linux(sg)のしくみや Windows で使われている ASPI や ASPI32 も一通り扱っ ています。 謝辞. 貢献していただいた、下記の方々に感謝致します。 ・ Kai M臾isara (st) ・ Jens Axboe (sr) ・ Richard Gooch (devfs) ・ Tim Waugh (ppa, imm, ppscsi + docbook) ・ Gadi Oxman (ide-scsi) ニ楔貳納媼??この翻訳を行うに当たって、下記の方にお世話になりました。こ の場をかりてお礼申し上げます。 ・ 中野武雄さん ・ ちくわふさん 訂正と提案. 訂正や提案があればどのようなものでも、著者までお送りくださ い。 or . Notes [1] SCSI 規格では、1 本のバス上に複数のイニシエータがあってもかまいま せん。 Linux ではうまくいきませんが、状況を改善するパッチがありま す。 [2] 15 個のパーティションで足りなければ、Logical Volume Manager (LVM) を検討してください。/usr/src/linux/Documentation/LVM-HOWTO を参照 してください。LVM は、複数のブロックデバイスにまたがる論理的なパー ティションを扱えます。 [3] grub のちょっとした工夫の 1 つは、/etc/grub.conf が /boot/grub/ grub.conf へのシンボリックリンクである点です。これは /boot が別パ ーティションになっている場合に、知っておくと便利かもしれません。【 訳註: grub.conf、menu.list の位置や存在は、ディストリビューション によって変わるようです】 [4] ルートファイルシステムが、SCSI デバイスにあり、それを制御する低レ ベルの (アダプタ)ドライバが /etc/modules.conf に記述されている場合 、ロードする順序に関する問題が生じます。ブートローダーが SCSI デバ イス(たいていは(マスター)ブートレコード)から、最初にカーネルをどの ように持ってくるのか、という問題もあります。後者は通常システムの BIOS もしくはアダプタ・カードの BIOS が面倒をみています。 [5] mkinitrd の使用例です。ルートパーティションが SCSI ディスク上にあ り、これは Adaptec のコントローラ(aic7xxx ドライバが必要)に接続さ れているとします。aic7xxx ドライバをモジュールとしてカーネルを構築 した後、カーネルイメージを通常の場所に置きます(おそらく /boot ディ レクトリ)。次に「alias scsi_hostadapter aic7xxx」というような行が /etc/modules.conf ファイルにあることを確認します。 /boot ディレク トリから mkinitrd /boot/initrd-2.4.5.img 2.4.5 のようなコマンドラ インを実行してください(Linux カーネル 2.4.5 が構築してあると仮定) 。これで initrd-2.4.5.img が生成されるはずです。 /etc/lilo.conf に は、下記のような項目を追加することになるでしょう。 image=/boot/vmlinuz-2.4.5 label=linux initrd=/boot/initrd-2.4.5.img read-only root=/dev/sda7 カーネルの設定では次のような内容を選択しておく必要があります。 CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=4096 CONFIG_BLK_DEV_INITRD=y Documentation/initrd.txt も見てください。 [6] PCI アダプタは古い ISA アダプタに比べて、初期化コードが「より安全 」です。したがって、PCI アダプタの初期化過程で固まるようなことはほ とんどありません。この場合、組み込みドライバの初期化の順序(つまり 、SCSI アダプタ番号)は、 SCSI サブシステムの Makefile (/usr/src/ linux/drivers/scsi/Makefile)にある項目の順序を変更すれば修正できる かもしれません。(注意)複数のドライバが認識するドライバもあります (例えば NCR のチップベースのアダプタ)。 [7] 「scsihosts」の区切り文字は、カンマもしくはコロンです。つまり「 scsihosts=advansys,imm,,ide-scsi」も有効です。 [8] 「scsihosts」を使うと、コンピュータの BIOS はブートトラック(および lilo や grub で設定されたブート時設定)をどれかのディスクに見つけ、 一方カーネルはルートパーティションを別のディスクで見つける、という ような状況になることがあります。無計画に行ってしまうと、これはかな り混乱します。よって lilo や grub で「scsihosts」の設定を変更(追 加)した後は、マシンをブートし、どのディスクがアクセスされるかを見 るのが賢明です。 [9] 「add-single-device」と「remove-single-device」でのパーズは融通が 利きません。よって余分な空白(やタブ)を入れず、例で挙げた書き方その ままにするようにしてください。 [10] ATA は最近の呼び名で、以前は IDE もしくは EIDE と言っていました。 Linux では、これまでの経緯から ATA デバイスを制御するサブシステム を「IDE」サブシステムと呼んでいる点に注意してください。 [11] テープやフロッピーのような他の ATA デバイスは、たいてい ATAPI イン タフェースを使っています。しかし、圧倒的多数の ATA ディスクは、 ATAPI インタフェースを使っていません。 [12] Linux カーネル 2.4 系列では、ide-scsi ドライバを用いて cdrecord が ATAPI(IDE) CD ライターを制御できるようにした場合に、問題が生じるこ とが多くなっています。この問題は、IDE サブシステムが制御下のデバイ スに対して、無茶なやり方でデータ転送速度を最適化しようとする点に関 連しているようです。タイムアウトが発生したりマシンが固まったりする 現象を経験した人の中には、 hdparm コマンドを使って DMA の設定を遅 くすることで問題を解決できた方もいるようです。CD ライターが /dev/ hdd に接続されていれば、下記の 2 つのコマンドのどちらかで、うまく いったことがわかります。 hdparm -d0 -c1 /dev/hdd hdparm -d 1 -X 34 /dev/hdd 最初のものは DMA を完全に無効化し、次のものは「マルチワード DMA モ ード 2」にします。CD ライターは、最近ディスクが使用するようなタイ プの速度を必要としていません。「16倍速」で焼いたとしても、維持する 転送速度は 150 KB/sec の 16 倍、これはほぼ 2.4MB/sec に当たります 。これは高速とは言えません。また、高速な IDE コントローラ(Promise 製)から CD ライターを外し、マザーボードの低速な IDE コントローラに 接続し直すと、不規則に発生する IDE バスのリセット問題が解決した、 という報告もあります。別の報告では、IDE ハードディスクの DMA を低 速にする(もしくは無効にする)と固まることがなくなった、とあります。 [13] ディストリビューションによっては、hdparm コマンドが失敗するという 報告が挙がっています。そのような場合は "echo ... > /proc/ide/hdx/ settings" 方式を使ってください。 [14] このリストは www.kernel.org にある公式のカ ーネル 2.4 系リリースから集めたものです。ディストリビューションは 独立して公式のカーネルをいじっていますので、SCSI サブシステムのサ ポート(もしくは変更)にも影響が出るでしょう。例えばこのマシンではカ ーネルが「2.4.18-27.8.0」となっています。おそらく公式のカーネル 2.4.18 を元にしていて、ディストリビューションの「8.0」版のために、 ベンダーが 27 回に渡って修正をかけたということでしょう。変更の種類 の一例として、公式の 2.4.18 に入っている aic7xxx ドライバは Adaptec の Ultra 320 シリーズの PCI アダプタをサポートしていません が、ベンダーのバージョンではサポートしています。