下一页 上一页 目录

11. 常见问题解答:“使用 Ftape” 相关问题!

11.1 Ftape 的速度有多快?

使用 Ftape,您可以获得相当可观的备份和恢复速度:Colorado DJ-20 和 Adaptec 1542CF 控制器,在 70Mbyte tar 归档文件中,并比较磁带上的归档文件与 IDE 磁盘上的数据时,实测持续数据传输速率为 4.25Mbyte/min(无压缩)。Ftape 的速度主要取决于您的 FDC 的数据传输速率:AHA1542CF 具有“1991 年后 82077” FDC,它可以以 1Mbit/秒的速度推送到磁带驱动器。如果您的 FDC 只能提供 500Kbit/秒的数据速率,您将看到一半的传输速率(大概如此)。

11.2 当我写入一些磁带时,它们似乎花费大量时间进行“擦鞋”,或重新定位而不是流式传输。我的系统有什么问题吗?

有一些关于“擦鞋”现象的报告。这是指磁带似乎无休止地来回运行。这在 Jumbo 250 (74407.3051@compuserve.com) 和 Iomega 250 Ditto Insider (tom@opus.cais.com) 上都曾出现过。在后一种情况下,问题已缩小到使用 ELF Linux 并从 SCSI 硬盘(连接到 Adaptec 1542cf)运行时。如果您对此问题有任何更新,请与我联系。

<来自 Ftape-Howto>

可能不是。如果您要备份大量小于 2K 的文件,您只能接受这种情况。在这种情况下,重新定位是由文件系统访问开销引起的。如果您要备份正常系统的文件,这可能是由磁带盒中的松弛或介质拉伸引起的。只需重新张紧磁带,您应该会看到这种情况消失。尝试

ftmt -f /dev/zqft0 reten
重新张紧磁带。如果重新张紧无法解决问题,并且仅发生在某些磁带上,则更换有问题的磁带可能是明智之举。

<来自 Tim Jones 的回答>

如果您使用 afio 作为备份工具,您可以使用 -c 标志将其设置为一次写入大量缓冲区。使其足够大,以便您为磁带上的大多数单次端到端传输提供足够的数据。对于我的系统,以下设置运行良好 - 在未加载的系统上,每次磁带传输停止的次数相对较少

find /usr/local -xdev -print | afio -o -v -f -b 10240 -c 800 /dev/qft0
在我的情况下,我每次磁带写入写入 800 x 10240 字节,即大约 8MB。我没有对这些设置进行太多实验 - 因此有人可能希望建立更优化的设置。

据推测,可以修改其他备份实用程序以使用类似的技术。

<Michael Hamilton 的回答>

GNU tar 不以这种方式使用缓冲。商业备份程序“bru”能够使用共享内存进行多缓冲;这仅在使用 bru 写入压缩归档文件时有效(无论您是否使用 Ftape 的内置压缩)

克服该问题的另一种方法可能是在 Ftape 内核驱动程序中使用更多 dma 缓冲区,例如

mt -f /dev/qft0 setdrvbuffer $((6*32786))
$((6*32786)) 应该由您的 shell 在使用 Bourne 兼容 shell 时展开。这对系统的内存池有负面影响:Ftape 的 dma 缓冲区不能被内核的任何其他部分或任何其他应用程序使用。并且内核内存无法换出。如果您决定使用这种多缓冲,那么您应该在不再需要驱动程序时立即卸载它。

<Claus Heine 的回答>

11.3 我是否必须重启到 DOS 世界才能格式化磁带?

如果您使用的是来自 Ftape 主页 的最新版本的 Ftape 驱动程序,则无需这样做。

要格式化 QIC-80、TR-1、TR-3、QICWide 3010 或 3020 磁带,请获取最新版本的 ftape 和最新版本的 ftape-tools 软件包(来自同一位置),并阅读 ftformat 实用程序的文档,该实用程序包含在 ftape-tools 软件包中。

评论

不要尝试格式化 Ditto 2GB 磁带。

评论

不要尝试格式化 Ditto Max 或 Max Pro 磁带。

<来自 Tim Jones 和 Claus Heine 的回答>

11.4 是否可以使用 ftape 格式化 Ditto 2GB 磁带?

