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

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

几年来,我们一直在一台装有定制 Linux 2.6.31 的旧 Gentoo 机器上运行软件 RAID1。该 RAID 由 2 个硬盘组成,每个硬盘有 4 个分区。在过去的几年里,磁盘从阵列中被丢弃的情况发生了 3-4 次。但每次都badblocks没有报告错误,我能够像这样重新激活磁盘

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

这次情况有所不同:mdadm过去 24 小时内报告了 2 个故障分区,均位于同一磁盘上sda。我再次运行badblocks但未成功:它报告了 0 个坏块。如果我尝试将故障磁盘重新添加到阵列,它每次都会出现相同的错误:

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它不会显示任何重新分配的扇区,因此我认为我可以使用我找到的方法强制重新分配这里

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

我谷歌了一下这条status: { DRDY ERR }消息,有人说这可能是内核错误。但后来我想知道为什么现在才开始发生这种情况。过去几年系统没有发生任何变化。

但有一件事仍然困扰着我:smartctl -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 重新同步失败的扇区?为什么磁盘在确实检测到错误时不首先尝试重新分配损坏的扇区?

答案1

如果按照您的评论,错误一直发生在同一扇区,那么这就是磁盘问题,由于某种原因,磁盘在那里写入时超时(基于智能错误日志),并且无法重新分配它,或者由于某些未知原因它决定不重新分配。

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

您唯一的选择是尝试明确写入扇区,同时在磁盘上设置非常大的超时。您可以通过将 /sys/block/sdX/device/eh_timeout 设置为较大的值来控制磁盘超时,甚至可以高达 600 秒(5 分钟)。这可以帮助写入错误位置并避免每次都中止请求。

答案2

您有 RAID1,因此不会丢失任何数据。我会更换磁盘并再次重新同步。

相关内容