This script can be executed every linux PPC, and it reports each disk serial number and volume group or zpool associated (latest debian or ubuntu support it). Useful in big centralized disks on SAN environment.
Centralize variables for all scripts: .env file
# global variables for all scripts export binpath=/root/script/bin export sn=`basename $0 | cut -d. -f1` export HOSTNAME=`hostname` export logpath=/root/script/log export logname=$logpath/$sn.log export configfile=$binpath/$sn.cfg export destination="test@test.com"
list_diskserial.sh
List disks serial number:
#!/bin/bash
#set -x
#@(#) Collect LPAR info on Linux servers
########################################################################
# verion 1.2 01-09-2016 Manu
dir=`dirname $0`
. $dir/.env
#log_serial=$logpath/list_serial_disk_lpar.txt
listvg=$logpath/map_disk
host_name=$(hostname -s)
rm -f $logpath/map_disk* $logpath/lshw.txt
lshw > $logpath/lshw.txt
serialsrv=$(cat $logpath/lshw.txt | grep serial | grep IBM | head -1 | sed "s/.*IBM,//" | rev | cut -c1-7 | rev)
lpar_id=$(lparstat -i | grep "Partition Number" | cut -d':' -f2- | awk '{print $1}')
delim=':'       # Field delimiter
#------------------------------------------------
analyse_uuid ()
{
diskfull=$(echo $1 | cut -d':' -f2- | sed -e 's/;//g' -e 's/://g' | cut -c5-)
manufacturer=$(echo $diskfull | sed 's/fcp//' | rev | sed 's/[0-9]/\ /g' | awk '{print $1}' | rev)
if [ "$manufacturer" == "HITACHI" ]
then
  serial=$(echo $diskfull | cut -c1-8)
  hexadiskid=$(echo $diskfull | cut -c9-12)
  diskid=$(printf "%04d\n" 0x$hexadiskid)
else
  if [ "$manufacturer" == "IBM" ]
  then
    serial=$(echo $diskfull | cut -c2-29)
    diskid=$(echo $diskfull | cut -c30-33)
  else
    if [ "$manufacturer" == "DataCore" ]
    then
      serial="NA" # $(lscfg -vpl $hdisk | grep "Device Specific" | grep "(Z0)" | sed 's/\./\ /g' | rev | awk '{print $1}' | rev)
      diskid="NA"
    else
      if [ "$manufacturer" == "NVDISK" ]
      then
        unset diskid
        serial="NA"
        diskid=$(echo $diskfull | cut -c1-32 | tr 'A-Z' 'a-z')
      else
        serial="NA"
        diskid="NA"
      fi
    fi
  fi
fi
}
#------------------------------------------------
listvgs ()
{
# List zpool and disks
if [ -e /sbin/zpool ]
then
  zpool status 2> /dev/null | awk '{print $1";"$2}' | sed '/^;/ s//\n/' | egrep "^sd|^mpath|^pool" > $listvg.tmp
  for line in $(cat $listvg.tmp | egrep -v "^NAME;|^errors:|^state:|^state:|^scan:|^config:" | sed '/^$/d')
  do
    if [ $(echo $line | grep -q '^pool:'; echo $?) -eq 0 ]
    then
      poolname=$(echo $line | cut -d':' -f2- | sed 's/;//g')
    else
      if [ $(echo $line | grep -vq "^$poolname;"; echo $?) -eq 0 ]
      then
        hdisk=$(echo $line | cut -d';' -f1)
        device=$(ls /dev/$hdisk /dev/mapper/$hdisk 2>/dev/null)
        echo ";$device;:"$poolname
      fi
    fi
  done
fi
# List VG and disks
pvs 2> /dev/null | awk '{print $1,$2}' | grep -v '^PV ' | while read dsk vg
do
  hdisk=$(echo $dsk | cut -d '-' -f1 | sed 's/[0-9-]//g')
  echo ";"$hdisk";:"$vg
done
}
#------------------------------------------------
listmapth ()
{
for line in $(multipath -ll | egrep -v "size=|policy=" | awk '{print $1";"$2";"$3}')
do
  if [ $(echo $line | grep -q '^mpath' ; echo $?) -eq 0 ]
  then
    mpathname=$(echo $line | cut -d';' -f1)
  else
    dsk=$(echo $line | cut -d';' -f3)
    echo ";/dev/mapper/"$mpathname";/dev/"$dsk";"
  fi
done
}
#------------------------------------------------
listhw ()
{
for line in $(cat $logpath/lshw.txt | tr '\*\-' '\n' | awk -v RS='' -v ORS='\n\n' '/disk/' | egrep 'disk|description|bus|logical|serial|size' | awk '{print $1,$2,$3,$4}' | sed 's/\ /\;/g' | sed 's/$/:/')
do
  begin=$(echo $line | cut -d':' -f1 | sed 's/;//g')
  case "$begin" in
     "disk" )       hdisk=$(echo $line | cut -d':' -f1 | sed 's/;//g') ;;
     "businfo" )    type=$(echo $line | cut -d':' -f2- | cut -d'@' -f1 | sed -e 's/://' -e 's/;//g' | sed 's/scsi/vscsi/')
                    address=$(echo $line | cut -d':' -f2- | cut -d'@' -f2 | sed 's/;//g') ;;
     "logicalname") sdisk=$(echo $line | cut -d':' -f2- | sed -e 's/;//g' -e 's/://g') ;;
     "serial" )     diskuuid=$(echo $line | cut -d':' -f2- | sed 's/;//g')
                    analyse_uuid $line ;;
     "size" )       size=$(echo $line | cut -d';' -f2)
                    if [ $(echo $size | grep -q GiB; echo $?) -eq 0 ]
                    then
                      sz=$(echo $size | sed 's/GiB//')
                      (( disksz = sz * 1024 ))
                    fi ;;
  esac
  if [ $(echo $line | grep -q '^size:'; echo $?) -eq 0 ]
  then
    pvid=NA
    if [ $(grep -q ";$sdisk;" $listvg.disks_vgs; echo $?) -eq 0 ]
    then
      vg=$(grep ";$sdisk;" $listvg.disks_vgs | rev | cut -d':' -f1 | rev)
    else
      vg=novg
    fi
    hdisk=$(grep ";$sdisk;" $listvg.disks_vgs | cut -d';' -f2 | rev | cut -d'/' -f1 | rev)
    if [ "$hdisk" = "" ]
    then
      hdisk=$(grep ";$sdisk;" $listvg.mpaths | cut -d';' -f2 | rev | cut -d'/' -f1 | rev)
    fi
    if [ "$hdisk" != "" ]
    then
      echo "$host_name${delim}$serialsrv${delim}$lpar_id${delim}$hdisk${delim}$pvid${delim}$vg${delim}$serial${delim}$diskid${delim}$type${delim}$manufacturer${delim}$disksz${delim}$serial$diskid"
    fi
  fi