无法使用 Ditto 2GB 磁带驱动器格式化 Ditto 2GB 磁带,也根本无法重新格式化 Ditto 2GB 磁带,使其仍然可以被 Ditto 2GB 磁带驱动器使用。

这是 Ditto 2GB 磁带驱动器的硬件限制。在软件层面上无法解决,即这不是 ftape 的错误。

11.5 是否可以使用 ftape 格式化 Ditto Max 或 Max Pro 磁带?

否,Ditto Max 无法格式化磁带。

这是 Ditto Max (Pro) 磁带驱动器的硬件限制。在软件层面上无法解决,即这不是 ftape 的错误。

11.6 Ftape 在 QIC-3020 磁带上检测到的坏扇区比 DOS 多

如果您查看差异,您会注意到 Ftape 总是比 DOS 多检测到 2784 个扇区。

Ftape 报告的数字是正确的(当然 :-)。每个正确格式化的 QIC-3020 磁带都有 2784 个扇区,这些扇区位于固定位置,并在坏扇区映射中标记。引用规范

EOT 或 BOT 的 4 个段内的磁道 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25 和 27 容易出现更高的错误率,这是由于孔印记造成的。因此,这些区域应在格式化时标记为坏扇区,并在坏扇区映射中输入,表明已识别段内的所有扇区均为坏扇区。

这给出 12 个磁道 * 2 * 4 个段 * 29 个扇区 == 2784 个扇区。

因此,Ftape 选择报告磁带上无法使用的扇区的真实数量,而 DOS 给出了更乐观的数字,更好地指示了磁带质量。(Ftape 的行为可能会在未来发生变化,以检测正确的格式化并显示单独的数字。但这优先级相当低)。

QIC-3010 在这方面与 QIC-3020 磁带相似。

<来自 Ftape-Howto>

11.7 当我使用 mt 执行 fsf 或 bsf 时,我没有听到磁带移动的声音,这正常吗?

是的。驱动程序仅在发出这些命令时更新内部计数器。磁带应在下次读取或写入磁带驱动器时移动到正确的位置。

<来自 Ftape-Howto>

11.8 为什么我的 XYZ 备份程序抱怨“无效参数”错误?

zftape 要求数据以固定最小块大小的倍数写入。这对于磁带设备来说是非常常见的行为。有三种方法可以消除这些错误

您可能需要阅读手册的“磁带块”部分(使用其“概念索引”直接跳转到该部分)

当使用 GNU tar 的内置压缩时,对于 tar-1.12 之前的 GNU tar 版本,需要使用 --block-compress 开关运行 tar 以 重新分块 输出到磁带。否则,tar 将压缩它读取的数据,并以任意部分将其写入磁带。

Example :

tar -czvf /dev/qft0 --block-compress /etc

警告: 不应将 tar 的内置压缩用于大型备份,因为它使整个数据流成为一个巨大的压缩块。如果此类归档文件在开头就损坏,将很难恢复。

<Claus Heine 的回答>

11.9 I/O 错误和 FDC - 一些解释。

当您收到以下消息时,这可能对您很有趣!

解释

“FDC”表示“软盘驱动器控制器”。问题在于您的软盘驱动器控制器必须能够支持称为“垂直模式”的功能,才能读取和写入 QIC-3020/QIC-3010 磁带盒(即 TR-3 磁带盒)。据我所知,所有能够至少达到 1Mbit/秒数据传输速率的 FDC 也都支持“垂直模式”(“垂直”指的是磁带上铁磁颗粒的磁化方向)。

这意味着您需要购买另一个 FDC。在一些电脑商店四处看看,询问能够支持 2.88 Mb 软盘的 IO 控制器卡(这意味着 1Mbit 数据传输速率和垂直模式)。

或者购买所谓的“高速”控制器之一,它们甚至支持 2Mbit/秒的数据传输速率。这些控制器基于 Intel 82078 FDC。Iomega 以“Ditto Dash”的名称销售这种卡。我认为 Exabyte 也单独销售其 2Mbit 控制器,而 Seagate 将其 TR-3 驱动器(即 TST-3200)与此类控制器一起发货。

<Claus Heine 的回答>

11.10 为什么我收到“/dev/qft0: No such device”错误?

