您可以通过遍历/sys
树找到对应的/ dev / sdY设备:
$ find /sys/devices | grep '/ata[0-9]\+/.*/block/s[^/]\+$' \
| sed 's@^.\+/\(ata[0-9]\+\)/.\+/block/\(.\+\)$@\1 => /dev/\2@'
使用更有效的/sys
遍历(请参阅lsata.sh):
$ echo /sys/class/ata_port/ata*/../../host*/target*/*/block/s* | tr ' ' '\n' \
| awk -F/ '{printf("%s => /dev/%s\n", $5, $NF)}'
2磁盘系统的示例输出:
ata1 => /dev/sda
ata2 => /dev/sdb
然后,为了可靠地标识实际硬件,您需要将/ dev / sdY映射到序列号,例如:
$ ls /dev/disk/by-id -l | grep 'ata.*sd[a-zA-Z]$'
lsci
该lssci
实用程序还可用于导出映射:
$ lsscsi | sed 's@^\[\([^:]\+\).\+\(/dev/.\+\)$@\1,\2@' \
| awk -F, '{ printf("ata%d => %s\n", $1+1, $2) }'
请注意,相关的lsscsi枚举从0开始,而ata枚举从0开始。
系统日志
如果没有其他效果,可以查看syslog / journal以获取映射。
这些/dev/sdY
设备的创建顺序与ataX标识符的枚举顺序相同,kern.log
而忽略了非磁盘设备(ATAPI)和未连接的链接。
因此,以下命令将显示映射:
$ grep '^May 28 2' /var/log/kern.log.0 | \
grep 'ata[0-9]\+.[0-9][0-9]: ATA-' | \
sed 's/^.*\] ata//' | \
sort -n | sed 's/:.*//' | \
awk ' { a="ata" $1; printf("%10s is /dev/sd%c\n", a, 96+NR); }'
ata1.00 is /dev/sda
ata3.00 is /dev/sdb
ata5.00 is /dev/sdc
ata7.00 is /dev/sdd
ata8.00 is /dev/sde
ata10.00 is /dev/sdf
(请注意,由于上面的日志消息来自另一个系统,因此不显示ata4。)
我正在使用,/var/log/kern.log.0
而不是/var/log/kern.log
因为引导消息已经旋转。我grep May 28 2
因为这是最后一次启动时间,我想忽略以前的消息。
要验证映射,可以通过查看以下输出进行一些检查:
$ grep '^May 28 2' /var/log/kern.log.0 | \
grep 'ata[0-9]\+.[0-9][0-9]: ATA-'
May 28 20:43:26 hn kernel: [ 1.260488] ata1.00: ATA-7: SAMSUNG SV0802N, max UDMA/100
May 28 20:43:26 hn kernel: [ 1.676400] ata5.00: ATA-5: ST380021A, 3.19, max UDMA/10
[..]
您可以将此输出与hdparm
输出进行比较,例如:
$ hdparm -i /dev/sda
/dev/sda:
Model=SAMSUNG SV0802N [..]
(使用内核2.6.32-31)