MTIO(4) | FreeBSD Kernel Interfaces Manual | MTIO(4) |
名称
mtio — FreeBSD 磁気テープインタフェース解説
/dev/[n]sa* と名前が付けられたスペシャルファイルは、システムに取り付けられた SCSI にテープドライブを参照します。 /dev/[n]sa*.ctl は、テープのアンマウントした後も持続して要求されるパラメータを設定するために SCSI テープドライバに ioctl を発行するために使用することができる制御デバイスです。 巻き戻しデバイスは、最終の読み込み、書き込み、とシーク要求が終了するかまたはテープの最後に到達したとき、自動的に巻き戻します。文字‘ n
’は、通常、巻き戻しを行なわないデバイスの名前として先頭に追加されます。
テープは、固定長レコードか可変長レコードのいずれかで書き込むことができます。詳しい情報に関しては、 sa(4) を参照してください。 2 つの end-of-file マークは、テープの終わりとなり、 1 つの end-of-file マークは、テープファイルの終わりとなります。テープが巻き戻されない場合は、2 つのテープマークの間にヘッドが位置付けられ、次の書き込みで 2 つ目の end-of-file マークが上書きされます。
すべての磁気テープデバイスは、 mt(1) コマンドで操作できます。
多くの ioctl(2) 操作が生の (raw) 磁気テープで利用可能です。次の定義は、 < sys/mtio.h> からのものです:
#ifndef _SYS_MTIO_H_ #define _SYS_MTIO_H_ #ifndef _KERNEL #include <sys/types.h> #endif #include <sys/ioccom.h> /* * 磁気テープ IO 制御コマンドのための構造体と定義 */ /* MTIOCTOP のための構造体 - 磁気テープ操作コマンド */ struct mtop { short mt_op; /* 下記に定義された操作 */ int32_t mt_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__) /* デバイスのためにブロックサイズを設定します. デバイスが可変サイズ dev */ /* であるなら, 0 でないパラメータは渡されたパラメータの値に設定された */ /* ブロックサイズでデバイスを固定ブロックサイズに変更します. 0 に */ /* ブロックサイズを再設定すると, デバイスは可変ブロックサイズデバイスに */ /* 復旧されます. */ #define MTSETBSIZ 10 /* デバイスの密度を設定します. オープンされたモードのためだけに値を 設定します. */ #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 の値 */ #define MTIO_DSREG_NIL 0 /* 未知 */ #define MTIO_DSREG_REST 1 /* 何も行わない */ #define MTIO_DSREG_RBSY 2 /* テープと通信中 (動作なし) */ #define MTIO_DSREG_WR 20 /* 書き込み中 */ #define MTIO_DSREG_FMK 21 /* ファイルマークを書き込み中 */ #define MTIO_DSREG_ZER 22 /* 消去中 */ #define MTIO_DSREG_RD 30 /* 読み込み中 */ #define MTIO_DSREG_FWD 40 /* 前進中 */ #define MTIO_DSREG_REV 41 /* 後退中 */ #define MTIO_DSREG_POS 42 /* ハードウェアによる位置決め中 (方向不明) */ #define MTIO_DSREG_REW 43 /* 巻き戻し中 */ #define MTIO_DSREG_TEN 44 /* 張り直し中 */ #define MTIO_DSREG_UNL 45 /* 取り外し中 */ #define MTIO_DSREG_LD 46 /* 取り付け中 */ #endif /* __FreeBSD__ */ /* MTIOCGET のための構造体 - 磁気テープの状態取得コマンド */ struct mtget { short mt_type; /* 磁気テープデバイスのタイプ */ /* 次の 2 つのレジスタは, 大幅にデバイスに依存しています */ short mt_dsreg; /* ``デバイス状態'' レジスタ */ short mt_erreg; /* ``エラー'' レジスタ */ /* デバイス依存レジスタの終わり */ /* * 残りのカウントは, 保守されますが, 残りのサイズが 32 K * バイトを (大きく) 超過するかもしれないので, 無意味で * あるかもしれないことに注意してください. より正確な * カウントを得るためには, MTIOCERRSTAT ioctl を使用し * てください. */ short mt_resid; /* 残りカウンタ */ #if defined (__FreeBSD__) int32_t mt_blksiz; /* 現在操作中のブロックサイズ */ int32_t mt_density; /* 現在操作中の記録密度 */ uint32_t mt_comp; /* 現在操作中の圧縮 */ int32_t mt_blksiz0; /* モード 0 のブロックサイズ */ int32_t mt_blksiz1; /* モード 1 のブロックサイズ */ int32_t mt_blksiz2; /* モード 2 のブロックサイズ */ int32_t mt_blksiz3; /* モード 3 のブロックサイズ */ int32_t mt_density0; /* モード 0 の記録密度 */ int32_t mt_density1; /* モード 1 の記録密度 */ int32_t mt_density2; /* モード 2 の記録密度 */ int32_t mt_density3; /* モード 3 の記録密度 */ /* 次は, まだ実装されていません */ uint32_t mt_comp0; /* モード 0 の圧縮タイプ */ uint32_t mt_comp1; /* モード 1 の圧縮タイプ */ uint32_t mt_comp2; /* モード 2 の圧縮タイプ */ uint32_t mt_comp3; /* モード 3 の圧縮タイプ */ /* 未実装の終わり */ #endif int32_t mt_fileno; /* 現在位置の相対ファイル番号 */ int32_t mt_blkno; /* 現在位置の相対ブロック番号 */ }; /* MTIOCERRSTAT のための構造体 - 磁気テープのエラー状態取得コマンド */ /* 現在のところ SCSI テープのためだけ実際にサポートされています */ struct scsi_tape_errors { /* * これらの操作で有名な SCSI Check Condition を持つ最後の * コマンドからラッチされます. MTIOCERRSTAT を発行する動作 * は, それらをアンラッチしてクリアします. */ uint8_t io_sense[32]; /* データ I/O のための最後のセンスデータ */ int32_t io_resid; /* 最後のデータ I/O からの残りカウント */ uint8_t io_cdb[16]; /* 最後のセンスデータを起こしたコマンド */ uint8_t ctl_sense[32]; /* 制御 I/O のための最後のセンスデータ */ int32_t ctl_resid; /* 最後の制御 I/O からの残りカウント */ uint8_t ctl_cdb[16]; /* 最後の制御センスを起こしたコマンド */ /* * これらは, 読み込み書き込みの累積エラーカウンタです. * (どのように累積エラーカウンタをリセットするかは, * まだ確定されていません). * (まだ実装されていませんが, 場所がそれらのために予約されています) */ struct { uint32_t retries; /* 実行されたリトライの合計数 */ uint32_t corrected; /* 実行された誤り訂正の合計数 */ uint32_t processed; /* 成功した誤り訂正の合計数 */ uint32_t failures; /* 失敗した誤り訂正/リトライの 合計数 */ uint64_t nbytes; /* 処理した合計バイト数 */ } wterr, rderr; }; union mterrstat { struct scsi_tape_errors scsi_errstat; char _reserved_padding[256]; }; /* * mt_type バイトのための定数. これらは, リストされたタイプと * 互換性があるコントローラと同じです. */ #define MT_ISTS 0x01 /* TS-11 */ #define MT_ISHT 0x02 /* TM03 マスバス: TE16, TU45, TU77 */ #define MT_ISTM 0x03 /* TM11/TE10 ユニバス */ #define MT_ISMT 0x04 /* TM78/TU78 マスバス */ #define MT_ISUT 0x05 /* ユニバス上の SI TU-45 エミュレーション */ #define MT_ISCPC 0x06 /* SUN */ #define MT_ISAR 0x07 /* SUN */ #define MT_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 エラーを有効 */ /* * 多くの SCSI-3 SSC (ストリーミングデバイス) デバイスが全 32 バイトタイプ * 2 構造のサポートがあるとき, それらが, 関係する (64 ビットの * ブロック, 論理ファイルレコード番号, 等) すべての実体をサポート * するために, これらの ioctl を再考しなければなりません. */ #define MTIOCRDSPOS _IOR('m', 5, uint32_t) /* 論理ブロックアドレスを 取得 */ #define MTIOCRDHPOS _IOR('m', 6, uint32_t) /* ハードウェアブロック アドレスを取得 */ #define MTIOCSLOCATE _IOW('m', 5, uint32_t) /* 論理ブロックアドレスに シーク */ #define MTIOCHLOCATE _IOW('m', 6, uint32_t) /* ハードウェアブロック アドレスにシーク */ #define MTIOCERRSTAT _IOR('m', 7, union mterrstat) /* テープエラーを取得 */ /* * EOT モデルを設定 - 引数は, テープの終わるファイルマークの数です. * すべての指定される値が受け付けられるわけではないことに注意してください. */ #define MTIOCSETEOTMODEL _IOW('m', 8, uint32_t) /* 現在 EOT モデルを取得 */ #define MTIOCGETEOTMODEL _IOR('m', 8, uint32_t) #ifndef _KERNEL #define DEFTAPE "/dev/nsa0" #endif #endif /* !_SYS_MTIO_H_ */
関連ファイル
- /dev/[n]sa*
歴史
mtio マニュアルは、 4.2BSD で登場しました。 i386 バージョンは、 FreeBSD 2.2 ではじめて登場しました。バグ
状態 (ステータス) は、デバイスに独立した形式で返されるべきです。スペシャルファイルの命名については、もっと一貫した分かりやすい方法でやり直すべきです。
November 11, 2011 | FreeBSD |