建好軟體 RAID 後重新啟動,儲存區卻不見了:陣列沒有在開機時組裝起來
磁碟沒問題,資料也還在,但儲存區不見了。缺少的不是磁碟上的東西,而是告訴系統開機時要組裝陣列的那份記錄。
AtlasPVE ·
本條目涵蓋以下問題
- proxmox 軟體 raid mdadm
- proxmox raid 陣列 開機時沒有組裝
- proxmox 重新啟動後 儲存空間 消失
- proxmox 支援 mdadm 嗎
- proxmox 用 raid 還是 zfs
磁碟組合好了,陣列啟動了,儲存區出現了,資料也寫進去了。一切都正常。
接著重新啟動機器,儲存區就不見了。
磁碟沒問題。資料也還在。少掉的是別的東西。
陣列不在磁碟上,而在組裝指令裡
把多顆磁碟呈現為單一儲存空間,並不是磁碟本身帶有的屬性。每次開機時,系統都必須找到這些磁碟,並把它們重新組合起來。
有一份記錄告訴系統該怎麼做。少了這份記錄,陣列可能不會被組裝。就算組裝了,也可能以不同的名稱出現,結果其實一樣:儲存區指向舊名稱,而那裡什麼都沒有。
所以問題不是資料遺失,而是開機時沒有建立通往資料的路徑。這聽起來沒那麼可怕,但在恐慌的當下,兩者感覺完全一樣。
Proxmox 自己的立場
這一點值得坦白說:Proxmox 內建且受支援的路徑是 ZFS。安裝時要求磁碟鏡像,得到的就是 ZFS。
傳統的軟體 RAID 可以運作,但不是安裝程式會自動設定好的路徑。這代表選擇它的時候,確認開機時的組裝步驟有正確完成,就是自己的責任。
在某些情況下它仍然合理:手上已經有一組陣列要遷移過來、控制器的配置不符合 ZFS 的預期,或是機器的記憶體對 ZFS 來說太吃緊。這些都是正當的理由。沒有這類理由卻選擇它,等於替未來的自己製造工作。
規則:沒經歷過重新啟動的陣列,不算是陣列
這是本文最實用的一句話。
建好陣列之後,趁還沒有任何東西依賴它時,刻意重新啟動一次。儲存區有沒有回來,回來時名稱是否相同,內容是否看得到。
本 wiki 的警示文章也寫過同樣的事:沒有測試過的警報不是機制,而只是一種希望。陣列也是一樣。沒有撐過重新啟動的陣列,只是相信它能運作的陣列。
名稱改變的陷阱
第二個常見陷阱:陣列組裝起來了,但名稱和上次不同。
儲存區定義指向舊名稱,所以儲存區又看不見了。這次陣列是啟動的,只是沒有人在看它。
解法是用識別碼而不是名稱來掛接儲存區。名稱可能改變,識別碼不會。
Atlas 的做法
Atlas 建立陣列時也會寫入開機記錄,並在畫面上顯示這則警告:如果這個步驟失敗,陣列可能不會在開機時組裝,儲存區就會看不見。
這則警告說的是實話。但有一段時間,它自己拆了自己的台。
產生這份記錄時呼叫的是系統本身的工具。經過實際測量,結果如下:完全沒有陣列時,那個工具以結束代碼零結束,而且什麼都不輸出。換句話說,它回報成功,卻什麼也沒交出來。
結果是:什麼都沒寫入,這個步驟卻被記錄為成功。警告剛剛描述的情況正發生在使用者身上,畫面卻顯示一切正常。
修正分成兩部分。預期的格式是透過實際測量而不是猜測來決定的,輸出不符合這個格式時,步驟就算失敗。空白輸出也算失敗。另外,為了避免同一個陣列被寫入兩次,會同時檢查裝置路徑和識別碼。
一般性的教訓
這裡最重要的一句話是:指令成功和工作完成,不是同一件事。
結束代碼說明的是工具有沒有執行。它說明不了結果是否真的出現。如果一個步驟的全部目的就是產生某個效果,該檢查的就不是工具的狀態,而是效果本身。
本 wiki 裡還有兩篇屬於同一類型的文章。孤立磁碟那篇文章區分了空白的答案與拿不到答案的失敗。伺服器名稱那篇文章談的則是把看似合理的預設值放在未知值位置的危險。這是第三種:把結束代碼放在一個從未確認過的結果所在的位置。
三者都是同一個缺陷的不同面貌:程式在陳述一件它沒有驗證過的事。
資料來源
Proxmox 官方文件。內容為英文,且在此主題上以官方文件為準。