EN JA
CD(4)
CD(4) FreeBSD Kernel Interfaces Manual CD(4)

名称

cdSCSI CD-ROM ドライバ

書式

device cd
options "CHANGER_MIN_BUSY_SECONDS=3"
options "CHANGER_MAX_BUSY_SECONDS=11"

解説

cd ドライバは、 SCSI CD-ROM (コンパクトディスク読み込み専用メモリ (Compact Disc-Read Only Memory)) ドライブのサポートを行います。通常のディスクのように見せようとして、 cd ドライバは、 CD-ROM 全体をカバーする 1 つのパーティションで、パーティションテーブルを合成します。 disklabel(8) を使用してこのパーティションテーブルを変更することができますが、 CD-ROM がアンマウントされるまで存続するだけです。一般的に、インタフェースは、 ada(4)da(4) によって説明されているものと同様です。

SCSI アダプタがブートの間にプローブされるとき、 SCSI バスは、デバイスのためにスキャンされます。 CDROM (タイプ 5) か WORM (タイプ 4) タイプのデバイスと応答して見つかったどのデバイスも cd ドライバに `アタッチ' されます。 FreeBSD 2.1 以前では、最初に見つけられたデバイスは、 cd0、次は、 cd1 などとしてアタッチされます。 FreeBSD 2.1 から、何番の cd ユニットデバイスがラインに接続するべきかを指定できます。カーネル設定の詳細については、 scsi(4) を参照してください。

システムユーティリティ disklabel(8) は、合成されたディスクラベル構造体を読み込むために使用されます。その構造体は、その情報が必要となる CD-ROM のサイズのための正確な数字を含みます。

カーネルの設定

すべてのリソースが動的に割り付けられるように、システム設定にかかわらず、いくつもの CD-ROM デバイスがシステムにアタッチされます。

IOCTL

SCSI CD-ROM ドライブに適用される次の ioctl(2) 呼び出しは、ヘッダファイル < sys/cdio.h>< sys/disklabel.h> で定義されています。
DIOCGDINFO
DIOCSDINFO
( struct disklabel) ドライブのためのディスクラベルのコア内コピーを読み書きします。ディスクラベルは、scsi 問い合せコマンドから読み込まれる情報で初期化されます。それは、ブート時に印刷された情報と同じであるべきです。この構造体は、ヘッダファイル < sys/disklabel.h> に定義されています。
CDIOCPLAYTRACKS
( struct ioc_play_track) トラックアドレスと長さを前提として、オーディオ再生を開始します。構造体は、次のように定義されます:

struct ioc_play_track 
{ 
 u_char start_track; 
 u_char start_index; 
 u_char end_track; 
 u_char end_index; 
};
CDIOCPLAYBLOCKS
( struct ioc_play_blocks) ブロックアドレスと長さを前提として、オーディオ再生を開始します。構造体は、次のように定義されます:

struct ioc_play_blocks 
{ 
 int blk; 
 int len; 
};
CDIOCPLAYMSF
( struct ioc_play_msf) `分-秒-フレーム' アドレスと長さを前提として、オーディオ再生を開始します。構造体は、次のように定義されます:

struct ioc_play_msf 
{ 
 u_char start_m; 
 u_char start_s; 
 u_char start_f; 
 u_char end_m; 
 u_char end_s; 
 u_char end_f; 
};
CDIOCREADSUBCHANNEL
( struct ioc_read_subchannel) この構造体によって指定された位置のサブチャネルから情報を読み込みます:

struct ioc_read_subchannel { 
 u_char address_format; 
#define CD_LBA_FORMAT 1 
#define CD_MSF_FORMAT 2 
 u_char data_format; 
#define CD_SUBQ_DATA  0 
#define CD_CURRENT_POSITION 1 
#define CD_MEDIA_CATALOG 2 
#define CD_TRACK_INFO  3 
 u_char track; 
 int data_len; 
 struct  cd_sub_channel_info *data; 
};
CDIOREADTOCHEADER
( struct ioc_toc_header) マウントされた CD-ROM の目次に関する要約 (サマリ) 情報を返します。情報は、次の構造体に返されます:

struct ioc_toc_header { 
 u_short len; 
 u_char  starting_track; 
 u_char  ending_track; 
};
CDIOREADTOCENTRYS
( struct ioc_read_toc_entry) 指定された目次エントリから情報を返します。 (そのとおり、このコマンド名のスペルは、間違っています。) 引数の構造体は、次のように定義されます:

