Bacula-users

Re: [Bacula-users] HP MSL2024 Autochanger "ERR=Device or resource busy."

2010-01-07 07:46:02
Subject: Re: [Bacula-users] HP MSL2024 Autochanger "ERR=Device or resource busy."
From: "ext-daniel.hawker AT nokia DOT com" <ext-daniel.hawker AT nokia DOT com>
To: <richard AT sauce.co DOT nz>, <bacula-users AT lists.sourceforge DOT net>
Date: Thu, 7 Jan 2010 13:06:54 +0100
Hi Richard,

> 
> Anyone else running this library I can compare notes with?
> 

Not anymore :)  Used to use an SAS LTO3 based MSL2024 on a project I worked at 
a while back. TBH it *just worked* and worked well too. Would recommend one to 
anyone that needed an autochanger of this size. Was quick and worked. What more 
do you need :)

Have attached the salient directives from my notes below, hope they're of use. 
Was using a relatively old Bacula version back then (not sure which maybe 1.38 
or early v2), but the important bits haven't changed much, so should be valid. 
Have also added the mtx-changer I was using. Can't recall if I changed this 
from the default shipped one either, but... 

If the configs get munged, send me an email and I'll send you an attachment, 
not sure this list server allows them.

HTH

Dan

--
Dan Hawker
Linux Consultant
ext-daniel.hawker AT nokia DOT com
+44 (0)7827 352612
--

######################
# Director Directives
######################

# New HP MSL2024 Tape Drive
Storage {
        Name = MSL2024
        Address = charon
        SDPort = 9103
        Password = "zFLQDHxxxxxxxxxxxxxxxxxxxxOZ8zmf94NDvTdE1"
        Device = MSL2024-Autoloader
        Media Type = LTO3
        Autochanger = yes
#close storage
}


################
# SD Directives
################

# Our HP MSL2024 Autoloader...
Autochanger {
  Name = MSL2024-Autoloader
  Device = MSL2024-Drive
  Changer Device = /dev/changer
  Changer Command = "/etc/bacula/mtx-changer %c %o %S %a %d"
# close Autoloader
}

# The Drive itself...
Device {
        Name = MSL2024-Drive
        Drive Index = 0
        Media Type = LTO3
        Archive Device = /dev/nst0
        AutoChanger = yes
        AutomaticMount = yes;               # when device opened, read it
        AlwaysOpen = yes;
        RandomAccess = no
        RemovableMedia = yes
        LabelMedia = yes
        Alert Command = "sh -c 'tapeinfo -f %c |grep TapeAlert|cat'"
#  If you have smartctl, enable this, it has more info than tapeinfo
#       Alert Command = "sh -c 'smartctl -H -l error %c'"

#close device
}


##################
# MTX-Changer
##################
#!/bin/sh
#
# Bacula interface to mtx autoloader
#
#  $Id: mtx-changer.in 5360 2007-08-16 13:01:19Z pbuschman $
#
#  If you set in your Device resource
#
#  Changer Command = "path-to-this-script/mtx-changer %c %o %S %a %d"
#    you will have the following input to this script:
#
#  So Bacula will always call with all the following arguments, even though
#    in come cases, not all are used.
#
#  mtx-changer "changer-device" "command" "slot" "archive-device" "drive-index"
#                  $1              $2       $3        $4               $5
#
#  for example:
#
#  mtx-changer /dev/sg0 load 1 /dev/nst0 0 (on a Linux system)
# 
#  will request to load the first cartidge into drive 0, where
#   the SCSI control channel is /dev/sg0, and the read/write device
#   is /dev/nst0.
#
#  The commands are:
#      Command            Function
#      unload             unload a given slot
#      load               load a given slot
#      loaded             which slot is loaded?
#      list               list Volume names (requires barcode reader)
#      slots              how many slots total?
#
#  Slots are numbered from 1 ...
#  Drives are numbered from 0 ...
#
#
#  If you need to an offline, refer to the drive as $4
#    e.g.   mt -f $4 offline
#
#  Many changers need an offline after the unload. Also many
#   changers need a sleep 60 after the mtx load.
#
#  N.B. If you change the script, take care to return either 
#   the mtx exit code or a 0. If the script exits with a non-zero
#   exit code, Bacula will assume the request failed.
#

MTX=mtx

# mt status output
# SunOS     No Additional Sense
# FreeBSD   Current Driver State: at rest.
# Linux     ONLINE

OS=`uname`
case ${OS} in
  SunOS)
    ready="No Additional Sense"
    ;;
  FreeBSD)
    ready="Current Driver State: at rest."
    ;;
  *)
    ready="ONLINE"
  ;;
esac

