巻き戻し用デバイスは、最後の読み込み、書きこみ、そしてシーク要求が 終了するか、あるいはテープの最後に到達したときに、自動的にテープを 巻き戻します。 通常、巻き戻しを行わないデバイス名には、文字 `n' が付けられます。
テープには、固定長レコードも可変長レコードも書きこむことができます。 さらなる情報を得たい場合は、 sa(4) を参照してください。テープの最後には、end-of-file マーカが 2 つ付けられ、 テープファイルの末尾には、end-of-file マーカが 1 つ付けられます。 テープが巻き戻されない場合には、テープの位置は 2 つのテープマークの 間に ヘッドがくる所となり、次回の書きこみで 2 つ目の end-of-file マーカ が上書きされることになります。
磁気テープデバイスはすべて mt(1) コマンドで制御されます。
raw 磁気テープデバイスでは、 ioctl(2) での操作がいくらか可能です。 以下の宣言は Aq Pa 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_ */
スペシャルファイルの命名については、もっと一貫した分かりやすい 方法でやり直すべきです。