ST(4)

名前
st - SCSI テープデバイス

書式
#include <sys/mtio.h>

int ioctl(int fd, int request [, (void *)arg3])
int ioctl(int fd, MTIOCTOP, (struct mtop *)mt_cmd)
int ioctl(int fd, MTIOCGET, (struct mtget *)mt_status)
int ioctl(int fd, MTIOCPOS, (struct mtpos *)mt_pos)

説明
st ドライバーは様々な SCSI テープデバイスのインターフェイスを提供する。 現在では、ドライバーは検出された全ての “シーケンシャルアクセス(sequential-access)” タイプのデバイスへの 制御を行う。 st ドライバーはメジャーデバイスナンバー 9 を用いる。

それぞれのデバイスは二つのマイナーデバイスナンバーを使う: 主マイナーデバイスナンバー n は検出された順に割り当てられる、そして、 “非巻き戻し(no-rewind)” デバイスナンバーは (n+ 128) である。 主デバイスナンバーを用いてオープン(open)されたデバイスはクローズ(close)す る時に REWIND が送られる。 “非巻き戻し(no-rewind)” デバイス番号 を用いてオープンされた 場合、REWIND は送られない。 密度(density)やブロックサイズといったようなオプションはマイナーナンバー に符号化されない。 これらのオプションは明示的に ioctl() コールによってセットしなければならない。このオプションはデバイスがクロー ズされ再度オープンされた時でも効果が残る。

典型的にはデバイスは次のように作られる:
    mknod -m 660 /dev/st0 c 9 0
    mknod -m 660 /dev/st1 c 9 1
    mknod -m 660 /dev/nst0 c 9 128
    mknod -m 660 /dev/nst1 c 9 129

これらのデバイスに対応するブロックデバイスは無い。 このキャラクターデバイスはデフォルトでバッファリングと先読み (read-ahead)を提供し、任意のサイズの読み書きをサポートする。(このサイ ズは、ドライバ内部のバッファサイズによって制限される。デフォルトでは 32768 バイトであるが、カーネル起動時オプションを用いる、あるい はコンパイル時に定数を変更することでサイズを変えることができる)

/dev/tape デバイスは通常、システムのデフォルトのテープデバイスへのシンボリックリ ンクあるいはハードリンクとして作成される。

IOCTLS
このドライバーは三つの ioctl 要求をサポートしている。 st ドライバーで解釈されなかった要求は scsi ドライバーに渡される。 以下の定義は、 <linux/mtio.h> からのものである。

  MTIOCTOP - テープ操作の実行

この要求は、 (struct mtop *) という型の引数を一つとる。全てのドライブが全ての操作をサポートして いるわけではない。ドライブがその操作を拒否するとドライバーは EIO エラー を返す。

/* MTIOCTOP のための構造体 - 磁気テープ操作コマンド: */
struct mtop {
	short	mt_op;		/* 以下で定義されている操作 */
	int	mt_count;	/* その操作を何回行うか */
};

磁気テープ操作:
MTBSF
    mt_count 個のファイルマーク(filemark)分の後方スペース(backward space)。
MTBSFM
    mt_count 個のファイルマーク分の後方スペース。 テープは最後のファイルマークの EOT 側に位置を変えられる。
MTBSR
    mt_count 個のレコード(テープブロック)分の後方スペース。
MTBSS
    mt_count 個のセットマーク分の後方スペース。
MTEOM
    (ファイルを加えるために)メディア中の最後の記録部分まで進める。
MTERASE
    テープの内容を消去する。
MTFSF
    mt_count 個のファイルマーク分の前方スペース(forward space)。
MTFSFM
    mt_count 個のファイルマーク分の前方スペース。 テープは最後のファイルマークの BOT 側に位置を変えられる。
MTFSR
    mt_count 個のレコード(テープブロック)分の前方スペース。
MTFSS
    mt_count 個のセットマーク分の前方スペース。
