简短版本:我的 RAID 5 阵列出现故障,其中有一堆进程挂起,等待 I/O 操作;我该如何恢复?
长版本:昨天我注意到 Samba 访问非常不稳定;从 Windows 访问服务器的共享会在单击一两个目录后随机完全锁定资源管理器。我认为这是 Windows 的问题,所以就不管了。今天问题还是一样,所以我做了一些调查;我注意到的第一件事是运行会ps aux | grep smbd
给出很多这样的行:
ben 969 0.0 0.2 96088 4128 ? D 18:21 0:00 smbd -F
root 1708 0.0 0.2 93468 4748 ? Ss 18:44 0:00 smbd -F
root 1711 0.0 0.0 93468 1364 ? S 18:44 0:00 smbd -F
ben 3148 0.0 0.2 96052 4160 ? D Mar07 0:00 smbd -F
...
有很多进程卡在“D”状态。运行ps aux | grep " D"
显示一些其他进程,包括我的夜间备份脚本,所有这些进程都需要在某个时候访问安装在我的 RAID 阵列上的卷。经过一番谷歌搜索,我发现这可能是由于 RAID 阵列出现故障,所以我检查了/proc/mdstat
,结果显示:
ben@jack:~$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid5 sdb1[3](F) sdc1[1] sdd1[2]
2930271872 blocks level 5, 64k chunk, algorithm 2 [3/2] [_UU]
unused devices: <none>
运行后结果mdadm --detail /dev/md0
如下:
ben@jack:~$ sudo mdadm --detail /dev/md0
/dev/md0:
Version : 00.90
Creation Time : Sat Oct 31 20:53:10 2009
Raid Level : raid5
Array Size : 2930271872 (2794.53 GiB 3000.60 GB)
Used Dev Size : 1465135936 (1397.26 GiB 1500.30 GB)
Raid Devices : 3
Total Devices : 3
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Mon Mar 7 03:06:35 2011
State : active, degraded
Active Devices : 2
Working Devices : 2
Failed Devices : 1
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 64K
UUID : f114711a:c770de54:c8276759:b34deaa0
Events : 0.208245
Number Major Minor RaidDevice State
3 8 17 0 faulty spare rebuilding /dev/sdb1
1 8 33 1 active sync /dev/sdc1
2 8 49 2 active sync /dev/sdd1
我认为这说明 sdb1 出现故障,因此阵列正在运行,三个驱动器中有两个处于“正常运行”状态。我发现一些建议是检查 /var/log/messages 以查找故障通知,果然有很多:
ben@jack:~$ grep sdb /var/log/messages
...
Mar 7 03:06:35 jack kernel: [4525155.384937] md/raid:md0: read error NOT corrected!! (sector 400644912 on sdb1).
Mar 7 03:06:35 jack kernel: [4525155.389686] md/raid:md0: read error not correctable (sector 400644920 on sdb1).
Mar 7 03:06:35 jack kernel: [4525155.389686] md/raid:md0: read error not correctable (sector 400644928 on sdb1).
Mar 7 03:06:35 jack kernel: [4525155.389688] md/raid:md0: read error not correctable (sector 400644936 on sdb1).
Mar 7 03:06:56 jack kernel: [4525176.231603] sd 0:0:1:0: [sdb] Unhandled sense code
Mar 7 03:06:56 jack kernel: [4525176.231605] sd 0:0:1:0: [sdb] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
Mar 7 03:06:56 jack kernel: [4525176.231608] sd 0:0:1:0: [sdb] Sense Key : Medium Error [current] [descriptor]
Mar 7 03:06:56 jack kernel: [4525176.231623] sd 0:0:1:0: [sdb] Add. Sense: Unrecovered read error - auto reallocate failed
Mar 7 03:06:56 jack kernel: [4525176.231627] sd 0:0:1:0: [sdb] CDB: Read(10): 28 00 17 e1 5f bf 00 01 00 00
对我来说,很明显设备 sdb 已发生故障,我需要停止阵列、关机、更换它、重新启动,然后修复阵列、将其恢复并安装文件系统。我无法热插拔替换驱动器,并且不想让阵列在降级状态下运行。我相信我应该在停止阵列之前卸载文件系统,但这样做失败了,这就是我现在陷入困境的地方:
ben@jack:~$ sudo umount /storage
umount: /storage: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
它确实很忙;大约有 30 或 40 个进程正在等待 I/O。
我该怎么办?我应该终止所有这些进程并重试吗?当它们是“不可中断”时,这是一个明智的举动吗?如果我尝试重新启动会发生什么?
请告诉我你认为我应该怎么做。如果您需要任何额外的信息来诊断问题或提供帮助,请随时询问!
答案1
我认为您不需要停止阵列。只需使 /dev/sdb 故障,将其移除(我猜想它是可插拔硬盘),然后插入一个您将声明为热备用的新驱动器。
答案2
您无法终止正在尝试 I/O 的进程。您需要做的是使用懒惰的选项卸载命令将文件系统从文件系统命名空间中删除,即使其中的文件仍处于打开状态。有关此问题(以及 Linux 设计此方面的其他“怪癖”)的更多信息,请参阅尼尔·布朗。
umount -l /storage
答案3
您还可以停止 samba 进程,这将停止对磁盘的写入并允许当前写入完成,而不是卸载正在写入的文件系统。