struct ioc_read_toc_entry { 
 u_char address_format; 
 u_char starting_track; 
 u_short data_len; 
 struct  cd_toc_entry *data; 
};

要求されたデータは、 data で指される、サイズ data_len の領域に書き込まれます。

CDIOCSETPATCH
( struct ioc_patch) 様々なオーディオチャネルを様々な出力チャネルにアタッチします。引数の構造体は、次のように定義されます:

struct ioc_patch { 
 u_char patch[4]; 
 /* 各チャネルに対して 1 つ */ 
};
CDIOCGETVOL
CDIOCSETVOL
( struct ioc_vol) 出力チャネルのボリューム設定に関する情報を取得 (設定) します。引数の構造体は、次のように定義されます:

struct ioc_vol 
{ 
 u_char vol[4]; 
 /* one for each channel */ 
};
CDIOCSETMONO
すべての出力チャネルをすべてのソースチャネルにパッチ (一時的に接続) します。
CDIOCSETSTEREO
左のソースチャネルを左の出力チャネルに、右のソースチャネルを右の出力チャネルにパッチ (一時的に接続) します。
CDIOCSETMUTE
ボリューム設定を変更せずに出力をミュート (音を弱める) します。
CDIOCSETLEFT
CDIOCSETRIGHT
両方の出力チャネルを左 (右) のソースチャネルにアタッチします。
CDIOCSETDEBUG
CDIOCCLRDEBUG
適切なデバイスのためのデバッグ機能をオン (オフ) にします。
CDIOCPAUSE
CDIOCRESUME
読み込みヘッドの位置をリセットしないで、オーディオ再生を一時停止 (再開) します。
CDIOCRESET
ドライブをリセットします。
CDIOCSTART
CDIOCSTOP
ドライブに CD-ROM の回転を上げる (下げる) ように指示します。
CDIOCALLOW
CDIOCPREVENT
ドライブに CD-ROM ディスクの手動のイジェクション (排出) を許可 (防止) するように指示します。すべてのドライブがこの機能をサポートするわけではありません。
CDIOCEJECT
CD-ROM をイジェクト (排出) します。
CDIOCCLOSE
トライブにドアを閉じてメディアをロードするように指示します。すべてのドライブがこの機能をサポートするわけではありません。

cd ドライバによって制御されているドライブで CD-ROM が変更されたとき、メディアを変更する行為は、カーネル中に保持されたディスクラベルと情報を無効にします。不正行為を止めるために、デバイスを参照するオープンファイル記述子がそれ以上なくなるまで、デバイスへのアクセスは、すべて破棄されます。この期間中、新しいオープンの試みは、すべて拒否されます。デバイスを参照するオープンファイル記述子がこれ以上なくなるとき、次の最初のオープンでドライブに対する (ディスクラベルを含む) 新しいパラメータの一式をロードします。