MTNOP
    何も操作を行わない。- 副次的な効果として、ドライバーのバッファ をフラッシュする。MTIOCGET を使って状態を読み出す前に使わなけ ればならない。
MTOFFL
    巻き戻し(rewind)を行い、ドライブをオフライン(off line)にする。
MTRESET
    ドライブをリセットする。
MTRETEN
    テープをリテンション(retension, テープを最後まで巻いた後、最初まで 巻き戻すことを)する。
MTREW
    巻き戻し。
MTSEEK
    mt_count で指定されたテープブロック番号を探す。 この操作は(アドレスはデバイス依存である) LOCATE コマンドをサポー トする SCSI-2 ドライブであること、または、Tandberg 互換の SCSI-1 ドライブ(Tandberg, Archive, Viper, Wangtek,…)であること が要求される。 このブロック番号はデバイス固有であるため、あらかじめ MTIOCPOS によって返されたものでなければならない。
MTSETBLK
    mt_count の値をドライブのブロック長(block length)としてセットする。 ブロック長を 0 にするとドライブは可変長ブロックサイズモードにセッ トされる。
MTSETDENSITY
    mt_count のコードで示されるテープ密度(tape density)にセットする。 いくつかの有用な密度コード(density code)は:
    0x00	Implicit	0x11	QIC-525
    0x04	QIC-11	0x12	QIC-1350
    0x05	QIC-24	0x13	DDS
    0x0F	QIC-120	0x14	Exabyte EXB-8200
    0x10	QIC-150	0x15	Exabyte EXB-8500
MTWEOF
    mt_count 個のファイルマークを書き込む。
MTWSM
    mt_count 個のセットマークを書き込む。
