HP-UX Tips

Da Emigar.
Jump to navigation Jump to search

A volte può essere complicato modificare la grandezza di un filesystem, utilizzando le funzioni Online JFS. Questo semplice script può semplificare la gestione.

resize.sh

#!/usr/bin/ksh
# resize.sh
# comando per modificare la grandezza di un filesystem
# by Emilio Gargiulo, 26/08/2001
#       Aggiunto check iniziale 20/01/2004
#set -x
get_fssizek()
{
bdf $1 | awk '/\/dev\// { print $2 } ' | read FSSIZEK
if [ "$FSSIZEK" = "" ]
then
  bdf $1 | awk '/'$(echo $1 | sed -e 's/\//\\\//g' )'/ { print $1 } ' | read FSSIZEK
fi
echo $FSSIZEK
}

###########################################################################
### MAIN ### MAIN ### MAIN ### MAIN ### MAIN ### MAIN ### MAIN ### MAIN ###
###########################################################################

MOUNT=$1
NEWSIZE=$2

if [ "$MOUNT" = "" ]
then
  echo "$0: Uso del comando: $0 mount_point <new_size (in Mb)> "
  return 255
else
  bdf $MOUNT | awk '/\/dev\// { print $1 } ' | read DEV
  get_fssizek $MOUNT | read FSSIZEK
  FSSIZE=$(( $FSSIZEK / 1024 ))
  VG=$( lvdisplay $DEV | awk '/VG Name/ { print $3 } ' )
  PESIZE=$( vgdisplay $VG | awk '/PE Size/ { print $4 } ' )
  LVSIZE=$( lvdisplay $DEV | awk '/LV Size/ { print $4 } ' )
  LVSIZEPE=$( lvdisplay $DEV | awk '/Current LE/ { print $3 } ' )
  LVSIZEK=$(( $LVSIZE * 1024 ))

  echo ''
  echo dev=$DEV vg=$VG pesize=$PESIZE
  echo fssize\(Kb\)=$FSSIZEK fssize\(Mb\)=$FSSIZE
  echo lvsize\(Kb\)=$LVSIZEK lvsize\(Mb\)=$LVSIZE
  echo lvsize\(PE\)=$LVSIZEPE
  if [ "$NEWSIZE" = "" ]
  then
        echo ''
        df -g $MOUNT
  else
    NEWSIZEPE=$(( $NEWSIZE / $PESIZE ))
    # per eseguire un troncamento dei decimali
    NEWSIZEK=$(( $NEWSIZEPE * $PESIZE * 1024 ))
    echo ''
    echo newsizepe=$NEWSIZEPE newsize=$(( $NEWSIZEPE * $PESIZE ))
    if [ $LVSIZEPE -le $NEWSIZEPE ]
    then
        lvextend -l $NEWSIZEPE $DEV
        RC=$?
        if [ $RC -ne 0 ]
        then
                echo "$0: Errore in lvextend $DEV"
                exit $RC
        fi
        LVSIZEPE=$( lvdisplay $DEV | awk '/Current LE/ { print $3 } ' )
        if [ $LVSIZEPE -eq $NEWSIZEPE ]
        then
                fsadm -F vxfs -b $NEWSIZEK $MOUNT
                RC=$?
                if [ $RC -ne 0 ]
                then
                        echo "$0: Errore in fsadm $DEV"
                        exit $RC
                fi
        else
                echo "$0: Errore LVSIZEPE != NEWSIZEPE"
                exit 254
        fi
    else
        fsadm -F vxfs -b $NEWSIZEK $MOUNT
        RC=$?
        if [ $RC -ne 0 ]
        then
                echo "$0: Errore in fsadm $MOUNT"
                exit $RC
        fi
        get_fssizek $MOUNT | read ACTSIZEK
        if [ $NEWSIZEK -eq $ACTSIZEK ]
        then
                lvreduce -f -l $NEWSIZEPE $DEV
                RC=$?
                if [ $RC -ne 0 ]
                then
                        echo "$0: Errore in lvreduce $DEV"
                        exit $RC
                fi
        else
                echo "$0: Errore NEWSIZEK != ACTSIZEK"
                exit 253
        fi
    fi
  fi
fi