Linux

第一次重新啟動後,MD 設備名稱更改為包含“HOSTNAME:”。如何獲得一致的名稱?

  • December 5, 2020

在 Ubuntu 18.04 上,我創建了一個 RAID 1 陣列,如下所示:

mdadm --create /dev/md/myarray --level=1 --run --raid-devices=2 /dev/sdc /dev/sdd

然後我將輸出添加mdadm --detail --scan /dev/md/myarray到 /etc/mdadm/mdadm.conf。它看起來像這樣:

ARRAY /dev/md/myarray metadata=1.2 name=MYHOSTNAME:myarray UUID=...

設備名稱以“MYHOSTNAME:”為前綴。此時符號連結/dev/md/myarray仍然存在,但在我第一次重新啟動後它變成了/dev/md/MYHOSTNAME:myarray,破壞了一些東西。更糟糕的是,這只發生在某些機器上——在其他機器上,符號連結仍然存在/dev/md/myarray。所有人都在執行 Ubuntu 18.04,所以我不知道為什麼。

如何為我的 MD 設備獲得一致的設備路徑,最好是我指定的確切路徑(“/dev/md/myarray”)?我嘗試編輯 mdadm.conf 以刪除主機名,但即使該行顯示

ARRAY /dev/md/myarray metadata=1.2 name=myarray UUID=...

重新啟動時符號連結仍然會發生變化 - 在“想要”主機名的機器上。我也嘗試過另一種方式並在兩個地方添加主機名:

ARRAY /dev/md/HOSTNAME:myarray metadata=1.2 name=HOSTNAME:myarray UUID=...

但再次在“不想要”主機名的機器上,符號連結在重新啟動後變為 /dev/md/myarray !

我也不能使用數字設備(/dev/md127),因為當有多個像這樣創建的 MD 設備時,它們也傾向於在 md126 和 md127 之間交替!這太瘋狂了!

如何為我的 MD 設備獲得一致的設備路徑,最好是我指定的確切路徑(“/dev/md/myarray”)?

之後mdadm --create /dev/md/foobar ...hostnamename都儲存在 mdadm 元數據中,您應該使用mdadm --examineor進行驗證mdadm --detail

# mdadm --detail /dev/md/foobar
          Name : ALU:foobar  (local to host ALU)

ALU恰好是我的 ArchLinux 機器的主機名:

# hostname
ALU

您可以指定應在創建時儲存的主機:

# mdadm --create /dev/md/foobar --homehost=barfoo
# mdadm --detail /dev/md/foobar
              Name : barfoo:foobar

…但通常沒有人記得這樣做。


這已經是問題開始的地方……您可能已經從一些 LiveCD 或其他設備創建了您的 RAID 陣列,並且該環境中的主機名與您的主安裝完全不匹配。然後元數據儲存一些完全不相關的主機名。

同樣,如果您正確設置了所有內容,但隨後遇到 RAID 問題並啟動救援系統進行檢查,那麼主機名再次不匹配。

或者相反,即使是錯誤的機器,主機名也可能匹配 - 如果您為兩個獨立的系統使用相同的主機名,然後遷移驅動器。然後外星人陣列接管了原始陣列的名稱……


現在,元數據也可以在以後使用mdadm --assemble --update=homehostor更改--update=name,這是處理問題的一種方法。它應該設置正確,但由於(出於某種原因)直接缺少十六進制編輯元數據很難更改,只能在組裝時完成。

另一種方法是忽略系統hostname,而是--homehost在程序集上指定或設置HOMEHOSTmdadm.conf. 這在 mdadm.conf 聯機幫助頁中有詳細描述。

HOMEHOST

homehost 行為 mdadm 提供了 –homehost= 選項的預設值。通常應該只有一個其他單詞。它應該是主機名,或者是特殊詞之一<system><none><ignore>。如果<system>給出,則 gethostname(2) 系統呼叫用於獲取主機名。這是預設設置。

$$ … $$

創建數組時,此主機名將儲存在元數據中。當使用自動組裝組裝陣列時,未在其元數據中記錄正確宿主主機名稱的陣列將使用“外來”名稱進行組裝。“外來”名稱總是以數字字元串結尾,前面帶有下劃線,以將其與任何可能的本地名稱區分開來。例如 /dev/md/1_1 或 /dev/md/home_0。

因此,您可以嘗試設置HOMEHOST ALU(在我的情況下),HOMEHOST <ignore>或者HOMEHOST <none>mdadm.conf. 但它只有在存在時才會起作用mdadm.conf。同樣,如果您設置忽略,然後從另一台機器連接一個數組,您可能會遇到名稱衝突。

所以最好在元數據和 mdadm.conf 中正確設置主機名,不要忽略它,最好在組裝之前在 initramfs 中設置實際主機名,但很難付諸實踐。

我個人的偏好是堅持經典的數字風格。通過 UUID 辨識,僅此而已:

ARRAY /dev/md1 UUID=8fe790ca:f3fa3388:4ae125b6:2c3a5d44
ARRAY /dev/md2 UUID=f14bef5b:a5356e51:25fde128:09983091
ARRAY /dev/md3 UUID=0639c68d:4c844bb1:5c02b33e:00ab4a93

這也是一致的(但也取決於它是否以這種方式創建和/或在元數據中相應地設置,否則您也可能不得不這樣--update做)。與給定 UUID 不匹配的外來數組應以/dev/md127+.


歸根結底,無論你做什麼,你都不應該盲目依賴,/dev/mdX或者/dev/md/name就像你不盲目依賴/dev/sdX字母一樣。始終使用文件系統 UUID 來辨識這些陣列上的任何內容。

名稱可能會意外更改的極端情況太多,因此充其量,這可能是對系統管理員的定位幫助或提示,它並不是所有問題的答案。

引用自:https://unix.stackexchange.com/questions/533563