(本节由 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 制作的磁带)时,您只需要知道磁带上每个实际数据文件都会有三个文件 - 一个 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)。
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 人员 :-))。
在示例中,我使用了 16k 的块大小。在 *nix 系统上,磁盘上的文件没有关联的块大小,而在 VMS 下,每个文件都有特定的块大小。这意味着块大小在 Linux 端不太重要... 除非它使读取磁带变得困难。如果您在确定块大小和读取磁带时遇到困难,您可以尝试使用 `mt -f $TAPE setblk 0` 在磁带驱动器上设置硬件块大小。setblk 选项的确切形式(及其可用性)可能取决于 mt 的版本、磁带驱动器硬件接口以及您特定的 *nix 版本。
(感谢 Wojtek Skulski (�) 指出 setblk。)