我假设以下是问题所在:Ftape 模块已正确加载到内核中

/usr/src/ftape-3.03b-970603# lsmod
 Module         Pages    Used by
 ftape             22            0
但随后发生这种情况
$ ftmt -f /dev/qft0 status
ftmt: /dev/qft0: No such device

解决方案:您还需要加载 zftape.o 模块。对于 Ftape-3.*,ftape.o 模块不实现 VFS 接口。这是由 zftape.o 完成的。

<Claus Heine 的回答>

11.11 当我使用某些脚本在磁带上进行多次备份时,我收到“设备繁忙”错误。

“设备繁忙”消息仅在 Ftape 设备仍被某些程序打开时才会发生。一旦 close() 系统调用完成,繁忙标志就会被清除。可能是 “bru” 或其他一些程序仍然派生出一个延迟死亡的子进程?

是的,这似乎会重现问题

tar -cvvzf /dev/nqft0 --block-compress ; mt rewind
如果使用最新版本的 GNU tar,您可以跳过“--block-compress”。

但是,这不是 Ftape 的错误。似乎是父 tar 进程在其子进程关闭磁带设备之前退出。但是,我知道,很久以前破解 tar 代码时,tar 会正确等待其父进程死亡。

但是,繁忙消息只是意味着“busy”变量仍然保持为 1 (zftape/zftape-init.c)。这仅仅意味着仍然有一个进程挂起并保持磁带设备打开。

我想我已经明白了(仅针对 tar 的情况,因为我有源代码)。

如果使用带压缩的 tar,则它会派生一个子进程,该子进程将通过 execing “gzip” 或其他程序成为压缩器。在调用 execlp() 之前,子进程将派生其父 tar 的一个孙子进程。该孙子进程将执行实际的磁带 I/O。

tar - fork() - write to child tar
        |
      child tar - fork() - gzip (will pipe to grand child tar)
                    |
                  grand child tar - open archive.

现在,父 tar 仅等待其子进程死亡。gzip 当然不会等待孙子进程,因为 gzip 是 execlp() 的结果。

我不知道的是,父 tar 是否应该隐式等待孙子进程,或者 wait() 函数是否也等待孙子进程。

但这似乎是问题所在:父 tar 已经退出,而其孙子进程仍在忙于关闭归档文件。如果 close() 发生得很快(即常规文件、块设备以及其他磁带设备?),则几乎不会注意到此问题,但这并不是 Ftape 中的错误,而是备份程序或内核或可能是 libc 退出代码中的错误。

不知道以上考虑是否也适用于 bru。如果没有孙子进程,并且父进程正确等待其子进程,则不应该有问题。

<Claus Heine 的回答>

11.12 如何使用 tar 执行“...”?

这些实际上是 tar 问题:请阅读 man 页面和 info 页面。如果您还没有,请尝试

tar  --help 2>&1 | less

如果您的 tar 版本是 v1.11.1 或更早版本,请考虑升级到 v1.11.8 - 此版本可以直接调用 GNU zip(即:它支持 -z 选项)并包含详细的帮助。此外,它可以在 Linux 上开箱即用进行编译。

<来自 Ftape-Howto>

11.13 我应该与 tar 一起使用什么块大小?

当使用压缩时,并且在所有一般情况下,指定 tar 将输出分块可能是有益的。由于 Ftape 将事物切割成 29Kbyte 的块,因此说“-b58”应该是最佳的。

“为什么是 29Kbyte?”,我听到您在喊。好吧,QIC-80 标准规定,所有数据都应受到纠错码 (ECC) 代码的保护。QIC-80 标准中指定的代码称为 Reed-Solomon (R-S) 代码。R-S 代码接受 29 个数据字节并生成 3 个奇偶校验字节。为了提高 ECC 代码的性能,奇偶校验字节是在 29 个 1Kbyte 扇区上生成的。因此,Ftape 采用 29Kbytes 的数据,添加 3Kbytes 的 ECC 奇偶校验,并一次将 32Kbytes 写入磁带。因此,Ftape 将始终读取和写入 32K 字节块,以便能够检测(和纠正)数据错误。

