この章では SCSI のテープドライブに特有の情報を記述しています。
固定長ブロックのドライブにも可変長ブロックにも対応しています。ただしド ライバで定義しているバッファよりもブロックは小さくなければなりません。 配布版カーネルのソースではドライバのバッファは 32K に設定されています。
ブロックサイズやバッファリング、記録密度などのパラメータは ioctl
を
使って (通常は mt
プログラムで) 設定されます。この設定はデバイスが
close/reopen
した後も保持されます。
ほとんど全てのドライブが動作します。以下に一部を示します。
テープをドライブに入れてからブートしてみてください。
複数のファイルをテープから読み出すとき、最初の tar
は成功し、その
次の tar
はなにも出力せずに終わります。さらに次の tar
を
行なうと二つめのファイルが読めます。
tar
のようなユーザレベルのプログラムはファイルマークを認識しません。
最初の tar
は先頭のファイルの最後まで読み込みます。
2 度目の tar
はファイルマークの位置で読み込みを始めるのでなにも出力
しません。しかしこれによりテープは次のファイルの先頭に移動するので 3 度目
の tar
は 2 番めのファイルを読み込みます。
次のファイルにスキップするためには、巻戻しをしないデバイス
(/dev/nst?
) に mt
コマンドを用いて下さい。
圧縮プログラムはファイルの最終ブロックに追加される 0 のデータを正しく 扱うことができません。
警告やエラーを防ぐには、圧縮ファイルを .tar
ファイルの中にまとめて
下さい。つまり
tar cfvz /dev/nrst0 file.1 file.2 ...
とするのではなく、以下のようにして下さい。
tar cfvz tmp.tar.z file.1 file.2 ...
tar cf /dev/nrst0 tmp.tar.z
他の OS で書き込んだテープを Linux で読み込むことができない。 または、Linux で書き込んだテープを他の OS で読み込むことができない。
システムが異なるとブロックサイズも異なることがあります。ブロックサイズが 固定のデバイスに、異なったサイズのブロックを読み込ませることはできません。
このようなテープを読むには、テープドライブのブロックサイズを書き込まれ たときのサイズに合わせてやるか、あるいは可変長にしてやる必要があります。
注意 : これはハードウェアのブロックサイズのことであって、tar
や
dump
等のコマンドのブロッキングファクターのことではありません。
ブロックサイズを変えるには mt
コマンドを使います。
mt setblk <size>
可変長にするときには以下のようにします。
mt setblk 0
mt
の setblk
フラグは、 Linux の配布パッケージに入っている
GNU 版の mt
ではサポートされていません。代わりに BSD から移植
された mt
コマンドを使う必要があります。ソースコードは以下の
ところから入手できます。
ftp://tsx-11.mit.edu/pub/linux/ALPHA/scsi
またデフォルトでは、バッファサイズの最大値が 32K バイトに指定されてい
ることに注意して下さい。これは
/usr/src/linux/drivers/scsi/st_options.h
(古いカーネルでは
st.c
) の ST_BUFFER_BLOCKS
で定義されています。 32K 以上の
ブロックを使う場合はこれを変更してカーネルを再構築する必要があります。
テープにアクセスするたびに「No such device」といったような エラーメッセージが出てしまう場合です。
テープデバイスのタイプをチェックして下さい。テープデバイスはキャラクタ デバイスでなければならず、またデバイスのメジャー番号とマイナー番号が デバイスファイル に記述してあるような値に なっていなければなりません。
多くのテープドライブでは古いハードウェアとの互換性を保つために、低密度 での読み込みをサポートしていますが、普通書き込みはできません。
特に QIC のドライブでこの問題が生じることが多いでしょう。例えば古い形 式の 60M テープが読めても、書き込みは 120, 150, 250, 525M のフォーマット でしかできない場合などです。
これは一度にひとつのコマンドしか処理できない SCSI ドライバで特に良く生 じる問題です。(内容については 複数のデバイス を 見て下さい。またどのドライバがそうかについては 購入の手引: ドライバ機能の比較 を見て下さい。) しかし切断を拒否するテープドライブもいくつか存在しています。
訳注: SCSI ホストアダプタから見て、複数のコマンドを同時に実行するには、 ターゲットデバイスがディスコネクトをサポートしていることが必要です。 (つまりコマンドを受けとったら SCSI バスを解放し、データが準備できたら ターゲット側からバスを要求してデータ転送を行なう。それまでの間に別の デバイスに対するコマンドの送出やデータ転送などが可能となる。) ディスコネクトをサポートしていないターゲットデバイスは、コマンドの 実行を終るまで SCSI バスを放さないので、テープドライブの巻き戻し コマンドなどを送ると悲惨なことになります。
drivers/scsi/st.c
の先頭に以下の行を追加してカーネルを再構築
することで、この問題を回避できる場合もあります。
#define ST_NOWAIT
この変更を行なった場合、エラー状態のレポートは次の SCSI コマンドが実行 されるまでされません。従って、mt などを使った頭出しがちゃんとできてい るかどうかを確認するには以下のようなコマンドを実行してみる必要がありま す。
mt status
この確認をしておかないと、頭出しに失敗した場合にテープを上書きしてしま うことになります。
しかし複数ファイルをテープに書き込んでいて、この解決法を使わなければな らない場合は、よりサポートの良い SCSI ボードか、新しいドライブにする方 が良いかもしれません。
SCSI テープはキャラクタデバイスのメジャー番号 9 を使います。
Linux では 16 ビットの dev_t
を使っているので、マイナー番号には 8 ビッ
トしか割り当てられていません。このため SCSI テープのマイナー番号は
SCSI のホスト/ID/LUN の低い方から動的に割り付けされます。
巻戻しデバイスは 0 からはじまります。一台目の SCSI テープ
/dev/rst0
は c 9 0
となり、二台目は c 9 1
となります。
巻戻しをしないデバイスではマイナー番号の最上位ビットがセットされます。
つまり /dev/nrst0
は c 9 128
となります。
通常は以下のような名前が使われます。
/dev/nst{数字} 巻戻さないデバイス /dev/st{数字} 巻戻すデバイス