给定内核 ATA 异常,如何确定哪个物理磁盘受到影响?

use*_*ser 20 linux logs kernel sata disk

我今天早上醒来收到一封通知电子邮件,其中包含一些令人不安的系统日志条目。

Dec  2 04:27:01 yeono kernel: [459438.816058] ata2.00: exception Emask 0x0 SAct 0xf SErr 0x0 action 0x6 frozen
Dec  2 04:27:01 yeono kernel: [459438.816071] ata2.00: failed command: WRITE FPDMA QUEUED
Dec  2 04:27:01 yeono kernel: [459438.816085] ata2.00: cmd 61/08:00:70:0d:ca/00:00:08:00:00/40 tag 0 ncq 4096 out
Dec  2 04:27:01 yeono kernel: [459438.816088]          res 40/00:00:00:4f:c2/00:00:00:00:00/40 Emask 0x4 (timeout)
Dec  2 04:27:01 yeono kernel: [459438.816095] ata2.00: status: { DRDY }
  (the above five lines were repeated a few times at a short interval)
Dec  2 04:27:01 yeono kernel: [459438.816181] ata2: hard resetting link
Dec  2 04:27:02 yeono kernel: [459439.920055] ata2: SATA link down (SStatus 0 SControl 300)
Dec  2 04:27:02 yeono kernel: [459439.932977] ata2: hard resetting link
Dec  2 04:27:09 yeono kernel: [459446.100050] ata2: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
Dec  2 04:27:09 yeono kernel: [459446.314509] ata2.00: configured for UDMA/133
Dec  2 04:27:09 yeono kernel: [459446.328037] ata2.00: device reported invalid CHS sector 0
  ("reported invalid CHS sector 0" repeated a few times at a short interval)
Run Code Online (Sandbox Code Playgroud)

我每晚将我的整个系统完整备份到一个外部(USB 连接)驱动器,上面的事情发生在备份运行的中间。(备份从 04:00 通过 cron 开始,今晚记录的完成时间在 04:56 之前。)备份过程本身声称已完成且没有任何错误。

我的系统上有两个内部连接的 SATA 驱动器和两个外部 (USB) 连接的驱动器;其中一个外部驱动器目前处于休眠状态。我不记得哪些物理 SATA 端口用于哪些内部驱动器。

谷歌搜索时我发现了 AskUbuntu 问题 这是驱动器故障还是其他问题?这表明在将 8-10 GB 复制到驱动器后发生了非常相似的错误,但实际故障模式不同,因为驱动器切换到只读状态。唯一真正的相似之处是我昨晚确实将 7-8 GB 的数据添加到了我的主存储中,这些数据会在发生错误的时间前后进行备份。

smartd没有在任何一个内部驱动器上报告任何异常。不幸的是 smartctl 不会说外部备份驱动器的 USB 桥接器的语言,只是抱怨Unknown USB bridge [0x0bc2:0x3320 (0x100)]. 谷歌搜索那个特定的错误显然没有帮助。

我的主要数据存储以及备份都在 ZFS 上并zpool status报告 0 错误并且没有已知数据错误。尽管如此,我还是对内部和外部驱动器进行了全面清理。目前,内部驱动器(主存储池)预计在大约 6 小时内完成,备份驱动器将在 13-14 小时内完成。

看来下一步应该是确定哪个驱动器有问题,并可能更换它。该ata2.00部分可能会告诉我哪个驱动器有问题,但如何将该标识符映射到物理驱动器?

小智 15

我根据 Tobi Hahn 的回答写了一行。

例如,您想知道 ata3 代表什么设备:

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

它会产生这样的东西

lrwxrwxrwx 1 root root 0 Jan 15 15:30 /sys/block/sde -> ../devices/pci0000:00/0000:00:1f.5/host2/target2:0:0/2:0:0:0/block/sde
Run Code Online (Sandbox Code Playgroud)


cas*_*sey 9

使用这个命令:

ls -l /sys/block/sd* | sed 's/.*\(sd.*\) -.*\(ata.*\)\/h.*/\2 => \1/'
Run Code Online (Sandbox Code Playgroud)

在我的系统上,这会产生输出:

ata1 => sda
ata2 => sdb
ata3 => sdc
ata4 => sdd
ata7 => sde
ata8 => sdf
Run Code Online (Sandbox Code Playgroud)

即使所有磁盘都具有相同的驱动器型号(这 6 个磁盘之间只有两种不同的型号),这也将起作用。请注意,这取决于 sysfs 命名并在我的内核 3.10.17 中工作。我知道在过去的某个时候检索映射并不是那么干净,但我不确定这将适用于什么最早的内核版本。

如果它对您不起作用,请参阅此链接以了解确定映射的更迂回的方式:http : //www.miriup.de/index.php? option = com_content&view = article& id= 84: mapping- linux- kernel- ata-errors-to-a-device&catid=8:linux&Itemid=25

  • @MichaelKjörling 该符号链接让您知道 sda 与 host1 相关联。现在看看`cat /sys/devices/pci0000:00/0000:00:11.0/host1/scsi_host/host1/unique_id`。无论您看到什么数字,都是 sda 的 ata#。您可以检查其他驱动器,只需确保第二个文件名中的 pci 地址和主机# 与第一个符号链接中的匹配。 (2认同)

use*_*ser 7

事实证明,做映射比我意识到的要容易。

dmesg | grep ata2 | head在引导过程中给出内核对驱动器的映射。或者你可以ata2.00马上去。

[    2.448300] ata2: SATA max UDMA/133 abar m1024@0xfeb0b000 port 0xfeb0b180 irq 19
[    2.940139] ata2: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
[    2.942143] ata2.00: ATA-8: ST31000340NS, SN05, max UDMA/133
[    2.942149] ata2.00: 1953525168 sectors, multi 16: LBA48 NCQ (depth 31/32)
[    2.944573] ata2.00: configured for UDMA/133
  (and some stuff I'd rather never have to see about drive errors)
Run Code Online (Sandbox Code Playgroud)

如您所见,其中一行包含我的驱动器型号 ( ST31000340NS),然后我可以使用它来映射到/dev文件:

$ readlink /dev/disk/by-id/*ST31000340NS* | head -n1
../../sda
Run Code Online (Sandbox Code Playgroud)