質問: /dev/nst0でテープデバイスへ書込みを行う場合、テープは巻き戻されずに追記で書き込まれます。 ■質問事項 以下図の8付近でテープデバイスに対して書き込もうとした場合の挙動を お教え願います。 ※自動でテープの先頭まで巻き戻った後に、書込みが行われるのでしょうか?その場合、途中まではテープ後方部にも書込みデータの一部が存在して しまうことになるのでしょうか? ![![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/76f0fe89c561f48683ed75d6e152055a.gif)説明](144adca63a804bf6a49a5c271c39f051.gif)](cbbf38fa2324a1cea2329948aa4cff85.gif)
回答: /dev/nst0は、自動的に巻き戻されないテープ装置のデバイスです。 * 図の8まで書き込んだ場合、テープドライブのヘッドが最後のEOFを書き込んだ直後で、テープは停まっています。 * 再びテープデバイスに書き込むと、そのEOFの後に、データ (と、もうひとつのEOF) が書き込まれます。/dev/nst0に書き込んだのなら、再びテープは最後のEOFの直後で停まります [1]。 テープには、EOFで区切られた複数のデータブロック (レコード) が記録されることになります。 mt(1)コマンドを使えば、レコードからレコードへ移動できます。次のEOFの位置まで移動することで次のレコードの先頭へ、前の前のEOFの位置まで移動することで前のレコードの先頭へ移動できます (詳しくは`man mt`して下さい)。これにより、特定のレコードへ移動した上で、そのレコードの内容を読み取ったり、またはデータを書き込んでレコードの内容を更新したりできます (当然、書き込むデータは元のレコードより長くてはいけません。次のレコードを上書きして壊してしまいますから)。 こうして、1本のテープに複数のデータを格納して管理することができます (もっとも、データを区別する方法は「テープの最初から何番目のレコードか」ということだけです。ディスク上のファイルシステムのようにファイル名をつけたりディレクトリで分けたりはできません) [2]。 ところで、テープにはもともと何か書いてあったかもしれません。新たに書き込みして途中まで上書きした場合、上書きした場所より後にあるレコードは、まだ読み出せるかもしれません。途中まで上書きされたレコードについては、残りのデータも壊れてもう読み出せないかもしれません。 [1] もともと巻き戻すデバイスがあって巻き戻さないオプションができたのではないです。逆で、初期のテープ装置には巻き戻し機能がありませんでした (巻き戻しは、テープを装置から外して手作業、または専用の機器で行いました)。そのためデバイス名で、巻き戻しに対応したものとしていないものを区別しました。 [2] 「これ以降はデータがない」ということを示すために、最後にEOFを2回 (以上) 続けて書き込んでおく、といった規約を設ける場合もあります。テープのこれ以降は空き領域とみなし、読み込みに使いません。新規のレコードを追加するときは、2個目のEOFを上書きして書き込みます。