wtape によって書かれたテープの互換性について

2002.5.15 修正

wtapeプログラム は連続記録の1分ファイルをテープに書き込みます。 テープに書かれた連続記録データを読み出すのは、 rtape プログラムです。テープ上では、 1分ごとではなくて、10分ごとにテープマーク(ファイルマーク)が 書かれます。wtape は1つのwrite()システムコールで1秒分のデータを テープデバイスに書きますので、基本的に1秒分がテープ上の1ブロック になるはずです。しかし1秒分のデータのサイズが大きい場合、OSによっては それが適当な大きさに分割されて書き込まれています。

FreeBSD 3.X の場合
write時には、ドライバーが1秒分のデータを61440 バイト毎のブロックに 分割して書き込むようです。read時には、ドライバーが分割されたブロックを つなぎ合わせて元のサイズに戻してくれます。したがってプログラムは テープ上に分割して記録されていることを意識する必要はありません。 ただし、テープ上で61440バイトを超える(物理)ブロックサイズは エラーになってしまい、読み出すことができません。
Solaris2の場合
write時はドライバーが 65534バイト毎に分割して書き込みます。 read時はドライバーが分割されたブロックを自動的に元のサイズに 戻すことはしなくて、65534バイトの物理ブロック単位で読みだされます。 したがって、読み出しをするアプリケーションプログラムがそれを つなぎ合わせる必要があります。そのため、rtape プログラムは、1秒分のデータが 読み出されるまで、read()システムコールを繰り返すようになっています。

以上のことから、FreeBSDのwtapeで書いたテープをSolaris のrtapeで読むことはできるが、逆にSolarisのwtapeで書いたテープを FreeBSDで読むことはできない、ということになります。

追加情報
SunOS4はFreeBSD 3.Xと同じ形式であるようです。 また、LinuxはSunOS/FreeBSDで 書いたテープを読めるようです。したがって、FreeBSD 3.XとSunOS4は同じBSD系、 Solaris2とLinuxは同じSystemV系で、BSD系のwtapeで書いたテープをSystemV系 のrtapeで読むことはできるが、逆にSystemV系のwtapeで書いたテープを BSD系のrtapeで読むことはできない、と整理することができるかも知れません。
追加情報2
FreeBSD 4.Xは、write時にブロックの分割を行いません。 実験したところ、少なくとも10MBまでの大きさのブロックのままで 書き込み、そのまま読み出すことができます。wtapeでこうやって書き込まれた テープは、1秒ブロックの大きさが60KBを超えるような場合、 FreeBSD 3.X/Solaris2のいずれでも読み出すことはできず、FreeBSD 4.Xでないと 読むことはできません。もちろんFreeBSD 4.XはFreeBSD 3.XやSolaris2によって 書かれた分割ブロックのデータも読み出すことができます。
追加情報3
上記のようにFreeBSD 4.X は巨大なブロックサイズでテープに 書き込もうとするため、SCSIカードによってはwtape実行時にI/Oエラーが 出る場合があります。wtapeプログラムで適当な大きさに分割してから 書き込むべきかもしれません。ただしテープの利用効率はブロックサイズが 大きい方が高いと思われます。

地震地殻変動観測センターのホームページに戻る