Next Previous Contents

13. 在 Linux 上读取 VMS 的磁带

(以下这段是由 Mike Miller 先生所著)

13.1 简介

有时候您可能需要读由 VMS 做出来的磁带(或是为了让 VMS 的机器和 *nix 系统可以读取的磁带)﹐ 大致上﹐对 DECFILES11A 磁带并不会太难。

或许您曾读过 Linux 的 mini-HOWTO, 但是﹐我相信﹐我在这里提及的一些观念也是和任何一种 *nix 系统。 我曾经在 Linux, HP, Sun and DEC *nix 等系统中试过。比较不一样的地方是﹐每种作业系统对装置名称(device names)可能会有所不同﹐ 而 mt 在指明装置名称(device name)的时候﹐其选项(options)也可能因作业系统而异。 例如:在 Linux 上是 mt -f ﹐但是在 HPUX 9 上却是 mt -t。

注意 - 我只以 Exabyte 8mm SCSI tape drives 实作过﹐如果您已经读过其他的格式﹐ 请让我知道﹐我将会把她增加到这份 Note 中。

13.2 一些基本常识

当读取 VMS 由 ``copy'' 指令作成的磁带时﹐(或是看起来像是由 copy 指令作成的磁带)﹐ 您必须要知道﹐每个实际的文档将会分成三的文档存放在磁带上﹐分别是“档头(header)”, “资料(data)”, 和“档尾(trailer)”。 其中档头(header) 和 档尾(trailer)存放著文档的信息﹐和在 VMS 上的位置。而资料(data)当然就是存放原来的资料啦! 这些文档都可以由 dd 这个指令从磁带(tape)上萃取出来。 由 mt 指令﹐可以将磁带转到所需要的位置。

范例:我有一个连续存放著文档的磁带。最前面两个在 VMS 上的档名为 ce66-2.evt 和 ce66-3.evt 磁带的标签(label)是 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

我 dd 了六个文档:header1, data1, trailer1, header2, data2 和 trailer2. 使用语法如下:if="input file", bs="block size" 和 of="output file". TAPE 这个便是须视您的机器上的装置名称而定﹐例如:如果您在 Linux 上使用 SCSI 的磁带装置﹐ 您的装置名称可能是 /dev/nts0 。

如果您想要读第二个文档﹐不是第一个。您不在意档头(header)﹐而且您想要使用原来的档名﹐您可以这么作:

> mt -f $TAPE fsf 4
> dd if=$TAPE bs=16k of=ce66-2.evt
> mt -f $TAPE fsf 1

注意 “4” - 跳过第一个文档所附属的三个文档﹐所以下一比(第二笔)的档头将会是从第四笔开始。 第二个 mt 为跳过第二笔文档的档尾(tailer)并且指到下一笔文档(第三笔资料的档头)。 当然﹐您也可以使用 mt 使磁带快转(bsf), 倒转(rewind)﹐或是 磁头归位(offline, rewoffl).

13.3 更多细节

档头(header) 和 档尾(trailer) 包含了给 VMS 储存文档的一些信息﹐例如区块大小(block size)。 同时她们也包含了文档名称﹐方便您建立 Script 档来自动读取文档或是搜寻特定的文档。 然而﹐在磁带上的第一个档头档(header file)﹐和其他磁带上的档头档有些许的差异。

对于在磁带上的第一个文档(假设为 header1)﹐最前面的四个字元将会是 "VOL1" ﹐其后伴随著版本名称(volume name)。 本例中﹐header1 的最初内容应该是 "VOL1C66A2"。随后是一个字串"HDR1" ﹐表示这是一个档头档(header file)。 然后才是文档名称(file name)。本例中﹐她会是 "HDR1CE66-2.EVT"。下一个栏位又是版本名称(volume name)。

对于其他的不是磁带上第一个档头档的档头档﹐最初的 VOL1 栏位将不会存在。 其他的栏位就和前面所介绍的第一个档头档的结构一模一样。另一个比较有用的栏位是第七个栏位。 她是以 "DECFILES11A" 为结尾。她必须存在﹐用还确认 DEC Files11A standard.

       field     initial header         subsequent headers
       =====     =============          ==================
         1       VOL1 + volume name     HDR1 + file name
         2       3HDR1 + file name      volume name
         3       volume name            

         6                              ...DECFILES11A
         7      ...DECFILES11A

其他更详细的档头和档尾的结构﹐请参考 DEC FILES11A 的说明文件。 (on the orange/grey wall - ask your local VMS folks :-).

13.4 区块大小的建议(Block Size)

在例子中﹐我使用的区块大小是 16K。在 *nix 系统上﹐磁盘上的文档并没有和区块大小有关连﹐ 然而﹐在 VMS 上﹐每一个文档都有一个明确的区块大小(block size)。也就是说﹐在 Linux 端﹐ 区块大小并没多太大的关系﹐除非当不容易从磁带中读出文档的时候。如果您找不到区块大小(block size)﹐ 您可以试著在磁盘装置上﹐用 `mt -f $TAPE setblk 0' 来设定硬件的区块大小。 用 setblk 选项的萃取的形式可能会随著 mt 的版本不同而有所不一样﹐ 您的磁带装置的硬件界面﹐还有您喜爱的 *nix 系统也想相当的关系。

(感谢 Wojtek Skulski ( skulski@nsrlc6.nsrl.rochester.edu) 提出 setblk 相关部份.)


Next Previous Contents