Получение списка соответствия портов рейд контроллера дискам в системе

Имеем RAID контроллер который экспортирует свои диски в систему как набор дисков (JBOD).
Нужно получить какой физический порт какому устройству в системе соответствует.

Пример был сделан для контроллера 3ware и CentOS release 6.5 (Final). Но с небольшими поправками подойдёт и для других контроллеров.

Unit  UnitType  Status         %RCmpl  %V/I/M  Stripe  Size(GB)  Cache  AVrfy
------------------------------------------------------------------------------
u0    JBOD      OK             -       -       -       931.513   Ri     OFF
u1    JBOD      OK             -       -       -       1863.02   Ri     OFF
u2    JBOD      OK             -       -       -       1863.02   Ri     OFF
u3    JBOD      OK             -       -       -       1863.02   Ri     OFF

VPort Status         Unit Size      Type  Phy Encl-Slot    Model
------------------------------------------------------------------------------
p0    OK             u0   931.51 GB SATA  0   -            WL1000GSA64RA100B
p1    OK             u1   1.82 TB   SATA  1   -            WDC WD2002FYPS-02W3
p2    OK             u2   1.82 TB   SATA  2   -            WDC WD2002FYPS-02W3
p3    OK             u3   1.82 TB   SATA  3   -            WDC WD2002FYPS-02W3


Данный bash скрипт позволяет получить такой список:

 p0 u0 /dev/sda  WOCL25301346263
 p1 u1 /dev/sdb  WD-WCAVY6179973  /dev/sdb1 /mnt/sdb1 ext4
 p2 u2 /dev/sdc  WD-WCAVY6142437
 p3 u? /dev/---  WD-WCAVY6176153

Ну и сам скрипт

#!/bin/bash

  TW_CLI="/root/tw_cli/x86_64/tw_cli"

  PVS=`pvs 2>/dev/null | sed -e 's/^ *//g;s/ \+/ /g;s/ *$//g' | grep -v "^PV VG" | grep '^/dev/'`
  MOUNTP=`cat /proc/mounts | grep '^/dev/'`

  for controller_ids in `${TW_CLI} show | grep -o '^c[0-9]\+' | sed -e 's/^c\([0-9]\+\)/\1/g'` ; do
    PCIADDR=`lspci | awk '/9650SE/ {print $1}'`
    SCSI_DEVS=`ls -l /dev/disk/by-path/ | grep -o 'pci-0000:.*$' | sed -n '/^pci-0000:'${PCIADDR}'-scsi-[0-9]\+:[0-9]\+:[0-9]\+:[0-9]\+ *-> */p' | sed -e 's/^pci-0000:'${PCIADDR}'-scsi-\([0-9]\+:[0-9]\+:[0-9]\+:[0-9]\+\) *-> *[^s]*\(s.*\)/\1 \2/g'`
    while read PORT TARGET ; do
#echo -e "p:[${PORT}]  t:[${TARGET}]"
      TMP=`echo "${SCSI_DEVS}" | awk -F: -v target=${TARGET} -v port=${PORT} '{if ($3 == target) print " p"port" u"target" /dev/"gensub(/(([0-9]+):)+[0-9]+[ \t]*/,"","g",$0)}'`
      # если TMP пустой то диск не появилось в системе (может появиться после команды tw_cli /cx rescan)
      if [ -z "${TMP}" ] ; then
        TMP=" p${PORT} u${TARGET} /dev/---"
        MOUNTPOINT=""
      else
        DEV=`echo -e "${TMP}" | awk '{print $3}' | sed -e 's|/|\\\/|g'`
        MOUNTPOINT=`echo -e "${PVS}\n${MOUNTP}" | sed -n '/^'${DEV}[0-9]*'[ \t]\+/p' | cut -d' ' -f1-3`
      fi
      SERIAL=`${TW_CLI} /c${controller_ids}/p${PORT} show serial | awk '{print $4}'`
      RESULT="${RESULT}\n${TMP}  ${SERIAL}  ${MOUNTPOINT}"
    done < <(${TW_CLI} /c${controller_ids} show | sed -n '/VPort/,/^$/p' | awk '/^p[0-9]+[ \t]/ {print gensub(/^p/,"","g",$1)" "gensub(/^u/,"","g",$3)}' | sort)
  done
  echo -e "${RESULT}"