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 で登場しました。

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

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