名称
autochanger ― メディアチェンジャと光磁気ディスクオートチェンジャ サーフェスデバイス用の
SCSI インタフェース
説明
オートチェンジャは、SCSI の大容量記憶装置で、 機械的なチェンジャデバイス、
ひとつ以上のデータ転送デバイス (光磁気ディスクドライブなど) とメディア
(光磁気ディスクなど) から構成されます。 機械的なチェンジャはオートチェーンジャ内でメディアを
保存領域から使用場所に移します。
システムのアーキテクチャによって、2 種類のメディアチェンジャ
ドライバ (schgr あるいは autox0)
が、メディアチェンジャのデバイスへのアクセスを提供します。 モジュール
(ssrfc) は光磁気ディスクのサーフェスへのアクセスを提供するものです。
メディアチェンジャのドライバによって提供される機能には 2 つのレベルが
あります。 機械的チェンジャデバイスは、 オートチェンジャ内のメディアを動かすために直接アクセスできます。
これに 対してメディアのサーフェスはユニークなデバイスによってアクセスされ、
これによりチェンジャのドライバがメディアをドライブ内に移動し、I/O リクエストを行います。
schgr と autox0 のメディアチェンジャのデバイスドライバは、
汎用的なメディアチェンジャ インタフェースを提供するために メディアチェンジャ
デバイスの SCSI 仕様に従います。 これにより、 機械的チェンジャ、ジュークボックス、ライブラリ、オートチェンジャデバイス
(MO、テープ、CD-ROM) の アプリケーションレベルのドライバを作成することが可能になります。
しかし、ssrfc モジュールは Hewlett-Packard の光磁気ディスクオートチェンジャ製品のみをサポートする
目的で提供されています。
デバイス名に関する規約
デバイス名に関する規約に従うことにより、オートチェンジャドライバで
チェンジャデバイスおよび個別のメディアサーフィスに アクセス可能になります。
オートチェンジャ用のブロックデバイスは /dev/ac に、キャラクタデバイスは /dev/rac にあります。
この 2 つのディレクトリでは、名前が "c#t#d#" の規約に従ってつけられており (intro(7) を参照)、最後にサーフェスデスクリプタが付加されています。
ユニークなデバイス名が、カードインスタンス、 ターゲットの SCSI チェンジャデバイスのアドレス、SCSI チェンジャデバイスの LUN、
およびサーフェスデスクリプタにより決定されます。
チェンジャデバイスに対して、サーフェスデスクリプタをゼロにしたり、
指定しないこともできます。 また、チェンジャ自身に対するブロック特殊ファイルはありません。
たとえば、
は、SCSI のターゲットアドレス 5 の LUN 0 の位置にある、SCSI インタフェースカードのインスタンス
1 に アタッチされたチェンジャのキャラクタ特殊ファイルで、/dev/rac/c1t5d0_0 と同じになります。
任意のサーフェスは、カードのインスタンス、SCSI のターゲットアドレスとチェンジャの SCSI
LUN により記述され、 そして、 スロット番号とサイドに対するサーフェスデスクリプタが後ろに付加されます。
たとえば、
は、 上で示したオートチェンジャのサーフェス 1a に 対するブロック特殊ファイルです。
は、同じサーフェス 1a のキャラクタ型特殊ファイルです。
メジャー番号とマイナー番号の記述
下に、 チェンジャドライバによって、 チェンジャデバイスと各サーフェスを
オートチェンジャ内でアクセスする際に使われるビットのアサイメント
(dev_t のフォーマット) を示します。
| 0-7 | 8-15 | 16-19 | 20-22 | 23-31 |
| MAJOR | INSTANCE | TARGET | LUN | SURFACE |
MAJOR は、該当するドライバのメジャー番号です。INSTANCE は、
チェンジャデバイスが アタッチされる SCSI インタフェースのカードのインスタンスです。TARGET は、チェンジャデバイスの SCSI のターゲットアドレスです。LUN
は、チェンジャデバイスの SCSI LUN です。 そして、SURFACE は、 以下のテーブルで
記述されるオートチェンジャ内の各サーフェスのユニークなデスクリプタです。
(注:サーフェスデスクリプタは、ビット 23-31 です)
| サーフェス | サーフェスデスクリプタ |
|---|
| チェンジャデバイス | 0 |
| 1a | 01 |
| 1b | 02 |
| 2a | 03 |
| 2b | 04 |
| ... | ... |
| 31b | 3e |
| 32a | 3f |
| 32b | 40 |
| .... | .... |
デバイス番号内のすべてのフィールドは 16 進表記で指定されます。
このマイナー番号に関して、 ハードパーティション (セクション) のサポートはないことに注意してください。
必要ならば、LVM ソフトパーティションを使って、 パーティションを作成できます。
チェンジャドライバによって使われるメジャー番号は次の通りです。
| | b_major | c_major |
|---|
| schgr | 29 | 231 |
| autox0 | 30 | 230 |
最初のサーフェスとチェンジャのデバイス特殊ファイル名に関連する
メジャー番号とマイナー番号を示す、長い形式のリストを以下に示します。
schgr:
brw-rw-rw- 1 root sys 29 0x015001 Apr 22 10:22 /dev/ac/c1t5d0_1a
crw-rw-rw- 1 root sys 231 0x015001 Apr 22 10:22 /dev/rac/c1t5d0_1a
crw-rw-rw- 1 root sys 231 0x015000 Apr 22 10:22 /dev/rac/c1t5d0
autox0:
brw-rw-rw- 1 root sys 30 0x015001 Apr 24 11:35 /dev/ac/c1t5d0_1a
crw-rw-rw- 1 root sys 230 0x015001 Apr 24 11:35 /dev/rac/c1t5d0_1a
crw-rw-rw- 1 root sys 230 0x015000 Apr 24 11:35 /dev/rac/c1t5d0
光磁気オートチェンジャ
サーフィスデバイスへのアクセス
HP 光磁気ディスクライブラリ内のディスクサーフェスにアクセスするには、
サーフェスモジュール ssrfc のエントリーを システムコンフィグレーション
ファイル /stand/system と、 該当する SCSI チェンジャドライバのエントリー (アーキテクチャにより schgr あるいは autox0 ) をインクルードする必要があります。 ssrfc モジュールによって、 光磁気ディスクサーフェスへのアクセスをディスクデバイス
のように行うことができます。 ディスクは、チェンジャによってアイドル状態のドライブに移動され、
リクエストされたディスクの I/O 操作が実行されます。 リクエストの終了時に、 ディスクはオートチェーンジャ内の所定のストレージ位置に戻されます。
サーフェスモジュールは、 オートチェーンジャのドライブに あるすべてのディスクに対して並列にアクセスできるようにします。
オートチェーンジャ内のそのほかのディスクに対する I/O リクエストは、
ドライブリソースが利用可能になるまでブロックされます。
デフォルトでは、いくつかのコマンド (mount、newfs、
および mediainit など) は O_NDELAY フラッグをセットしてデバイスをオープンします。
オートチェーンジャのサーフェスに関してこういったコマンドを起動しても、
ドライブリソースが利用可能になるのを待ちません。 その代わり、利用可能なドライブがない場合、リクエストは EBUSY を返します。
オートチェンジャのディスクに アクセスするためのサーフェスモジュールの機能を
使う開発者は次のような、 O_NDELAY フラグ付きで
open システムコールを起動すれば、同様の"ノンブロッキング"な 反応を得られます。
error = open("/dev/rac/c1t5d0_1a",O_RDWR | O_NDELAY);
利用可能なドライブリソースを待っているブロックにとってそれが
受理可能な場合は、 O_NDELAY フラッグは不要です。
2 ドライブを 持つオートチェンジャのマルチプル ディスクサーフェスに
アクセスするための、 ブロッキングを最少にするサンプルスクリプトを下に示します。
dd if=/dev/rdsk/c0t0d0 of=/dev/rac/c1t5d0_1a bs=64k &
dd if=/dev/rdsk/c0t1d0 of=/dev/rac/c1t5d0_2a bs=64k &
wait
dd if=/dev/rdsk/c0t2d0 of=/dev/rac/c1t5d0_1b bs=64k &
dd if=/dev/rdsk/c0t3d0 of=/dev/rac/c1t5d0_2b bs=64k &
wait
...
光磁気ディスクのサーフェスにアクセスするために 開発者が利用できる ioctl 関数は、SCSI ディスクドライバのマニュアルに記述されています。
ここで、いくつかの 光磁気ディスク専用の ioctl 関数を簡単に説明します。<sys/scsi.h> からインクルードします。
#define SIOC_WRITE_WOE _IOW('S', 17, int)
#define SIOC_VERIFY_WRITES _IOW('S', 18, int)
#define SIOC_ERASE _IOW('S', 19, struct scsi_erase)
#define SIOC_VERIFY_BLANK _IOW('S', 20, struct scsi_verify)
#define SIOC_VERIFY _IOW('S', 21, struct scsi_verify)
SIOC_ERASE (erase) および SIOC_WRITE_WOE (write
without erase) は、 キャラクタ特殊デバイスで一緒に使うことができます。
光磁気ディスクの pre-erase パスを実行し、 つづいて SCSI ディスクドライバを
write-without-erase モードに設定することに より、 書き込みのパフォーマンスが上がります。
これは、通常、 光磁気デバイスで必要な 2 パスの erase-then-write が省略されるためです。
SIOC_VERIFY_WRITES (write and verify) は、
すべての書き込みに対して ベリフィケーションパスを実行します。 これは、より安全な方法です。
しかし、ベリフィケーションパスを伴った write 操作は、 パフォーマンスを悪くします。pre-erase
および write-without-erase とともに使われた場合、write and verify
はパフォーマンスの低下なしで信頼性を増すことが できます。HP では、write-without-erase
も実行する場合は、write-and-verify モードで操作することを推奨します。
次に示すのは、光磁気製品で使われる可能性のある、このほかの ioctl 関数です。<sys/scsi.h> からインクルードされるものです。
#define SIOC_GET_IR _IOR('S', 14, int)
#define SIOC_SET_IR _IOW('S', 15, int)
#define SIOC_SYNC_CACHE _IOW('S', 70, int)
SIOC_GET_IR は、 デバイスに対する即刻の書き出し (キャッシュの書き込み) の現在の状態を
決定します。SIOC_SET_IR によって、そのデバイスに対する即刻の書き出しを、
イネーブルあるいはディスエーブルします。SIOC_SET_IR は、ライトキャッシングをイネーブルするために使われます。SIOC_SYNC_CACHE ioctl
関数を使ってライトキャッシュをフラッシュしたほうがよい場合もあります。
コマンド /usr/sbin/scsictl を使って、光磁気ディスクのプレイレースを行い、
即刻の書き出しの状態を設定、あるいはチェックできます。
サーフェスモジュールをコンフィギュレーションしてある場合、
いくつかの ioctl 関数を使って、チェンジャデバイスの状態、 および情報を得ることができます。
これには、SIOC_ELEMENT_ADDRESSES 、SIOC_ELEMENT_STATUS および SIOC_INQUIRY を使います。
これらの関数については、 チェンジャドライバに関する次のセクションで詳しく説明します。
オートチェンジャの状態を変更する関数は、 サーフェスモジュールが
カーネル内にコンフィギュレーションされている場合は、 許可されません。
SCSI
メディアチェンジャ デバイスドライバ
SCSI メディアチェンジャ デバイスドライバは、 ひとつのオートチェンジャ内の異なるメディアロケーション間の移動を
行います。 各メディアロケーションには、特定のエレメントアドレスがあり、
以下のいずれかのエレメントタイプを持っています。
- storage
現在使われていないメディアのユニットを保持すべきロケーション。 通常は、ほとんどのメディアがエレメントのこのタイプに置かれます。
- import/export
デバイスにメディアを挿入したり、デバイスから取り出すためのロケーション。
メディアのユニットをこのタイプのロケーションに動かすことは、 取り出し操作に
相当します。 メディアのユニットをこのタイプのロケーションから動かすことは、
ロード操作に 相当します。
- data transfer
メディアのデータにアクセスするためのロケーション。
これが 、メディアチェンジャ デバイスによって処理されているメディアに対して、
読み込みや書き出しの操作を行っているデバイスの通常のロケーションです。
このタイプのロケーションへの移動は、物理的メディアのマウント操作です。
このタイプのロケーションからの移動は、 物理的メディアのアンマウント操作です。
- media transport
メディアの移動用のロケーションです。 通常、メディアは、実際のメディアの移動の際にのみ、
エレメントのこのタイプのロケーションに置かれます。
チェンジャコントロール
リクエスト
以下の ioctl 関数は、<sys/chgrio.h> からインクルードされるものです。
#define CHGR_SSRFC_IS_PRESENT _IOR('X', 1, int)
#define CHGR_CLEAR_RESET _IO('X', 2)
- CHGR_SSRFC_IS_PRESENT
開発者用です。 サーフィスモジュールの機能 (ssrfc)
が、現在カーネル内でコンフィギュレーションされているかを決めるものです。
- CHGR_CLEAR_RESET
開発者用です。autox0 ドライバ専用です。 パワーフェイル復帰条件を、SCSI チェンジャドライバ内でクリアします。
メディアチェンジャ内でメディアを動かすために SCSI チェンジャドライバ (autox0) を使うが、
光磁気ディスクに対する透過的なアクセス用のサーフェスモジュールを使わない
開発者は、CHGR_CLEAR_RESET ioctl 関数が必要です。
チェンジャの ioctl コールから ECONNRESET エラーリターン
が返った場合は、それ以降のメディアの移動の前に CHGR_CLEAR_RESET コールが必要になります。
これによい、アプリケーションに対してパワーフェイルの可能性があることを
警告し、以後の操作の前に、 開発者にデータ構造とメディアチェンジャの再予約エレメントを
リセットする機会を与えます。
以下の ioctl 関数と構造体の定義は <sys/scsi.h> からインクルードされます。
#define SIOC_INIT_ELEM_STAT _IO('S', 51)
#define SIOC_ELEMENT_ADDRESSES _IOW('S', 52, struct element_addresses)
#define SIOC_ELEMENT_STATUS _IOWR('S', 53, struct element_status)
#define SIOC_RESERVE _IOW('S', 54, struct reservation_parms)
#define SIOC_RELEASE _IOW('S', 55, struct reservation_parms)
#define SIOC_MOVE_MEDIUM _IOW('S', 56, struct move_medium_parms)
#define SIOC_EXCHANGE_MEDIUM _IOW('S', 57, struct exchange_medium_parms)
/* structure for SIOC_ELEMENT_ADDRESSES ioctl */
struct element_addresses {
unsigned short first_transport;
unsigned short num_transports;
unsigned short first_storage;
unsigned short num_storages;
unsigned short first_import_export;
unsigned short num_import_exports;
unsigned short first_data_transfer;
unsigned short num_data_transfers;
};
/* structure for SIOC_ELEMENT_STATUS ioctl */
struct element_status {
unsigned short element; /* element address */
unsigned int resv1:2;
unsigned int import_enable:1; /* allows media insertion (load) */
unsigned int export_enable:1; /* allows media removal (eject) */
unsigned int access:1; /* transport element accessible */
unsigned int except:1; /* is in an abnormal state */
unsigned int operatr:1; /* medium positioned by operator */
unsigned int full:1; /* holds a a unit of media */
unsigned char resv2;
unsigned char sense_code; /* info. about abnormal state */
unsigned char sense_qualifier; /* info. about abnormal state */
unsigned int not_bus:1; /* transfer device SCSIbus differs*/
unsigned int resv3:1;
unsigned int id_valid:1; /* bus_address is valid */
unsigned int lu_valid:1; /* lun is valid */
unsigned int sublu_valid:1; /* sub_lun is valid */
unsigned int lun:3; /* transfer device SCSI LUN */
unsigned char bus_address; /* transfer device SCSI address */
unsigned char sub_lun; /* sub-logical unit number */
unsigned int source_valid:1; /* source_element is valid */
unsigned int invert:1; /* media in element was inverted */
unsigned int resv4:6;
unsigned short source_element; /* last storage medium location */
char pri_vol_tag[36]; /* volume tag (device optional) */
char alt_vol_tag[36]; /* volume tag (device optional) */
unsigned char misc_bytes[168]; /* device specific */
};
/* structure for SIOC_RESERVE and SIOC_RELEASE ioctls */
struct reservation_parms {
unsigned short element;
unsigned char identification;
unsigned char all_elements;
};
/* structure for SIOC_MOVE_MEDIUM ioctl */
struct move_medium_parms {
unsigned short transport;
unsigned short source;
unsigned short destination;
unsigned char invert;
};
/* structure for SIOC_EXCHANGE_MEDIUM ioctl */
struct exchange_medium_parms {
unsigned short transport;
unsigned short source;
unsigned short first_destination;
unsigned short second_destination;
unsigned char invert_first;
unsigned char invert_second;
};
- SIOC_INIT_ELEM_STAT
メディアチェンジャ デバイスが一覧を作ることを強制します。 この結果、メディアチェンジャ
デバイスは各エレメントのアドレス (メディアのユニットの有無を含む) の状態を確認します。
この機械的な操作は、かなりの時間がかかる場合があります。 この関数は、メディアチェンジャのサーバーエラーが起こった場合にのみ、
必要なものです。 ディスクの移動にサーフェスモジュール (ssrfc) を使っている場合は、
このレベルのエラーリカバリはサーフェスモジュール内で処理されます。
- SIOC_ELEMENT_ADDRESSES
メディアチェンジャ デバイスによってサポートされたエレメントアドレスを
決定します。 各エレメントタイプに対して、 最初の有効なエレメントアドレスとエレメントの個数が決定されます。
このエレメントアドレスを、 ロケーション引き数のソースあるいはデスティネーションとして使うことが
できます。
- SIOC_ELEMENT_STATUS
エレメントと状態を決定します。 情報がリクエストされているエレメントアドレスは、element フィールドによって指定されます。 結果の状態データは、そのエレメントアドレスのメディアのユニットの有無や、
そのエレメントアドレスに関するそのほかの情報を含みます。
- SIOC_RESERVE およびSIOC_RELEASE
エレメントアドレスに対するコントロールアクセス。
デバイスによっては、予約することにより、 メディアチェンジャ デバイスにおける
エレメントアドレスのオペレータのコントロールを制限します。 特定のエレメントアドレスを予約して、
複数リクエスト間のインタロッキングを処理することができます。 ただしこの場合、
リクエスタがユニークな予約 ID を持っている必要があります。all_elements フィールドが
0 の場合、 ひとつのエレメントアドレスを予約あるいは解放することを指定します。
このようにして予約されたエレメントアドレスは、 別の予約 ID を使って、
ほかの単一のエレメントアドレスの予約によって予約することはできません。reservation フィールドによって、予約 ID を指定します。element フィールドによって、予約すべきエレメントアドレスを指定します。
all_elements フィールドの値が ``1''の場合、
すべてのエレメントアドレスが予約されることを意味します。reservation および element フィールドは、0
でなければなりません。 これは、 このフィールドがすべてのエレメントアドレスを
予約する際には意味を持たないからです。 すべてのエレメントアドレスの予約は、
おもにオペレータのコントロールを制限する目的で使われます。
- SIOC_MOVE_MEDIUM およびSIOC_EXCHANGE_MEDIUM
メディアの再配置ポジション ソースエレメントおよびデスティネーションエレメントのタイプにより、
メディアのロード、アンロード、 あるいは単純な再配置のいずれかになります。invert、invert_first、
あるいは invert_second フィールドに ``1''を指定することによって、
メディアを「フリップ」できます。SIOC_EXCHANGE_MEDIUM の
ioctl は、 メディアの 2 つの異なるユニットを再配置します。source フィールドによって指定されたエレメントから、first_destination によって指定されたエレメントに、
メディアのひとつのユニットが移動されます。 メディアの 2 番目ユニットは、first_destination フィールドによって指定されたエレメントから、second_destination フィールドによって指定されたエレメントに移動されます。
マルティプルチェンジャのメカニズムをもつオートチェンジャ、あるいは
メディアステージング エリアにおいては、source フィールド
および second_destination フィールドが同じ場合に、交換が行われます。
制約
HP の光磁気ディスクライブラリ内のディスクのサーフェスにアクセスするには、
システムコンフィギュレーション ファイルで、ssrfc モジュールが指定されている必要があります。ssrfc
モジュールは、schgr ドライバ、 あるいは autox0 ドライバに依存しています。ssrfc
が含まれる場合は、schgr あるいは autox0(あるいは両方) を含む必要があります。
デフォルトのコンフィギュレーション
デフォルトでは、ssrfc、schgr、
および autox0 はシステムコンフィギュレーション ファイル
(/stand/system) には含まれません。
例
以下の例では SIOC_ELEMENT_ADDRESSES および SIOC_ELEMENT_STATUS ioctl 関数を使って、HP 光磁気ディスクオートチェンジャにおけるドライバに関する
バスアドレス情報を獲得しています。
int last_drive_el;
struct element_addresses el_addrs;
struct element_status el_stat;
/*
* Changer attached to card instance 1, with SCSI target id 5, lun 0.
*/
fd = open("/dev/rac/c1t5d0",O_RDWR);
if ((error = ioctl(fd, SIOC_ELEMENT_ADDRESSES, &el_addrs)) != 0) {
syserr("ioctl: SIOC_ELEMENT_ADDRESSES");
return -1;
} else {
last_drive_el = el_addrs.first_data_transfer
+ el_addrs.num_data_transfers - 1;
for (i = el_addrs.first_data_transfer; i <= last_drive_el; i++) {
el_stat.element = i;
if ((error = ioctl(fd, SIOC_ELEMENT_STATUS, &el_stat)) != 0) {
syserr("ioctl: SIOC_ELEMENT_ADDRESSES");
return -1;
} else {
/*
* You may wish to also check some of the other fields
* in the el_stat structure to verify that the data is
* valid. Fields: el_stat.access (ac accessible),
* el_stat.except (exception).
*/
if (! el_stat.not_bus && el_stat.id_valid) {
drive[i].addr = el_stat.bus_address;
if (! el_stat.lu_valid) {
drive[i].lun = 0;
} else {
drive[i].lun = el_stat.lun;
}
}
}
}
}
警告
マルティプル オートチェンジャサーフェスをひとつの大きなファイルシステム
としてコンフィギュレーションするために LVM を使わないでください。LVM
はオンラインのボリューム用に設計されたものです。 オートチェンジャにおいては、
実際にドライブ内にあるディスクだけがオンラインに なっており、スロットにあるディスクはオフラインになっています。LVM を注意深くコンフィギュレーションしないと、
オートチェンジャの交換が頻繁に起こり、I/O のパフォーマンスが落ちます。
あらかじめ計画を立てておく必要があります。
HP 製でないメディアチェンジャ デバイスの中には SIOC_INIT_ELEM_STAT と SIOC_ELEMENT_STATUS の ioctl をサポートしないものがあります。
旧式のメディアチェンジャ デバイスの中には SIOC_EXCHANGE_MEDIUM の ioctl をサポートしないものがあります。
こういったデバイスに対しては、 複数の SIOC_MOVE_MEDIUM ioctl
操作を使って同じ結果を得ることができます。 ただし、適当な一次的エレメントアドレスが必要です。
参照
insf(1M), mknod(1M), scsictl(1M), ioctl(2), scsi(7), scsi_ctl(7).