cd ドライバのオーディオコードは、 SCSI-2 標準のオーディオコマンドのみサポートしています。多くの CD-ROM メーカが規格に従っていないために、オーディオが動作しない多くの CD-ROM ドライブがあります。より一般的な `壊れた' CD-ROM ドライブをサポートする計画がありますが、しかしながら、まだ実行されていません。

チェンジャ操作

このドライバは、LUN ベースの CD チェンジャ (切換器) のサポートを内蔵しています。 LUN ベースの CD チェンジャは、2 つ以上の CD を持つことができますが、 1 つの CD 再生機構しかないドライブです。ドライブにおける各 CD は、 SCSI バス上の別々の論理ユニットとして現れます。 cd ドライバは、自動的に LUN ベースのチェンジャを認識して、内部のスケジューラを通してチェンジャに対するコマンドを送りします。スケジューラは、チェンジャ中の異なった LUN にコマンドを同時に送ることによって、引き起こされるチェンジャの "スラッシング"を防ぎます。

スケジューラは、ドライバが特定の LUN に費やす最小と最大の時間の量の管理を引き受けます。最小の時間は、たとえその LUN のための未解決の I/O がなくても、ドライバが与えられた LUN で費やすことが保証されている最小の時間です。最大の時間は、他の LUN のために未解決の I/O があれば、チェンジャが LUN で費す最大の時間です。他の LUN のために未解決の I/O がなければ、ドライバは、与えられた LUN に無期限のアクセスを許します。

最小と最大の時間の量は、カーネルオプションを通して sysctl 変数とカーネル調整変数でも設定可能です。カーネルオプションは、次の通りです:

  • options "CHANGER_MIN_BUSY_SECONDS=3"
  • options "CHANGER_MAX_BUSY_SECONDS=11"

sysctl 変数/カーネル調整変数は、次の通りです:

  • kern.cam.cd.changer.min_busy_seconds
  • kern.cam.cd.changer.max_busy_seconds

ユーザは、sysctl 変数を通して利用者のチェンジャのための適切な値に達するように、最小と最大のタイムアウトを実験してみることをお勧めします。一旦、利用者のチェンジャのために適切なタイムアウトを決まれば、次に、カーネル設定ファイルにそれらを記述できます。

利用者のシステムに LUN ベースのチェンジャがあるなら、ブートプロセスが進んでいる間、利用者は、チェンジャの様々な LUN へのプローブメッセージが表示され続けることに気づくでしょう。これは、正常であり、チェンジャのスケジューリングコードによって引き起こされています。

SYSCTL 変数

次の変数は、 sysctl(8) 変数と loader(8) 調整変数の両方で利用可能です:
kern.cam.cd.retry_count

この変数は、 cd ドライバが何回 READ か WRITE コマンドを再試行するかを決定します。これは、プローブ時間の間に使用されるか、または cd ドライバダンプルーチンのための再試行の数に影響しません。この値は、現在、4 をデフォルトとします。

kern.cam.cd.%d.minimum_cmd_size

cd ドライバは、トーク (通信) しているドライブが、6 バイトまたは 10 バイトの MODE SENSE/MODE SELECT 操作をサポートするかどうか自動的に決定することを試みます。多くの SCSI ドライブは、6 バイトのコマンドのみをサポートし、 ATAPI ドライブは、10 バイトのコマンドのみをサポートします。 cd ドライバは、通常使用中のプロトコルが、CAM Path Inquiry CCB を発行することによって 6 バイトのコマンドをサポートするかどうか決定することを最初に試みます。次に、必要に応じて 6 バイトまたは 10 バイトのコマンドをデフォルトとします。その後に、 cd ドライバは、それが、 SCSI ILLEGAL REQUEST エラーで失敗するまで、 (ドライブが、6 バイトのコマンドをサポートするための要求を通信するプロトコルを仮定して) 6 バイトのコマンドを使用することをデフォルトとします。そして、代わりに動作するかどうかを確かめるためのコマンドの 10 バイトのバージョンを試みます。ユーザは、ドライブごとの sysctl 変数とローダ調整変数を通してデフォルトを変更することができます。ここで、“%d”は、問題のドライブのユニット番号です。有効な最小のコマンドサイズは、6 と 10 です。 6 を超える任意の値は、10 に四捨五入され、6 未満の任意の値は、 6 に四捨五入されます。

kern.cam.cd.changer.min_busy_seconds
kern.cam.cd.changer.max_busy_seconds

個々の LUN が、チェンジャ操作を最適化するための I/O 操作に対してどのくらい長く 'ロックされるか' を調整します。これらの項目をどのように使用するかの情報については、「チェンジャ操作」セクションを参照してください。

関連ファイル

/dev/cd[0-9][a-h]
生 (raw) のモード CD-ROM デバイス

診断

なし。

関連項目

cam(4), da(4), disklabel(8), cd(9)

歴史

この cd ドライバは、 386BSD-0.1 で登場した、Julian Elischer によって書かれた cd ドライバに基づいています。 cd ドライバの CAM バージョンは、Kenneth Merry によって書かれ、 FreeBSD 3.0 ではじめて登場しました。

バグ

ioctl() への 3 番目の引数に使用される構造体の名前は、不完全に選ばれ、そして、 ioctl() コマンドの名前の中に多くのスペルミスが残っています。

現在、さまざまな CD チェンジャにさまざまな最小と最大のタイムアウトを設定するためのメカニズム (機構) はありません。カーネルオプションまたは sysctl 変数によって設定されたタイムアウトは、システムのすべての LUN ベースの CD チェンジャに適用されます。そのようなサポートを実装することは可能ですが、現在、sysctl コードがコンパイルの後でノードを追加を扱うことができないので、少なくとも sysctl の実装は、あまり洗練されていません。したがって、タイムアウト値を取得/設定するために、動的なサイズの sysctl 変数とユーザランドユーティリティを必要とするでしょう。カーネル設定ファイルの中でさまざまな CD デバイスに対して別々のタイムアウトを実装することは、 cd デバイスを接続するとき、2 つのタイムアウトをサポートするために、おそらく config(8) の修正を必要とするでしょう。

February 8, 2012 FreeBSD