User Tools

Site Tools


linux:list_linux_disks

[root@rhldaph1 ~]# cat collect_lparinfo_linux.sh

#!/bin/bash
#set -x
#@(#) Collect LPAR info on Linux servers
########################################################################
# verion 1.1 10-03-2016 Manu

dir=`dirname $0`
#. $dir/.env

logpath=/tmp

#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
linux/list_linux_disks.txt · Last modified: 2021/01/01 21:25 (external edit)