SDS INSTALLATION
#!/bin/sh
#
# Author: Paul Robertson
#
# This script automates the process of creating a mirror of the boot
# disk with Solstice DiskSuite.
#
PATH=/usr/ucb:/bin:/usr/bin:/sbin:/usr/sbin:/usr/opt/SUNWmd/sbin
SYSROOT=
OS=`uname -r`
bootdir="/etc/rc3.d"
rebootscript="S99sdsattach"
version="$Id: sdsinstall,v 1.10 2004/02/10 19:46:26 proberts Exp $"
tmpfile1=/tmp/sdsinstall1.$$
tmpfile2=/tmp/sdsinstall2.$$
tmpfile3=/tmp/sdsinstall3.$$
bail()
{
# clean up any temporary files and return system to known state
exit 101
}
xcmd()
{
if [ ! -z "$debug" ]
then
echo "$@" >&2
fi
"$@"
[ $? = 0 ] || bail
}
preinstall()
{
# Check to make sure the system is ready for us
if [ ! -x $BINDIR/metadb ]; then
echo "Error: Disksuite does not appear to be installed. Exiting."
exit 102
fi
# If any state database replicas exist, then quit
if [ `metadb|wc -l 2>/dev/null` -gt 0 ]; then
echo "Error: There appears to be a preexisting DiskSuite installation. Exiting."
exit 102
fi
# If any metadevices exist, then quit
if [ `metastat|wc -l 2>/dev/null` -gt 0 ]; then
echo "Error: There appears to be a preexisting DiskSuite installation. Exiting."
exit 102
fi
}
read_vfstab()
{
# determine which slices to mirror to the secondary disk(s)
if [ "x$debug" != "x" ]; then
echo "Reading /etc/vfstab..."
fi
if [ ! -f $SYSROOT/etc/vfstab ]; then
"Error: $SYSROOT/etc/vfstab"
exit 101
fi
exec 9<&0 < $SYSROOT/etc/vfstab
while read _special _fsckdev _mountp _fstype _fsckpass _automnt _mntopts
do
case ${_special} in
'#'* | '') # Ignore comments, empty lines
continue ;;
'-') # Ignore no-action lines
continue ;;
/dev/dsk/${primary}*)
_slice=`expr "\${_special}" : '/dev/dsk/.*s\(.\)\$'`
slices="$slices ${_slice}"
;;
esac
done
exec <&9 9<&-
init_metadbs
}
partition_secondaries()
{
if [ "x$debug" != "x" ]; then
echo "Partitioning $secondaries..."
fi
for _secondary in $secondaries
do
# Copy the partition table from the primary disk to the destination disk
xcmd prtvtoc /dev/rdsk/${primary}s2 | fmthard -s - /dev/rdsk/${_secondary}s2
# ensure that the destination is bootable
xcmd installboot /usr/platform/`uname -i`/lib/fs/ufs/bootblk /dev/rdsk/${_secondary}s0
done
}
init_metadbs()
{
if [ "x$debug" != "x" ]; then
echo "Initializing metadevices..."
fi
for _disk in $primary $secondaries
do
for _metadb in $metadbs
do
xcmd metadb -c $copies -f -a /dev/rdsk/${_disk}${_metadb}
done
done
}
update_vfstab()
{
if [ "x$debug" != "x" ]; then
echo "Updating /etc/vfstab..."
fi
sed "s/\/dev\/dsk\/${primary}s/\/dev\/md\/dsk\/d/; s/\/dev\/rdsk\/${primary}s/\/dev\/md\/rdsk\/d/" $SYSROOT/etc/vfstab > $tmpfile2
}
yorn()
{
echo -n "$1"
while true
do
read input
case $input in
y|Y|yes) return 0;;
n|N|no) return 1;;
*) echo -n "Please respond with \"y\" or \"n\": "
continue;;
esac
done
}
finish()
{
#make a backup copy of the vfstab file
xcmd cp -p $SYSROOT/etc/vfstab $SYSROOT/etc/vfstab.bak.`date '+%m%d'`
# I think it's a safe assumption that the root metadevice will be 0
xcmd metaroot -v $tmpfile2 d0
# Put the SDS-aware vfstab into place
xcmd mv $tmpfile2 $SYSROOT/etc/vfstab
xcmd chmod 644 $SYSROOT/etc/vfstab
_dump_device=`awk '/^\/dev\/md\/dsk\/d.*swap/ {print $1}' $SYSROOT/etc/vfstab| head -1`
if [ ! -z "$_dump_device" -a -f /usr/sbin/dumpadm ]; then
echo "Setting dump device to metadevice $_dump_device"
echo "/usr/sbin/dumpadm -c kernel -d $_dump_device"
/usr/sbin/dumpadm -c kernel -d $_dump_device
else
echo "NOTICE: Unable to automatically configure dump device."
fi
# Put the reboot script in place
xcmd mv $tmpfile1 ${bootdir}/$rebootscript
xcmd chmod 755 ${bootdir}/$rebootscript
cleanup
if [ "x$quiet" != "xtrue" ]; then
# Prompt the user to reboot the system
yorn "The system needs to be rebooted for changes to take affect. Proceed?: " && \
/usr/sbin/shutdown -y -g0 -i6
else
# Just reboot now
/usr/sbin/shutdown -y -g0 -i6
fi
}
buildmetadevices()
{
read_vfstab
for _slice in $slices
do
_i=1
xcmd metainit -f d1${_slice} 1 1 ${primary}s${_slice}
xcmd metainit d${_slice} -m d1${_slice}
for _secondary in $secondaries
do
_i=`expr "${_i}" + 1`
xcmd metainit -f d${_i}${_slice} 1 1 ${_secondary}s${_slice}
echo "metattach d${_slice} d${_i}${_slice}" >> $tmpfile1
done
done
if [ -f $DATADIR/md.tab ]; then
mv $DATADIR/md.tab $DATADIR/md.tab.`date '+%m%d'`
fi
metastat -p > $DATADIR/md.tab
# The last thing the reboot script does is ensure it only runs once
echo "mv ${bootdir}/$rebootscript /tmp/_dont_start_${rebootscript}" >> $tmpfile1
}
createrebootscript()
{
if [ "x$debug" != "x" ]; then
echo "Creating reboot script..."
fi
echo "#!/bin/sh" > $tmpfile1
echo "#" >> $tmpfile1
echo "# This script simply attaches the SDS mirrors to" >> $tmpfile1
echo "# the primaries after reboot" >> $tmpfile1
echo "#" >> $tmpfile1
echo "PATH=/bin:/usr/bin:/sbin:/usr/sbin:$BINDIR" >> $tmpfile1
}
cleanup()
{
rm -f $tmpfile1 $tmpfile2
}
printusage()
{
echo "Usage: `basename $0` [-v] [-h] [-d] [-c copies] [-p primary] [-s secondary]... [-m metadb]..."
echo " "
echo "Eg: ./sdsinstall -p c0t0d0 -s c0t1d0 -m s5 -m s6"
exit 0
}
if [ $# -eq 0 ]; then
printusage
else
while getopts qhvdc:p:s:m: OPTION
do
case $OPTION in
q)quiet=true;; # don't run interactively
d)debug=true;;
v)echo "`basename $0`$version"
exit 0;;
p)primary=$OPTARG;;
s)secondaries="$secondaries $OPTARG";;
m)metadbs="$metadbs $OPTARG";;
c)copies=$OPTARG;;
\?|h)printusage;;
esac
done
shift `expr $OPTIND - 1`
fi
case $OS in
5.6|5.7)
BINDIR=/usr/opt/SUNWmd/sbin
DATADIR=/etc/opt/SUNWmd/
;;
*) BINDIR=/usr/sbin
DATADIR=/etc/lvm
esac
# If we are running non-interactively, we may not know the primary
if [ -z "$primary" ]; then
# find the c0t0d0 part of the df -k
primary=`df -k / | tail -1 | \
sed "s+/dev/dsk/\(c[0-9][0-9]*t[0-9][0-9]*d[0-9][0-9]*\)s[0-9][0-9]*.*+\1+"`
fi
if [ "x$quiet" != "xtrue" ]; then
echo "This program will mirror all the slices on $primary"
echo "listed in $SYSROOT/etc/vfstab to their corresponding"
echo "slices on $secondaries."
echo " "
echo "It will then configure the system to use Disksuite, and"
echo "ask you to reboot the system. After the reboot, the mirrors"
echo "on $secondaries will be attached."
echo ""
echo "You have selected the following:"
echo ""
echo " Primary Disk : $primary"
echo " Secondary Disk(s) :$secondaries"
echo -n " State database replicas :"
for _disk in $primary $secondaries
do
for _slice in $metadbs
do
echo -n " ${_disk}${_slice}"
done
done
echo " "
echo " "
echo "Warning: All data on$secondaries will be destroyed!"
yorn "Continue? [y/n]: " || exit 0
fi
if [ "x$debug" != "x" ]; then
echo "primary : $primary"
echo "secondaries : $secondaries"
echo "metadb slices : $metadbs"
fi
preinstall
partition_secondaries
createrebootscript
buildmetadevices
update_vfstab
finish
|