Miklix

在 Ubuntu 上更換 mdadm 陣列中的故障磁碟機

已發佈: 2025年2月15日 晚上10:02:39 [UTC]
最後更新: 2026年1月12日 上午8:50:06 [UTC]

如果您不幸遇到 mdadm RAID 陣列中的硬碟發生故障的情況,本文將說明如何在 Ubuntu 系統上正確更換硬碟。


該頁面是由英語機器翻譯而來的,以便盡可能多的人可以訪問。不幸的是,機器翻譯還不是一項完善的技術,因此可能會出現錯誤。如果您願意,可以在這裡查看原始英文版本:

Replacing a Failed Drive in an mdadm Array on Ubuntu

本文資訊基於 Ubuntu 18.04 及其軟體倉庫中包含的 mdadm 版本;撰寫本文時,該版本為 v4.1-rc1。對於其他版本,這些資訊可能有效,也可能無效。

最近我的家用檔案伺服器突然出現硬碟故障,這台伺服器由九塊硬碟組成,採用的是 mdadm RAID-6 陣列。這種情況總是很嚇人,但幸運的是,我很快就找到了替換硬碟,第二天就送到了,所以我可以開始重建系統了。

說實話,當初搭建檔案伺服器的時候我確實有點摳門;只有兩塊硬碟是真正的NAS專用硬碟(希捷IronWolf),其餘的都是桌上型硬碟(希捷Barracuda)。不出所料,其中一塊桌上型硬碟壞了(雖然用了快三年了)。它徹底死機了;我把它裝到桌上USB硬碟盒裡,結果只聽到令人不安的咔噠聲,Ubuntu 20.04和Windows 10都檢測不到它。

好吧,接下來是更換硬碟的部分(沒錯,我買的新硬碟是IronWolf,吸取教訓了)——在運行中的陣列中丟失硬碟固然可怕,但如果你不知道正確的更換步驟,那就更可怕了。這並非我第一次在mdadm陣列中更換故障硬碟,但幸運的是這種情況非常罕見,所以我通常只需要查閱正確的命令。這次我決定自己寫個小指南,以便將來參考。

首先,當你收到 mdadm 的故障事件郵件時,你需要確定是哪個磁碟機出了問題。郵件裡會顯示裝置名稱(我的例子中是 /dev/sdf),但你可能很難看出它實際對應的是哪個實體驅動器,因為這些名稱在機器啟動時可能會改變。

如果您甚至不確定哪個裝置名稱發生故障,可以使用下列命令來尋找(將 /dev/md0 替換為您的 RAID 裝置):

mdadm -–query -–detail /dev/md0

如前所述,我的情況是 /dev/sdf,所以我們繼續從這裡入手。

然後,您可以嘗試執行以下命令來尋找故障硬碟的序號:

smartctl -–all /dev/sdf | grep -i 'Serial'

(如果找不到 smartctl,則需要在 Ubuntu 上安裝 smartmontools 軟體包)

然後可以將序號與硬碟物理標籤上的序號進行比較,以確定哪個硬碟出現故障。

不過這次我就沒那麼幸運了。硬碟徹底壞了,連SMART資訊和其他資料都無法提供,包括序號。

由於我可以實際接觸到伺服器(如果你要自己更換硬碟,這確實是必不可少的 ;-)),而且硬碟故障時伺服器正在運行(由於 RAID 6 冗餘,伺服器仍然運作良好),所以我採用了一種非常原始但實際上非常有效且顯而易見的方法:向伺服器複製一個大文件,然後觀察哪個硬碟的指示燈沒有閃爍。幾秒鐘之內,我就找到了罪魁禍首。

在拔出實體硬碟之前,最好先正式通知 mdadm 此意圖,方法是發出以下命令(請根據實際情況將裝置名稱替換為您自己的名稱):

mdadm -–manage /dev/md0 -–remove /dev/sdf1

成功後,mdadm 會回覆一則訊息,表示它「熱移除」了驅動器,顯然是因為虛擬 RAID 裝置當時正在運作。

如果出現類似「裝置或資源忙碌」的錯誤訊息,則可能是 mdadm 實際上尚未將磁碟機標記為完全故障。要使其標記為完全故障,請執行以下命令(同樣,請記住將設備名稱替換為您自己的設備名稱):

mdadm --manage /dev/md0 --fail /dev/sdf

之後,您應該能夠使用先前的命令從陣列中移除該設備。

