将设备号映射到逻辑设备名称


Answers:


5

来自http://www.phuket-data-wizards.com/blog/2011/07/16/matching-linux-ata-numbers-to-the-device-names/
该命令grep '[0-9]' /sys/class/scsi_host/host{0..9}/unique_id 将提供输出, 因此我们可以匹配内核错误消息中使用的唯一ID到主机号。然后该命令将向我们显示哪个设备名称属于哪个主机号: 从这两个输出中我们可以看到唯一ID 6映射到host7,host7映射到/ dev / sdg。最后,使用命令: 我们可以找到驱动器的序列号。
/sys/class/scsi_host/host0/unique_id:1
/sys/class/scsi_host/host1/unique_id:2
/sys/class/scsi_host/host2/unique_id:0
/sys/class/scsi_host/host3/unique_id:0
/sys/class/scsi_host/host4/unique_id:3
/sys/class/scsi_host/host5/unique_id:4
/sys/class/scsi_host/host6/unique_id:5
/sys/class/scsi_host/host7/unique_id:6

ls -l /sys/block/sd*
/sys/block/sda -> ../devices/pci0000:00/0000:00:13.2/usb1/1-6/1-6:1.0/host2/target2:0:0/2:0:0:0/block/sda
/sys/block/sdb -> ../devices/pci0000:00/0000:00:13.2/usb1/1-8/1-8:1.0/host3/target3:0:0/3:0:0:0/block/sdb
/sys/block/sdc -> ../devices/pci0000:00/0000:00:12.0/host6/target6:0:0/6:0:0:0/block/sdc /sys/block/sdd -> ../devices/pci0000:00/0000:00:13.2/usb1/1-8/1-8:1.0/host3/target3:0:0/3:0:0:1/block/sdd
/sys/block/sde -> ../devices/pci0000:00/0000:00:13.2/usb1/1-8/1-8:1.0/host3/target3:0:0/3:0:0:2/block/sde /sys/block/sdf -> ../devices/pci0000:00/0000:00:13.2/usb1/1-8/1-8:1.0/host3/target3:0:0/3:0:0:3/block/sdf
/sys/block/sdg -> ../devices/pci0000:00/0000:00:12.0/host7/target7:0:0/7:0:0:0/block/sdg

hdparm -i /dev/sdg
/dev/sdg: Model=ST3500418AS, FwRev=CC34, SerialNo=6VM2KSFD


2
我把你的答案包裹在单行中,这样可以更容易使用: ata=3; ls -l /sys/block/sd* | grep $(grep $ata /sys/class/scsi_host/host*/unique_id | awk -F'/' '{print $5}')
内部人员2014年

1

无法对之前的答案发表评论,但对于那个内容,您希望将grep更改为更加严格,因为1和10都是有效的ata#:

$ grep 1 /sys/class/scsi_host/host*/unique_id
/sys/class/scsi_host/host0/unique_id:1
/sys/class/scsi_host/host9/unique_id:10
$ grep ^1$ /sys/class/scsi_host/host*/unique_id
/sys/class/scsi_host/host0/unique_id:1

所以...

ata=3; ls -l /sys/block/sd* | grep $(grep ^$ata$ /sys/class/scsi_host/host*/unique_id | awk -F'/' '{print $5}')

根据我的需要,我想将驱动器号映射到ata,所以我写了这个,在我的系统上,ata字符串并不总是路径的第5个组件:

#!/bin/sh                                                                       
dev=$1                                                                         
name=`basename $dev`                                                            
readlink /sys/block/$name | perl -ne'm{/(ata\d+)/} && print "$1\n"'             

像这样使用它:

$ ./map2ata /dev/sda
ata2

我在CentOS 6上运行它,它总是返回空白输出。这从哪里获得$ dev值?
爱德华_178118 2015年

请参阅“像这样使用”部分。您将设备路径传递给脚本。
rrauenza 2015年

我这样做了,它总是返回空白输出。
爱德华_178118 2015年

逐个运行脚本中的每个命令。basename $ dev只需要/ path / whatever / xyz并返回xyz。它将xyz分配给name。readlink返回/ sys / block / $ name实际指向的内容,将其传送到perl以获取ata [0-9] +标识符并打印出来。
rrauenza 2015年

类似地在centos6上,/ sys / block / sdN不指向ata设备名称。#readlink / sys / block / sda ../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda
Dan Pritts

1

我们很清楚ATA号码直接映射到UNIQUE_ID(它们是相同的数字)。所以ATA#3是UNIQUE_ID#3。然后,您查找HOST#与UNIQUE_ID关联的内容

/ SYS /类/ scsi_host /主机4 / UNIQUE_ID:3

所以这里ATA#3是UNIQUE_ID#3是HOST#4

