使用 Ftape,您可以获得相当可观的备份和恢复速度:经测量,Colorado DJ-20 和 Adaptec 1542CF 控制器在 70Mbyte tar 存档中实现了 4.25Mbyte/min 的持续数据传输速率(无压缩),同时比较了磁带上的存档与 IDE 磁盘上的数据。Ftape 的速度主要取决于您的 FDC 的数据传输速率:AHA1542CF 具有“1991 年后 82077” FDC,它可以以 1Mbit/秒的速度推动磁带驱动器。如果您的 FDC 只能提供 500Kbit/秒的数据速率,您将看到一半的传输速率(大概如此)。
已经有一些关于“鞋擦式操作”的报告。这是指磁带似乎只是无休止地来回运行。这已经在 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)) 应该在您使用 Bourne 兼容 shell 时由您的 shell 展开。这对系统的内存池有负面影响:Ftape 的 dma 缓冲区不能被内核的任何其他部分或任何其他应用程序使用。并且内核内存无法换出。如果您决定使用这种多缓冲,那么您应该在不再需要驱动程序后立即卸载它。<Claus Heine 的回答>
如果您使用的是来自 Ftape 主页 的最新版本的 Ftape 驱动程序,则无需重启。
要格式化 QIC-80、TR-1、TR-3、QICWide 3010 或 3020 磁带,请获取最新版本的 ftape
和最新版本的 ftape-tools
软件包(来自同一位置),并阅读 ftformat
实用程序的文档,该实用程序包含在 ftape-tools
软件包中。
<来自 Tim Jones 和 Claus Heine 的回答>
使用 Ditto 2GB
磁带驱动器无法格式化 Ditto 2GB
磁带,并且根本无法重新格式化 Ditto 2GB
磁带,使其仍然可以被 Ditto 2GB
磁带驱动器使用。
这是 Ditto 2GB
磁带驱动器的硬件限制。在软件层面无法解决,即这不是 ftape
的错。
否,Ditto Max
无法格式化磁带。
这是 Ditto Max (Pro)
磁带驱动器的硬件限制。在软件层面无法解决,即这不是 ftape
的错。
如果您查看差异,您会注意到 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>
是的。驱动程序仅在发出这些命令时更新内部计数器。磁带应在下次读取或写入磁带驱动器时移动到正确的位置。
<摘自 Ftape-Howto>
zftape
要求数据以固定最小块大小的倍数写入。这对于磁带设备来说是非常常见的行为。有三种方法可以消除这些错误
mt -f /dev/qft0 setblk 5120
mt -f /dev/qft0 setblk 0
将 Ftape 切换到可变块大小模式,并能够以任意部分将数据写入磁带(但是:内置压缩不适用于此设置)。当您打算使用 "KBackup" 时,这是使其与 Ftape 一起工作的唯一方法(它_可能_有效,不知道是否有效)
afio -b 10k ...
您可能需要阅读手册的“磁带块”部分(使用其“概念索引”直接跳转到该部分)
当将 GNU tar 的内置压缩与 tar-1.12 之前的 GNU tar 版本一起使用时,需要使用 --block-compress
开关运行 tar 以 重新分块
输出到磁带。否则,tar 将压缩它读取的数据,并以任意部分将其写入磁带。
Example :
tar -czvf /dev/qft0 --block-compress /etc
警告: 不应将 tar 的内置压缩用于大型备份,因为它使整个数据流成为一个巨大的压缩块。如果此类存档在开头就损坏,将很难恢复。
<Claus Heine 的回答>
当您收到以下消息时,这可能对您很有趣!
解释
"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 的回答>
我假设以下是问题所在: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 的回答>
"设备忙" 消息只能在 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 的回答>
这些确实是 tar
问题:请阅读 man
页面和 info
页面。如果您仍然不明白,请尝试
tar --help 2>&1 | less
如果您的 tar
版本是 v1.11.1 或更早版本,请考虑升级到 v1.11.8 - 此版本可以直接调用 GNU zip
(即:它支持 -z
选项),并包含详细的帮助。此外,它可以在 Linux 上开箱即用。
<摘自 Ftape-Howto>
当使用压缩时,以及在一般情况下,指定 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.c
和 ecc.h
文件,以获取代码的解释以及 Reed-Solomon 代码教科书的参考。
<摘自 Ftape-Howto>
所有这些工具都是由 GNU 项目开发的,源代码(和手册页)可以从世界上几乎任何 ftp 站点获取(包括 ftp.funet.fi
、tsx-11.mit.edu
和 sunsite.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>
两次压缩数据本身并不坏(当将 tapers 压缩与 zftape 的压缩一起使用时就是这种情况),但没有任何意义。您不会获得更多的压缩,只会浪费 CPU 周期。
Tapers 压缩应该相当安全,因为 taper 压缩单个文件;与 tar -czf ... 形成对比,后者使整个数据流成为一个大型压缩数据块,这对于严重的备份来说确实是一件坏事,因为存档开头的一个坏字节可能会使整个存档无法使用,或者至少很难恢复。
<Claus Heine 的回答>
gzip -9 更好(即可以获得更高的压缩率)。zftape 的压缩与 Un*x compress 程序相当,但应该更快,并且比 gzip 更快。
<Claus Heine 的回答>
使用 zftape 接口,但不要加载 zft-compressor 模块。然后设备变为 /dev/qft0
。
<来自 Tim Jones 的回答>
如果您没有擦除新格式化的磁带,您会收到此抱怨。这是因为 Ftape 期望磁带上有一个 "魔术头",以便能够以自己的方式解释头段(例如:文件标记)。要消除问题,请说
mt -f /dev/nftape erase
<摘自 Ftape-Howto>
不可以。DOS 软件符合关于 DOS 文件系统布局的 QIC-80 规范,并且应该(?)编写一个可以读取/写入 DOS 格式的程序不是什么大问题。实际上,我敢打赌,创建一个漂亮的用户界面将是一个更大的问题。
<来自 Ftape-Howto>
(EOM 是 "已记录媒体的末尾",即紧随已记录到磁带的所有数据之后的位置)
不能像普通文件系统上的文件那样使用磁带 "文件"。
原则上,磁带不允许在 EOM 处附加新数据以外的任何操作。但是,如果将位置定位在已记录数据的中间并开始写入,则驱动程序首先删除所有后续文件(从而将 EOM 移动到实际位置),然后开始写入。
因此,完成写入过程后的新 EOM 位于新记录的数据之后。
当然,上述情况的后果之一是,在已记录区域的中间写入磁带具有破坏性,因为它不仅覆盖了磁带定位的 "文件",还删除了所有后续文件。
<来自 Ftape-Howto> <Claus Heine 的回答>
以前可能不起作用是因为您没有使用
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 进程完成后,另一个文件标记被写入该位置的磁带盒。现在,这些文件标记的意义在于,与读取回数据相比,可以更快地在磁带上的不同存档之间跳转。
执行此操作的命令是
快速跳到 EOT(磁带末尾)方向的下一个文件标记
快速跳到 BOT(磁带开头)方向的下一个文件标记
mt -f /dev/nqft0 rewind
mt -f /dev/nqft0 fsf
tar -xvf /dev/nqft0
<Claus Heine 的回答>
当 Ftape 还很年轻时,有两个版本的软盘磁带驱动程序,其中一个称为 zftape,因为它具有内置的用户透明的即时压缩。这种东西是功能还是错误(因为这不需要在内核空间中完成)是另一个问题。但是,zftape 提供的 ioctl 接口和文件标记处理更好,并且错误更少。而且 zftape 允许将软盘磁带盒与不同的操作系统一起使用。好吧,您不能交换数据,但是 zftape 不会覆盖您的 Windoze 程序创建的卷,反之亦然。
如今,Ftape 是整个软盘磁带驱动程序包的名称,ftape.o 是实现底层硬件支持的内核模块的文件名。zftape 已停止作为单独的软件包存在,但是新的 Ftape 版本(自 ftape-3.00 起)包含一个 zftape.o 模块,该模块需要加载在 ftape.o 之上(即,您需要加载两个模块才能访问您的软盘磁带驱动器),并实现文件系统接口和先前版本 zftape 的高级(?)功能。
<Claus Heine 的回答>
好吧,自动回绕磁带设备在设备关闭时将磁带回绕到 BOT(磁带开头),即
tar -cvf /dev/qft0 /bin
将在 tar 作业完成后回绕磁带盒。相反,
tar -cvf /dev/nqft0 /bin
将不会回绕磁带盒,并将磁带 R/W 头留在其当前位置。在执行单个备份时应使用自动回绕设备,在执行多次备份时,非自动回绕设备可能很有用,因为在附加另一个存档之前无需间隔到 EOM(已记录媒体的末尾)。
当向磁带驱动器发送任何磁带运动命令(例如
mt -f /dev/nqft0 fsf
)时,必须使用非自动回绕设备,因为当 mt 进程完成时,磁带设备将关闭,这将导致使用自动回绕设备回绕磁带盒。<Claus Heine 的回答>
好吧,这取决于情况。如果磁带仍然定位在刚刚写入的卷内,则 "mt bsf 1"(或等效的 "mt bsf")将仅倒退到该卷的开头(这就是 "tar --verify" 的工作方式)。如果磁带已经定位在标记最后一个写入卷末尾的文件标记之后,那么您需要发出 "mt bsf 2"
这背后的逻辑如下:"MTBSF count" 倒退 count 个文件标记,停止,然后在最后一个跳过的文件标记的 EOT
侧定位。这意味着,"mt bsf 2" 将定位在先前卷的开头。
<Claus Heine 的回答>
您是对的:自动回绕意味着,当磁带设备关闭时,磁带会被回绕,非自动回绕意味着,当磁带设备关闭时,磁带不会自动回绕(但是,您当然可以使用磁带运动命令 BSF/FSF 等将磁带头定位在您喜欢的任何位置)。
<Claus Heine 的回答>
记录是在一次读取/写入操作中磁带将接受的最小字节数(除了 "可变块大小模式" 之外,在可变块大小模式中,它应该只是在单个写入操作中实际写入的数据量??)。
对于 zftape,每个读取和写入访问都必须是固定块大小的倍数(固定,但可以使用 MTSETBLK
进行调整)。此块大小是 "磁带记录"(如 GNU mt 手册页中所述,对于 zftape 默认为 10kb)。
"文件"(在 mt 手册页的意义上)是一个,嗯,具有误导性的术语。意思是两个文件标记之间的磁带区域。这不像文件系统上的文件,因为它可能具有名称、文件访问模式,可以使用 cp、mv、rm 等移动或复制。
相反,它只是在一个备份会话中记录的磁带区域,其末尾由磁带文件标记标记,其开头由 BOT
或先前磁带 "文件" 的文件标记分隔。该磁带 "文件" 是可以使用 MTBSF/FSF
命令跳过的东西。
<Claus Heine 的回答>
我们尝试回答以下问题
如果您要 "擦除" 整个磁带盒,只需执行
mt -f /dev/qft0 erase
这将擦除卷表(即 "文件标记")。
早期版本的 zftape 和 ftape 允许覆盖磁带盒上已存在的卷。我已经删除了此功能,因为据报告,它已经导致某些备份程序的数据丢失。
如果您确实需要删除磁带上的一些卷,则应使用
vtblc
程序,该程序随 ftape-tools
软件包一起提供,可以从与 ftape
内核驱动程序软件包相同的位置下载。请参阅 ftape-tools
软件包中包含的文档以获取更多信息。
如果您只是想重用旧磁带,那么只需执行
mt rewind
如果磁带位于 BOT(磁带开头),则每次写入磁带都会静默擦除所有文件标记并覆盖磁带上已存在的数据。
<Claus Heine 的回答>
这是一个小的 perl/bash 脚本,它使用 zftape 特定的 "volinfo" ioctl 列出磁带盒的内容。希望这能展示如何处理这类东西。
它基本上执行以下操作
claus@thales:~$ mt volinfo
file number = 1
block size = 10240
physical space used = 522.0 kilobytes
real size of volume = 520.0 kilobytes
解析输出并将值放入适当的变量中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:43:28 $
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 的回答>