次のページ 前のページ 目次へ

8. テープ

この章では SCSI のテープドライブに特有の情報を記述しています。

8.1 対応している (いない) ハードウェア

固定長ブロックのドライブにも可変長ブロックにも対応しています。ただしド ライバで定義しているバッファよりもブロックは小さくなければなりません。 配布版カーネルのソースではドライバのバッファは 32K に設定されています。

ブロックサイズやバッファリング、記録密度などのパラメータは ioctl を 使って (通常は mt プログラムで) 設定されます。この設定はデバイスが close/reopen した後も保持されます。

ほとんど全てのドライブが動作します。以下に一部を示します。

8.2 よくある問題

ブート時にテープドライブが認識されない

テープをドライブに入れてからブートしてみてください。

複数のファイルを含んだテープが正しく読み取れない

複数のファイルをテープから読み出すとき、最初の 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 で読み込むことができない。

システムが異なるとブロックサイズも異なることがあります。ブロックサイズが 固定のデバイスに、異なったサイズのブロックを読み込ませることはできません。

このようなテープを読むには、テープドライブのブロックサイズを書き込まれ たときのサイズに合わせてやるか、あるいは可変長にしてやる必要があります。

注意 : これはハードウェアのブロックサイズのことであって、tardump 等のコマンドのブロッキングファクターのことではありません。

ブロックサイズを変えるには mt コマンドを使います。

mt setblk <size>

可変長にするときには以下のようにします。

mt setblk 0
mtsetblk フラグは、 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」というエラーメッセージが出る

テープにアクセスするたびに「No such device」といったような エラーメッセージが出てしまう場合です。

テープデバイスのタイプをチェックして下さい。テープデバイスはキャラクタ デバイスでなければならず、またデバイスのメジャー番号とマイナー番号が デバイスファイル に記述してあるような値に なっていなければなりません。

読み込みには密度を指定できるのに、書き込みではできない

多くのテープドライブでは古いハードウェアとの互換性を保つために、低密度 での読み込みをサポートしていますが、普通書き込みはできません。

特に QIC のドライブでこの問題が生じることが多いでしょう。例えば古い形 式の 60M テープが読めても、書き込みは 120, 150, 250, 525M のフォーマット でしかできない場合などです。

テープの頭出しをすると全ての SCSI デバイスがフリーズしてしまう

これは一度にひとつのコマンドしか処理できない SCSI ドライバで特に良く生 じる問題です。(内容については 複数のデバイス を 見て下さい。またどのドライバがそうかについては 購入の手引: ドライバ機能の比較 を見て下さい。) しかし切断を拒否するテープドライブもいくつか存在しています。

訳注: SCSI ホストアダプタから見て、複数のコマンドを同時に実行するには、 ターゲットデバイスがディスコネクトをサポートしていることが必要です。 (つまりコマンドを受けとったら SCSI バスを解放し、データが準備できたら ターゲット側からバスを要求してデータ転送を行なう。それまでの間に別の デバイスに対するコマンドの送出やデータ転送などが可能となる。) ディスコネクトをサポートしていないターゲットデバイスは、コマンドの 実行を終るまで SCSI バスを放さないので、テープドライブの巻き戻し コマンドなどを送ると悲惨なことになります。

drivers/scsi/st.c の先頭に以下の行を追加してカーネルを再構築 することで、この問題を回避できる場合もあります。

#define ST_NOWAIT

この変更を行なった場合、エラー状態のレポートは次の SCSI コマンドが実行 されるまでされません。従って、mt などを使った頭出しがちゃんとできてい るかどうかを確認するには以下のようなコマンドを実行してみる必要がありま す。

mt status

この確認をしておかないと、頭出しに失敗した場合にテープを上書きしてしま うことになります。

しかし複数ファイルをテープに書き込んでいて、この解決法を使わなければな らない場合は、よりサポートの良い SCSI ボードか、新しいドライブにする方 が良いかもしれません。

8.3 デバイスファイル

SCSI テープはキャラクタデバイスのメジャー番号 9 を使います。

Linux では 16 ビットの dev_t を使っているので、マイナー番号には 8 ビッ トしか割り当てられていません。このため SCSI テープのマイナー番号は SCSI のホスト/ID/LUN の低い方から動的に割り付けされます。

巻戻しデバイスは 0 からはじまります。一台目の SCSI テープ /dev/rst0c 9 0 となり、二台目は c 9 1 となります。 巻戻しをしないデバイスではマイナー番号の最上位ビットがセットされます。 つまり /dev/nrst0c 9 128 となります。

通常は以下のような名前が使われます。

/dev/nst{数字}      巻戻さないデバイス
/dev/st{数字}       巻戻すデバイス


次のページ 前のページ 目次へ