特定のジョブを実行した後、BaculaにテープをIOスロットに移動させるにはどうすればよいですか?
私は数日からBaculaで毎日バックアップを実行していますが、このようなことができるかどうか疑問に思っていました。構成ファイルでUseVolumeOnce = yesディレクティブをすでに指定しましたが、ジョブの終了時にBaculaにテープをスロット24(I/Oスロット)に移動させることができるかどうかを知りたいと思います。
Baculaはこれを行うことができますか、それともスクリプトを作成する必要がありますか?スクリプトを作成する必要がある場合、その経験はありますか?
テストする同じ環境がなければ、これが機能するかどうかはわかりませんが、bacula-dir.confのRunAfterJobディレクティブを介して呼び出されるこのようなスクリプトは機能するはずです。
#!/bin/sh
#
echo "unmount <device-name>" | <bacula-path>/bconsole -c bconsole.conf
外部スクリプトの呼び出しを避けたい場合は、AlwaysOpen、RequiresMount/MountCommand/UnmountCommand、および/またはOfflineOnUnmountディレクティブを試してみてください。これらはすべて、ストレージデーモン構成のデバイスリソースにあります。
また、なぜこれがあなたにとって望ましいのかを明確にできますか?おそらく、私たちが見落としている根本的な問題に対する解決策があります。
Ejectという管理ジョブを設定しました。このジョブは優先度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
スクリプトを作成する必要がありますが、Baculaと最近のバージョンのMTXを組み合わせると、それほど苦痛ではなくなります。
「ジョブの前に実行」および「ジョブの後に実行」の「ジョブ」パラメーターを確認して、作成したスクリプトを呼び出します。コマンドを実行するスクリプトを(入力リダイレクトを介して)bconsoleに呼び出してテープボリュームをアンマウントしてから、MTXを呼び出してテープを移動することを好む傾向があります。