#
# log whats done
#
# to turn on logging, uncomment the following line
#touch /var/lib/bacula/mtx.log
#
dbgfile="/var/lib/bacula/mtx.log"
debug() {
    if test -f $dbgfile; then
        echo "`date +\"%Y%m%d-%H:%M:%S\"` $*" >> $dbgfile
    fi
}


#
# Create a temporary file
#
make_temp_file() {
  TMPFILE=`mktemp /var/lib/bacula/mtx.XXXXXXXXXX`
  if test x${TMPFILE} = x; then
     TMPFILE="/var/lib/bacula/mtx.$$"
     if test -f ${TMPFILE}; then
        echo "Temp file security problem on: ${TMPFILE}"
        exit 1
     fi
  fi
}

#
# The purpose of this function to wait a maximum 
#   time for the drive. It will
#   return as soon as the drive is ready, or after
#   waiting a maximum of 300 seconds.
# Note, this is very system dependent, so if you are
#   not running on Linux, you will probably need to
#   re-write it, or at least change the grep target.
#   We've attempted to get the appropriate OS grep targets
#   in the code at the top of this script.
#
wait_for_drive() {
  i=0 
  while [ $i -le 300 ]; do  # Wait max 300 seconds
    if mt -f $1 status | grep "${ready}" >/dev/null 2>&1; then
      break
    fi
    debug "Device $1 - not ready, retrying..."
    sleep 1
    i=`expr $i + 1`
  done
}

# check parameter count on commandline
#
check_parm_count() {
    pCount=$1
    pCountNeed=$2
    if test $pCount -lt $pCountNeed; then
        echo "usage: mtx-changer ctl-device command [slot archive-device 
drive-index]"
        echo "  Insufficient number of arguments given."
        if test $pCount -lt 2; then
            echo "  Mimimum usage is first two arguments ..."
        else
            echo "  Command expected $pCountNeed arguments"
        fi
        exit 1
    fi
}

# Check for special cases where only 2 arguments are needed, 
#  all others are a minimum of 5
#
case $2 in
    list)
        check_parm_count $# 2
        ;;
    slots)
        check_parm_count $# 2
        ;;
    *)
        check_parm_count $# 5
        ;;
esac


# Setup arguments
ctl=$1
cmd="$2"
slot=$3
device=$4
drive=$5

debug "Parms: $ctl $cmd $slot $device $drive"

case $cmd in 
   unload)
      debug "Doing mtx -f $ctl unload $slot $drive"
#
# enable the following line if you need to eject the cartridge
#     mt -f $device offline
#     sleep 10
      ${MTX} -f $ctl unload $slot $drive
      ;;

   load)
      debug "Doing mtx -f $ctl load $slot $drive"
      ${MTX} -f $ctl load $slot $drive
      rtn=$?
#
# Increase the sleep time if you have a slow device
# or remove the sleep and add the following:
#     sleep 15
      wait_for_drive $device
      exit $rtn
      ;;

   list) 
      debug "Doing mtx -f $ctl -- to list volumes"
      make_temp_file
# Enable the following if you are using barcodes and need an inventory
#     ${MTX} -f $ctl inventory
      ${MTX} -f $ctl status >${TMPFILE}
      rtn=$?
      cat ${TMPFILE} | grep " Storage Element [0-9]*:.*Full" | awk "{print \$3 
\$4}" | sed "s/Full *\(:VolumeTag=\)*//"
#
# If you have a VXA PacketLoader and the above does not work, try
#  turning it off and enabling the following line.
#     cat ${TMPFILE} | grep " *Storage Element [0-9]*:.*Full" | sed "s/ Storage 
Element //" | sed "s/Full :VolumeTag=//"
#
      cat ${TMPFILE} | grep "^Data Transfer Element [0-9]*:Full (Storage 
Element [0-9]" | awk '{printf "%s:%s\n",$7,$10}'
      rm -f ${TMPFILE} >/dev/null 2>&1
      exit $rtn
      ;;

   loaded)
      debug "Doing mtx -f $ctl $drive -- to find what is loaded"
      make_temp_file
      ${MTX} -f $ctl status >${TMPFILE}
      rtn=$?
      cat ${TMPFILE} | grep "^Data Transfer Element $drive:Full" | awk "{print 
\$7}"
      cat ${TMPFILE} | grep "^Data Transfer Element $drive:Empty" | awk "{print 
0}"
      rm -f ${TMPFILE} >/dev/null 2>&1
      exit $rtn
      ;;

   slots)
      debug "Doing mtx -f $ctl -- to get count of slots"
      ${MTX} -f $ctl status | grep " *Storage Changer" | awk "{print \$5}"
      ;;
esac

####################


------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev 
_______________________________________________
Bacula-users mailing list
Bacula-users AT lists.sourceforge DOT net
https://lists.sourceforge.net/lists/listinfo/bacula-users