巻き戻し用デバイスは、最後の読み込み、書きこみ、そしてシーク要求が 終了するか、あるいはテープの最後に到達したときに、自動的にテープを 巻き戻します。 通常、巻き戻しを行わないデバイス名には、文字 `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_ */
スペシャルファイルの命名については、もっと一貫した分かりやすい 方法でやり直すべきです。