Rub*_*ben 5 disk disk-management
在日志中获取这样的东西:
10 月 2 日 22:11:21 木星内核:[439646.093111] ata4.00:异常 Emask 0x0 SAct 0x0 SErr 0x0 action 0x6
10 月 2 日 22:11:21 木星内核:[439646.093144] ata4.00:BMDMA stat 0x6
10 月 2 日 22:11:21 木星内核:[439646.093176] ata4.00:失败的命令:WRITE DMA EXT
10 月 2 日 22:11:21 木星内核:[439646.093206] ata4.00:cmd 35/00:98:00:0d:ff/00:02:42:00:00/e0 tag 0 dma 339968 out
10 月 2 日 22:11:21 木星内核:[439646.093282] ata4.00:状态:{ DRDY ERR }
10 月 2 日 22:11:21 木星内核:[439646.093306] ata4.00:错误:{ ICRC ABRT }
10 月 2 日 22:11:21 jupiter 内核:[439646.093353] ata4:软重置链接
Oct 2 22:11:21 jupiter 内核:[439646.265242] ata4.00:为 UDMA/133 配置
10 月 2 日 22:11:21 木星内核:[439646.265268] ata4:EH 完成
现在我想知道要更换哪个磁盘。但是我找不到“ataX.YZ”和 /dev/disk/ 条目之间的任何明确映射。
您应该从 dmesg 获得更多信息:
dmesg | grep ata
Run Code Online (Sandbox Code Playgroud)
就像是:
[ 2.345126] ata2.00: ATA-8: WDC WD20EARX-00PASB0, 51.0AB51, max UDMA/133
Run Code Online (Sandbox Code Playgroud)
那将是我的 Wester Digital 硬盘。
如果您有一个型号的多个驱动器,这是一种方法(当上述方法无济于事时):
查找从 SCSI 主机到 ata* ID 的映射:
$ egrep "^[0-9]{1,}" /sys/class/scsi_host/host*/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
Run Code Online (Sandbox Code Playgroud)查找从 SCSI 主机到 sd* ID 的映射:
$ ls -l /sys/block/sd*
... /sys/block/sda -> ../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda
... /sys/block/sdb -> ../devices/pci0000:00/0000:00:1f.2/host1/target1:0:0/1:0:0:0/block/sdb
Run Code Online (Sandbox Code Playgroud)现在您可以通过 host* 标识符链接这两个结果。因此,如果在这种情况下我遇到 ata2 问题,我会寻找 unique_id 2 吗?host1,然后哪个 sd* 是 host1 ?数据表。
我也试图想出一个单线。不知道这是否健壮。您首先必须将 ata* 设置为变量:
FAIL=ata1
Run Code Online (Sandbox Code Playgroud)
然后运行:
echo "$FAIL -> $(ls -l /sys/block/ | grep $(grep "^$(echo $FAIL | cut -c 4-)" /sys/class/scsi_host/host*/unique_id | sed "s/.*\(host[0-9]\{1,\}\).*/\1/") | awk '{print $8}')"
Run Code Online (Sandbox Code Playgroud)
应该返回如下内容:
ata1 -> sda
Run Code Online (Sandbox Code Playgroud)在我的一些服务器中,一台 scsi_host 上有两个或多个设备。我不知道它是否正确,但我认为它可以通过目标来区分并且它对我有用:
ls -l /sys/block/sd*
lrwxrwxrwx 1 root root 0 2012-02-08 08:15 /sys/block/sda -> ../devices/pci0000:00/0000:00:01.0/0000:01:00.0/host3/target3:0:0/3:0:0:0/block/sda
lrwxrwxrwx 1 root root 0 2012-02-08 08:15 /sys/block/sdb -> ../devices/pci0000:00/0000:00:1f.2/host6/target6:0:0/6:0:0:0/block/sdb
lrwxrwxrwx 1 root root 0 2012-02-08 08:15 /sys/block/sdc -> ../devices/pci0000:00/0000:00:1f.2/host7/target7:0:0/7:0:0:0/block/sdc
lrwxrwxrwx 1 root root 0 2012-02-08 08:15 /sys/block/sdd -> ../devices/pci0000:00/0000:00:1f.2/host8/target8:0:0/8:0:0:0/block/sdd
lrwxrwxrwx 1 root root 0 2012-02-08 08:15 /sys/block/sde -> ../devices/pci0000:00/0000:00:1f.2/host9/target9:0:0/9:0:0:0/block/sde
lrwxrwxrwx 1 root root 0 2012-02-08 08:15 /sys/block/sdf -> ../devices/pci0000:00/0000:00:1f.2/host10/target10:0:0/10:0:0:0/block/sdf
lrwxrwxrwx 1 root root 0 2012-02-08 08:15 /sys/block/sdg -> ../devices/pci0000:00/0000:00:1f.2/host11/target11:0:0/11:0:0:0/block/sdg
lrwxrwxrwx 1 root root 0 2012-02-08 08:15 /sys/block/sdh -> ../devices/pci0000:00/0000:00:1c.4/0000:04:00.0/host13/target13:0:0/13:0:0:0/block/sdh
lrwxrwxrwx 1 root root 0 2012-02-08 08:15 /sys/block/sdi -> ../devices/pci0000:00/0000:00:1c.4/0000:04:00.0/host13/target13:0:1/13:0:1:0/block/sdi
Run Code Online (Sandbox Code Playgroud)
简单的 bash 脚本:
#!/bin/bash
#inspired by http://askubuntu.com/questions/64351/how-to-match-ata4-00-to-the-apropriate-dev-sdx-or-actual-physical-disk
for d in /sys/block/sd*
do
s=`basename $d`
h=`ls -l $d | egrep -o "host[0-9]+"`
t=`ls -l $d | egrep -o "target[0-9:]*"`
a2=`echo $t | egrep -o "[0-9]:[0-9]$" | sed 's/://'`
a=`cat /sys/class/scsi_host/$h/unique_id`
echo "$s -> ata$a.$a2"
done
Run Code Online (Sandbox Code Playgroud)
它的输出:
sda -> ata4.00
sdb -> ata7.00
sdc -> ata8.00
sdd -> ata9.00
sde -> ata10.00
sdf -> ata11.00
sdg -> ata12.00
sdh -> ata14.00
sdi -> ata14.01
Run Code Online (Sandbox Code Playgroud)