Назад | Перейти на главную страницу

Замена ленты Bacula

Как я могу заставить Bacula переместить ленту в слот ввода-вывода после выполнения определенного задания?

Я выполняю ежедневное резервное копирование с помощью Bacula уже пару дней, и мне было интересно, смогу ли я сделать такие вещи. Я уже указывал директиву UseVolumeOnce = yes в файлах конфигурации, но теперь я хочу знать, могу ли я заставить Bacula переместить ленту в слот 24 (слот ввода-вывода) после завершения задания.

Может ли bacula это сделать или мне нужно написать сценарий? Если мне нужно написать сценарий, есть ли у вас в этом опыт?

Я создал административную работу под названием Извлечь который запускает следующий сценарий с приоритетом 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

Я не уверен, что это сработает без той же среды для тестирования, но такой сценарий, вызываемый с помощью директивы RunAfterJob в bacula-dir.conf, должен работать:

#!/bin/sh
#
echo "unmount <device-name>" | <bacula-path>/bconsole -c bconsole.conf

Если вы не хотите вызывать внешние скрипты, вы можете поэкспериментировать с директивами AlwaysOpen, RequiresMount / MountCommand / UnmountCommand и / или OfflineOnUnmount. Все это находится в ресурсе устройства вашей конфигурации Storage Daemon.

Также не могли бы вы пояснить, почему вам это желательно? Возможно, есть решение основной проблемы, которую мы упускаем из виду.

Вы должны написать сценарий, но комбинация Bacula и последней версии MTX делает это не слишком болезненным.

Взгляните на параметры «Выполнить перед заданием» и «Выполнить после задания» «Задание», чтобы вызвать сценарий, который вы написали. Мы склонны отдавать предпочтение вызову сценария, который запускает команду в bconsole (через перенаправление ввода), чтобы отключить ленточный том, а затем вызывает MTX для перемещения ленты.