9.2. CDROM ドライバ(sr もしくは scd)

CD-ROM と DVD ドライブ(と WORM デバイス)は、高レベルのデバイスドライバで ある sr 経由でアクセスできます。 デバイスドライバの名前は「sr」ですが、モジュール名は「sr_mod」です。 デバイスファイル名は /dev/sr<n> もしくは /dev/scd<n> です。

下記の図表は、sr を含む CD-ROM サブシステムの説明です。

CD-ROM サブシステムの構造

この図表では、プロトコルスタック間の違いは隠れています。CD-ROM デバイス名 は CD-ROM レイヤが統一して面倒を見ているわけではなく、 むしろ個々のプロトコルスタックが面倒を見ています。 IDE サブシステムでは、中心にある「ide」ドライバがデバイス名の面倒を見ている (つまり、ide-cd ドライバではない)のに対し、SCSI サブシステムでは sr ドライバ が行っています。USB や IEEE1394 の cd デバイス名は、 おのおののスタックが面倒を見ています。これは、/dev/cdrom が適切なサブシステムのデバイス名へのシンボリック・リンクになっている理由の 一部と言えるかもしれません。

sr ドライバ経由でアクセスできる SCSI デバイスには、2 つのタイプがあります。

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 ライターのソフトウェア(例えば cdrecordcdrdao))や音楽 CD を聞く プログラム(例えば cdparanoia)が、なぜ Linux の SCSI サブシステムを使用するのか、少々戸惑います。答えは、それらのプログラムが デバイスへアクセスするのに、低レベルのドライバを必要としているからです。 ATAPI(ATA Packet Interface)は、基本的に ATA 転送越しにSCSI コマンドセットを 送り出しています [1] (このセクションでの議論は、ATAPI テープドライブと ATAPI フロッピードライブ にも適用できます)。

現状 cdrecordcdparanoia は ともに SCSI 汎用ドライバ(sg) と接続しています。また ATAPI CD デバイス の場合は、ハードウェアにアクセスするのに ide-scsi 擬似デバイスを利用して います。 カーネル 2.4 系列で ioctl のパケットインタフェースが、統合 CD-ROM レイヤに 追加されたので(上記の Section 9.2 の図を参照)これは今後変更される かもしれません。 [2]

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」という方法で)。 [3]

Notes

[1]

ATA は最近の呼び名で、以前は IDE もしくは EIDE と言っていました。 Linux では、これまでの経緯から ATA デバイスを制御するサブシステムを「IDE」 サブシステムと呼んでいる点に注意してください。

[2]

テープやフロッピーのような他の ATA デバイスは、たいてい ATAPI インタフェース を使っています。 しかし、圧倒的多数の ATA ディスクは、ATAPI インタフェースを 使っていません

[3]

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 を低速にする(もしくは無効にする)と固まることが なくなった、とあります。