User Tools

Site Tools


linux:script_list_disk_serial

List disks serial number on Linux PPC

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.

Environment variables

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"

File_name

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