如果您好奇并且想了解更多信息,请查看 ecc.cecc.h 文件,以了解代码的解释以及 Reed-Solomon 代码教科书的参考。

<来自 Ftape-Howto>

11.14 我在哪里可以找到 tar/mt/cpio/dd 二进制文件 - 源代码 - 手册页?

所有这些工具都是由 GNU 项目开发的,源代码(和手册页)可以从世界上几乎任何 ftp 站点获取(包括 ftp.funet.fitsx-11.mit.edusunsite.unc.edu)。在任何情况下,它们都可以从官方 GNU 主站点获取:prep.ai.mit.edu [18.71.0.38]:/pub/gnu。截至 1996 年 9 月 12 日,最新版本是

cpio:   2.4.2 (cpio-2.4.2.tar.gz)
dd:     3.13 (fileutils-3.13.tar.gz)
mt:     2.4.2 (cpio-2.4.2.tar.gz)
tar:    1.11.8 (tar-1.11.8.tar.gz)
gzip:   1.2.4 (gzip-1.2.4.tar.gz)

它们都可以在 Linux v1.0.4 / libc v4.5.19 / gcc v2.5.8 上开箱即用进行编译。

<来自 Ftape-Howto>

11.15 如果我使用 tapers 压缩,那么将压缩与 zftape 一起使用是否是一个坏主意,或者最好不要使用 tapers 压缩,而让 zftape 来完成?

将数据压缩两次(当将 tapers 压缩与 zftape 的压缩一起使用时会发生这种情况)本身并不是坏事,但这没有任何意义。您不会获得更多的压缩,只会浪费 CPU 周期。

Tapers 压缩应该相当安全,因为 taper 压缩单个文件;与 tar -czf ... 形成对比,后者使整个数据流成为一个大型压缩数据块,这对于严重的备份来说确实是一件坏事,因为归档文件开头的一个坏字节可能会使整个归档文件无法使用,好吧,至少很难恢复。

<Claus Heine 的回答>

11.16 zftape 压缩与 gzip -9 相比如何?

gzip -9 更好(即获得更高的压缩率)。zftape 的压缩与 Un*x compress 程序相当,但应该更快,并且比 gzip 更快。

<Claus Heine 的回答>

11.17 我不信任压缩,但听说 sftape 接口即将消失。我该怎么办?

使用 zftape 接口,但不要加载 zft-compressor 模块。然后设备变为 /dev/qft0

<来自 Tim Jones 的回答>

11.18 Ftape 说“This tape has no 'Linux raw format'”

如果您没有擦除新格式化的磁带,您会收到此投诉。这是因为 Ftape 期望磁带上有一个“魔术头”,以便能够以自己的方式解释头段(例如:文件标记)。要消除问题,请说

mt -f /dev/nftape erase

<来自 Ftape-Howto>

11.19 我可以与使用 DOS 的人交换磁带吗?

不可以。DOS 软件符合关于 DOS 文件系统布局的 QIC-80 规范,并且应该(?)编写一个可以读取/写入 DOS 格式的程序只是一个小问题。事实上,我敢打赌,创建一个漂亮的用户界面将是一个更大的问题。

<来自 Ftape-Howto>

11.20 当您开始在中间覆盖磁带时,`mt eom` 如何工作?

(EOM 是“已记录介质的末尾”,即所有已记录到磁带的数据之后的正确位置)

不能像普通文件系统上的文件那样使用磁带“文件”。

原则上,磁带除了在 EOM 处附加新数据外,不允许任何操作。但是,如果一个人定位在已记录数据的中间并开始写入,则驱动程序首先删除所有后续文件(从而将 EOM 移动到实际位置),然后开始写入。

因此,完成写入过程后的新 EOM 位于新记录的数据之后。

当然,上述情况的后果之一是,在已记录区域的中间写入磁带具有破坏性意义,因为它不仅会覆盖磁带定位到的“文件”,还会删除所有后续文件。

<来自 Ftape-Howto> <Claus Heine 的回答>

11.21 当我在使用 taper 之前使用 2.0.29 ftape 进行备份时,我的驱动器不支持 fsf,在新 zftape 下它支持,为什么会这样,fsf 到底是什么?

以前可能不起作用,因为您没有使用

mt -f /dev/rft0 erase
在将数据写入磁带盒之前。这不再是必要的了。