然后获取驱动器号只需运行“ls -lisah / sys / block”并找到主机#4。

这是一个很好的stackexchange /超级用户,谈论这个:将设备号映射到逻辑设备名


0

我喜欢这个:

sg_inq /dev/sdq --verbose --id

VPD INQUIRY: Device Identification page
    inquiry cdb: 12 01 83 00 fc 00
    inquiry: requested 252 bytes but got 54 bytes
  Designation descriptor number 1, descriptor length: 24
    id_type: T10 vendor identification,  code_set: ASCII
    associated with the addressed logical unit
      vendor id: HITACHI
      vendor specific: R500D1075BCC
  Designation descriptor number 2, descriptor length: 6
    id_type: vendor specific [0x0],  code_set: Binary
    associated with the target port
 00     00 00                                               ..
  Designation descriptor number 3, descriptor length: 20
    id_type: NAA,  code_set: Binary
    associated with the addressed logical unit
      NAA 6, IEEE Company_id: 0x60e8
      Vendor Specific Identifier: 0x6d10700
      Vendor Specific Identifier Extension: 0xd10700005bcc
      [0x60060e8006d107000000d10700005bcc]


Logical device number in HEX:
vendor specific: R500D107**5BCC**
Array Serial in HEX:
vendor specific: R500**D107**5BCC

我不确定这对其他存储阵列制造商是否有用,但它适用于日立,


这是有趣的信息,但它如何帮助我们映射到内核报告的ataX?
Dan Pritts 2016年

0

一种可能更简单但不是万无一失的方法:检查/ bin / dmesg的输出。这些设备列在那里。

ata1: SATA max UDMA/133 abar m2048@0xf0616000 port 0xf0616100 irq 29
[ ... ]
ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
ata1.00: ATA-8: Hitachi HDT721010SLA360, ST6OA31B, max UDMA/133
ata1.00: 1953525168 sectors, multi 16: LBA48 NCQ (depth 31/32), AA
ata1.00: configured for UDMA/133
scsi 0:0:0:0: Direct-Access     ATA      Hitachi HDT72101 A31B PQ: 0 ANSI: 5
[ ... ] 
sd 0:0:0:0: [sda] 1953525168 512-byte logical blocks: (1.00 TB/931 GiB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Mode Sense: 00 3a 00 00
sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
 sda:

由于一些原因,这不是万无一失的。/ bin / dmesg列出了内核的“环形缓冲区”的内容; 后来的内核消息可以覆盖引导消息。

它需要你跟随并从ata1.00翻译到(这里)Hitachi HDT72101,然后立即看到scsi 0:0:0:0:是同一个磁盘。然后sd 0:0:0:0:显示为sda。

如果您有多个具有相同型号和固件级别的驱动器,您将无法确定使用此方法的驱动器。您希望可以从dmesg输出中的探测顺序推断出它。

在我的centos6系统上,/ var / log / dmesg包含上次启动时的dmesg。


0

我不是Linux大师,但在我的Ubuntu系统上,一切都变得容易:

# sudo ls /dev/disk/by-path -al
lrwxrwxrwx 1 root root   9 Jun 16 14:28 pci-0000:00:0b.0-ata-1 -> ../../sda
lrwxrwxrwx 1 root root  10 Jun 16 14:28 pci-0000:00:0b.0-ata-1-part1 -> ../../sda1
lrwxrwxrwx 1 root root  10 Jun 16 14:28 pci-0000:00:0b.0-ata-1-part2 -> ../../sda2
lrwxrwxrwx 1 root root  10 Jun 16 14:28 pci-0000:00:0b.0-ata-1-part3 -> ../../sda3
lrwxrwxrwx 1 root root   9 Jun 16 14:28 pci-0000:00:0b.0-ata-2 -> ../../sdb
lrwxrwxrwx 1 root root  10 Jun 16 14:28 pci-0000:00:0b.0-ata-2-part2 -> ../../sdb2
lrwxrwxrwx 1 root root  10 Jun 16 14:28 pci-0000:00:0b.0-ata-2-part5 -> ../../sdb5
lrwxrwxrwx 1 root root   9 Jun 16 14:28 pci-0000:00:0b.0-ata-3 -> ../../sdc
lrwxrwxrwx 1 root root  10 Jun 16 14:28 pci-0000:00:0b.0-ata-3-part1 -> ../../sdc1
lrwxrwxrwx 1 root root   9 Jun 16 14:28 pci-0000:00:0b.0-ata-4 -> ../../sdd
lrwxrwxrwx 1 root root  10 Jun 16 14:28 pci-0000:00:0b.0-ata-4-part1 -> ../../sdd1

1
这不是问题的答案。
Rich Michaels

请解释为什么不是。在我的系统中,ATA通道编号与此命令的输出完全匹配。
dredkin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.