現在是時候更換硬碟了。如果您非常非常確定您的機器和控制器支援熱插拔,那麼您可以在不關機的情況下進行更換。對於運行在真正可靠的伺服器硬體上的關鍵生產系統,並且您確信這些硬體能夠承受熱插拔,那麼熱插拔是最佳選擇。不過,我的家用檔案伺服器使用的是消費級桌面主機板,PCIe 插槽裡插著幾個不知名的 SATA 控制器,用來提供更多的 SATA 介面。

雖然 SATA 通常支援熱插拔,但在這個配置下我不想冒任何風險,所以我選擇在更換硬碟時關閉機器。

在此之前,最好先註解掉 `/etc/fstab` 檔案中的 RAID 設備,這樣 Ubuntu 就不會在下次啟動時自動嘗試掛載它,否則可能會因為 RAID 陣列降級而導致系統卡死並強制進入復原模式。如果是桌面系統,這可能不是什麼大問題,但我的伺服器是無頭運行的,沒有連接顯示器或鍵盤,所以這樣做會比較麻煩。

安裝新硬碟後啟動電腦,使用 lsblk 或其他方法識別硬碟名稱。如果您沒有更改其他任何設置,新硬碟的名稱很可能(但不一定)與您更換的舊硬碟相同。我的情況就是這樣,所以新硬碟也叫 /dev/sdf。

由於我的陣列是基於分區而非實體設備的,所以我需要將分區表從一台正常工作的硬碟複製到新硬碟,以確保它們完全相同。如果你的陣列運作在實體設備上,則可以跳過此步驟。

我使用 sgdisk 工具將分割表從 /dev/sdc 複製到 /dev/sdf。請務必根據實際情況取代設備名稱。

注意這裡的順序:要先列出“目標”驅動器!這對我來說有點違反直覺,但一定要確保順序正確,以免陣列中出現其他驅動器故障 ;-)

sgdisk -R /dev/sdf /dev/sdc

然後,為了避免 UUID 衝突,為新磁碟機產生新的 UUID:

sgdisk -G /dev/sdf

現在終於到了把新硬碟加入陣列,開始重建的時候了! (好吧,其實這算不上什麼派對,而是一個相當緩慢且令人不安的過程,因為你真的非常非常不想在這個時候再有一塊硬碟出問題。不過,啤酒或許能幫上忙。)

總而言之,要將新磁碟機新增至陣列中,請執行以下命令(同樣,請務必根據實際情況將裝置名稱替換為您自己的名稱):

mdadm -–manage /dev/md0 -–add /dev/sdf1

如果一切順利,這塊硬碟將順利添加到陣列中。我相信它預設是以「熱備盤」的形式添加的,但由於該陣列缺少一塊硬碟(故障的那塊),它會立即投入使用,並啟動重建過程。

你可以這樣關注它:

watch cat /proc/mdstat

這可能需要一些時間;在我那台配置較低的伺服器上(請注意,它主要基於消費級硬體和桌面級硬碟),速度勉強達到 100 MB/s。請記住,這是 RAID 6,因此重建過程中涉及大量的奇偶校驗計算;RAID 10 的速度會快得多。這台機器配備了 AMD A10 9700E 四核心 CPU(「E」表示它是低頻節能型,即速度不是很快),讓您對速度有個大致了解。我的配置中有九個 8TB 硬碟,整個重建過程耗時超過 24 小時。

重建過程中,您可以根據需要將檔案系統掛載到陣列上並像往常一樣使用它,但我建議在重建完成後再進行操作。請記住,如果一個硬碟發生故障,另一個硬碟可能很快也會發生故障,因此您需要盡快完成重建,以免在重建過程中出現其他硬碟故障。所以,請不要進行任何不必要的 I/O 操作。

完成後,將其添加回 /etc/fstab 文件,重新啟動系統,即可享用您的文件 :-)

分享至 Bluesky在 Facebook 分享在 LinkedIn 分享在 Tumblr 上分享分享至 X在 LinkedIn 分享固定在 Pinterest 上

Mikkel Christensen

關於作者

Mikkel Christensen
麥可 是 miklix.com 的創建者和所有者。他有超過 20 年的專業電腦程式設計師/軟體開發人員經驗,目前全職受僱於一家歐洲大型 IT 公司。不寫部落格時,他會將業餘時間花在各種各樣的興趣、愛好和活動上,這在一定程度上反映在本網站所涵蓋的主題的多樣性上。