Имеем 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}"