web-dev-qa-db-ja.com

Baculaテープ交換

特定のジョブを実行した後、BaculaにテープをIOスロットに移動させるにはどうすればよいですか?

私は数日からBaculaで毎日バックアップを実行していますが、このようなことができるかどうか疑問に思っていました。構成ファイルでUseVolumeOnce = yesディレクティブをすでに指定しましたが、ジョブの終了時にBaculaにテープをスロット24(I/Oスロット)に移動させることができるかどうかを知りたいと思います。

Baculaはこれを行うことができますか、それともスクリプトを作成する必要がありますか?スクリプトを作成する必要がある場合、その経験はありますか?

2
Gert M

テストする同じ環境がなければ、これが機能するかどうかはわかりませんが、bacula-dir.confのRunAfterJobディレクティブを介して呼び出されるこのようなスクリプトは機能するはずです。

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

外部スクリプトの呼び出しを避けたい場合は、AlwaysOpen、RequiresMount/MountCommand/UnmountCommand、および/またはOfflineOnUnmountディレクティブを試してみてください。これらはすべて、ストレージデーモン構成のデバイスリソースにあります。

また、なぜこれがあなたにとって望ましいのかを明確にできますか?おそらく、私たちが見落としている根本的な問題に対する解決策があります。

2
sh-beta

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
2
Brent

スクリプトを作成する必要がありますが、Baculaと最近のバージョンのMTXを組み合わせると、それほど苦痛ではなくなります。

「ジョブの前に実行」および「ジョブの後に実行」の「ジョブ」パラメーターを確認して、作成したスクリプトを呼び出します。コマンドを実行するスクリプトを(入力リダイレクトを介して)bconsoleに呼び出してテープボリュームをアンマウントしてから、MTXを呼び出してテープを移動することを好む傾向があります。

0
jharley