Bacula 磁带更换

Bacula 磁带更换

如何让 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 来移动磁带。

相关内容