MTSETDRVBUFFER
    いろいろなドライブとドライバーのオプションを mt_count にエンコードされたビットに従い設定する。 オプションはドライバのバッファリングモード、真偽値をとる 6 つのオプショ ン、バッファの書き込み閾値から構成される。 これらのパラメータはデバイスが最初に検知された時にのみ初期化される。 設定はデバイスがクローズされ再びオープンされた時にも保持される。 一回の操作で変えられるのは、(a)バッファリングモード、(b)真偽値をとるオ プション、(c)書き込み閾値、のうちのどれか一つだけである。

    高位の4ビットがゼロである値は、ドライブのバッファリングモードを設定す るのに使われる。 バッファリングモードは：

    0   ドライブはライトコマンドに対し、データブロックが実際に媒体に書き込まれ るまで、GOOD のステータスを返さない。
    1   ドライブはライトコマンドに対し、 すべてのデータがドライブの内部バッファに転送されるとすぐに、 GOOD のステータスを返すことができる。
    2   ライトコマンドに対し、以下の 2 つの条件がそろった場合、ドライブはすぐ に GOOD ステータスを返す事ができる。その条件は、(a)すべ てのデータがドライブの内部バッファに転送され、かつ (b) 違ったイニシエー ターからのすべてのバッファされたデータの媒体への書き込みが成功した時で ある。

    書き込み閾値を制御するには、 mt_count には、定数 MT_ST_WRITE_THRESHOLD とブロックカウントの論理和 (OR) をとった値を下位の 28ビットに含まねばならない。 このブロックカウントは 1024 バイトブロックを単位としたもので、テープの 物理ブロックサイズを単位としたものではない。 また、閾値はドライバの内部バッファ(上記の DESCRIPTION 参照の事)のサイズを越える事はできない。 真偽値をとるオプションをセット/クリアするには、 mt_count は、定数 MT_ST_BOOLEANS と次のオプションのうちの設定した いものを組み合わせたものとの論理和をとった値を含まねばならない。 指定のなかったオプションは、偽とされる。 真偽値をとるオプションは：

    MT_ST_BUFFER_WRITES  (デフォルト: 真)
        すべての書き込み動作をバッファリングする。 このオプションが偽であり、かつドライブが固定ブロックサイズの時は、すべ ての書き込み動作は、ブロックサイズの倍数の大きさのものに対してでなけれ ばならない。 信頼性のあるマルチボリュームアーカイブを書き込むためには、このオプション は偽に設定されていなければならない。
    MT_ST_ASYNC_WRITES  (デフォルト: 真)
        このオプションが真の時には、データがドライバのバッファに収まる時には データがドライブに転送されるのを待たずに、すぐに書き込み操作が返って来 る。 書き込み閾値により、バッファがどのくらいいっぱいになったら SCSI の write コマンドを発生させるかが決まる。 ドライブが返すすべてのエラーは、次の操作まで保存される。 信頼性のあるマルチボリュームアーカイブを書き込むためには、このオプショ ンは偽に設定されていなければならない。
    MT_ST_READ_AHEAD  (デフォルト: 真)
        このオプションにより、ドライバは読み込みバッファリングと先読みをする ようになる。 このオプションが偽であり、かつドライブが固定ブロックサイズの時は、すべて の読み込み動作は、ブロックサイズの倍数の大きさのものに対してでなければ ならない。
    MT_ST_TWO_FM  (デフォルト: 偽)
        このオプションはファイルがクローズされた時のドライバーの動作を変更する。 通常の動作は、一つのファイルマークを書き込むことである。 このオプションが真の時には、ドライバーは2つのファイルマークを書き込ん だ後、2つめのファイルマークのところに戻る。

        注意： QICテープドライブはファイルマークに上書きすることができないので、この オプションを真にしてはならない。 これらのドライブは記録されたデータの終りをみつけるのに、ファイルマーク が2つ続けてあるかではなく、ブランクテープであるかどうかで、判断する。

    MT_ST_DEBUGGING  (デフォルト: 偽)
        このオプションはドライバーがいろいろなデバッグ用メッセージを出すようにする。 (ドライバーがDEBUGを定義してコンパイルしている時のみ有効)
    MT_ST_FAST_EOM  (デフォルト: 偽)
        このオプションで、MTEOM 操作が直接ドライバーに送られるようになる。 動作が早くなるはずだが、ふつう MTIOCGET リクエストによって返され る現在のファイルのトラック番号を、ドライバーは見失うことになる。 MT_ST_FAST_EOM が偽の時には、ドライバーが前方にファイルを勘定し ながらすすめて、MTEOM リクエストにこたえる。
    例
        struct mtop mt_cmd;
        mt_cmd.mt_op = MTSETDRVBUFFER;
        mt_cmd.mt_count = MT_ST_BOOLEANS |
        		MT_ST_BUFFER_WRITES |
        		MT_ST_ASYNC_WRITES;
        ioctl(fd, MTIOCTOP, &mt_cmd);

  MTIOCGET - ステータスの取得

このリクエストは (struct mtget *). という型の引数をとる。 ドライブが動作を受け付けない時には、ドライバーはEIOエラーを返す。

/* MTIOCGET のための構造体 - 磁気テープからステータスを得るコマンド */
struct mtget {
	long	mt_type;
	long	mt_resid;
	/* 次のレジスタはデバイス依存 */
	long	mt_dsreg;
	long	mt_gstat;
	long	mt_erreg;
	/* 次の2つのフィールドは使われないことがある*/
	daddr_t	mt_fileno;
	daddr_t	mt_blkno;
};

mt_type
    ヘッダファイル中には多くの mt_type の値が定義されているが、現行のドライバーは、 MT_ISSCSI1 (汎用SCSI-1テープ)か MT_ISSCSI2 (汎用SCSI-2テープ) の汎用タイプのみを返す。
mt_resid
    は常にゼロ。(SCSI テープドライブのためには実装されていない。)
mt_dsreg
    ドライブのブロックサイズと密度の現在の設定を報告する(下位24ビットがブ ロックサイズ、上位 8 ビットが密度)。 このフィールドは、MT_ST_BLKSIZE_SHIFT, MT_ST_BLKSIZE_MASK, MT_ST_DENSITY_SHIFT, MT_ST_DENSITY_MASK で定義される。
