我的公司有一个双戴尔 LTO-7 驱动器。我最近发现可以按顺序自动备份两个磁带:
tar -cv --multi-volume --file=/dev/nst0 --file=/dev/nst1 gigantic10TBfile.bin
出色的。每盘磁带原生容量为 6TB,我们假设gigantic10TBfile.bin
不压缩,当磁带/dev/nst0
满了时,tar 会自动在磁带上移动/dev/nst1
,而我不必离开椅子。
现在,实际上,它不是一个巨大的文件,而是数千个较小的文件。我tee
将 tar 的输出保存到日志文件中以查看情况如何。在跨多个磁带进行传输的情况下,我希望在此日志文件中添加一个条目,说明“磁带更改”或其他内容。
输入--new-volume-script
(也称为--info-script
or -F
、 docs这里)。耶。除非它没有被执行。让我们做一个更易于管理的例子:
tar -cvlp --multi-volume --new-volume-script="./new_volume_script.sh" --file=tarball1.tar --file=tarball2.tar --tape-length=4M 10MBrandom.bin
运行此示例表明,--new-volume-script
仅执行一次tarball1.tar
并tarball2.tar
已创建,并且 tar“用完了”目标文件。
所以,我的问题是,是否可以选择在写入tarball1.tar
和之间执行脚本tarball2.tar
?
答案1
事实上,它仅在目标文件用完时执行tar
,因此为了在每次创建卷时运行脚本,您必须在命令中仅使用一个目标文件,例如
tar -cv -M -F './my_script.sh' --file=/dev/nst1 --tape-length=4M 10MBrandom.bin
并让脚本创建其他档案。该脚本继承了tar
的 shell 环境,并通过环境变量将附加数据传递给它,例如:
TAR_ARCHIVE正在处理的
存档的名称tar
。TAR_VOLUME即将启动的
卷的序号。tar
TAR_FD
文件描述符,可用于将新卷名称传达给tar
.
所以,像这样的脚本
#! /bin/bash
echo Preparing volume $TAR_VOLUME of $TAR_ARCHIVE.
name=${TAR_ARCHIVE%?}
echo ${name}$TAR_VOLUME >&$TAR_FD
每次创建另一个存档并生成时都会运行/dev/nst2
,/dev/nst3
等等。请注意,TAR_VOLUME
开始于1
(即通过命令中指定的初始卷--file=
)。如果您想使用--file=/dev/nst0
连续编号的档案,则必须在传递卷名称时减去1
, TAR_VOLUME
例如TAR_FD
将最后一行更改为
echo ${name}$((TAR_VOLUME - 1)) >&$TAR_FD
如果您只有两个始终命名为 和 的磁带机/dev/nst0
,并且/dev/nst1
希望脚本在其中一个或另一个用作初始--file
参数时工作,则可以从 的当前值中提取驱动器号TAR_ARCHIVE
,并在以下情况下使用另一个驱动器号:将下一个存档名称写入TAR_FD
:
#! /bin/bash
echo Preparing volume $TAR_VOLUME of $TAR_ARCHIVE.
drive=${TAR_ARCHIVE: -1}
case "$drive" in
0) other=1 ;;
1) other=0 ;;
*) exit 1
esac
echo "${TAR_ARCHIVE%?}${other}" >&$TAR_FD
这将创建两个存档,/dev/nst1
反之亦然/dev/nst0
,第一个是您在命令行上指定的存档--file
作为记录,这里是手册中的引用(第9.6.1节)包括那里提供的示例脚本:
最灵活的方法是使用卷脚本,它将新的存档名称写入文件描述符
$TAR_FD
。例如,以下卷脚本将创建一系列存档文件,名为 '存档卷', 在哪里档案是正在创建的存档的名称(由--file
选项给出)并且卷是正在创建的存档的序号:
#! /bin/bash
# For this script it's advisable to use a shell, such as Bash,
# that supports a TAR_FD value greater than 9.
echo Preparing volume $TAR_VOLUME of $TAR_ARCHIVE.
name=`expr $TAR_ARCHIVE : '\(.*\)-.*'`
case $TAR_SUBCOMMAND in
-c) ;;
-d|-x|-t) test -r ${name:-$TAR_ARCHIVE}-$TAR_VOLUME || exit 1
;;
*) exit 1
esac
echo ${name:-$TAR_ARCHIVE}-$TAR_VOLUME >&$TAR_FD