Identifier les LUN correspondant à un disque ASM

Lorsque l’on installe le Grid Infrastructure avec du stockage ASM, nous demandons à nos administrateurs SAN et Stockage préférés quelques LUNs sur une baie qui sont présentées au serveur, voire les serveurs en cas de RAC. Puis nous ajoutons, éventuellement, des alias multipath avant de créer nos disques ASM avec la commande:

oracleasm createdisk REDOA1 /dev/mapper/ASM_REDOA1

Mais une fois que ces disques ASM sont créés, comment faire pour retrouver le disk réel (LUN de SAN) qui lui est associé? Si l’on en croit la documentation, il faut utiliser l’option querydisk:

oracleasm querydisk REDOA1
 Disk "REDOA1" is a valid ASM disk

Super on est plutôt avancé là… mais heureusement, il y a des options « non-documentées »

En cherchant, je suis d’abord tombé sur un post d’Alejandro Vargas qui fournissait exactement ce que je cherchais, mais qui utilisait, visiblement, une ancienne version d’oracleasm, puis un post de Satish Chikkathammaiah, plus récent mentionne l’option -d devant le disque ASM, donc essayons:

oracleasm querydisk -d REDOA1
Disk "REDOA1" is a valid ASM disk on device [253, 10]

Et là on peut avancer, car ces 2 chiffres entre crochets, sont les valeurs majeures et mineures du disque, ici en multipath et l’on peut trouver la correspondance avec le disque à 2 endroits:

  • /dev:
ls -l /dev/ | grep 253| grep 10
brw-rw----  1 root root     253,    10 fév 16 15:59 dm-10
  • /proc/partitions:
 cat /proc/partitions | grep 253| grep 10
 253     5   10485760 dm-5
 253    12  104857600 dm-12
 253    23  104857600 dm-23
 253    10   20971520 dm-10
 253    18  104857600 dm-18
...

Donc notre disque REDOA1 est donc basé sur le disque multipath dm-10. Pour connaitre les chemins physiques, on utilise la commande multipath:

multipath -l | grep -A 9 dm-10
ASM_REDOA1 (360a98000646f6171435a6734524d7261) dm-10 NETAPP,LUN
[size=20G][features=1 queue_if_no_path][hwhandler=0][rw]
_ round-robin 0 [prio=0][enabled]
 _ 0:0:2:4  sdac 65:192  [active][undef]
_ round-robin 0 [prio=0][active]
 _ 0:0:3:4  sdaw 67:0    [active][undef]
_ round-robin 0 [prio=0][enabled]
 _ 1:0:2:4  sdco 69:192  [active][undef]
_ round-robin 0 [prio=0][enabled]
 _ 1:0:3:4  sddi 71:0    [active][undef]

Ici on est en stockage NETAPP, donc nous utiliserons la commande sanlun lun show pour trouver le nom de la LUN concernée. Voici le script que j’ai adapté des experts cités plus haut:

#!/bin/ksh
export ORACLE_HOME=`grep ASM /etc/oratab | cut -d: -f2`
export PATH=$PATH:~$user/dba/scripts/bin:$ORACLE_HOME/bin
export SID=`grep ASM /etc/oratab | cut -d: -f1`
printf "n%-15s %-12s %-11s %-8s %-8s %-35sn" "ASM disk" "based on" "Major,Minor" "Size(Gb)" "SAN bay" "SAN device name"
printf "%-15s %-12s %-11s %-8s %-8s %-35sn" "===============" "===========" "===========" "========" "=======" "=================================="
for i in `/etc/init.d/oracleasm listdisks`
do
v_asmdisk=`/etc/init.d/oracleasm querydisk -d $i | awk '{print $2}'| sed 's/"//g'`
v_minor=`/etc/init.d/oracleasm querydisk -d $i | awk -F[ '{print $2}'| awk -F] '{print $1}' | awk '{print $1}'`
v_major=`/etc/init.d/oracleasm querydisk -d $i | awk -F[ '{print $2}'| awk -F] '{print $1}' | awk '{print $2}'`
v_device=`ls -la /dev | awk -v v_minor=$v_minor -v v_major=$v_major '{if ( $5==v_minor ) { if ( $6==v_major ) { print $10}}}'`
v_real_dev=`multipath -ll | grep -A 4 $v_device | grep ready | awk '{print $3}'`
sanlun lun show | grep $v_real_dev | awk '{print $1,$2,$3}' > tmp1.lst
cat tmp1.lst | while read line
do
v_san_bay=`echo $line | awk '{print $1}'`
v_san_str=`echo $line | awk '{print $2}' | awk -F "/" '{print $5}'`
v_san_dev=`echo $line | awk '{print $3}'`
if [ "$v_san_dev" == "/dev/$v_real_dev" ]; then
v_san_name=$v_san_str
fi
done
rm -f tmp1.lst
v_size=`${ORACLE_HOME}/bin/kfod asm_diskstring='ORCL:*' disks=all | grep ${v_asmdisk} | awk '{print $2}'`
v_size=`expr $v_size / 1024`
Total_size=`expr $Total_size + $v_size`
Formated_size=`echo $v_size | sed -e :a -e 's/(.*[0-9])([0-9]{3})/1,2/;ta'`
printf "%-15s %-12s %-11s %-8s %-8s %-35sn" $v_asmdisk "/dev/$v_device" "[$v_minor $v_major]" $Formated_size $v_san_bay $v_san_name
done
#####################################################

Qui produit un résultat du style:

ASM disk        based on     Major,Minor Size(Gb) SAN bay  SAN device name
=============== ===========  =========== ======== =======  ==================================
DATAFINPPK1     /dev/dm-14   [253, 14]   20       sank52B: L_RACPPRK01_9_DATAFINPPK1
DATAHUBPPK1     /dev/dm-25   [253, 25]   50       sank52B: L_RACPPRK01_21_DATAHUBPPK1
DATATSTDGRK1    /dev/dm-24   [253, 24]   50       sank52B: L_RACPPRK01_20_DATATSTDGRK1
FRA1            /dev/dm-12   [253, 12]   100      sank52B: L_RACPPRK01_7_ARCH
CLUSTER1        /dev/dm-26   [253, 26]   2        sank52B: L_RACPPRK01_1_CLUSTER1
CLUSTER2        /dev/dm-27   [253, 27]   2        sank52B: L_RACPPRK01_2_CLUSTER2
CLUSTER3        /dev/dm-8    [253, 8]    2        sank52B: L_RACPPRK01_3_CLUSTER3
CTRLA1          /dev/dm-21   [253, 21]   2        sank52B: L_RACPPRK01_17_CTRLA1
CTRLB1          /dev/dm-22   [253, 22]   2        sank52B: L_RACPPRK01_18_CTRLB1
REDOA1          /dev/dm-10   [253, 10]   20       sank52B: L_RACPPRK01_5_REDOA1
REDOB1          /dev/dm-11   [253, 11]   20       sank52B: L_RACPPRK01_6_REDOB1
TEMP1           /dev/dm-23   [253, 23]   100      sank52B: L_RACPPRK01_19_TEMP1

ATTENTION: Si vous êtes en RAC, exécutez ce script sur tous les nœuds, car le nom multipath est propre à chaque serveur!