但是,嘿,mt fsf 是做什么的?磁带驱动器不会以您可以使用的意义存储文件

cp somefile /dev/my_what_ever_tape
或者能够像挂载硬盘一样挂载磁带驱动器。除了以顺序方式将数据写入磁带驱动器外,您无法对磁带驱动器执行任何操作。

由于这非常不方便,因此有人发明了一种被称为文件标记eof 标记(eof == 文件结束)的东西。这些标记不会分隔已备份到磁带设备的文件,而只会分隔数据块(无论可能是什么数据)。

通常,内核磁带设备驱动程序会在关闭磁带设备时负责写入文件标记,即

tar -cf /dev/nqft0 /bin
tar -cf /dev/nqft0 /etc
mt -f /dev/nqft0 rewind
将导致备份 /bin/etc 下的所有文件。当第一个 tar 完成时,内核驱动程序将负责在当前磁带位置将文件标记写入磁带,当第二个 tar 进程完成后,另一个文件标记将写入该位置的磁带盒。

现在,这些文件标记的意义在于,可以比读取数据更快地在磁带上的不同归档文件之间跳过。

执行此操作的命令是

mt fsf

快速跳到 EOT(磁带末尾)方向的下一个文件标记

mt bsf

快速跳到 BOT(磁带开始)方向的下一个文件标记

因此,要提取上面示例中的第二个归档文件,您无需将第一个归档文件读回,而是可以按如下方式进行
mt -f /dev/nqft0 rewind
mt -f /dev/nqft0 fsf
tar -xvf /dev/nqft0 

<Claus Heine 的回答>

11.22 ftape 和 zftape 之间到底有什么区别?

Ftape 年轻时,软盘磁带驱动程序有两个版本,其中一个版本被称为 zftape,因为它内置了用户透明的即时压缩。这种东西是功能还是错误(因为这不需要在内核空间中完成)是另一个问题。但是,zftape 提供的 ioctl 接口和文件标记处理要好得多,并且错误更少。并且 zftape 允许将软盘磁带盒与不同的操作系统一起使用。好吧,您无法交换数据,但是 zftape 不会覆盖您的 Windoze 程序创建的卷,反之亦然。

如今,Ftape 是整个软盘磁带驱动程序包的名称,ftape.o 是内核模块的文件名,该模块实现了低级硬件支持。zftape 已停止作为单独的软件包存在,但是新的 Ftape 版本(自 ftape-3.00 起)包含一个 zftape.o 模块,该模块需要在 ftape.o 之上加载(即您需要加载两个模块才能访问您的软盘磁带驱动器),并实现了以前版本 zftape 的文件系统接口和高级 (?) 功能。

<Claus Heine 的回答>

11.23 倒带和非倒带驱动器之间有什么区别?

好吧,倒带磁带设备会在设备关闭时将磁带倒回到 BOT(磁带开始),即

tar -cvf /dev/qft0 /bin
将在 tar 作业完成时倒带磁带盒。相反,
tar -cvf /dev/nqft0 /bin 
将不会倒带磁带盒,并将磁带 R/W 头留在当前位置。

在执行单次备份时应使用倒带设备,在执行多次备份时,非倒带设备可能很有用,因为在附加另一个归档文件之前,无需间隔到 EOM(已记录介质的末尾)。

当向磁带驱动器发送任何磁带运动命令时,必须使用非倒带设备,例如

mt -f /dev/nqft0 fsf
,因为当 mt 进程完成时,磁带设备将关闭,这将导致使用倒带设备倒带磁带盒。

<Claus Heine 的回答>

11.24 有人可以告诉我如何使用 mt 使用 zftape 记录倒带我的 TR-3 驱动器一个记录,以便我可以验证它吗?

好吧,这取决于情况。如果磁带仍然定位在刚刚写入的卷内,“mt bsf 1”(或等效地“mt bsf”)将仅倒退到该卷的开头(这就是“tar --verify”的工作方式)。如果磁带已经定位在标记最后一个写入卷结尾的文件标记之后,那么您需要发出“mt bsf 2”

