Inspirado por el post de RuBiCK sobre como extender un VG con todos los PV links alternates de cada PV, se me occurrio hacer un script para distribuir todos los PV links sobre los distinctos caminos a los discos (es decir sobre las posibles controladoras). Esto no aplica si estamos usando un drivers que balancea el acceso a los discos y no hace uso de los pv links (por ejemplo Powerpath).
Por ejemplo, un VG de 3 PVs. Cada PV se ve por 4 caminos, por las controladoras c4, c6, c8 y c10.
Posiblemente, el primary path de los 3 PVs sea por la c4, mientras que los demas caminos estan en standby. Aun que no sea comparable a Powerpath, es mas interesante distribuir las I/O sobre todos los caminos posibles. Para esto, podemos redistribuir los primary path sobre los caminos posibles.
Por ejemplo: PV1 por la c4, PV2 por la c6 y PV3 por la c8 (y seguiriamos asi con los demas discos…)
Para hacerlo en caliente, lo que hace el script es quitar los caminos que no seran el primario y reañadirlos (en el orden correcto):
# pvdisplay /dev/dsk/c4t0d4 --- Physical volumes --- PV Name /dev/dsk/c4t0d4 PV Name /dev/dsk/c6t0d4 Alternate Link PV Name /dev/dsk/c8t0d4 Alternate Link PV Name /dev/dsk/c10t0d4 Alternate Link # vgreduce -A n $VG /dev/dsk/c8t0d4 /dev/dsk/c10t0d4 /dev/dsk/c4t0d4 # vgextend -A n $VG /dev/dsk/c8t0d4 /dev/dsk/c10t0d4 /dev/dsk/c4t0d4 # pvdisplay /dev/dsk/c6t0d4 --- Physical volumes --- PV Name /dev/dsk/c6t0d4 PV Name /dev/dsk/c8t0d4 Alternate Link PV Name /dev/dsk/c10t0d4 Alternate Link PV Name /dev/dsk/c4t0d4 Alternate Link
He hecho el siguiente script para hacer el trabajo automaticamente con todos los discos de un VG:
#!/usr/bin/ksh
# Distribuye los PV links sobre las controladoras
set -o nounset
# bucle para cada primary link:
VG=$1
FILE=$( mktemp )
J=0
for PV in $(
vgdisplay -v $VG | grep "PV Name" |
grep -v "Alternate Link" | awk '{ print $3 }' )
do
(( J = J + 1 ))
I=1
LISTA_LINKS=$( pvdisplay $PV | grep "PV Name" | awk '{ print $3 }' | sort )
NUM_LINKS=$( echo $LISTA_LINKS | wc -w )
for LINK in $( pvdisplay $PV | grep "PV Name" | awk '{ print $3 }' )
do
(( N = ( I + J ) % NUM_LINKS + 1 ))
echo $PV $( echo $LINK | tr "t" "/" | cut -d/ -f 4 ) $LINK $I $N
(( I = I + 1 ))
done
done | sort -k 5 > $FILE
for PV in $(
vgdisplay -v $VG | grep "PV Name" |
grep -v "Alternate Link" | awk '{ print $3 }' )
do
# Lista de links
set -- $( grep $PV" " $FILE | awk '{ print $3 }' )
PRIMARY=$1
shift
ALTERNATES=$*
# esta bien el futur primary? (sino saltamos)
pvdisplay $PRIMARY >/dev/null 2>&1 || continue
vgreduce -A n $VG $ALTERNATES
vgextend -A n $VG $ALTERNATES
done
vgcfgbackup $VG
rm $FILE

Con la pasta que vale el software de multipath y lo solucionamos con un script, la de pasta que se ahorrarían :)
Por cierto. con “pvchange -s disco” pones como primary link el disco que elijas sin hacer un reduce/extend, seguro que así el script te queda mucho mas simple.
Ya hice algo parecido, por que pedian balancear los pvlinks de unas cuantas máquinas y para que valiera para todas, miraba el HW path de las tarjetas de fibra y los discos que colgaban de esos HW path, con lo cual teniamos los discos que cada hba veía. así se hace más atomatizado aún.
Entre tu y yo, al final acabamos haciendo un software multipath ya veras… Alguien más se apunta? :D
Un saludo Alex