即时更改磁带脚本

即时更改磁带脚本

我必须将 17 Tb 写入磁带:

ssh some_host 'tar -cz /' | dd bs=20b of=/dev/tape

当然,17 Tb 不适合一盘磁带,所以当出现“没有空间”错误时我需要自动更改它。我有机器人更换器,“mtx next”工作正常。我还需要在磁带更改时编写标签来记录,因此我更喜欢在此事件上编写挂钩脚本。
“tar”具有“更改磁带脚本”功能,但我在另一台主机上运行 tar。

此外,无法将 17 Tb 复制到本地主机。 sshfs 不是一个选项,同样糟糕。并且请不要提供庞大的备份解决方案。

我需要的是像 dd 这样的管道工具,它能够在“没有空间”错误时运行一些脚本,然后继续。指定块大小也很重要,因为磁带驱动器需要一些值。

答案1

如果可以安装的话平均时间在具有磁带驱动器的系统上,您可以让 tar 通过网络访问该驱动器。默认情况下tar将使用该rsh协议在磁带服务器上运行 rmt,但如果您有 GNU tar,则可以为其提供该--rsh-command='ssh tapeserver /usr/sbin/rmt'选项。

如果您有 LTO 磁带,则阻塞因子 20 可能太小而无法保持磁带流式传输; 126 是我们与 LTO4 一起使用的。但我认为某些 rmt 实现将您限制为 20 块传输大小,因此您可能需要查看 @schily 的实现平均时间

在您提出的评论中

rmt是一个不错的选择,但是如何分配时间呢?我有大约二十台服务器需要备份。我怎样才能将它们排队以使用 rmt?

如果每个服务器的备份命令可以打包到一个 shell 脚本中,那么可能有一些灵活的批处理排队系统可以保证它们的顺序处理,但我不知道有什么临时的,我意识到你不想要这里有很多复杂性。

首先,您可以在可以通过 ssh 连接到所有服务器的系统上尝试如下操作:

#!/bin/sh
lock=/var/run/doalldumps.lock
status=/var/run/doalldumps.status
for s in $(cat ~/servers)
do
(
    flock -e 9
    echo started $s at $(date) > $status
    ssh $s -n command-to-do-backups
    echo finished $s at $(date) > $status
) 9> $lock
done

或者,串行化对磁带驱动器的访问的一种简单方法是使用flock磁带驱动器锁定服务器上的文件。您可以在 tar--rsh-command选项中使用它:

tar ... --rsh-command='ssh tapeserver flock -e /var/run/tape.lock /usr/sbin/rmt'

相关内容