13. 从 Linux 读取 VMS 磁带

(本节由 Mike Miller 编写)

13.1. 简介

有时您可能需要读取在 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 轨磁带吗?),请告诉我,我将在此处添加注释。

13.2. 基础知识

当读取使用 VMS ``copy'' 命令制作的磁带(或至少看起来像是使用 copy 制作的磁带)时,您只需要知道磁带上每个实际数据文件都会有三个文件 - 一个 header、数据和一个 trailer。header 和 trailer 的有趣之处在于它们包含有关文件在 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

我剩下六个文件:header1、data1、trailer1、header2、data2 和 trailer2。这里的语法是 if="输入文件",bs="块大小",of="输出文件"。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 - 为磁带上的第一个文件跳过三个文件,为下一个 header 跳过一个文件。第二个 mt 跳过第二个文件的 trailer,并将磁带定位到下一个文件的开头 - 第三个 VMS header。您还可以使用 mt 向后跳过 (bsf)、倒带 (rewind) 以及倒带和卸载磁带 (offline, rewoffl)。

13.3. 一些细节

header 和 trailer 文件包含 VMS 用于存储文件信息(如块大小)的大写 ASCII 数据。它们还包含文件名,如果您想构建自动化读取文件或搜索特定文件的脚本,这将非常方便。磁带卷上的第一个 header 与后续 header 略有不同。

对于作为磁带上第一个文件的文件,如上面示例中的 header1,前四个字符将是 "VOL1",后跟卷名。在示例中,header1 以 "VOL1C66A2" 开头。接下来是一系列以数字结尾的空格。之后是字符串 "HDR1",表示这是一个文件 header。紧随 HDR1 字符串之后的字符是 VMS 文件名。在示例中,这是 "HDR1CE66-2.EVT"。下一个字段再次是卷名。

对于不是磁带上第一个文件的文件,初始 VOL1 字段不存在。除此之外,header 的结构与初始文件相同。另一个有用的字段是第 7 个字段,它将以 "DECFILES11A" 结尾。这必须存在于符合 DEC Files11A 标准的磁带上。

       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

有关 header 和 trailer 格式的完整详细信息,请参阅 DEC FILES11A 文档(在橙色/灰色墙上 - 询问您当地的 VMS 人员 :-))。

13.4. 关于块大小的评论

在示例中,我使用了 16k 的块大小。在 *nix 系统上,磁盘上的文件没有关联的块大小,而在 VMS 下,每个文件都有特定的块大小。这意味着块大小在 Linux 端不太重要... 除非它使读取磁带变得困难。如果您在确定块大小和读取磁带时遇到困难,您可以尝试使用 `mt -f $TAPE setblk 0` 在磁带驱动器上设置硬件块大小。setblk 选项的确切形式(及其可用性)可能取决于 mt 的版本、磁带驱动器硬件接口以及您特定的 *nix 版本。

(感谢 Wojtek Skulski () 指出 setblk。)