这背后的逻辑如下:“MTBSF count”倒退 count 个文件标记,停止,然后在最后一个跳过的文件标记的 EOT 侧定位。这意味着,“mt bsf 2”将定位到前一个卷的开头。

<Claus Heine 的回答>

11.25 非倒带,它们的意思是不自动倒带,对吗?这并不意味着在任何情况下都不会倒带,对吗?我尝试使用 /dev/zqft0,它立即倒带了磁带。

您是对的:自动倒带意味着,当磁带设备关闭时,磁带会倒带,非倒带意味着,当磁带设备关闭时,磁带不会自动倒带(但是,当然,您可以使用磁带运动命令 BSF/FSF 等将磁带头定位在您喜欢的任何位置)。

<Claus Heine 的回答>

11.26 mt 认为的记录和它认为的文件之间有什么区别?

记录是磁带在一次读取/写入操作中将接受的最小字节数(在“可变块大小模式”中除外,在这种模式下,它应该只是单次写入操作中实际写入的数据量??)。

对于 zftape,每个读取和写入访问都必须是固定块大小的倍数(固定,但可以使用 MTSETBLK 调整)。此块大小是一个“磁带记录”(如 GNU mt 手册页中所述,并且对于 zftape 默认为 10kb。

“文件”(在 mt 手册页的意义上)是一个,嗯,具有误导性的术语。指的是两个文件标记之间的磁带区域。这不是文件系统上的文件,因为它可能有一个名称、文件访问模式,可以使用 cp、mv、rm 等移动或复制。

相反,它只是在一个备份会话中记录的磁带区域,其结尾由磁带文件标记标记,其开头由 BOT 或上一个磁带“文件”的文件标记分隔。该磁带“文件”是可以使用 MTBSF/FSF 命令跳过的东西。

<Claus Heine 的回答>

11.27 在不重新格式化磁带的情况下,使用 zftape 重用磁带。

我们尝试回答以下问题

如果您想“擦除”整个磁带盒,只需执行

mt -f /dev/qft0 erase

这将擦除卷表(即“文件标记”)。

Pre-ftape-3.x 版本的 zftape 和 ftape 曾经允许覆盖磁带盒上已存在的卷。我已经删除了此功能,因为据报告,它已经导致某些备份程序的数据丢失。

如果您确实需要删除磁带上的一些卷,那么您应该使用

vtblc

程序,该程序随 ftape-tools 软件包一起提供,可以从与 ftape 内核驱动程序软件包相同的位置下载。请参阅 ftape-tools 软件包中包含的文档以获取更多信息。

如果您只是想重用旧磁带,那么执行以下操作就足够了

mt rewind

如果磁带位于 BOT(磁带开始)处,则每次写入磁带都会静默擦除所有文件标记并覆盖磁带上已存在的数据。

<Claus Heine 的回答>

11.28 此脚本使用“MTIOCVOLINFO”ioctl 实现 zftape 软件包的简单内容列表。

这是一个小的 perl/bash 脚本,它使用 zftape 特定的“volinfo”ioctl 列出磁带盒的内容。希望这能展示如何处理这类事情。

它基本上执行以下操作

  1. 倒带磁带盒
  2. 发出 volinfo 命令
       claus@thales:~$ mt volinfo
       file number          = 1
       block size           = 10240
       physical space used  =  522.0 kilobytes
       real size of volume  =  520.0 kilobytes
    
    解析输出并将值放在适当的变量中
  3. 使用“mt fsf”跳到下一个卷
  4. 如果这给出错误 (EOD),则退出,否则“转到 2)”

Perl 脚本

#!/usr/bin/perl
#
#     Copyright (C) 1997 Claus-Justus Heine
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; see the file COPYING.  If not, write to
# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
#
#   This script implements a simple contents listing for the zftape
#   package using the MTIOCVOLINFO ioctl.
#

$version = <<EOT;
listtape-1.0 -- a perl script to list the contents of a floppy tape cartridge
under Linux using the zftape driver

RCS \$Revision: 1.2 $
RCS \$Date: 1998/08/30 13:44:03 $
EOT

$tapedev = "/dev/tape";
$usage = <<EOT;
Usage: listtape [options ...]

Mandatory or optional arguments to long options are mandatory or optional
for short options too.