done
}
#------------------------------------------------
mergevg ()
{
for line in $(cat $listvg.poolvgs)
do
  hdisk=$(echo $line | cut -d':' -f1)
  vg=$(echo $line | cut -d':' -f2)
  if [ $(grep -q "$hdisk"  $listvg.mpaths; echo $?) -eq 0 ]
  then
    alldsk=$(cat $listvg.mpaths | grep "$hdisk" | sed 's/;/\ /g' | tr ' ' '\n' | awk '{print $1}' | sed '/^$/d' | sort -u | tr '\n' ';' | sed 's/^/;/')
    echo $alldsk":"$vg
  else
    echo $hdisk":"$vg
  fi
done
}
#------------------------------------------------
suppress_multiples ()
{
for line in $(cat $listvg.disks | cut -d':' -f1-4 | sort -u)
do
  if [ $(grep "^$line:" $listvg.disks | wc -l) -gt 1 ]
  then
    if [ $(grep "^$line:" $listvg.disks | grep -v ':novg:' | wc -l) -ge 1 ]
    then
      grep "^$line:" $listvg.disks | grep -v ':novg:' | head -1
    else
      grep "^$line:" $listvg.disks | head -1
    fi
  else
    grep "^$line:" $listvg.disks
  fi
done
}
###########################################################################
#
# main ()
#
###########################################################################
listmapth > $listvg.mpaths
listvgs > $listvg.poolvgs
mergevg > $listvg.disks_vgs
listhw | sort -u > $listvg.disks
suppress_multiples | tee $listvg.final