如何让 Bacula 在运行特定作业后将磁带移至 IO 插槽?
几天以来,我一直使用 Bacula 进行每日备份,我想知道我是否可以做这种事情。我已经在配置文件中指定了 UseVolumeOnce = yes 指令,但现在我想知道我是否可以让 Bacula 在作业完成时将磁带移动到插槽 24(I/O 插槽)。
bacula 能做到这一点吗?还是我需要编写脚本?如果我需要编写脚本,您有这方面的经验吗?
答案1
如果没有相同的环境进行测试,我不确定这是否会起作用,但是通过 bacula-dir.conf 中的 RunAfterJob 指令调用的这样的脚本应该可以起作用:
#!/bin/sh
#
echo "unmount <device-name>" | <bacula-path>/bconsole -c bconsole.conf
如果您想避免调用外部脚本,您可以尝试使用 AlwaysOpen、RequiresMount/MountCommand/UnmountCommand 和/或 OfflineOnUnmount 指令。所有这些都位于存储守护程序配置的设备资源中。
另外,您能解释一下为什么这对您来说是可取的吗?也许我们忽略的根本问题有解决方案。
答案2
我已经设置了一个名为喷射以优先级 1000 运行以下脚本,因此一旦所有备份完成,就会执行该脚本:
您还可以将其作为特定作业的“RunAfterJob”选项运行。
#!/bin/bash
MAXATTEMPTS=3
STORAGE=StorageName
DEVICE=/dev/sg3
CODE=0
OUT=`mktemp /tmp/XXXXXX`
###########################################################################
## Eject the tape from the drive and determine which slot it ended up in ##
###########################################################################
STATUS=1
ATTEMPT=0
while [ $STATUS -ne 0 ] && [ $ATTEMPT -lt $MAXATTEMPTS ]; do
echo "umount Storage=$STORAGE"|/usr/sbin/bconsole >> $OUT
if ( grep "Command Failed" $OUT > /dev/null ); then
STATUS=1
echo "Command Failed!"
rm $OUT
else
STATUS=0
cat $OUT
fi
ATTEMPT=$(( $ATTEMPT + 1 ))
done
SLOT=`tac $OUT|grep -m1 3307|cut -d" " -f6|cut -d, -f1` # Find the last occurrence of the success message only
rm $OUT
if [ "x$SLOT" = "x" ] || [ $STATUS -ne 0 ]; then
echo "ERROR: Unable to unmount drive after $ATTEMPT attempts"
exit 1
else
echo "Slot $SLOT unloaded from Drive-0 "
fi
###########################################
## Move the ejected tape to the I/O slot ##
###########################################
STATUS=1
ATTEMPT=0
while [ $STATUS -ne 0 ] && [ $ATTEMPT -lt $MAXATTEMPTS ]; do
/usr/sbin/mtx -f $DEVICE transfer $SLOT 24
STATUS=$?
ATTEMPT=$(( $ATTEMPT + 1 ))
done
if [ $STATUS -ne 0 ]; then
echo "ERROR: Unable to move tape from slot $SLOT to I/O after $ATTEMPT attempts"
CODE=2
else
echo "Tape moved from slot $SLOT to I/O"
fi
#################################
## Ensure the DB is up to date ##
#################################
echo "update slots Storage=$STORAGE"|/usr/sbin/bconsole > /dev/null
if [ $CODE -ne 0 ]; then
exit $CODE
fi
答案3
您确实需要编写脚本,但 Bacula 和最新版本的 MTX 的组合使得这一过程不会太痛苦。
查看“作业前运行”和“作业后运行”‘作业’参数,以调用您编写的脚本。我们倾向于调用一个脚本,该脚本将命令运行到 bconsole(通过输入重定向)以卸载磁带卷,然后调用 MTX 来移动磁带。