スポンサーリンク

MTIO(4) FreeBSD/i386 カーネルインタフェースマニュアル MTIO(4)

名称

mtio − FreeBSD 磁気テープインタフェース

解説

/dev/[nr]sa* という名前のスペシャルファイルは、 SCSI テープドライブを表し ています。このドライブは、システムに接続することができます。 /dev/[nr]sa*.ctl は、コントロールデバイスで、SCSI テープドライバに ioctl システムコールを発行するのに使用できます。これによって、テープをアンマウ ントした後も続けて有効にする必要のあるパラメータを設定できます。

巻き戻し用デバイスは、最後の読み込み、書きこみ、そしてシーク要求が終了す るか、あるいはテープの最後に到達したときに、自動的にテープを巻き戻しま す。通常、巻き戻しを行わないデバイス名には、文字 ‘n’ が付けられます。

テープには、固定長レコードも可変長レコードも書きこむことができます。さら なる情報を得たい場合は、 sa(4) を参照してください。テープの最後に は、end-of-file マーカが 2 つ付けられ、テープファイルの末尾に は、end-of-file マーカが 1 つ付けられます。テープが巻き戻されない場合に は、テープの位置は 2 つのテープマークの間にヘッドがくる所となり、次回の書 きこみで 2 つ目の end-of-file マーカが上書きされることになります。

磁気テープデバイスはすべて mt(1) コマンドで制御されます。

raw 磁気テープデバイスでは、 ioctl(2) での操作がいくらか可能です。以下の 宣言は ⟨sys/mtio.h⟩ からのものです。

/*
 * 磁気テープ IO 制御コマンド用構造体および宣言
 */

/* MTIOCTOP - 磁気テープ操作コマンド用構造体 */
struct mtop {

shortmt_op;

/* 以下で宣言する操作 */

daddr_tmt_count;

/* 何回操作するのか */

};

/* 操作 */

#define MTWEOF

0

/* end-of-file レコードを書く */

#define MTFSF

1

/* 空きファイルまで前進 */

#define MTBSF

2

/* 空きファイルまで後退 */

#define MTFSR

3

/* 空きレコードまで前進 */

#define MTBSR

4

/* 空きレコードまで後退 */

#define MTREW

5

/* 巻き戻し */

#define MTOFFL

6

/* 巻き戻してドライブをオフラインにする */

#define MTNOP

7

/* 何もしない。ステータスを設定するだけ */

#define MTCACHE

8

/* コントローラキャッシュを有効 */

#define MTNOCACHE

9

/* コントローラキャッシュを無効 */

#if defined(__FreeBSD__)
/* デバイス用のブロックサイズを設定します。デバイスが可変長のものである */
/* 場合、0 以外のパラメータを与えると、受け付けられたパラメータ値の */
/* ブロックサイズを持った固定ブロック長のものに変えられます。ブロック */
/* サイズを 0 に戻すと、デバイスは再び可変長ブロックのものに戻ります。 */

#define MTSETBSIZ

10

/* デバイスの密度を設定します。密度の値は SCSI II の仕様で定められて */
/* おり、0 から 0x17 までの値を取ります。オープンモードのときのみこの */
/* 値を設定してください。 */

#define MTSETDNSTY

11

#define MTERASE

12

/* EOM まで消去 */

#define MTEOD

13

/* EOM まで空白にする */

#define MTCOMP

14

/* 圧縮モードの選択 0= オフ, 1= 定義 */

#define MTRETENS

15

/* テープのたるみ直し */

#define MTWSS

16

/* セットマーク書き込み */

#define MTFSS

17

/* セットマークまで前進 */

#define MTBSS

18

/* セットマークまで後退 */

#define MT_COMP_ENABLE

0xffffffff

#define MT_COMP_DISABLED

0xfffffffe

#define MT_COMP_UNSUPP

0xfffffffd

/*
* mt_dsreg の値で、今デバイスが何をしているかを表す。
*/

#defineMTIO_DSREG_NIL

0

/* 未知 */

#defineMTIO_DSREG_REST

1

/* 何もしない */

#defineMTIO_DSREG_RBSY

2

/* テープと通信中 (しかし、操作していません) */

#defineMTIO_DSREG_WR

20

/* 書き込み中 */

#defineMTIO_DSREG_FMK

21

/* ファイルマークの書き込み中 */

#defineMTIO_DSREG_ZER

