几年来,我们一直在一台装有定制 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,因此不会丢失任何数据。我会更换磁盘并再次重新同步。