我有一些磁带驱动器,并决定将我的数据备份到磁带(原因之一是我的大部分数据都没有改变,所以一旦我进行了完整备份,磁带在架子上放置一段时间后将有更好的机会工作比硬盘驱动器要短一些)。
我想使用简单的 Linux 工具来进行这些备份,而不是像 bacula 这样有自己的数据库的更复杂的软件。我的用例有点不同,我宁愿编写自己的脚本来执行此操作。
tar 和 cpio 对此很有用,但是,由于格式的原因,它需要读取整个磁带(可能需要几个小时)才能列出文件,如果我想恢复磁带末尾的单个文件,它需要再次阅读整盘磁带。
由于 LTO 磁带的写入方式(多次写入磁带),可以相对快速地查找存档末尾的文件,而无需从磁带开头读取所有数据。
例如,使用 mt 获取下一个文件标记比 tar 扫描存档以生成文件列表或从存档末尾恢复 1KB 文件所需的时间要少得多。
还应该可以在磁带的开头放置一个“目录”,以便您知道磁带上有哪些文件以及它们在哪里。
像 BackupExec 这样的软件可以做到这一点 - 只需要很短的时间来“编目”磁带,并且也需要很短的时间来恢复位于磁带末尾的文件。
我可以在目录上运行 ls (或 find),将输出写入磁带,然后将目录 tar 到磁带。这将解决列表问题,但 tar 仍然需要很长时间才能恢复最后一个文件。
是否有一个类似于 tar 的简单工具,但可以在存档的开头创建文件列表并能够寻求恢复文件?
答案1
如果您可以随意跳过磁带,那么无论如何,我认为将内容列表保留在前面并没有显着的优势。
我会将一些较小的 tar 存档附加到每个磁带,以缩短特定文件的检索时间。每个磁带 20 个存档子文件可能是一个合适的平衡。
我会将每个磁带的目录保留在磁盘上:也许每个磁带都有一个子目录,其中包含每个 tar 文件的 tar -tvf,名称如下:
tar_yyyymmdd_hhmmss_LTO_nnnnn_sub_vv.toc
这为您提供了整个集合的在线搜索工具,而不必知道要加载哪个磁带来获取内容列表。
当您不打算进一步追加时,我会将特定目录存档到其自己的磁带末尾,并定期将所有目录存档到单独的磁带。将目录多次存档到自己的磁带上不会有什么坏处:您始终可以通过跳到媒体末尾,然后跳回 1 来找到最后一个版本。
答案2
我们曾经在 Solaris 上使用 QIC 磁带将多个 tar 存档存储在单个磁带上。
要管理物理磁带,可以使用 mt(1) 命令。具体来说,这允许您使用磁带标记向前和向后间隔,使用绝对或相对编号。令人困惑的是,该术语使用的“文件”是指由磁带标记分隔的多个子文件。一个完整的 tar 存档将对应于一个“文件”。
mt 命令在我的 Linux Mint 18.1 上有一个二进制文件和一个手册页。磁带非常不标准——某些类型的磁带不会包含所有命令,但磁带标记非常基本。
标准磁带设备通常会在每次使用前后默认倒带,从而破坏您所做的任何预定位。通常,每个转盘都有一个像 /dev/rmt0 这样的指示符,以及一个用于相同物理单元的附加设备,例如 /dev/nrmt0,其中 n 表示“不倒带”。
因此,您将追加 tar 命令嵌入到执行以下操作的脚本中:
mt -f /dev/nrmt0 rewind
mt -f /dev/nrmt0 eod
tar -f /dev/nrmt0 ...
mt -f /dev/rmt0 offline
您需要保留一个目录,其中包含哪些档案位于哪个磁带上以及哪个子文件,并且您的检索将如下所示:
mt -f /dev/nrmt0 rewind
mt -f /dev/nrmt0 fsf 17
tar -f /dev/nrmt0 ...
将您的档案分成许多较小的部分,并在它们之间跳转,这对于检索少量文件来说是一个重要的优化。