如何停止并修复发生故障且I / O挂起的RAID 5arrays?

短版本 :我有一个失败的RAID 5arrays,有一堆进程挂起等待I / O操作; 我怎么能从这恢复?

长版本 :昨天我注意到桑巴进入是非常零星的; 从Windows访问服务器的共享将在点击一个或两个目录后,完全随机locking资源pipe理器。 我认为这是Windows是一个痛苦,离开了它。 今天的问题是一样的,所以我做了一点挖掘。 我注意到的第一件事就是运行ps aux | grep smbd 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" ps aux | grep " D"显示了一些其他进程,包括我的夜间备份脚本,所有这些都需要在某个时刻访问安装在RAIDarrays上的卷。 一些谷歌search后,我发现它可能是RAIDarrays失败,所以我检查/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失败了,所以arrays在三个“向上”中运行两个驱动器。 我发现一些build议说,检查/ 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失败了,我需要停止arrays,关机,取代它,重新启动,然后修复arrays,使其恢复和挂载文件系统。 我无法热插拔replace驱动器,也不希望使arrays在降级状态下运行。 我相信我应该在停止数组之前卸载文件系统,但那是失败的,那就是我现在被卡住的地方:

 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。

我该怎么办? 我应该杀死所有这些进程,然后再试一次吗? 当他们“不可中断”的时候,这是一个明智的举动吗? 如果我尝试重新启动会发生什么?

请让我知道你应该怎么做。 并请询问您是否需要任何额外的信息来诊断问题或帮助!

我不认为你需要停止arrays。 只要失败/ dev / sdb,删除它(我想这是一个可插拔的硬盘驱动器),并插入一个新的驱动器,你会声明为热备份。

你不能杀死正在尝试I / O的进程。 你需要做的是使用umount命令的lazy选项从文件系统命名空间中删除文件系统,即使文件仍然处于打开状态。 有关这方面的更多信息(以及这方面的Linuxdevise的其他“怪癖”),请参阅Neil Brown 。

 umount -l /storage 

您也可以停止samba进程,这将停止写入磁盘,并允许当前写入完成,而不是卸载正在写入的文件系统。