为什么我不能恢复显然没有错误的RAID1磁盘?

几年以来,我们使用定制的Linux 2.6.31在旧的Gentoo盒子上运行软件RAID1。 RAID由2个硬盘组成,每个硬盘4个分区。 在过去的几年里,它发生了大约3-4倍的磁盘抛出arrays。 但是,每次badblocks没有报告错误,我能够像这样重新激活磁盘

 mdadm /dev/md3 -r /dev/sda3 mdadm /dev/md3 -a /dev/sda3 

这一次情况不同: mdadm在过去的24小时内报告了2个错误的分区,都在同一个磁盘sda 。 我再次运行badblocks没有成功:报告0坏块。 如果我尝试将故障磁盘添加回arrays,则每次都会发生相同的错误:

 Mar 25 23:09:10 xen0 kernel: ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0 Mar 25 23:09:10 xen0 kernel: ata1.00: irq_stat 0x40000001 Mar 25 23:09:10 xen0 kernel: ata1.00: cmd ea/00:00:00:00:00/00:00:00:00:00/a0 tag 0 Mar 25 23:09:10 xen0 kernel: res 51/04:00:38:df:f7/00:00:00:00:00/a7 Emask 0x1 (device error) Mar 25 23:09:10 xen0 kernel: ata1.00: status: { DRDY ERR } Mar 25 23:09:10 xen0 kernel: ata1.00: error: { ABRT } Mar 25 23:09:10 xen0 kernel: ata1.00: configured for UDMA/133 Mar 25 23:09:10 xen0 kernel: ata1: EH complete Mar 25 23:09:10 xen0 kernel: end_request: I/O error, dev sda, sector 18297870 Mar 25 23:09:10 xen0 kernel: md: super_written gets error=-5, uptodate=0 Mar 25 23:09:10 xen0 kernel: md: md3: recovery done. Mar 25 23:09:10 xen0 kernel: RAID1 conf printout: Mar 25 23:09:10 xen0 kernel: --- wd:1 rd:2 Mar 25 23:09:10 xen0 kernel: disk 0, wo:1, o:0, dev:sda3 Mar 25 23:09:10 xen0 kernel: disk 1, wo:0, o:1, dev:sdb3 Mar 25 23:09:10 xen0 kernel: RAID1 conf printout: Mar 25 23:09:10 xen0 kernel: --- wd:1 rd:2 Mar 25 23:09:10 xen0 kernel: disk 1, wo:0, o:1, dev:sdb3 

这个部门总是一样的: 18297870 。 如果我检查smartctl -a /dev/sda的输出,它不显示任何重新分配的扇区,所以我可以用我在这里find的方法强制重新分配。

 hdparm --read-sector 18297870 /dev/sda hdparm --write-sector 18297870 --yes-i-know-what-i-am-doing /dev/sda 

但是通过上面的命令,磁盘根本不报告任何错误 – 因此不会重新分配扇区:

 smartctl -a /dev/sda | grep -i reall 5 Reallocated_Sector_Ct 0x0033 200 200 140 Pre-fail Always - 0 196 Reallocated_Event_Count 0x0032 200 200 000 Old_age Always - 0 

我search了status: { DRDY ERR }消息,有人说这可能是一个内核错误。 但是我想知道为什么现在才刚刚开始。 这个制度在过去几年没有改变。

有一件事仍然让我感到smartctl -a /dev/sdasmartctl -a /dev/sda也报告日志中的一些错误。 这总是一样的错误:

 Error 15 occurred at disk power-on lifetime: 39971 hours (1665 days + 11 hours) When the command that caused the error occurred, the device was active or idle. After command completion occurred, registers were: ER ST SC SN CL CH DH -- -- -- -- -- -- -- 04 51 00 38 df f7 a7 Commands leading to the command that caused the error were: CR FR SC SN CL CH DH DC Powered_Up_Time Command/Feature_Name -- -- -- -- -- -- -- -- ---------------- -------------------- ea 00 00 00 00 00 00 08 35d+12:17:45.571 FLUSH CACHE EXT 61 80 f0 0e 96 2d 00 08 35d+12:17:44.033 WRITE FPDMA QUEUED 61 80 e8 8e 95 2d 00 08 35d+12:17:44.033 WRITE FPDMA QUEUED 61 80 e0 0e 95 2d 00 08 35d+12:17:44.033 WRITE FPDMA QUEUED 61 80 d8 8e 94 2d 00 08 35d+12:17:44.033 WRITE FPDMA QUEUED 

这一切对我来说都没有意义:如果磁盘真的有问题,那我为什么可以成功读取和写入每次RAID重新同步失败的扇区? 为什么磁盘没有先尝试重新分配损坏的扇区,如果它真的检测到错误?

如果根据你的评论,错误总是发生在同一个扇区,而不是磁盘问题,由于某种原因,磁盘超时写入(根据智能错误日志),或者它不能重新分配它或它决定不重新分配一些未知的原因。

在SAS磁盘上,你可以使用一个明确的命令重新分配这个扇区,但是我不知道SATA中有这样的命令。

你唯一的select是在磁盘上设置一个非常大的超时的时候尝试写入扇区。 您可以通过将/ sys / block / sdX / device / eh_timeout设置为一个较大的值来控制磁盘超时,即使高达600秒(5分钟)也是如此。 这可以帮助写入不好的位置,并避免每次中止请求。

你有RAID1,所以你不会有任何数据丢失。 我会更换磁盘,并进行另一次重新同步。