如何停止和修復發生故障且 I/O 掛起的 RAID 5 陣列?
簡短版本:我有一個失敗的 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 陣列上的捲。經過一番Google搜尋,我發現它可能是由於 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。
我該怎麼辦?我應該殺死所有這些程序並重試嗎?當它們“不間斷”時,這是明智之舉嗎?如果我嘗試重新啟動會發生什麼?
請讓我知道你認為我應該怎麼做。請詢問您是否需要任何額外資訊來診斷問題或提供幫助!
我認為您不需要停止陣列。只需讓 /dev/sdb 失敗,將其移除(我想它是一個可插拔硬碟驅動器),然後插入一個您將聲明為熱備件的新驅動器。
您不能殺死正在嘗試 i/o 的程序。您需要做的是使用umount命令的**惰性選項從文件系統命名空間中刪除文件系統,即使其上的文件仍處於打開狀態。有關這方面的更多資訊(以及 linux 設計這一方面的其他“怪癖”),請參閱Neil Brown。
umount -l /storage