永久掛載:一行設定就能讓機器無法開機

手動建立的掛載在重新啟動後就會消失,而要讓它永久生效,必須經過一個決定機器能否開機的檔案。那裡有一行錯誤,停掉的不是某個服務,而是整台機器。

AtlasPVE ·

本條目涵蓋以下問題

  • proxmox fstab 永久掛載
  • proxmox 重新啟動後磁碟消失
  • proxmox fstab 無法開機
  • nofail 是什麼
  • proxmox nfs 永久掛載

手動掛載一顆磁碟或一個網路儲存,運作正常。機器重新啟動後,它就不見了。

解法顯而易見:在開機時要掛載的清單中加一行。而危險正是從這裡開始的。

這個檔案和其他檔案不一樣

伺服器上大多數設定檔損毀時,會讓某個服務無法運作。這個檔案損毀時,機器可能無法開機。

結果不是服務停擺,而是系統掉進救援 shell。到了這個地步就無法遠端連線;需要鍵盤和螢幕,或實體主控台。

沒人注意到的不對稱

網路設定損毀很惱人:會失去遠端存取。但機器仍然能開機。

掛載設定中有一行損毀,卻可能讓機器完全無法開機。

然而人們在編輯網路設定檔時反而謹慎得多。危險的順序和直覺相反,而錯的正是直覺。

三條規則

寫入前先驗證結構。一行至少需要三個欄位:來源、目標和檔案系統類型。缺少欄位的行,會讓每個讀取這個檔案的工具出問題。

以原子方式寫入。在這個檔案裡,寫了一半比完全不寫更糟:留下的是一個被截斷的檔案,而機器會試著用它開機。

不讓缺席的磁碟挾持整台機器。對於網路儲存和可移除磁碟,使用掛載失敗時仍讓開機繼續的選項。備份磁碟沒插上,不是伺服器無法開機的理由。

驗證陷阱:當掉的檢查不等於通過

本文最具普遍性的教訓就在這裡,而且不只適用於這個檔案。

有一個用來驗證這個檔案的標準工具。在真實機器上量測時,出現了這樣的結果:這個工具遇到少於三欄的行就會當掉。也就是說,它恰好在看到自己應該抓出的錯誤格式時崩潰。

驗證工具當掉,不代表驗證通過。正確的答案不是沒有問題,而是無法驗證。

不做這項區分的流程,會在最危險的檔案最脆弱的時刻核准它。

第二個陷阱:並非每項抱怨都是錯誤

同一個驗證工具可能說出兩種不同的話,把它們混為一談會製造新的問題。

格式錯誤代表檔案無法讀取。這確實危險,寫入應該被回復。

語意上的抱怨則不同:例如開機時無法連到目標,或未知的檔案系統類型。這些不會損毀檔案,而且可能是合理的。替尚未接上的裝置加一行,是常見且正確的做法;讓開機繼續的選項正是為此而存在。

把兩者放進同一個籃子的檢查,會拒絕一行全新且完全有效的設定。換句話說,過於嚴格的關卡會讓工作無法完成,並迫使人們把關卡關掉。

Atlas 的做法

在 Atlas 中,對這個檔案的每一次寫入都經過同一道門。每一行在寫入前都會檢查結構,寫入以原子方式進行,寫入後會重新讀取檔案加以驗證;如果沒有出現預期的結果,就還原先前的狀態。

上面兩個陷阱都經過刻意處理。外部驗證工具只算是次要訊號:如果它當掉,結果不是乾淨,而是無法驗證。格式錯誤和語意抱怨也分開處理;只有格式錯誤會導致回復,語意抱怨則不會被吞掉,而是回報給呼叫端。

這項區分的必要性同樣是量測發現的:在第一個版本中兩者都會導致回復,在那種狀態下連一行全新且完全有效的設定都會被拒絕。

關於歷史的坦白說明:產品過去從八個不同的地方寫入這個檔案,而且沒有一處檢查寫入的內容是否有效;其中兩處還以非原子的方式覆寫整個檔案。在同一個產品中,不會讓機器無法開機的網路設定檔,反而是以原子方式寫入的。也就是說,比較危險的檔案反而受到較少的保護。這一點經過量測後,已收攏到同一道門之後。

資料來源

Proxmox 官方文件。內容為英文,且在此主題上以官方文件為準。

相關條目

這項工作在 Atlas 中是什麼樣子?

前往產品頁面