Mapping ATA to Device Name
source: http://superuser.com/questions/617192/mapping-ata-device-number-to-logical-device-name/938620#938620
source: http://www.phuket-data-wizards.com/blog/2011/07/16/matching-linux-ata-numbers-to-the-device-names/comment-page-1/#comment-164108
First Get the ata # (maybe its from some error message that you see in dmesg)
The ata # is the unique_id with scsi_host
So ata # 5 is unique_id 5
Now we have to find out how ata # (or unique_id) maps to a scsi_host host number.
grep . /sys/class/scsi_host/host*/unique_id
NOTE: the above command reads every unique_id file in all /sys/class/scsi_host/host* files and outputs it, for nice output.
Here is the ouput which shows the mapping between host number and unique_id:
/sys/class/scsi_host/host0/unique_id:1 /sys/class/scsi_host/host1/unique_id:2 /sys/class/scsi_host/host2/unique_id:3 /sys/class/scsi_host/host3/unique_id:4 /sys/class/scsi_host/host4/unique_id:5 /sys/class/scsi_host/host5/unique_id:6 /sys/class/scsi_host/host6/unique_id:0
So ata # 5 which is unique_id 5 is host # 4.
Mapping SCSI HOSTÂ to Device Name
So now to find out what host # 4 drive device name we run this:
ls -l /sys/block
NOTE: /sys/block has all of the block devices you have symlinks to their final path.
lrwxrwxrwx 1 root root 0 2015-07-09 15:01 loop0 -> ../devices/virtual/block/loop0 lrwxrwxrwx 1 root root 0 2015-07-09 15:01 loop1 -> ../devices/virtual/block/loop1 lrwxrwxrwx 1 root root 0 2015-07-09 15:01 loop2 -> ../devices/virtual/block/loop2 lrwxrwxrwx 1 root root 0 2015-07-09 15:01 loop3 -> ../devices/virtual/block/loop3 lrwxrwxrwx 1 root root 0 2015-07-09 15:01 loop4 -> ../devices/virtual/block/loop4 lrwxrwxrwx 1 root root 0 2015-07-09 15:01 loop5 -> ../devices/virtual/block/loop5 lrwxrwxrwx 1 root root 0 2015-07-09 15:01 loop6 -> ../devices/virtual/block/loop6 lrwxrwxrwx 1 root root 0 2015-07-09 15:01 loop7 -> ../devices/virtual/block/loop7 lrwxrwxrwx 1 root root 0 2015-07-09 15:01 md0 -> ../devices/virtual/block/md0 lrwxrwxrwx 1 root root 0 2015-07-09 15:01 md1 -> ../devices/virtual/block/md1 lrwxrwxrwx 1 root root 0 2015-07-09 15:01 md2 -> ../devices/virtual/block/md2 lrwxrwxrwx 1 root root 0 2015-07-08 15:45 sda -> ../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda lrwxrwxrwx 1 root root 0 2015-07-08 15:45 sdb -> ../devices/pci0000:00/0000:00:1f.2/host1/target1:0:0/1:0:0:0/block/sdb lrwxrwxrwx 1 root root 0 2015-07-08 15:45 sdc -> ../devices/pci0000:00/0000:00:1f.2/host4/target4:0:0/4:0:0:0/block/sdc lrwxrwxrwx 1 root root 0 2015-07-08 15:45 sdd -> ../devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/block/sdd
So for me host #4 is sdc.
So to summarize ata #5 is unique_id # 5 is host # 4 which is /dev/sdc.
OR ata #5 is /dev/sdc
COOL COMMAND: ata=3; ls -l /sys/block/sd* | grep $(grep ^$ata$ /sys/class/scsi_host/host*/unique_id | awk -F’/’ ‘{print $5}’)
REVERSE: device name to ata name
We can now go in reverse (using above output):
so /dev/sdb is host # 1
host # 1 is unique_id # 2
And unique_id #2 is ata 2
So /dev/sdb is ata #2
BONUS – 12 drives example – ATA to DEVICE &HOST to DEVICE maps
Here is a unit with 12 drives. It appears some drives dont need to have “ata” they can be just attached to the “scsi” drives. So some drives go from “ata”->”scsi” and some just go straight thru “scsi”.
The top command here is useful and shows how each ata device is attached to what drives.
#################################### ### 12 drives in a ReadyNAS 4220 ### #################################### ls -l /sys/block # total 0 # lrwxrwxrwx 1 root root 0 Jun 30 08:39 loop0 -> ../devices/virtual/block/loop0 # lrwxrwxrwx 1 root root 0 Jun 30 08:39 loop1 -> ../devices/virtual/block/loop1 # lrwxrwxrwx 1 root root 0 Jun 30 08:39 loop2 -> ../devices/virtual/block/loop2 # lrwxrwxrwx 1 root root 0 Jun 30 08:39 loop3 -> ../devices/virtual/block/loop3 # lrwxrwxrwx 1 root root 0 Jun 30 08:39 loop4 -> ../devices/virtual/block/loop4 # lrwxrwxrwx 1 root root 0 Jun 30 08:39 loop5 -> ../devices/virtual/block/loop5 # lrwxrwxrwx 1 root root 0 Jun 30 08:39 loop6 -> ../devices/virtual/block/loop6 # lrwxrwxrwx 1 root root 0 Jun 30 08:39 loop7 -> ../devices/virtual/block/loop7 # lrwxrwxrwx 1 root root 0 Jun 30 08:09 md0 -> ../devices/virtual/block/md0 # lrwxrwxrwx 1 root root 0 Jun 30 09:09 md1 -> ../devices/virtual/block/md1 # lrwxrwxrwx 1 root root 0 Jun 30 08:09 md127 -> ../devices/virtual/block/md127 # lrwxrwxrwx 1 root root 0 Jun 30 08:10 sda -> ../devices/pci0000:00/0000:00:01.1/0000:02:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/block/sda # lrwxrwxrwx 1 root root 0 Jun 30 08:10 sdb -> ../devices/pci0000:00/0000:00:01.1/0000:02:00.0/host0/port-0:1/end_device-0:1/target0:0:1/0:0:1:0/block/sdb # lrwxrwxrwx 1 root root 0 Jun 30 08:11 sdc -> ../devices/pci0000:00/0000:00:01.1/0000:02:00.0/host0/port-0:2/end_device-0:2/target0:0:2/0:0:2:0/block/sdc # lrwxrwxrwx 1 root root 0 Jun 30 08:11 sdd -> ../devices/pci0000:00/0000:00:01.1/0000:02:00.0/host0/port-0:3/end_device-0:3/target0:0:3/0:0:3:0/block/sdd # lrwxrwxrwx 1 root root 0 Jun 30 09:09 sde -> ../devices/pci0000:00/0000:00:01.1/0000:02:00.0/host0/port-0:4/end_device-0:4/target0:0:4/0:0:4:0/block/sde # lrwxrwxrwx 1 root root 0 Jun 30 08:11 sdf -> ../devices/pci0000:00/0000:00:01.1/0000:02:00.0/host0/port-0:5/end_device-0:5/target0:0:5/0:0:5:0/block/sdf # lrwxrwxrwx 1 root root 0 Jun 30 08:09 sdg -> ../devices/pci0000:00/0000:00:01.1/0000:02:00.0/host0/port-0:6/end_device-0:6/target0:0:6/0:0:6:0/block/sdg # lrwxrwxrwx 1 root root 0 Jun 30 08:10 sdh -> ../devices/pci0000:00/0000:00:01.1/0000:02:00.0/host0/port-0:7/end_device-0:7/target0:0:7/0:0:7:0/block/sdh # lrwxrwxrwx 1 root root 0 Jun 30 08:09 sdi -> ../devices/pci0000:00/0000:00:1f.2/ata1/host1/target1:0:0/1:0:0:0/block/sdi # lrwxrwxrwx 1 root root 0 Jun 30 08:10 sdj -> ../devices/pci0000:00/0000:00:1f.2/ata2/host2/target2:0:0/2:0:0:0/block/sdj # lrwxrwxrwx 1 root root 0 Jun 30 08:39 sdk -> ../devices/pci0000:00/0000:00:1f.2/ata3/host3/target3:0:0/3:0:0:0/block/sdk # lrwxrwxrwx 1 root root 0 Jun 30 08:10 sdl -> ../devices/pci0000:00/0000:00:1c.0/0000:03:00.0/ata7/host7/target7:0:0/7:0:0:0/block/sdl # lrwxrwxrwx 1 root root 0 Jun 30 08:10 sdm -> ../devices/pci0000:00/0000:00:1c.0/0000:03:00.0/ata8/host8/target8:0:0/8:0:0:0/block/sdm ########################## ### ATA to DEVICE NAME ### ########################## for i in {0..100}; do echo -n "ata${i}: "; echo $(find /sys | grep "ata$i" | egrep -o "(sd|hd|sg)[a-z]+" | sort | uniq); echo; done | egrep "(sd|hd|sg)[a-z]+" # OUTPUT: # ata1: sdi # ata2: sdj # ata3: sdk # ata7: sdl # ata8: sdm # NOTE: my command allows multiple devices for an ata device (im not sure if an ata device can control more than 1 device) ########################### ### HOST to DEVICE NAME ### ########################### for i in {0..100}; do echo -n "host${i}: "; echo $(find /sys | grep "host$i" | egrep -o "(sd|hd|sg)[a-z]+" | sort | uniq); echo; done | egrep "(sd|hd|sg)[a-z]+" # OUTPUT: # host0: sda sdb sdc sdd sde sdf sdg sdh # host1: sdi # host2: sdj # host3: sdk # host7: sdl # host8: sdm # NOTE: my command obviously allows multiple devices for a scsi host device (as seen with host0)
The end
UPDATE: ata# and host# can both map to more than 1 drive. especially if port multipliers or SAS controllers are used in the system