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