mt_gstat
    汎用の(デバイスに無関係な)ステータスを報告する。 ヘッダファイル中にこれらのステータスビットをテストするマクロが定義されている。
    GMT_EOF(x): テープはファイルマークのすぐ後に位置している。 (MTSEEK 操作の後では常に偽)
    GMT_BOT(x): テープは最初のファイルの始めに位置している。 (MTSEEK 操作の後では常に偽)
    GMT_EOT(x): テープ操作はテープの物理的な終点に達した。
    GMT_SM(x): テープは現在セットマークに位置している。 (MTSEEK 操作の後では常に偽)
    GMT_EOD(x): テープは記録されたデータの終りに位置している。
    GMT_WR_PROT(x): ドライブはライトプロテクトされている。 いくつかのドライブでは、これはドライブが現在のメディアタイプへの書き 込みをサポートしていない事をあらわす場合もある。
    GMT_ONLINE(x): もっとも最近の open() によって、テープが入っていて動作準備ができているドライブが検知された。
    GMT_D_6250(x), GMT_D_1600(x), GMT_D_800(x): この汎用のステータス情報は、9-トラック ½" テープドライブの場合にの み、現在の密度の設定を報告する。
    GMT_DR_OPEN(x): ドライブにはテープが入っていない。
    GMT_IM_REP_EN(x): 即時レポートモード(サポートされていない)。
mt_erreg
    mt_erreg で定義されているフィールドは一つだけで、下位の16ビットがエラーをリカバー した回数である(MT_ST_SOFTERR_SHIFT と MT_ST_SOFTERR_MASK で定義される)。 ドライブの報告するリカバーされたエラーの数と矛盾している ため、この数はしばしば無視される。
mt_fileno
    (ゼロから数えた)現在のファイル番号を報告する。 ファイル番号がわからない時(例えば MTBSS や MTSEEK の後など)には -1 にセットされる。
mt_blkno
    現在のファイル中の(ゼロから数えた)ブロック番号を報告する。 ブロック番号がわからない時(例えば MTBSF, MTBSS, MTSEEK の後など)には -1 にセットされる。

  MTIOCPOS - テープ位置の取得

このリクエストは (struct mtpos *) 型の引数をとり、ドライブが理解している現在のテープのブロック番号を報告する。 これは、MTIOCGET により返される mt_blkno と同じではない。 ドライブは (アドレスはデバイス固有である)READ POSITION コマンドをサポー トする SCSI-2ドライブか Tandberg 互換の SCSI-1 ドライブ (Tandberg, Archive, Viper, Wangtek, ... )でなくてはならない。

/* MTIOCPOSのための構造体 - 磁気テープの位置取得コマンド */
struct	mtpos {
	long 	mt_blkno;	/* 現在のブロック番号 */
};

返り値

EIO リクエストの操作は完遂できなかった。

ENOSPC
    メディアの終点に達したため、書き込み動作が完了しなかった。

EACCES
    書き込み保護されているテープに書き込み、または、消去を行おうとした。 このエラーは open() 中には検知されない。

ENXIO
    オープンする時にテープデバイスが存在しなかった。

EBUSY
    デバイスがすでに使われているか、ドライバがバッファを割当てられなかっ た。

EOVERFLOW
    ドライバの内部バッファより大きいサイズの可変長のブロックを、読むか書 くかしようとした。

EINVAL
    ioctl() の引数が不当であるか要求のブロックサイズが不当である。

ENOSYS
    知らない(Unknown な) ioctl().

著作権
Copyright © 1995 Robert K. Nichols.

Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Additional permissions are contained in the header of the source file.

このマニュアルが示している著作権表示と許可通知が全てのコピーにおいて、 そのままの形で保存され、提供される場合についてのみ、配布を許可する。 付加的な許可はソースファイルのヘッダに含まれている。

関連項目
mt(1)

翻訳者
石川 睦 <ishikawa@linux.or.jp> 高橋 睦司 <muz@ilp.iijnet.or.jp>