將新磁碟新增至伺服器後 zpool 不可用(掛載點已變更)

將新磁碟新增至伺服器後 zpool 不可用(掛載點已變更)

我有一台運行 Proxmox 的家庭伺服器,帶有兩個 zpool。我想用新的硬碟替換現有的硬碟較小的池。但是當我插入兩個新 SATA 硬碟之一時,我的 zpool 無法運作。日誌顯示缺少一個重要的磁碟。當我發送新磁碟時,一切正常。

我發現我的新的磁碟已安裝至sda.但是,當新磁碟未插入時,現有 zpool 中的舊磁碟也會被掛載sda。我需要告訴 linux sdazpool 是為舊磁碟保留的,它應該用於sdg新磁碟。

我很困惑這種行為竟然會發生。因此,linux 似乎沒有像 Windows 中的磁碟機號碼那樣將掛載點綁定到磁碟機。我認為使用掛載點是一個錯誤,我應該在 zpool 中使用一些唯一識別碼(UUID?)。但我該怎麼做呢?我有現有的 zfs 池,我在其中使用了掛載點。

答案1

有關該問題的一些背景知識

經過一番研究和嘗試,我發現 zfs 使用了掛載點。所以我的理論是正確的:掛載點不像 Windows 中的磁碟機代號一樣是靜態的。相反,Linux 按照啟動期間偵測到的順序分配它們。新增或刪除磁碟可能會混合安裝點。

簡單的例子:

sda -> Drive #1
sdb -> Drive #2
sdc -> Drive #3

現在我們新增一個新的磁碟機#4。可以這樣插入:

sda -> Drive #1
sdb -> Drive #4
sdc -> Drive #2
sde -> Drive #3

如果我們依賴安裝點,我們現在就遇到麻煩了:我們的系統期望驅動器#2在 中sdb,但得到了一個完全不同的驅動器(驅動器#4)。根據 arch wiki,這甚至可能在常規啟動期間發生,沒有對硬碟的任何變更。

我們可以做什麼?

嗯,使用這些掛載點似乎是個壞主意。我們應該使用持久性區塊設備命名相反,可以使用 udev 來使用它們。它應該可以在任何現代 Linux 發行版上使用。持久性區塊名稱不使用中性名稱,例如sdasdb。相反,它會建立某種名稱,這些名稱永久綁定到磁碟機。它們與 Windows 中的磁碟機號碼相當(是的,請記住,磁碟機號碼綁定到分割區,其中區塊名稱識別磁碟機,但它們都是持久的!)。

by-id似乎by-uuid與解決這個問題最相關,但還有其他問題。您可以在 Arch 的連結 wiki 頁面中閱讀更詳細的解釋。這是一篇通用文章,也適用於其他發行版。對於這個問題,重要的是要知道,這uuids是一種產生的唯一 ID。我們可以將其用作ids更好的可讀替代方案,因為它們使用的是硬碟特定訊息,例如製造商、型號和序號。

ZFS

作為此處描述,需要匯出所有池,然後重新匯入它們,但需要切換-d。它告訴 zpool 在哪裡尋找設備:

zpool export <poolname>
zpool import -d /dev/disk/by-id <poolname>

使用zpool status此功能可以進行驗證:在匯出/匯入之前,您應該會看到/dev/sda裝置的安裝點。在這些過程之後,這應該會更改為磁碟 ID。

常規卷(可選)

對我來說這還不夠:我還有一個名為緩衝對於 ISO 映像之類的東西。沒有重要數據,只是為了緩解我的SSD。所以這是一本經典的 ext3 卷。這會阻止我的伺服器啟動,因為這裡發生了完全相同的問題:安裝點發生了新磁碟的更改,導致安裝失敗。

我透過簡單地刪除該驅動器解決了這個問題。無論如何,這是我的想法,因為新的硬碟足夠大,我可以透過減少光碟來節省一些能源。為此,我們必須使用/etc/pve/storage.cfgfile 從 proxmox 中刪除儲存。就我而言,相關部分如下所示:

dir: buffer
path /buffer
content iso

拆下來之後,我們來看看/etc/fstab。該文件安裝了我們的/buffer捲,根本原因發生在此:

/dev/sdf /buffer ext3 rw 0 0

如您所見,掛載點/dev/sdf位於此處。如果您不想像我一樣拒絕磁碟,只需在此處使用唯一的安裝點即可!例如 /dev/disk/by-id。這是持久性區塊設備名稱的範例。它們是根據設備相關數據產生的。by-id例如使用硬體序號。所以我們甚至可以設備兩個相同的磁碟。請閱讀第一段中的更多背景資訊。

就我而言,只需刪除此行即可阻止 linux 掛載我的硬碟。如果您有更多卷,則需要對每個卷重複這些步驟,以確保重新啟動後不會遇到任何問題。

相關內容