22

/* 消去中 */

#defineMTIO_DSREG_RD

30

/* 読み込み中 */

#defineMTIO_DSREG_FWD

40

/* 送り中 */

#defineMTIO_DSREG_REV

41

/* 戻し中 */

#defineMTIO_DSREG_POS

42

/* ハードウェアによる位置決め中 (方向不明) */

#defineMTIO_DSREG_REW

43

/* 巻き戻し中 */

#defineMTIO_DSREG_TEN

44

/* たるみ直し中 */

#defineMTIO_DSREG_UNL

45

/* 取り除き中 */

#defineMTIO_DSREG_LD

46

/* 取り除き中 */

#endif

/* MTIOCGET 用の構造体 - 磁気テープの状態取得コマンド */

struct mtget {

shortmt_type;

/* 磁気テープデバイスの種類 */

/* 次の 2 つのレジスタはほとんどデバイス依存です */

shortmt_dsreg;

/* ‘‘デバイス状態’’ レジスタ */

shortmt_erreg;

/* ‘‘エラー’’ レジスタ */

/* デバイス依存レジスタの終わり */

shortmt_resid;

/* 残りカウンタ */

#if defined (__FreeBSD__)

daddr_t mt_blksiz;

/* 現在効力のあるブロックサイズ */

daddr_t mt_density;

/* 現在効力のある記録密度 */

daddr_t mt_comp;

/* 現在効力のある圧縮法 */

daddr_t mt_blksiz0;

/* モード 0 用ブロックサイズ */

daddr_t mt_blksiz1;

/* モード 1 用ブロックサイズ */

daddr_t mt_blksiz2;

/* モード 2 用ブロックサイズ */

daddr_t mt_blksiz3; /* モード 3 用ブロックサイズ */

daddr_t mt_density0;

/* モード 0 用記録密度 */

daddr_t mt_density1;

/* モード 1 用記録密度 */

daddr_t mt_density2;

/* モード 2 用記録密度 */

daddr_t mt_density3; /* モード 3 用記録密度 */

/* 以下のものは、まだ実装されていません。 */

u_charmt_comp0;

/* モード 0 用圧縮法 */

u_charmt_comp1;

/* モード 1 用圧縮法 */

u_charmt_comp2;

/* モード 2 用圧縮法 */

u_charmt_comp3;

/* モード 3 用圧縮法 */

/* 未実装部分終わり */
#endif

daddr_tmt_fileno;

/* 現在位置のファイル番号 */

daddr_tmt_blkno;

/* 現在位置のブロック番号 */

};

/* MTIOCERRSTAT - テープエラー状態を取得するコマンド用構造体 */
/* 現在は、SCSI テープ用のみサポートされています。 */
struct scsi_tape_errors {

/*

* 操作用に SCSI Check Condition を書き出すコマンドの

* 最後の実行結果から、これらのメンバが保持されます。

* MTIOCERRSTAT を発行すると保持されていたメンバがクリアされます。

*/

u_int8_t io_sense[32];

/* データ I/O 用の最終センスデータ */

u_int32_t io_resid;

/* 最後のデータ I/O からの残りカウンタ */

u_int8_t io_cdb[16];

/* 最終センスデータを作ったコマンド */

u_int8_t ctl_sense[32];

/* 制御 I/O 用の最終センスデータ */

u_int32_t ctl_resid;

/* 最後の制御 I/O からの残りカウンタ */

u_int8_t ctl_cdb[16];

/* 最終制御センスデータを作ったコマンド */

/*

* これらは、読み書き時の累積エラーカウンタです。

* (どのように累積エラーカウンタをリセットするかは

* まだ決まっていません。)

* (まだ実装されていませんが、場所だけは確保してあります。)

*/

struct {

u_int32_t retries;

/* 実行したリトライの総数 */

u_int32_t corrected;

/* 実行した誤り訂正の総数 */

u_int32_t processed;

/* 誤り訂正の成功総数 */

u_int32_t failures;

/* 誤り訂正 / リトライ失敗総数 */

u_int64_t nbytes;

/* 処理した総バイト数 */

} wterr, rderr;

};

union mterrstat {

struct scsi_tape_errors scsi_errstat;

char _reserved_padding[256];

};
/*
* mt_type バイト用定数。これらの定数は、リストされている
* タイプと互換性のあるコントローラで同一のものです。
*/

