(この章は Mike Miller に よって書かれたものです)
時々、VMS マシンで書き込んだテープ(あるいは、VMS と *nix システムで読み取 り可能なように作成したもの)を読み込みたいことがあるでしょう。概して、こ れが DECFILES11A テープならまったく簡単です。
Linux mini-HOWTO の一部としてこれを読んだことがあるかも知れませんが、こ こでの情報はどの *nix システムでも適用可能だと信じます - 私は、Linux、HP、 Sun それに DEC *nix システム上で行ないました。私が知っている主なプラットフォー ム依存点は、異なるシステム毎にデバイス名が違うことと、デバイス名を指定する mt のオプションです(例えば、Linux では mt -f 、HPUX 9なら mt -t)。
警告 - これは Exabyte 8mm SCSI テープ装置のみで試しました。他のフォーマッ ト形式(まだ 9 トラックはあるのかしら)で読み込むことができたら、私に知らせてください。ここに加えておきます。
VMS の「 copy 」コマンドで作成されたテープ(あるいは、ともかく copy で作成されたのと同じように作られたもの)を読むときに、実際のデータファイル毎にテープ上にあ る三つファイル - ヘッダー、データ、トレイラーのことを知っておく 必要があります。ヘッダーとトレイラーは VMS 上にあったときのファイル情報 を格納したものに関係あります。データは、もちろんデータのことです。めいめ いのファイルは dd コマンドでテープから取り出すことができます。mt コマンドでテープの位置をあちこちに移動させることができます。
例:連続してファイルが書き込まれている VMS のテープがあります。最初の二 つは、VMS システムでのオリジナルの名前が ce66-2.evt と ce66-3.evt です。 テープラベルは c66a2 です。
もしこれらのコマンドを実行したなら、
> dd if=$TAPE bs=16k of=header1
> dd if=$TAPE bs=16k of=data1
> dd if=$TAPE bs=16k of=trailer1
> dd if=$TAPE bs=16k of=header2
> dd if=$TAPE bs=16k of=data2
> dd if=$TAPE bs=16k of=trailer2
6つのファイル - header1, data1, trailer1, header2, data2 と trailer2 を 取り出せます。ここでの構文は、if="入力ファイル", bs="ブロックサイズ" そして、of="出力ファイル"です。TAPE はあなたのテープ装置の装置名称 に応じて変更されることでしょう。 - 例えば、Linux での一番目の SCSI テー プは /dev/nts0 です。
最初のファイルじゃなく 2 番目のファイルを読みたいときに、ヘッダーにつ いては気にせずによくて、さらにオリジナルのファイル名を使いたければ、このよう にします。
> mt -f $TAPE fsf 4
> dd if=$TAPE bs=16k of=ce66-2.evt
> mt -f $TAPE fsf 1
4 は最初のファイルから 3 つのファイルと、次のヘッダの一つをスキップするた めにあることに注意してください。二つ目の mt は 2 番目のファイルのトレイラーをスキップして、次のファイル - 3 番目の VMS ヘッダー の先頭にテープの位置を移し ます。mt を使って、後方( bsf )にスキップしたり、巻き戻したり ( rewind )、巻き戻してアンロード( offline, rewoffl )することもまたできます。
ヘッダーとトレイラーファイルは、ブロックサイズなどのファイル情報を保存す るために VMS で使われる大文字の ASCII データを含んだものです。それらはま たファイル名も含んでおり、自動でファイルを読み込んだり、特定のファイルを サーチするスクリプトを作るのに便利です。テープボリュームの一番目のヘッダー は、それ以降のヘッダーとはわずかに異なっています。
上記の例で header1 に相当するテープ上の最初のファイルは、初めの4文字が 「VOL1」で始まり、その後にボリューム名が続きます。例では、header1 は VOL1C66A2 で始まります。数字で終る連続したスペースが続きます。その後に、 ファイルヘッダーであることを示す「 HDR1 」があります。HDR1 に続く文字列が VMS ファイル名です。例では、HDR1CE66-2.EVT です。次のフィールドは、再びボリューム名となります。
テープ上の最初のファイル以外のファイルには、語頭に VOL1 フィールドはありません。 VOL1 フィールドがないことを除けば、ヘッダーの構造は最初のファイルとそれ 以外のファイルも同じです。他に便利なフィールドは7番目のフィールドで、 「 DECFILES11A 」で終るでしょう。これは DEC Files11A 規格に適合している テープには、このフィールドがあるはずです。
フィールド 最初のヘッダー 次のヘッダー
========= ================== ==================
1 VOL1 + ボリューム名 HDR1 + ファイル名
2 3HDR1 + ファイル名 ボリューム名
3 ボリューム名
6 ...DECFILES11A
7 ...DECFILES11A
ヘッダーやトレイラーの完全なフォーマットの詳細については、DEC FILES11A ドキュメントを御覧ください(オレンジやグレイの壁の上にあります - 身近にい る VMS 信奉者に尋ねてください :-)。
例では、16k のブロックサイズを使いました。*nix システムでは、ディスク上 のファイルに関連づけたブロックサイズはありませんが、VMS での各ファ イルには、固有のブロックサイズがあります。これは、テープを読むことさえ難 しくなければ、ブロックサイズは、Linux 界において大した問題ではないこと意味します。 もしブロックサイズを算出してテープを読むことが難しければ、mt -f $TAPE setblk 0 を使って、ハードウェアブロックサイズを設定することができます。setblk オプションの正確な形式(と、使用可能かどうか)は mt のバージョンと、あなた が使用する特定の *nix の種類に依ります。
( setblk について指摘してくれた Wojtek Skulski に感謝 ( skulski@nsrlc6.nsrl.rochester.edu))