-f, --file=FILE       Tape device to use. Default is  "/dev/tape".
-h, --help            Print this help.
-?                    Same as '-h'.
--usage           Same as '-h'.
-V, --version         Print version information.

Author: Claus-Justus Heine <claus\@momo.math.rwth-aachen.de>
EOT

while ($ARGV[0] =~ /^-/) {
$_ = shift; 
if (/--file/) {$_ = shift; $tapedev = $_; next;} 
if (/-f/) {$_ = shift; $tapedev = $_; next;} 
if (/--help/) { print $usage; exit 0; }
if (/-h/) { print $usage; exit 0; }
if (/--usage/) { print $usage; exit 0; }
if (/-\?/) { print $usage; exit 0; }
if (/--version/) { print $version; exit 0; }
if (/-V/) { print $version; exit 0; }
die $usage;
}

&open_tape($tapedev, "status");
while(<FTMT>)
{
$online = 1 if (/.*online.*/);
}

if (! $online) { die "No cartridge present.\n"; }

&mtop($tapedev, "rewind");

printf "%11s%12s%20s%20s\n",
"file number", "block size", "volume size", "tape space";

while (1)
{
&open_tape($tapedev, "volinfo");
while (<FTMT>) {
if (/^file number\s*=\s*([0-9]*)$/) { $filenumber = $1; }
if (/^block size\s*=\s*([0-9]*)$/) { $blocksize = $1; }
if (/^physical space used\s*=\s*([[0-9]*.*)/) { $rawsize = $1; }
if (/^real size of volume\s*=\s*([[0-9]*.*)/) { $size = $1; }
}
close(FTMT);
if (&mtop($tapedev, "fsf 1") != 0) {
&mtop($tapedev,"rewind");
print "\nRemaining space: $rawsize\n";
print "Tape block size: $blocksize\n";
exit 0;
}           
printf "%6d          %5d  %20s%20s\n",
    $filenumber, $blocksize, $size, $rawsize;
}

sub mtop
{
local ($tape, $operation) = @_;
local ($exitval);
system "ftmt -f $tape $operation > /dev/null 2>&1";
}

sub open_tape
{
local ($tape, $operation) = @_;
local ($command);

$command = "ftmt -f " . $tape . " " . $operation . " |";
open(FTMT, $command) || die "Couldn't open $command -- $!\n";
}

Bash 脚本


#! /bin/bash
#
#     Copyright (C) 1997 Claus-Justus Heine
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; see the file COPYING.  If not, write to
# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
#
#   This script implements a simple contents listing for the zftape
#   package using the MTIOCVOLINFO ioctl.
#

#
# insert better option parsing here
#
TAPEDEV=${1-/dev/tape}

if ! echo $TAPEDEV | grep "/dev/n"
then
TAPEDEV=/dev/n$(basename $TAPEDEV)
fi

if ! [ -c $TAPEDEV ]
then
echo $TAPEDEV is not a character device!  1>&2
exit 1
fi

if ! mt -f $TAPEDEV rewind
then
echo Could not rewind $TAPEDEV - no cartridge present?  1>&2
exit 1
fi

echo -e "\nContents of $TAPEDEV:\n"

printf "%11s%12s%20s%20s\n" "file number" "block size" "volume size" "tape space"

trap "rm -f /tmp/$0.$$" exit

while true
do
if ! foo=$(mt -f $TAPEDEV volinfo |cut -f 2 -d =)
then
echo $TAPEDEV doesn\'t seem to be a floppy tape device 1>&2
exit 1
fi
#
# "echo foo | read foo" will not work as the "read foo" is executed in
# another shell.
#
echo $foo > /tmp/$0.$$
read file blksz used usedunit size sizeunit < /tmp/$0.$$
if ! mt -f $TAPEDEV fsf 1 > /dev/null 2>&1
then
echo -e "\nRemaining space: $used $usedunit"
echo -e "Tape block size: $blksz"
if ! mt -f $TAPEDEV rewind
then
    echo Rewind of $TAPEDEV failed 1>&2
    exit 1
fi
exit 0
fi
printf "%6d          %5d  %20s%20s\n"\
$file $blksz "$size $sizeunit" "$used $usedunit"
done

<Claus Heine 的回答>


下一页 上一页 目录