#!/bin/sh # # (C) aryzhov@excite.com # # Find a good candidate for a second root mirror # Resync rootdisk to it # Kill original rootdisk # Resync back to original and create a nice VTOC # on both disks, with all volumes visible as disk slices # RESYNC_CHECK_SLEEP=240 [ -z "$SI_ROOTDISK" -o "$SI_ROOTDISK" = "." ] && { echo " Can not determine SI_ROOTDISK - exiting " exit 1 } [ -d /var/vxvm/tempdb ] || mkdir -p /var/vxvm/tempdb || exit 1 [ -f /var/vxvm/tempdb/rootdg ] ||\ cp /a/var/vxvm/tempdb/* /var/vxvm/tempdb || echo No TempDB Files chroot /a /usr/sbin/vxdctl stop 2>&- VxImportRootdg >/dev/null 2>&1 vxprint -v | expand | egrep '^v *rootvol *root *ENABLED' || { echo " Failed to import rootdg - giving up " exit 0 } echo echo Saving the bootblk cp /a/usr/platform/`uname -i`/lib/fs/ufs/bootblk /a/usr/sbin/installboot /tmp echo echo Looking for a root mirror candidate # # Better options go later and overwrite the previous ones. # Ideal is same target on next controller # C=`echo $SI_ROOTDISK | cut -dc -f2- | cut -dt -f1` T=`echo $SI_ROOTDISK | cut -dt -f2- | cut -dd -f1` D=`echo $SI_ROOTDISK | cut -dd -f2- | cut -ds -f1` RDISKSZ=`prtvtoc -h /dev/rdsk/${SI_ROOTDISK} | expand | awk '{if($1 == 2 && $2 == 5) print $5}'` RBASE=`echo $SI_ROOTDISK | sed 's/s.$//'` DISKS="`echo "0\nq\nq" | format | egrep 'c[0-9]*t[0-9]*d[0-9]* *' | grep cyl | grep sec | awk '{print $2}' | grep -v $RBASE`" echo Installing bootblocks before resync /tmp/installboot /tmp/bootblk /dev/rdsk/${RBASE}s0 DLIST="" for DSK in $DISKS ; do SZ=`prtvtoc -h /dev/rdsk/${DSK}s2 | expand | awk '{if($1 == 2 && $2 == 5) print $5}'` [ "$SZ" -eq "$RDISKSZ" ] && DLIST="$DLIST\n$DSK" done DISK2=`{ echo "$DLIST" | egrep -v c"$C"t | grep t"$T"d$D ||\ echo "$DLIST" | egrep -v c"$C"t | grep t"$T" ||\ echo "$DLIST" | egrep -v c"$C"t | grep d$D ||\ echo "$DLIST" | egrep -v c"$C"t | grep '0-9]' ||\ echo "$DLIST" | grep d$D ||\ echo "$DLIST" } | sort -nu | head -1` [ -z "$DISK2" ] && { echo " Can not choose the disk for a second root mirror - giving up " exit 0 } # # umount everything under /a which is still on physical disks # for i in `mount | grep '^/a' | awk '{print $1}' | sort -ru` ; do sleep 5 umount $i || { echo " Failed to unmount $i " # start_shell # exit 0 } done for i in `swap -l | grep '^/dev' | awk '{print $1}' | sort -ru` ; do sleep 5 swap -d $i || { echo " Failed to demove swap on $i " # exit 0 } done BASE1=`echo $SI_ROOTDISK | cut -ds -f1` BASE2=`echo $DISK2 | cut -ds -f1` VOLCOUNT=`vxprint -g rootdg -v | grep '^v' | wc -l` for ARGS in "rootdisk rootmirr $BASE2 00" "rootmirr rootdisk $BASE1 01" ; do echo CMD="VxRootMirrMake $ARGS" echo Running $CMD ; $CMD TMPCOUNT=`vxprint -g rootdg -p | grep '^pl' | grep TEMP | wc -l` [ $TMPCOUNT -lt $VOLCOUNT ] && { echo " ERROR: None or too few plexes resyncing exiting " exit 1 } while ( date ; vxprint | grep TEMP ) ; do echo Resynching... sleep $RESYNC_CHECK_SLEEP ; echo done sleep 30 /etc/vx/bin/vxbootsetup [ `echo $ARGS | awk '{print $1}'` = rootdisk ] && { echo Killing the original submirror VxRootMirrKill rootdisk } echo done vxprint for d in $SI_ROOTDISK ${BASE2}s2 ; do echo === $d === ; prtvtoc -h /dev/rdsk/$d ; done echo Checking rootvol ... for i in `vxprint -v -g rootdg | egrep 'root|fsgen' | awk '{print $2}'` ; do fsck -y /dev/vx/rdsk/rootdg/$i # mount -r /dev/vx/dsk/rootdg/$i done echo Installing bootblocks after resync for d in $RBASE $BASE2 ; do /tmp/installboot /tmp/bootblk /dev/rdsk/${d}s0 ; done