===== 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