#defineMT_ISTS

0x01

/* TS-11 */

#defineMT_ISHT

0x02

/* TM03 マスバス: TE16, TU45, TU77 */

#defineMT_ISTM

0x03

/* TM11/TE10 ユニバス */

#defineMT_ISMT

0x04

/* TM78/TU78 ユニバス */

#defineMT_ISUT

0x05

/* ユニバス上の SI TU-45 エミュレーション */

#defineMT_ISCPC

0x06

/* SUN */

#defineMT_ISAR

0x07

/* SUN */

#defineMT_ISTMSCP

0x08

/* DEC TMSCP プロトコル (TU81, TK50) */

#define MT_ISCY

0x09

/* CCI Cipher */

#define MT_ISCT

0x0a

/* HP 1/4 テープ */

#define MT_ISFHP

0x0b

/* HP 7980 1/2 テープ */

#define MT_ISEXABYTE

0x0c

/* Exabyte */

#define MT_ISEXA8200

0x0c

/* Exabyte EXB-8200 */

#define MT_ISEXA8500

0x0d

/* Exabyte EXB-8500 */

#define MT_ISVIPER1

0x0e

/* Archive Viper-150 */

#define MT_ISPYTHON

0x0f

/* Archive Python (DAT) */

#define MT_ISHPDAT

0x10

/* HP 35450A DAT ドライブ */

#define MT_ISMFOUR

0x11

/* M4 Data 1/2 9 トラック ドライブ */

#define MT_ISTK50

0x12

/* DEC SCSI TK50 */

#define MT_ISMT02

0x13 /* Emulex MT02 SCSI テープコントローラ */

/* 磁気テープ I/O 制御コマンド */

#define

MTIOCTOP_IOW(’m’, 1, struct mtop)

/* 磁気テープを操作する */

#define

MTIOCGET_IOR(’m’, 2, struct mtget)

/* テープ状態取得 */

/* 次の 2 つのコマンドはどこでも使用されていないようです。 */

#define MTIOCIEOT_IO(’m’, 3)

/* EOT エラーを無視 */

#define MTIOCEEOT_IO(’m’, 4)

/* EOT エラー有効 */

/*
* 32 バイト type 2 構造をフルサポートする SCSI-3 SCC (ストリーム
* デバイス) がもっと出現するときには、この仕様が対象とする全エンティティ
* (64 ビットのブロック、論理ファイルレコード番号等) をこれらの ioctl が
* 扱えるように、再考する必要があるでしょう。
*/

#define

MTIOCRDSPOS

_IOR(’m’, 5, u_int32_t) /* 論理ブロックアドレスを取得 */

#define

MTIOCRDHPOS _IOR(’m’, 6, u_int32_t) /* ハードウェアブロックアドレスを取得 */

#define

MTIOCSLOCATE

_IOW(’m’, 5, u_int32_t) /* 論理ブロックアドレスを探す */

#define

MTIOCHLOCATE

_IOW(’m’, 6, u_int32_t) /* ハードウェアブロックアドレスを探す */

#define MTIOCERRSTAT

_IOR(’m’, 7, union mterrstat) /* テープのエラーを取得 */

#ifndef KERNEL
#defineDEFTAPE"/dev/nrsa0"
#endif

#ifdefKERNEL
/*
* マイナデバイス番号
*/

#define

T_UNIT

003

/* ユニットの選択 */

#define

T_NOREWIND

004

/* 巻き戻しを行わない */

#define

T_DENSEL

030

/* 記録密度の選択 */

#define

T_800BPI

000

/* 800 bpi を選択 */

#define

T_1600BPI

010

/* 1600 bpi を選択 */

#define

T_6250BPI

020

/* 6250 bpi を選択 */

#define T_BADBPI

030

/* 未定義値を選択 */

#endif
#endif /* _SYS_MTIO_H_ */

関連ファイル

       /dev/[nr]sa*

関連項目

mt(1), tar(1), st(4)

歴史

mtio のマニュアルは 4.2BSD で登場しました。 i386 バージョンは最初に FreeBSD 2.2 で登場しました。

バグ

ステータスは、デバイスに依らないフォーマットで返されるようにすべきです。

スペシャルファイルの命名については、もっと一貫した分かりやすい方法でやり 直すべきです。

FreeBSD 2.2 February 11, 1996 FreeBSD 2.2

スポンサーリンク