On 02/19/2011 03:09 PM, Mathias BurÃn wrote: > The script works for me: > > $ sudo ./lsdrv.sh > Password: > Controller device @ pci0000:00/0000:00:0b.0 [ahci] > SATA controller: nVidia Corporation MCP79 AHCI Controller (rev b1) > host0: /dev/sda ATA Corsair CSSD-F60 {SN: 10326505580009990027} > host1: /dev/sdb ATA WDC WD20EARS-00M {SN: WD-WCAZA1022443} > host2: /dev/sdc ATA WDC WD20EARS-00M {SN: WD-WMAZ20152590} > host3: /dev/sdd ATA WDC WD20EARS-00M {SN: WD-WMAZ20188479} > host4: [Empty] > host5: [Empty] > Controller device @ pci0000:00/0000:00:16.0/0000:05:00.0 [sata_mv] > SCSI storage controller: HighPoint Technologies, Inc. RocketRAID > 230x 4 Port SATA-II Controller (rev 02) > host6: [Empty] > host7: /dev/sde ATA SAMSUNG HD204UI {SN: S2HGJ1RZ800964 } > host8: /dev/sdf ATA WDC WD20EARS-00M {SN: WD-WCAZA1000331} > host9: /dev/sdg ATA SAMSUNG HD204UI {SN: S2HGJ1RZ800850 } > > So ata3 is the same as host3 then? How come no errors are logged on the drive: No, generally not. ATA numbering starts from #1. Host numbering starts from #0, but includes non-ATA SCSI devices. I've attached a version of the script that shows the LUN in addition to the host number, and includes John's adjustment. It might be useful to people with port multipliers, and controllers that show all ports under a single host. Simon, I'm very curious what this latest script shows for the Supermicro when one or more ports are empty, and whether those LUNs are consistently assigned to specific ports. Phil
#! /bin/bash # # Examine specific system host devices to identify the drives attached # function describe_controller () { local device driver modprefix serial slotname driver="`readlink -f \"$1/driver\"`" driver="`basename $driver`" modprefix="`cut -d: -f1 <\"$1/modalias\"`" echo "Controller device @ ${1##/sys/devices/} [$driver]" if [[ "$modprefix" == "pci" ]] ; then slotname="`basename \"$1\"`" echo " `lspci -s $slotname |cut -d\ -f2-`" return fi if [[ "$modprefix" == "usb" ]] ; then if [[ -f "$1/busnum" ]] ; then device="`cat \"$1/busnum\"`:`cat \"$1/devnum\"`" serial="`cat \"$1/serial\"`" else device="`cat \"$1/../busnum\"`:`cat \"$1/../devnum\"`" serial="`cat \"$1/../serial\"`" fi echo " `lsusb -s $device` {SN: $serial}" return fi echo -e " `cat \"$1/modalias\"`" } function describe_device () { local empty=1 while read device ; do empty=0 if [[ "$device" =~ ^(.+/[0-9]+:)([0-9]+:[0-9]+:[0-9]+)/block[/:](.+)$ ]] ; then base="${BASH_REMATCH[1]}" lun="${BASH_REMATCH[2]}" bdev="${BASH_REMATCH[3]}" vnd="$(< ${base}${lun}/vendor)" mdl="$(< ${base}${lun}/model)" sn="`sginfo -s /dev/$bdev | \ sed -rn -e \"/Serial Number/{s%^.+' *(.+) *'.*\\\$%\\\\1%;p;q}\"`" &>/dev/null if [[ -n "$sn" ]] ; then echo -e " $1 `echo $lun $bdev $vnd $mdl {SN: $sn}`" else echo -e " $1 `echo $lun $bdev $vnd $mdl`" fi else echo -e " $1 Unknown $device" fi done [[ $empty -eq 1 ]] && echo -e " $1 [Empty]" } function check_host () { local found=0 local pController= while read shost ; do host=`dirname "$shost"` controller=`dirname "$host"` bhost=`basename "$host"` if [[ "$controller" != "$pController" ]] ; then pController="$controller" describe_controller "$controller" fi find $host -regex '.+/target[0-9:]+/[0-9:]+/block[:/][^/]+' |describe_device "$bhost" done } find /sys/devices/ -name 'scsi_host*' |check_host