Как я могу заставить 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 для перемещения ленты.