Linux

如何停止和修復發生故障且 I/O 掛起的 RAID 5 陣列?

  • March 8, 2011

簡短版本:我有一個失敗的 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

引用自:https://serverfault.com/questions/244891