18 管理裝置的多重路徑 I/O #
本章描述如何透過使用多重路徑 I/O (MPIO) 管理伺服器和區塊儲存裝置間多重路徑的容錯移轉和路徑負載平衡。
18.1 瞭解多重路徑 I/O #
多重路徑是指伺服器與相同實體或邏輯區塊儲存裝置在伺服器中的主機匯流排介面卡與裝置的儲存控制器之間、跨多重實體路徑進行通訊的能力,通常是在光纖通道 (FC) 或 iSCSI SAN 環境中進行。
Linux 多重路徑提供了連接容錯功能並可在各主動連接之間實現負載平衡。設定並執行多重路徑時,會自動隔離並識別裝置連接失敗,並將 I/O 重新路由至替代連接。
多重路徑針對連接故障提供容錯,但不針對儲存裝置本身的故障提供容錯。針對後者的容錯是透過鏡像等互補技術實現的。
18.1.1 多重路徑的術語 #
- 儲存陣列
包含許多磁碟和多個結構連接 (控制器) 的硬體裝置,為用戶端提供 SAN 儲存空間。儲存陣列通常具備 RAID 和容錯移轉功能並支援多重路徑。一直以來,主動/被動 (容錯移轉) 和主動/主動 (負載平衡) 儲存陣列的組態是有區別的。這些概念仍舊存在,但它們不過是新式硬體所支援的路徑群組和存取狀態概念的特殊情況。
- 主機、主機系統
執行 SUSE Linux Enterprise Server 的電腦,用做儲存陣列的用戶端系統。
- 多重路徑對應、多重路徑裝置
一組路徑裝置。它代表儲存陣列上的儲存磁碟區,主機系統將其視為單個區塊裝置。
- 路徑裝置
多重路徑對應的成員,通常是一個 SCSI 裝置。每個路徑裝置代表主機電腦與實際儲存磁碟區之間的唯一連接,例如,來自 iSCSI 工作階段的邏輯單元。
- WWID
「全球識別碼」
multipath-tools
使用 WWID 來確定應將哪些低層級裝置組合到多重路徑對應中。WWID 必須與可設定的對應名稱區分開 (請參閱第 18.12 節 「多重路徑裝置名稱和 WWID」)。- uevent、udev 事件
由核心傳送至使用者空間並由
udev
子系統處理的事件。在新增、移除裝置或變更裝置內容時會產生 uevent。- 裝置對應程式
Linux 核心中用於建立虛擬區塊裝置的架構。對應裝置的 I/O 操作將重新導向至基礎區塊裝置。裝置對應可以堆疊。裝置對應程式實作自身的事件訊號 (也稱為「裝置對應程式事件」或「dm 事件」)。
- initramfs
初始 RAM 檔案系統,由於歷史原因,也稱為「初始 RAM 磁碟」(initrd) (請參閱第 16.1 節 「術語」)。
- ALUA
「非對稱邏輯單元存取」,隨 SCSI 標準 SCSI-3 引入的概念。可以透過多個連接埠存取儲存磁碟區,這些連接埠依不同狀態 (作用中、待命等) 的連接埠群組進行組織。ALUA 定義了用於查詢連接埠群組及其狀態,以及變更連接埠組狀態的 SCSI 指令。支援 SCSI 的現代儲存陣列通常也支援 ALUA。
18.2 硬體支援 #
多重路徑驅動程式和工具可在 SUSE Linux Enterprise Server 支援的所有架構上使用。不區分通訊協定的一般驅動程式適用於市面上大多數支援多重路徑的儲存硬體。一些儲存陣列廠商會提供其自己的多重路徑管理工具。請參閱廠商的硬體文件以決定所需設定。
18.2.1 多重路徑實作:裝置對應程式和 NVMe #
Linux 中傳統的一般多重路徑實作使用裝置對應程式架構。對於大多數裝置類型 (例如 SCSI 裝置),裝置對應程式多重路徑是唯一可用的實作。裝置對應程式多重路徑可自由設定,且非常靈活。
Linux NVM Express (NVMe) 核心子系統在核心中原生實作多重路徑。這種實作可以降低 NVMe 裝置 (通常是延遲極低的快速裝置) 的計算負荷。原生 NVMe 多重路徑不需要使用者空間元件。從 SLE 15 開始,原生多重路徑一直是 NVMe 多重路徑裝置的預設功能。如需詳細資訊,請參閱第 17.2.4 節 「多重路徑」。
本章介紹裝置對應程式多重路徑及其使用者空間元件 multipath-tools
。multipath-tools
也可對原生 NVMe 多重路徑提供有限的支援 (請參閱第 18.13 節 「其他選項」)。
18.2.2 針對多重路徑的儲存陣列自動偵測 #
裝置對應程式多重路徑是一般性的技術。多重路徑裝置偵測只要求核心偵測低層級 (例如 SCSI) 裝置,並要求裝置內容可靠地將多個低層級裝置識別為同一個磁碟區的不同「路徑」,而不是實際不同的裝置。
multipath-tools
套件依廠商和產品名稱偵測儲存陣列。它提供了多種不同儲存產品的內建組態預設值。請參閱您的儲存陣列的硬體文件:某些廠商為 Linux 多重路徑組態提供了具體的建議。
如果您需要對儲存陣列的內建組態套用變更,請參閱第 18.8 節 「多重路徑組態」。
multipath-tools
為許多儲存陣列提供內建預設。給定儲存產品存在此類預設並不意味著該儲存產品的廠商已使用 dm-multipath
測試了該產品,也不意味著該廠商認可或支援對該產品使用 dm-multipath
。若有支援相關的問題,請始終參閱原始廠商文件。
18.2.3 需要特定硬體處理器的儲存陣列 #
對於某些儲存陣列,需要執行特殊指令才能從一個路徑容錯移轉至另一個路徑,或需要使用非標準的錯誤處理方法。這些特殊指令和方法由 Linux 核心中的硬體處理器實作。新式 SCSI 儲存陣列支援 SCSI 標準中定義的「非對稱邏輯單元存取」(ALUA) 硬體處理器。除 ALUA 之外,SLE 核心還包含 Netapp E 系列 (RDAC)、Dell/EMC CLARiiON CX 陣列系列和 HP 傳統陣列的硬體處理器。
從 Linux 核心 4.4 開始,Linux 核心已自動偵測到大多數陣列 (包括所有支援 ALUA 的陣列) 的硬體處理器。唯一的要求是在查探相應裝置時載入裝置處理器模組。multipath-tools
套件會安裝適當的組態檔案,來確保符合此要求。一旦裝置處理器關聯到給定裝置,就不能再變更。
18.3 規劃多重路徑 #
使用本節中的準則規劃多重路徑 I/O 解決方案。
18.3.1 先決條件 #
您用於多重路徑裝置的儲存陣列必須支援多重路徑。如需詳細資訊,請參閱 第 18.2 節 「硬體支援」。
只有在伺服器中的主機匯流排配接器和區塊儲存裝置的主機匯流排控制器之間存在多重實體路徑時,才需要設定多重路徑。
對於某些儲存陣列,廠商提供了自己的多重路徑軟體來管理陣列之實體和邏輯裝置的多重路徑。在這種情況下,您應根據廠商的指示設定那些裝置的多重路徑。
在虛擬化環境中使用多重路徑時,將在主機伺服器環境中控制多重路徑。請先設定裝置的多重路徑,然後才能將其指派給虛擬訪客機器。
18.3.2 多重路徑安裝類型 #
我們根據處理根裝置的方式來區分安裝類型。第 18.4 節 「在多重路徑系統上安裝 SUSE Linux Enterprise Server」介紹了在安裝期間和安裝後如何建立不同的設定。
18.3.2.1 根檔案系統位於多重路徑上 (SAN-boot) #
根檔案系統位於多重路徑裝置上。對於僅使用 SAN 儲存空間的無磁碟伺服器,一般都是如此。在此類系統上,需要支援多重路徑才能開機,並且必須在 initramfs 中啟用多重路徑。
18.3.2.2 根檔案系統位於本地磁碟上 #
根檔案系統 (可能還包括其他某些檔案系統) 位於本地儲存裝置中,例如,位於直連 SATA 磁碟或本地 RAID 上,但系統另外還會使用多重路徑 SAN 儲存空間中的檔案系統。可透過三種不同的方式設定此系統類型:
- 為本地磁碟設定多重路徑
所有區塊裝置 (包括本地磁碟) 是多重路徑對應的一部分。根裝置會顯示為只有一個路徑的降級多重路徑對應。如果在使用 YaST 進行初始系統安裝期間啟用了多重路徑,則會建立此組態。
- 將本地磁碟排除在多重路徑之外
在此組態中,多重路徑是在 initramfs 中啟用,但根裝置明確排除在多重路徑之外 (請參閱第 18.11.1 節 「
multipath.conf
中的blacklist
區段」)。程序 18.1 「安裝後對根磁碟停用多重路徑」介紹了如何設定此組態。- 在 initramfs 中停用多重路徑
如果在使用 YaST 進行初始系統安裝期間未啟用多重路徑,則會建立此設定。這種組態相當脆弱;請考慮改用其他選項之一。
18.3.3 磁碟管理任務 #
使用協力廠商 SAN 陣列管理工具或儲存陣列的使用者介面來建立邏輯裝置,並將其指定給主機。確定在兩端正確設定主機身分證明。
可以在執行中的主機上新增或移除磁碟區,但偵測變更時可能需要重新掃描 SCSI 目標並在主機上重新設定多重路徑。請參閱 第 18.14.6 節 「在不重新開機的情況下掃描新裝置」。
在某些磁碟陣列上,儲存陣列透過儲存處理器管理流量。一個處理器為主動,另外一個為被動,直到發生了失敗。如果您連接到被動儲存處理器,可能會找不到所需的 LUN,或雖然找到了這些 LUN,但在嘗試存取時會發生 I/O 錯誤。
如果磁碟陣列有多個儲存處理器,請確定 SAN 交換器已連接到您要存取的 LUN 所屬的主動儲存處理器。
18.3.4 軟體 RAID 和複雜的儲存堆疊 #
多重路徑在 SCSI 磁碟等基本儲存裝置的頂層設定。在多層儲存堆疊中,多重路徑始終位於底層。其他層 (例如軟體 RAID、邏輯磁碟區管理、區塊裝置加密等) 排布在多重路徑之上。因此,對於每個具有多重 I/O 路徑的裝置和要用於軟體 RAID 的裝置來說,您必須先設定多重路徑的裝置,然後才能嘗試建立軟體 RAID 裝置。
18.3.5 高可用性解決方案 #
叢集儲存資源的高可用性解決方案在每個節點上之多重路徑服務的基礎上執行。確定每個節點上 /etc/multipath.conf
檔案中的組態設定在整個叢集中保持一致。
確定多重路徑裝置在所有裝置中的名稱都相同。如需詳細資訊,請參閱第 18.12 節 「多重路徑裝置名稱和 WWID」。
用於 LAN 鏡像複製裝置的分散式複製區塊裝置 (DRBD) 高可用性解決方案在多重路徑的基礎上執行。對於每個具有多重 I/O 路徑的裝置和要用於 DRDB 解決方案的裝置來說,您必須先設定多重路徑的裝置,然後才能設定 DRDB。
將多重路徑與依賴於使用共用儲存實現圍籬區隔的叢集軟體 (例如包含 pacemaker
的 sbd
) 一起使用時必須格外小心。如需詳細資料,請參閱 第 18.9.2 節 「叢集伺服器上的排入佇列規則」。
18.4 在多重路徑系統上安裝 SUSE Linux Enterprise Server #
在配有多重路徑硬體的系統上安裝 SUSE Linux Enterprise Server 時,不需要指定特殊的安裝參數。
18.4.1 在未連接多重路徑裝置的情況下安裝 #
您可能希望在本地磁碟上執行安裝,而不先設定網狀架構和儲存裝置,以便稍後再將多重路徑 SAN 裝置新增至系統。在此情況下,安裝將如同在非多重路徑系統上一般進行。完成安裝後,雖然會安裝 multipath-tools
,但將停用 systemd
服務 multipathd.service
。系統的組態將如第 18.3.2.2 節 「根檔案系統位於本地磁碟上」中的在 initramfs 中停用多重路徑所述。新增 SAN 硬體前,您將需要啟用並啟動 multipathd.service
。我們建議在 /etc/multipath.conf
中為根裝置建立 blacklist
項目 (請參閱第 18.11.1 節 「multipath.conf
中的 blacklist
區段」)。
18.4.2 在連接了多重路徑裝置的情況下安裝 #
如果安裝時多重路徑裝置已連接到系統,YaST 將偵測到這些裝置,並在進入磁碟分割階段前顯示一個快顯視窗,詢問您是否啟用多重路徑。
如果您在此提示視窗中選取「否」(不建議如此),安裝將依照第 18.4.1 節 「在未連接多重路徑裝置的情況下安裝」所述進行。在磁碟分割階段,請勿使用/編輯稍後將成為多重路徑對應一部分的裝置。
如果您在多重路徑提示視窗中選取「是」,multipathd
將在安裝期間執行。不會有裝置新增至 /etc/multipath.conf
的 blacklist
區段,因此,在磁碟分割對話方塊中,所有 SCSI 和 DASD 裝置 (包括本地磁碟) 都將顯示為多重路徑裝置。安裝後,所有 SCSI 和 DASD 裝置都將是多重路徑裝置 (請參閱第 18.3.2.1 節 「根檔案系統位於多重路徑上 (SAN-boot)」)。
此程序假設您將系統安裝在本地磁碟上,並在安裝期間啟用了多重路徑,以便根裝置現在位於多重路徑上,但您希望依照第 18.3.2.2 節 「根檔案系統位於本地磁碟上」中的將本地磁碟排除在多重路徑之外所述設定系統。
檢查您的系統,以獲取本地根裝置的
/dev/mapper/...
參考,並以裝置不再是多重路徑對應時仍然有效的參考 (請參閱第 18.12.4 節 「參考多重路徑對應」) 取代它們。如果以下指令未找到參考,您無需套用變更:>
sudo
grep -rl /dev/mapper/ /etc切換到
dracut
的by-uuid
永久裝置規則 (請參閱第 18.7.4.2 節 「initramfs 中永久裝置的名稱」):>
echo 'persistent_policy="by-uuid"' | \ sudo tee /etc/dracut.conf.d/10-persistent-policy.conf確定根裝置的 WWID:
>
multipathd show paths format "%i %d %w %s" 0:2:0:0 sda 3600605b009e7ed501f0e45370aaeb77f IBM,ServeRAID M5210 ...此指令會列印所有路徑裝置及其 WWID 和廠商/產品資訊。您可以識別根裝置 (此處為 ServeRAID 裝置) 並記下 WWID。
使用您剛剛確定的 WWID 在
/etc/multipath.conf
中建立一個黑名單項目 (請參閱第 18.11.1 節 「multipath.conf
中的blacklist
區段」)。暫時先不要套用這些設定:blacklist { wwid 3600605b009e7ed501f0e45370aaeb77f }
重建 initramfs:
>
sudo
dracut -f重新開機。您的系統應使用非多重路徑根磁碟開機。
18.5 在多重路徑系統上更新 SLE #
從線上更新系統時,您可以依照第 5 章 「線上升級」所述操作。
系統的線下更新過程與第 18.4 節 「在多重路徑系統上安裝 SUSE Linux Enterprise Server」所述的全新安裝類似。系統沒有 blacklist
,因此,如果使用者選取啟用多重路徑,根裝置將顯示為多重路徑裝置,即使它通常不是多重路徑裝置。當 dracut
在更新過程中建立 initramfs 時,它看到的儲存堆疊與在已開機系統上看到的不同。請參閱第 18.7.4.2 節 「initramfs 中永久裝置的名稱」 和第 18.12.4 節 「參考多重路徑對應」。
18.6 多重路徑管理工具 #
SUSE Linux Enterprise Server 中的多重路徑支援以 Linux 核心的裝置對應程式多重路徑模組及 multipath-tools
使用者空間套件為基礎。
裝置對應程式多重路徑 (DM-MP) 模組負責處理一般多重路徑功能。如需詳細資訊,請參閱第 18.6.1 節 「裝置對應程式多重路徑模組」。
multipath-tools
和 kpartx
套件提供了用於處理自動路徑探查和分組的工具。這些工具如下:
multipathd
用於設定和監控多重路徑對應的精靈,以及用來與精靈程序通訊的指令列用戶端。請參閱 第 18.6.2 節 「
multipathd
精靈」。multipath
用於執行多重路徑操作的指令列工具。請參閱 第 18.6.3 節 「
multipath
指令」。kpartx
用於管理多重路徑裝置上的「分割區」的指令列工具。請參閱 第 18.7.3 節 「多重路徑裝置上的分割區和
kpartx
」。mpathpersist
用於管理 SCSI 永久保留的指令列工具。請參閱 第 18.6.4 節 「SCSI 永久保留和
mpathpersist
」。
18.6.1 裝置對應程式多重路徑模組 #
裝置對應程式多重路徑 (DM-MP) 模組 dm-multipath.ko
為 Linux 提供了一般多重路徑功能。DM-MPIO 是 SUSE Linux Enterprise Server 中適用於 SCSI 和 DASD 裝置的慣用多重路徑解決方案,它也適用於 NVMe 裝置。
從 SUSE Linux Enterprise Server 15 開始,建議將原生 NVMe 多重路徑 (請參閱第 18.2.1 節 「多重路徑實作:裝置對應程式和 NVMe」) 用於 NVMe,並且預設已使用該功能。若要停用原生 NVMe 多重路徑,並改用裝置對應程式多重路徑 (不建議如此),請使用核心參數 nvme-core.multipath=0
開機。
裝置對應程式多重路徑模組可處理以下任務:
在作用中路徑群組內的多個路徑上分散負載。
注意到路徑裝置上的 I/O 錯誤,並將這些裝置標示為發生故障,這樣就不會向其傳送 I/O。
當作用中路徑群組中的所有路徑都失敗時切換路徑群組。
如果所有路徑都失敗,則使多重路徑裝置上的 I/O 失敗或排入佇列,具體取決於組態。
以下任務由 multipath-tools
套件中的使用者空間元件處理,而不是由裝置對應程式多重路徑模組處理:
探查代表同一儲存裝置的不同路徑的裝置,並基於這些裝置組合多重路徑對應。
將具有相似內容的路徑裝置收集到路徑群組。
主動監控路徑裝置是否出現故障或重新具現化。
監控路徑裝置的新增和移除。
裝置對應程式多重路徑模組未提供易於使用的設定和組態使用者介面。
如需 multipath-tools
套件中各元件的詳細資料,請參閱第 18.6.2 節 「multipathd
精靈」。
DM-MPIO 預防的是裝置路徑中的故障,而不是裝置自身的故障,例如媒體錯誤。只能透過其他方式來預防後一種錯誤,例如複製。
18.6.2 multipathd
精靈 #
multipathd
是新式 Linux 裝置對應程式多重路徑設定中的最重要部分。通常透過 systemd 服務 multipathd.service
來啟動此精靈 (請參閱第 18.7.1 節 「啟用、啟動和停止多重路徑服務」)。
multipathd
可處理以下任務 (其中一些任務依賴於組態):
啟動時,偵測路徑裝置並設定從偵測到的裝置的多重路徑對應。
監控 uevent 和裝置對應程式事件,根據需要在多重路徑對應中新增或移除路徑對應,並啟動容錯移轉或容錯回復操作。
探查到新的路徑裝置時立即設定新對應。
定期檢查路徑裝置以偵測故障,並測試有故障的路徑,以便在它們恢復正常時將其重新啟用。
如果所有路徑都發生故障,
multipathd
將使對應失敗,或者將對應裝置切換到佇列模式,並使其排入佇列給定的一段時間。處理路徑狀態變更,並根據需要切換路徑群組或重新分組路徑。
測試路徑的「臨界」狀態,即導致路徑狀態在正常運作與不正常運作之間來回變化的不穩定結構狀況。
處理路徑裝置的 SCSI 永久保留金鑰 (如果已設定)。請參閱第 18.6.4 節 「SCSI 永久保留和
mpathpersist
」。
multipathd
還可用做指令列用戶端,透過將互動式指令傳送到執行中精靈來處理這些指令。用於向精靈傳送指令的一般語法如下:
>
sudo
multipathd COMMAND
或
>
sudo
multipathd -k'COMMAND'
此精靈還可在互動模式下執行,允許您傳送多個後續指令:
>
sudo
multipathd -k
許多 multipathd
指令都有等效的 multipath
指令。例如,multipathd
show topology
的作用與 multipath
-ll
相同。兩者的明顯差別在於,multipathd 指令會查詢執行中 multipathd
精靈的內部狀態,而 multipath 則是直接從核心和 I/O 操作取得資訊。
如果多重路徑精靈正在執行,我們建議使用 multipathd
指令對系統進行修改。否則,該精靈可能會注意到組態變更並做出回應。在某些情況下,該精靈甚至可能嘗試復原已套用的變更。如果偵測到執行中的精靈,multipath
會自動將某些可能帶來風險的指令 (例如損毀和衝洗對應) 委派給 multipathd
。
下面的清單介紹了常用的 multipathd
指令:
- show topology
顯示目前的對應拓撲和內容。請參閱 第 18.14.2 節 「解讀多重路徑 I/O 狀態」。
- show paths
顯示目前已知的路徑裝置。
- show paths format "FORMAT STRING"
使用格式字串顯示目前已知的路徑裝置。使用
show wildcards
可查看支援的格式指定元清單。- show maps
顯示目前設定的對應裝置。
- show maps format FORMAT STRING
使用格式字串顯示目前設定的對應裝置。使用
show wildcards
可查看支援的格式指定元清單。- show config local
顯示 multipathd 目前使用的組態。
- reconfigure
重新讀取組態檔案、重新掃描裝置,並再次設定對應。這基本上等同於重新啟動
multipathd
。有幾個選項在不重新啟動的情況下無法修改。手冊頁multipath.conf(5)
中述及了這些選項。reconfigure
指令只會重新載入發生某種變更的對應裝置。若要強制重新載入每個對應裝置,請使用reconfigure all
(從 SUSE Linux Enterprise Server 15 SP4 開始提供;在先前的版本上,reconfigure
可以重新載入每個對應)。- del map MAP DEVICE NAME
取消設定並刪除給定的對應裝置及其分割區。MAP DEVICE NAME 可以是裝置節點名稱 (例如
dm-0
)、WWID 或對應名稱。如果該裝置正在使用中,則該指令會失敗。- switchgroup map MAP DEVICE NAME group N
切換到索引 (從 1 開始) 為指定數字的路徑群組。對於具有手動容錯回復的對應,這很有用 (請參閱第 18.9 節 「設定容錯移轉、排入佇列及容錯回復的規則」)。
可以使用其他指令來修改路徑狀態、啟用或停用佇列等。如需詳細資料,請參閱 multipathd(8)
。
18.6.3 multipath
指令 #
儘管多重路徑的大部分設定是自動完成並由 multipathd
處理,您仍可使用 multipath
來完成某些管理任務。下面提供了幾個指令用法範例:
- multipath
偵測路徑裝置並設定找到的所有多重路徑對應。
- multipath -d
類似於
multipath
,但不設定任何對應 (「模擬執行」)。- multipath DEVICENAME
設定特定的多重路徑裝置。DEVICENAME 可以使用裝置節點名稱 (
/dev/sdb
) 或major:minor
格式的裝置編號來指定成員路徑裝置。或者,它可以是多重路徑對應的 WWID 或名稱。- multipath -f DEVICENAME
取消設定 (「衝洗」) 多重路徑對應及其分割區對應。如果該對應或其某個分割區正在使用中,則該指令會失敗。請參閱上文瞭解 DEVICENAME 的可能值。
- multipath -F
取消設定 (「衝洗」) 所有多重路徑對應及其分割區對應。如果這些對應正在使用中,則該指令會失敗。
- multipath -ll
顯示所有目前設定的多重路徑裝置的狀態和拓撲。請參閱 第 18.14.2 節 「解讀多重路徑 I/O 狀態」。
- multipath -ll DEVICENAME
顯示指定多重路徑裝置的狀態。請參閱上文瞭解 DEVICENAME 的可能值。
- multipath -t
顯示內部硬體表和使用中的多重路徑組態。如需組態參數的詳細資料,請參閱
multipath.conf(5)
。- multipath -T
功能與
multipath -t
指令類似,但僅顯示與主機上偵測到的硬體相符的硬體項目。
選項 -v
控制輸出的詳細程度。提供的值會覆寫 /etc/multipath.conf
中的 verbosity
選項。請參閱 第 18.13 節 「其他選項」。
18.6.4 SCSI 永久保留和 mpathpersist
#
mpathpersist
公用程式可用於管理裝置對應程式多重路徑裝置上的 SCSI 永久保留。永久保留用於僅限特定的 SCSI 啟動器存取 SCSI 邏輯單元。在多重路徑組態中,必須對給定磁碟區的所有 I_T 節點 (路徑) 使用相同的保留金鑰;否則,在一部路徑裝置上建立保留會導致其他路徑發生 I/O 錯誤。
將此公用程式與 /etc/multipath.conf
檔案中的 reservation_key
屬性配合使用,可設定 SCSI 裝置的永久保留。當且僅當設定了此選項時,multipathd
精靈才會檢查新探查到的路徑或重新啟用之路徑的永久保留。
您可以將該屬性新增至 multipath.conf
的 defaults
或 multipaths
區段。例如:
multipaths { multipath { wwid 3600140508dbcf02acb448188d73ec97d alias yellow reservation_key 0x123abc } }
為適用於永久管理的所有 mpath 裝置設定 reservation_key
參數後,使用 multipathd reconfigure
重新載入組態。
reservation_key file
”
如果在 multipath.conf
的 defaults
區段中使用了特殊值 reservation_key file
,則可以使用 mpathpersist
以動態方式在檔案 /etc/multipath/prkeys
中管理保留金鑰。
這是處理多重路徑對應永久保留的建議方法。從 SUSE Linux Enterprise Server 12 SP4 開始可以使用這種方法。
使用指令 mpathpersist
查詢和設定由 SCSI 裝置組成的多重路徑對應的永久保留。如需詳細資料,請參閱手冊頁 mpathpersist(8)
。指令列選項與 sg3_utils
套件中 sg_persist
的選項相同。sg_persist(8)
手冊頁詳細解釋了選項的語意。
在以下範例中,DEVICE 表示裝置對應程式多重路徑裝置,例如 /dev/mapper/mpatha
。以下指令與長選項一起列出,以方便閱讀。可以用單個字母取代所有選項,例如 mpathpersist -oGS 123abc
DEVICE
。
- mpathpersist --in --read-keys DEVICE
讀取裝置的已註冊保留金鑰。
- mpathpersist --in --read-reservation DEVICE
顯示裝置的現有保留。
- mpathpersist --out --register --param-sark=123abc DEVICE
為裝置註冊一個保留金鑰。這會為主機上的所有 I_T 聯結 (路徑裝置) 新增保留金鑰。
- mpathpersist --out --reserve --param-rk=123abc --prout-type=5 DEVICE
使用先前註冊的金鑰為裝置建立類型 5 (「獨佔寫入 - 僅限註冊者」) 保留。
- mpathpersist --out --release --param-rk=123abc --prout-type=5 DEVICE
釋放裝置的類型 5 保留。
- mpathpersist --out --register-ignore --param-sark=0 DEVICE
從裝置中刪除現有的保留金鑰。
18.7 針對多重路徑設定系統 #
18.7.1 啟用、啟動和停止多重路徑服務 #
若要允許多重路徑服務在開機時啟動,請執行以下指令:
>
sudo
systemctl enable multipathd
若要在執行中的系統上手動啟動該服務,請輸入:
>
sudo
systemctl start multipathd
若要重新啟動該服務,請輸入:
>
sudo
systemctl restart multipathd
在大多數情況下不需要重新啟動該服務。若要簡單地讓 multipathd
重新載入其組態,請執行:
>
sudo
systemctl reload multipathd
若要檢查該服務的狀態,請輸入:
>
sudo
systemctl status multipathd
若要停止目前工作階段中的多重路徑服務,請執行:
>
sudo
systemctl stop multipathd multipathd.socket
停止服務不會移除現有的多重路徑對應。若要移除未使用的對應,請執行以下指令:
>
sudo
multipath -F
multipathd.service
保持為啟用狀態
我們強烈建議永遠將 multipathd.service
保持為啟用狀態,並讓其在配有多重路徑硬體的系統上執行。雖然該服務支援 systemd
的通訊端啟用機制,但我們不建議您依賴於該機制。如果停用該服務,開機期間將不會設定多重路徑對應。
如果您需要在出現上述警告的情況下停用多重路徑,例如,因為要部署協力廠商多重路徑軟體,請執行以下操作。確定系統不會使用多重路徑裝置的硬式編碼參考 (請參閱第 18.15.2 節 「瞭解裝置參考問題」)。
若要僅為單次系統開機停用多重路徑,請使用核心參數 multipath=off
。這會影響已開機的系統和 initramfs (在這種情況下不需要重建)。
若要永久停用 multipathd 服務,使其不會在系統今後開機時啟動,請執行以下指令:
>
sudo
systemctl disable multipathd multipathd.socket>
sudo
dracut --force --omit multipath
(每次停用或啟用多重路徑服務後,都需要重建 initramfs
。請參閱第 18.7.4 節 「將 initramfs 與系統保持同步」)。
如果您想確保不設定多重路徑裝置 (即使是手動執行 multipath
時),請在重建 initramfs 之前,將以下幾行新增至 /etc/multipath.conf
的結尾:
blacklist { wwid .* }
18.7.2 針對多重路徑準備 SAN 裝置 #
在為 SAN 裝置設定多重路徑 I/O 之前,請視需要執行以下步驟準備 SAN 裝置:
使用廠商工具對 SAN 進行設定並分區。
使用廠商工具設定儲存陣列中主機 LUN 的權限。
如果 SUSE Linux Enterprise Server 未隨附主機匯流排介面卡 (HBA) 的驅動程式,請安裝 HBA 廠商提供的 Linux 驅動程式。如需更多詳細資料,請參閱廠商的特定指示。
如果已偵測到多重路徑裝置並已啟用 multipathd.service
,則應會自動建立多重路徑對應。如果未自動建立,第 18.15.3 節 「緊急模式下的疑難排解步驟」 會列出一些可用於檢查該情況的外圍程序指令。如果 HBA 驅動程式無法探查到 LUN,請檢查 SAN 中的區域設定。尤其是要檢查 LUN 遮罩是否處於使用中,且 LUN 是否正確地指定給伺服器。
如果 HBA 驅動程式可以探查到 LUN,但未建立相應的區塊裝置,則可能需要使用額外的核心參數。請參閱 https://www.suse.com/support/kb/doc.php?id=3955167 上 SUSE 知識庫中的 TID 3955167: Troubleshooting SCSI (LUN) Scanning Issues。
18.7.3 多重路徑裝置上的分割區和 kpartx
#
多重路徑對應可以像其路徑裝置一樣包含分割區。分割區表掃描以及為分割區建立裝置節點的操作是由 kpartx
工具在使用者空間中執行的。kpartx
由 udev 規則自動呼叫,通常不需要手動執行。請參閱第 18.12.4 節 「參考多重路徑對應」獲取參考多重路徑分割區的方法。
kpartx
可以在 /etc/multipath.conf
中使用 skip_kpartx
選項來禁止對選定的多重路徑對應呼叫 kpartx
。例如,在虛擬化主機上,這種做法可能很有用。
可以使用 YaST 或者使用 fdisk
或 parted
等工具來如常操作多重路徑裝置上的分割區表和分割區。當分割工具退出時,系統會記下套用於分割區表的變更。如果這種方法不起作用 (通常是因為裝置忙碌),請嘗試執行 multipathd
reconfigure
或將系統重新開機。
18.7.4 將 initramfs 與系統保持同步 #
對於所有區塊裝置,是否以及如何使用多重路徑,初始 RAM 檔案系統 (initramfs) 與已開機系統的行為務必要保持一致。套用多重路徑組態變更後重建 initramfs。
如果在系統中啟用了多重路徑,那麼也需要在 initramfs
中啟用多重路徑,反之亦然。此規則的唯一例外情況是第 18.3.2.2 節 「根檔案系統位於本地磁碟上」中所述的選項 在 initramfs 中停用多重路徑。
必須在已開機系統與 initramfs 之間同步多重路徑組態。因此,如果您變更 /etc/multipath.conf
、/etc/multipath/wwids
和 /etc/multipath/bindings
中的任一檔案,或者其他與裝置識別相關的組態檔案或 udev 規則,請使用以下指令重建 initramfs:
>
sudo
dracut -f
如果 initramfs
與系統不同步,系統將無法正常開機,啟動程序可能會顯示緊急外圍程序。如需如何避免或修復此類情況的說明,請參閱第 18.15 節 「MPIO 疑難排解」。
18.7.4.1 在 initramfs 中啟用或停用多重路徑 #
如果要在非一般情況下重建 initramfs (例如,從救援系統重建,或使用核心參數 multipath=off
開機後重建),必須格外小心。當且僅當 dracut
在建立 initramfs 期間偵測到根檔案系統位於多重路徑裝置上時,它才會自動在 initramfs 中包含多重路徑支援。在這種情況下,需要明確啟用或停用多重路徑。
若要在 initramfs
中啟用多重路徑支援,請執行以下指令:
>
sudo
dracut --force --add multipath
若要在 initramfs
中停用多重路徑支援,請執行以下指令:
>
sudo
dracut --force --omit multipath
18.7.4.2 initramfs 中永久裝置的名稱 #
當 dracut
產生 initramfs 時,它必須參考要以永久式掛接的磁碟和分割區,以確保系統能夠正常開機。當 dracut
偵測到多重路徑裝置時,出於此目的,它預設將使用 DM-MP 裝置名稱,例如
/dev/mapper/3600a098000aad73f00000a3f5a275dc8-part1
如果系統永遠以多重路徑模式執行,這樣將不會產生問題。但如果系統在不使用多重路徑的情況下啟動 (如第 18.7.4.1 節 「在 initramfs 中啟用或停用多重路徑」所述),那麽使用這樣的 initramfs 開機時將會失敗,因為 /dev/mapper
裝置將不存在。請參閱第 18.12.4 節 「參考多重路徑對應」瞭解其他可能的問題情境以及一些背景資訊。
若要防止此類情況發生,請使用 --persistent-policy
選項變更 dracut
的永久裝置命名規則。我們建議設定 by-uuid
使用規則:
>
sudo
dracut --force --omit multipath --persistent-policy=by-uuid
18.8 多重路徑組態 #
內建的 multipath-tools
預設值適用於大多數設定。如需進行自訂,需要建立一個組態檔案。主組態檔案為 /etc/multipath.conf
。此外,還需將 /etc/multipath/conf.d/
中的檔案納入考量。如需其他資訊,請參閱 第 18.8.2.1 節 「其他組態檔案和優先順序規則」。
一些儲存廠商在其文件中發佈了多重路徑選項的建議值。這些值通常代表廠商在其環境中測試後認為最適合相應儲存產品的值。請參閱第 18.2.2 節 「針對多重路徑的儲存陣列自動偵測」中的免責聲明。
multipath-tools
內建了適用於許多儲存陣列的預設值,這些預設值均源自廠商發佈的建議。請執行 multipath -T
以查看裝置的目前設定,並將其與廠商的建議進行比較。
18.8.1 建立 /etc/multipath.conf
#
建議您建立只包含要變更設定的最小 /etc/multipath.conf
。在很多情況下,您根本不需要建立 /etc/multipath.conf
。
如果您想要使用包含所有可能組態指令的組態範本,請執行:
multipath -T >/etc/multipath.conf
18.8.2 multipath.conf
語法 #
/etc/multipath.conf
檔案使用由區段、子區段和選項/值組構成的階層。
空格會將記號分隔開。多個連續的空格字元將壓縮成一個空格,除非將它們括在引號中 (參閱下文)。
井號 (
#
) 和驚嘆號 (!
) 字元會使系統將行中的其餘內容視為備註而忽略。區段和子區段在同一行中以區段名稱和左大括弧 (
{
) 開頭,並在獨立的一行中以右大括弧 (}
) 結尾。選項和值撰寫在一行中。不支援行接續。
選項和區段名稱必須是關鍵字。
multipath.conf(5)
中闡述了允許的關鍵字。值可以用雙引號 (
"
) 括住。如果值包含空格或備註字元,則必須用引號將其括住。值中的雙引號字元由一組雙引號 (""
) 表示。某些選項的值是 POSIX 規則運算式 (請參閱
regex(7)
)。它們區分大小寫且位置不固定,因此,「bar
」會與「rhabarber
」相符,但不會與「Barbie」相符。
以下範例展示了相應語法:
section { subsection { option1 value option2 "complex value!" option3 "value with ""quoted"" word" } ! subsection end } # section end
18.8.2.1 其他組態檔案和優先順序規則 #
除了 /etc/multipath.conf
,工具會讀取與 /etc/multipath.conf.d/*.conf
模式相符的檔案。其他檔案遵循與 /etc/multipath.conf
相同的語法規則。區段和選項可以多次出現。如果在多個檔案中或者在同一檔案的多行中設定了同一個區段的同一個選項,則以最後一個值為準。在 multipath.conf
的各個區段之間,採用不同的優先程度規則。請參閱下文。
18.8.3 multipath.conf
中的區段 #
/etc/multipath.conf
檔案由下列區段構成。某些選項可以出現在多個區段中。如需詳細資料,請參閱multipath.conf(5)
。
- defaults
一般預設設定。
重要:覆寫內建裝置內容內建的硬體特定裝置內容優先於
defaults
區段中的設定。因此,所需的變更必須在devices
或overrides
區段中進行。- blacklist
列出要忽略的裝置。請參閱第 18.11.1 節 「
multipath.conf
中的blacklist
區段」。- blacklist_exceptions
列出要進行多重路徑處理的裝置,即使它們與黑名單相符。請參閱第 18.11.1 節 「
multipath.conf
中的blacklist
區段」。- devices
特定於儲存控制器的設定。此區段是
device
子區段的集合。此區段中的值會覆寫defaults
區段中相同選項的值以及multipath-tools
的內建設定。devices
區段中的device
項目將與使用規則運算式的裝置的廠商和產品進行比對。這些項目將會「合併」,為裝置設定相符區段中的所有選項。如果在多個相符device
區段中設定了相同的選項,則以最後一個裝置項目為準,即使它不如之前的項目那麼「符合情況」。此規則還適用於相符項目在不同組態檔案中的情況 (請參閱第 18.8.2.1 節 「其他組態檔案和優先順序規則」)。在以下範例中,裝置SOMECORP STORAGE
將使用fast_io_fail_tmo 15
。devices { device { vendor SOMECORP product STOR fast_io_fail_tmo 10 } device { vendor SOMECORP product .* fast_io_fail_tmo 15 } }
- multipaths
個別多重路徑裝置的設定。此區段是
multipath
子區段的清單。值會覆寫defaults
和devices
區段。- overrides
覆寫所有其他區段中的值的設定。
18.8.4 套用 multipath.conf
修改 #
若要套用組態變更,請執行:
>
sudo
multipathd reconfigure
請不要忘記與 initramfs 中的組態同步。請參閱 第 18.7.4 節 「將 initramfs 與系統保持同步」。
multipath
套用設定
當 multipath
正在執行時,請不要使用 multipathd
指令套用新設定。否則可能導致設定不一致甚至損壞。
在套用已修改的設定之前,可以先執行以下指令對其進行測試:
>
sudo
multipath -d -v2
此指令會顯示要使用建議的拓撲建立的新對應,但不顯示是否會移除/衝洗對應。若要獲得更多資訊,請以更高的詳細程度執行:
>
sudo
multipath -d -v3 2>&1 | less
18.9 設定容錯移轉、排入佇列及容錯回復的規則 #
多重路徑 I/O 的目的是在儲存系統與伺服器之間提供連接容錯。需要的預設行為視伺服器是獨立伺服器還是高可用性叢集中的節點而定。
規則本節介紹用於實現容錯的最重要的 multipath-tools
組態參數。
- polling_interval
對路徑裝置進行狀態檢查的時間間隔 (以秒為單位)。預設值為 5 秒。將按照此時間間隔檢查有故障的裝置。對於健康情況良好的裝置,最多可將時間間隔增加到
max_polling_interval
秒。- detect_checker
如果設定為
yes
(預設值,建議採用),multipathd
會自動偵測最佳路徑檢查演算法。- path_checker
用於檢查路徑狀態的演算法。如果您需要啟用該檢查程式,請依照下列方式停用
detect_checker
:defaults { detect_checker no }
下面僅列出了最重要的演算法。如需完整的演算法清單,請參閱
multipath.conf(5)
。- tur
傳送 TEST UNIT READY 指令。對於支援 ALUA 的 SCSI 裝置,這是預設設定。
- directio
使用非同步 I/O (aio) 讀取裝置磁區。
- rdac
適用於 NetAPP E 系列和相似陣列的裝置特定檢查程式。
- none
不執行路徑檢查。
- checker_timeout
如果裝置在給定時間內未回應路徑檢查程式指令,則將其視為發生故障。預設值是裝置核心的 SCSI 指令逾時 (通常為 30 秒)。
- fast_io_fail_tmo
如果在 SCSI 傳輸層上偵測到錯誤 (例如在光纖通道遠端連接埠上),核心傳輸層將在傳輸復原前等待此選項所指定的時長 (以秒計)。這段時間過後,路徑裝置將會失敗並顯示為「傳輸離線」狀態。這對多重路徑非常有用,因為它允許對經常發生的一類錯誤快速進行路徑容錯移轉。該值必須與在相應網路架構中進行重新組態所需的一般時間間隔相符。預設值 5 秒對光纖通道而言非常合適。iSCSI 等其他傳輸可能需要更長的逾時。
- dev_loss_tmo
如果 SCSI 傳輸端點 (例如光纖通道遠端連接埠) 再也無法存取,核心會在連接埠再次出現前等待此選項所指定的時長 (以秒計),這段時間過後,核心會永久移除 SCSI 裝置節點。移除裝置節點是一項複雜的操作,容易產生競爭情形或鎖死,因此最好避免此類操作。因此,我們建議將此選項設定為較高的值。支援特殊值
infinity
。預設值為 10 分鐘。為避免鎖死狀態,multipathd
會確保 I/O 佇列作業 (請參閱no_path_retry
) 在dev_loss_tmo
到期前停止。- no_path_retry
決定當給定多重路徑對應的所有路徑都失敗時會發生什麼情況。可能的值包括:
- fail
使多重路徑對應上的 I/O 失敗。這會導致上層 (例如掛接的檔案系統) 發生 I/O 錯誤。受影響的檔案系統 (也可能是整個主機) 將進入降級模式。
- queue
多重路徑對應上的 I/O 在裝置對應程式層中排入佇列,並在路徑裝置重新可用時傳送到裝置。這是避免遺失資料的最安全選項,但如果路徑裝置長時間不能恢復,使用該值可能會造成負面影響。從裝置讀取資料的程序將會當機並處於不中斷睡眠 (
D
) 狀態。排入佇列的資料會佔用記憶體,而被佔用的記憶體不可供程序使用。最終,記憶體將會耗盡。- N
N 是一個正整數。使對應裝置保持佇列模式 N 個輪詢間隔。在這段時間過去後,
multipathd
將使對應裝置失敗。如果polling_interval
為 5 秒且no_path_retry
為 6,則multipathd
會將 I/O 排入佇列大約 6 * 5 = 30 秒,然後使對應裝置上的 I/O 失敗。
- flush_on_last_del
如果設定為
yes
,並且對應的所有路徑裝置均已刪除 (與只是失敗不同),系統會在移除對應前,使對應內的所有 I/O 失敗。預設值為no
。- deferred_remove
如果設定為
yes
,並且對應的所有路徑裝置均已刪除,系統會等待佔有者關閉對應裝置的檔案描述子,之後才衝洗並移除對應裝置。如果路徑在最後一個佔有者關閉對應之前重新出現,將會取消延遲移除操作。預設值為no
。- failback
如果非作用中路徑群組中發生故障的路徑裝置復原,
multipathd
會重新評估所有路徑群組的路徑群組優先程度 (請參閱第 18.10 節 「設定路徑分組和優先程度」)。重新評估後,優先程度最高的路徑群組有可能會成為目前非作用中的路徑群組之一。此參數決定在此狀況下將發生什麼情況。重要:遵循廠商的建議最佳容錯回復規則取決於儲存裝置的內容。因此,強烈建議聯絡儲存裝置廠商以確定
failback
設定。- manual
除非管理員執行
multipathd switchgroup
,否則什麼也不會發生 (請參閱第 18.6.2 節 「multipathd
精靈」)。- immediate
立即啟用優先程度最高的路徑群組。這通常可以提升效能,特別是在獨立的伺服器上,但它不應該用於陣列,因為在陣列上變更路徑群組代價很高。
- followover
與
immediate
相似,但僅在剛變為作用中狀態的路徑是其路徑群組中唯一一個狀況良好的路徑時,才執行容錯回復。此選項對叢集組態很有用,可以防止某個節點在另一個節點先申請了容錯移轉時自動容錯回復。- N
N 是一個正整數。在啟用優先程度最高的路徑群組之前,等待 N 個輪詢間隔。如果在此期間內優先程度再次變更,則等待期重新開始。
- eh_deadline
設定一個大約值,指定在裝置無回應,SCSI 指令逾時且無錯誤回應的情況下,處理 SCSI 錯誤所花費時間的上限 (以秒計)。截止期限過後,核心將執行一次完整的 HBA 重設。
修改 /etc/multipath.conf
檔案後,套用您的設定 (請參閱第 18.8.4 節 「套用 multipath.conf
修改」)。
18.9.1 獨立伺服器上的排入佇列規則 #
如果您為獨立伺服器設定了多重路徑 I/O,設定為 queue
值的 no_path_retry
可使伺服器作業系統在儘可能長的時間內不收到 I/O 錯誤。它會使訊息排入佇列,直至發生多重路徑容錯移轉。如果不需要「無限期」排入佇列 (見上文),請選取一個您認為足夠高的數值,以便儲存路徑能在正常情況下復原 (見上文)。
18.9.2 叢集伺服器上的排入佇列規則 #
為高可用性叢集中的節點設定多重路徑 I/O 時,您希望多重路徑報告 I/O 故障以觸發資源容錯移轉,而不是等待多重路徑容錯移轉得以解決。在叢集環境中,您必須修改 no_path_retry
設定,以確保在與儲存系統的連接中斷時,叢集節點會收到與叢集驗證程序相關的 I/O 錯誤 (建議設為 heartbeat 容錯的 50%)。此外,您還希望將多重路徑 failback
設為 manual
或 followover
,以免因路徑失敗而造成資源的乒乓效應。
18.10 設定路徑分組和優先程度 #
多重路徑對應中的路徑裝置會歸入路徑群組,也稱為優先程度群組。任何時間只有一個路徑群組接收 I/O。multipathd
可向路徑群組指定優先程度。在包含作用中路徑的路徑群組中,根據為對應設定的容錯回復規則啟用優先程度最高的群組 (請參閱第 18.9 節 「設定容錯移轉、排入佇列及容錯回復的規則」)。路徑群組的優先程度是路徑群組內作用中路徑裝置優先程度的平均值。路徑裝置的優先程度是根據裝置內容計算出的整數值 (請參閱下方 prio
選項的描述)。
本節介紹了與確定優先程度和進行路徑分組相關的 multipath.conf
組態參數。
- path_grouping_policy
指定用於將路徑合併成群組的方法。此處僅列出最重要的規則;如需其他不常使用的值,請參閱
multipath.conf(5)
。- failover
每個路徑群組一個路徑。對於傳統的「主動/被動」儲存陣列,此設定很有用。
- multibus
一個路徑群組中的所有路徑。對於傳統的「主動/主動」陣列,此設定很有用。
- group_by_prio
將路徑優先程度相同的路徑裝置分為一個群組。對於支援非對稱存取狀態 (例如 ALUA) 的新式陣列,此選項很有用。
multipathd
設定的優先程度群組與alua
或sysfs
優先程度演算法結合使用時,將與儲存陣列透過 ALUA 相關 SCSI 指令報告的主要目標連接埠組相符。
使用相同的規則名稱時,可以透過以下指令臨時變更多重路徑對應的路徑分組規則:
>
sudo
multipath -p POLICY_NAME MAP_NAME- marginal_pathgroups
如果設定為
on
或fpin
,「臨界」路徑裝置儲存在單獨的路徑群組中。這與所使用的路徑分組演算法無關。請參閱 第 18.13.1 節 「處理不可靠 (「臨界」) 的路徑裝置」。- detect_prio
如果設定為
yes
(預設值,建議採用),multipathd
會自動偵測用於為儲存裝置設定優先程度的最佳演算法,並會忽略prio
設定。在實際情況中,這表示在偵測到 ALUA 支援時使用sysfs
優先程度演算法。- prio
確定獲取路徑裝置優先程度的方法。如果您覆寫此設定,請依照下列方式停用
detect_prio
:defaults { detect_prio no }
下面僅列出了最重要的方法。系統還提供了其他幾種方法,主要用於支援舊版硬體。如需完整的清單,請參閱
multipath.conf(5)
。- alua
使用 SCSI-3 ALUA 存取狀態獲取路徑優先程度值。選擇性
exclusive_pref_bit
引數可用於變更設定了 ALUA「偏好主要目標連接埠群組」(PREF) 位元的裝置的行為:prio alua prio_args exclusive_pref_bit
如果設定了此選項,「偏好」路徑將獲得優先於其他作用中/最佳化路徑的優先程度。否則,將會為所有作用中/最佳化路徑指定相同的優先程度。
- sysfs
與
alua
類似,但它不向裝置傳送 SCSI 指令,而是從sysfs
獲取存取狀態。這會使 I/O 負載比alua
要少,但並不適用於所有支援 ALUA 的儲存陣列。- const
對所有路徑使用常數值。
- path_latency
測量路徑裝置上的 I/O 延遲 (從 I/O 提交到完成的時間),並為低延遲裝置指定較高的優先程度。如需詳細資料,請參閱
multipath.conf(5)
。該演算法仍處於實驗階段。- weightedpath
根據名稱、序號、Host:Bus:Target:Lun ID (HBTL) 或光纖通道 WWN 為路徑指定優先程度。優先程度值不會隨時間變更。該方法需要
prio_args
引數,如需詳細資料,請參閱multipath.conf(5)
。例如:prio weightedpath prio_args "hbtl 2:.*:.*:.* 10 hbtl 3:.*:.*:.* 20 hbtl .* 1"
這會為 SCSI 主機 3 上的裝置指定比 SCSI 主機 2 上的裝置更高的優先程度,並為所有其他裝置指定較低的優先程度。
- prio_args
一些
prio
演算法需要額外的引數。這些引數在此選項中指定,其語法取決於演算法。參見上文內容。- hardware_handler
核心在切換路徑群組時用來啟用路徑裝置的核心模組名稱。此選項對最新的核心沒有影響,因為系統會自動偵測硬體處理器。請參閱 第 18.2.3 節 「需要特定硬體處理器的儲存陣列」。
- path_selector
用於在作用中路徑群組的路徑之間平衡負載的核心模組名稱。可用的選項取決於核心組態。由於歷史原因,在
multipath.conf
中,名稱必須一律用引號括住並後接一個「0」,如下所示:path_selector "queue-length 0"
- service-time
估算在所有路徑上完成待處理 I/O 所需的時間,並選取值最低的路徑。此為預設選項。
- historical-service-time
根據歷程服務時間 (保持移動平均值) 和未完成申請數量估算未來的服務時間。估算在所有路徑上完成待處理 I/O 所需的時間,並選取值最低的路徑。
- queue-length
選取目前待處理 I/O 申請數量最少的路徑。
- round-robin
採用輪替方式切換路徑。可以使用選項
rr_min_io_rq
和rr_weight
調整在切換到下一個路徑之前提交到路徑的申請數量。- io-affinity
此路徑選擇器目前不適用於
multipath-tools
。
修改 /etc/multipath.conf
檔案後,套用您的設定 (請參閱第 18.8.4 節 「套用 multipath.conf
修改」)。
18.11 選取要用於多重路徑的裝置 #
在配有多重路徑裝置的系統上,您可能希望避免在某些裝置 (通常是本地磁碟) 上設定多重路徑對應。multipath-tools
提供了多種方法來設定應視為多重路徑裝置的裝置。
一般而言,如果在本地磁碟的基礎上僅使用單部裝置設定「降級」多重路徑對應,將不會出現問題。系統可正常運作,且不需要額外組態。然而,一些管理員認為這會造成混亂,或者普遍反對這種不必要的多重路徑。另外,多重路徑層也會造成輕微的效能負擔。另請參閱第 18.3.2.2 節 「根檔案系統位於本地磁碟上」。
修改 /etc/multipath.conf
檔案後,套用您的設定 (請參閱第 18.8.4 節 「套用 multipath.conf
修改」)。
18.11.1 multipath.conf
中的 blacklist
區段 #
/etc/multipath.conf
檔案可能包含 blacklist
區段,其中會列出 multipathd
和 multipath
應該忽略的所有裝置。以下範例展示了可用於排除裝置的方法:
blacklist { wwid 3600605b009e7ed501f0e45370aaeb77f 1 device { 2 vendor ATA product .* } protocol scsi:sas 3 property SCSI_IDENT_LUN_T10 4 devnode "!^dasd[a-z]*" 5 }
| |
此 | |
透過
從 SLES 15 SP1 和 SLES 12 SP5 開始支援此格式。 | |
這一 | |
建議僅對使用規則運算式的裝置類別採用透過
該範例展示了僅在 |
依預設,multipath-tools
會忽略除 SCSI、DASD 或 NVMe 以外的所有裝置。從技術上講,內建的 devnode 排除清單就是下面這個否定的規則運算式:
devnode !^(sd[a-z]|dasd[a-z]|nvme[0-9])
18.11.2 multipath.conf
中的 blacklist exceptions
區段 #
有時,需要僅將非常具體的裝置設定為用於多重路徑。在這種情況下,需預設排除裝置,並將應成為多重路徑對應一部分的裝置定義為例外。blacklist_exceptions
區段就用於實現此目的。該區段的一般用法如下方範例所示,該範例排除了所有儲存裝置,產品字串為「NETAPP」的儲存裝置除外:
blacklist { wwid .* } blacklist_exceptions { device { vendor ^NETAPP$ product .* } }
blacklist_exceptions
區段支援上文所述適用於 blacklist
區段的所有方法。
blacklist_exceptions
中的 property
指令是強制性的,因為每部裝置必須至少具有一個「允許的」udev 內容,才能視為多重路徑的路徑裝置 (內容的值無關緊要)。property
的內建預設值為
property (SCSI_IDENT_|ID_WWN)
系統只會包含至少具有一個與此規則運算式相符的 udev 內容的裝置。
18.11.3 影響選取裝置的其他選項 #
除了 blacklist
選項外,/etc/multipath.conf
中的數個其他設定也會影響哪些裝置可視為多重路徑裝置。
- find_multipaths
此選項控制首次遇到未排除的裝置時
multipath
和multipathd
的行為。可能的值包括:- greedy
將
/etc/multipath.conf
中的blacklist
未排除的所有裝置視為多重路徑裝置。這是 SUSE Linux Enterprise 的預設設定。如果此設定處於作用中狀態,則防止將裝置新增至多重路徑對應的唯一方法是將它們設定為排除。- strict
排除所有裝置,即使它不在
/etc/multipath.conf
的blacklist
區段中,除非裝置的 WWID 列於/etc/multipath/wwids
檔案中。使用者需要手動維護 WWID 檔案 (請參閱下面的備註)。- yes
如果裝置符合
strict
的條件,或者系統中至少存在一個擁有相同 WWID 的其他裝置,則會將裝置視為多重路徑裝置。- smart
首次遇到新的 WWID 時,會暫時將其標示為多重路徑裝置。
multipathd
會等待一段時間,看看是否會有擁有相同 WWID 的其他路徑出現。如果這類路徑出現,則會如常設定多重路徑對應。如果沒有出現,當超過逾時時間後,這部裝置就會做為非多重路徑裝置釋放到系統中。使用選項find_multipaths_timeout
可設定該逾時。此選項相依於
systemd
功能,這些功能僅在 SUSE Linux Enterprise Server 15 上提供。
注意:維護/etc/multipath/wwids
multipath-tools
會在/etc/multipath/wwids
檔案 (「WWID 檔案」) 中保留之前所設定多重路徑對應的記錄。WWID 列於此檔案中的裝置會視為多重路徑裝置。根據find_multipaths
的任何值 (greedy
除外) 選取多重路徑裝置時,該檔案都必不可少。如果
find_multipaths
設定為yes
或smart
,multipathd
會在設定新對應後新增 WWID 至/etc/multipath/wwids
,以便日後能夠更快地偵測到這些對應。可以手動修改 WWID 檔案:
>
sudo
multipath -a 3600a098000aad1e3000064e45f2c2355 1>
sudo
multipath -w /dev/sdf 2在
strict
模式下,這是新增新多重路徑裝置的唯一方法。修改 WWID 檔案後,執行multipathd reconfigure
以套用變更。我們建議在套用對 WWID 檔案的變更後重建 initramfs (請參閱第 18.7.4 節 「將 initramfs 與系統保持同步」)。- allow_usb_devices
如果此選項設定為
yes
,則會考慮將 USB 儲存裝置用於多重路徑。預設值為no
。
18.12 多重路徑裝置名稱和 WWID #
multipathd
和 multipath
會在內部使用 WWID 來識別裝置。WWID 還會用做預設的對應名稱。為了方便起見,multipath-tools
支援為多重路徑裝置指定更簡單、更容易記住的名稱。
18.12.1 WWID 和裝置識別 #
多重路徑操作必須能夠可靠地偵測代表同一儲存磁碟區各個路徑的裝置。為實現此目的,multipath-tools
使用了裝置的全球通用識別碼 (WWID) (有時也稱為通用唯一 ID (UUID) 或唯一 ID (UID — 請勿與「使用者 ID」混淆))。對應裝置的 WWID 一律與其路徑裝置的 WWID 相同。
依預設,系統會從 sysfs 檔案系統讀取裝置屬性,或使用特定的 I/O 指令,來根據裝置 udev 內容 (在 udev 規則中確定) 推斷路徑裝置的 WWID。若要查看裝置的 udev 內容,請執行以下指令:
>
udevadm info /dev/sdx
multipath-tools
用於衍生 WWID 的 udev 內容如下:
對於 SCSI 裝置,使用
ID_SERIAL
(請勿將此內容與裝置的「序號」混淆)對於 DASD 裝置,使用
ID_UID
對於 NVMe 裝置,使用
ID_WWN
無法變更使用中多重路徑對應的 WWID。如果已對應路徑裝置的 WWID 因組態變更而變更,則需要損毀該對應,並使用新的 WWID 設定新對應。如果舊對應正在使用中,則無法執行此操作。在極端情況下,WWID 變更可能會導致資料損毀。因此,必須嚴格避免套用會導致對應 WWID 變更的組態變更。
在 /etc/multipath.conf
中啟用 uid_attrs
選項可以實現此目的,請參閱第 18.13 節 「其他選項」。
18.12.2 為多重路徑對應設定別名 #
可以在 /etc/multipath.conf
的 multipaths
區段中設定任意對應名稱,如下所示:
multipaths { multipath { wwid 3600a098000aad1e3000064e45f2c2355 alias postgres } }
別名較為易懂,但需要個別將它們指定給每個對應,這在大型系統上可能很麻煩。
18.12.3 使用自動產生的使用者易記名稱 #
multipath-tools
還支援自動產生的別名,即所謂的「使用者易記名稱」。別名的命名方案遵循以下模式:mpathINDEX,其中 INDEX 為小寫字母 (以 a
開頭)。因此,首個自動產生的別名為 mpatha
,下一個別名為 mpathb
、然後是 mpathc
,直至 mpathz
。之後是 mpathaa
、mpathab
等,依此類推。
對應名稱只有在永久存在時才有用。multipath-tools
會在 /etc/multipath/bindings
檔案 (「bindings 檔案」) 中記錄指定的名稱。建立新對應時,首先會在此檔案中尋找 WWID。如果未找到,則會為對應指定可用性最低的使用者易記名稱。
第 18.12.2 節 「為多重路徑對應設定別名」中所述的明確別名優先於使用者易記名稱。
/etc/multipath.conf
中的以下選項會影響使用者易記名稱:
- user_friendly_names
如果設定為
yes
,則會指定並使用使用者易記名稱。否則,將使用 WWID 做為對應名稱,除非設定了別名。- alias_prefix
用於建立使用者易記名稱的字首,預設為
mpath
。
對於叢集操作,裝置名稱必須在叢集的所有節點間都相同。multipath-tools
組態必須在節點之間保持同步。如果使用 user_friendly_names
,multipathd
可以在執行時期修改 /etc/multipath/bindings
檔案。此類修改必須動態複製到所有節點。這同樣適用於 /etc/multipath/wwids
(請參閱第 18.11.3 節 「影響選取裝置的其他選項」)。
可以在執行時期變更對應名稱。使用本節中所述的任何方法以及執行 multipathd
reconfigure
,都可變更對應名稱,而不會造成系統作業中斷。
18.12.4 參考多重路徑對應 #
從技術上講,多重路徑對應是裝置對應程式裝置,其名稱一般採用 /dev/dm-n
格式,其中 n 為整數。這些名稱不是永久存在的。切勿使用它們來參考多重路徑對應。udev
會建立指向這些裝置的各種符號連結,這些連結更適合做為永久參考。這些連結的不同之處在於它們不會隨特定組態的變更而變化。下面的一般範例展示了所有指向同一裝置的各種符號連結。
/dev/disk/by-id/dm-name-mpathb1 -> ../../dm-1 /dev/disk/by-id/dm-uuid-mpath-3600a098000aad73f00000a3f5a275dc82 -> ../../dm-1 /dev/disk/by-id/scsi-3600a098000aad73f00000a3f5a275dc83 -> ../../dm-1 /dev/disk/by-id/wwn-0x600a098000aad73f00000a3f5a275dc84 -> ../../dm-1 /dev/mapper/mpathb5 -> ../dm-1
這兩個連結使用對應名稱來參考對應。因此,如果對應名稱變更 (例如,如果您啟用或停用使用者易記名稱),連結也會變更。 | |
此連結使用裝置對應程式 UUID,即
若要確保僅參考多重路徑裝置,最好採用裝置對應程式 UUID。例如, filter = [ "a|/dev/disk/by-id/dm-uuid-mpath-.*|", "r|.*|" ] | |
這些連結通常指向路徑裝置。多重路徑裝置會取代這些連結,因為該裝置具有更高的 udev 連結優先程度 (請參閱 |
對於 kpartx
工具所建立多重路徑對應上的分割區,存在類似的符號連結,它們源自父裝置名稱或 WWID 和分割區編號:
/dev/disk/by-id/dm-name-mpatha-part2 -> ../../dm-5 /dev/disk/by-id/dm-uuid-part2-mpath-3600a098000aad1e300000b4b5a275d45 -> ../../dm-5 /dev/disk/by-id/scsi-3600a098000aad1e300000b4b5a275d45-part2 -> ../../dm-5 /dev/disk/by-id/wwn-0x600a098000aad1e300000b4b5a275d45-part2 -> ../../dm-5 /dev/disk/by-partuuid/1c2f70e0-fb91-49f5-8260-38eacaf7992b -> ../../dm-5 /dev/disk/by-uuid/f67c49e9-3cf2-4bb7-8991-63568cb840a4 -> ../../dm-5 /dev/mapper/mpatha-part2 -> ../dm-5
請注意,分割區通常也有 by-uuid
連結,該連結不參考裝置自身,而是參考裝置包含的檔案系統。一般最好使用這些連結。即使將檔案系統複製到不同的裝置或分割區,這些連接也不會變更。
當 dracut
建構 initramfs 時,會在 initramfs 中建立裝置的硬式編碼參考,並預設使用 /dev/mapper/$MAP_NAME
參考。如果 initramfs 中使用的對應名稱與建構 initramfs 時使用的名稱不符,在開機期間將找不到這些硬式編碼參考,導致開機失敗。這種情況通常不會發生,因為 dracut
會將所有多重路徑組態檔案新增至 initramfs 中。但如果 initramfs 是從不同的環境 (例如,在救援系統中或在離線更新期間) 建構的,就會出現問題。為防止這類開機失敗,請變更 dracut
的 persistent_policy
設定 (如第 18.7.4.2 節 「initramfs 中永久裝置的名稱」所述)。
18.13 其他選項 #
本節列出了一些到目前為止尚未提及的有用 multipath.conf
選項。如需完整清單,請參閱 multipath.conf(5)
。
- verbosity
控制
multipath
和multipathd
的記錄詳細程度。指令列選項-v
可覆寫這兩個指令的此設定。值可以介於 0 (僅限致命錯誤) 到 4 (詳細記錄) 之間。預設值為 2。- uid_attrs
此選項可實現 udev 事件處理最佳化,即所謂的「uevent 合併」。它在數百個路徑裝置可能同時發生故障或重新出現的環境中非常有用。為了確保路徑 WWID 不會變更 (請參閱第 18.12.1 節 「WWID 和裝置識別」),值應該完全依照下方所示設定:
defaults { uid_attrs "sd:ID_SERIAL dasd:ID_UID nvme:ID_WWN" }
- skip_kpartx
如果針對多重路徑裝置設定為
yes
(預設為no
),請勿在給定裝置的基礎上建立分割區裝置 (請參閱第 18.7.3 節 「多重路徑裝置上的分割區和kpartx
」)。可以用於虛擬機器使用的多重路徑裝置。先前的 SUSE Linux Enterprise Server 版本使用參數「features 1 no_partitions
」來實現同樣的效果。- max_sectors_kb
限制在多重路徑對應的所有路徑裝置的單個 I/O 申請中傳送的最大資料量。
- ghost_delay
在主動/被動陣列上,可能會發生被動路徑 (處於「ghost」狀態) 先於主動路徑查探到的情況。如果立即啟用對應並傳送 I/O,可能會導致花費很大代價才能啟用路徑。此參數指定在啟用對應之前等待對應的主動路徑出現的時間 (以秒計)。預設值為
no
(不進行 ghost 延遲)。- recheck_wwid
如果設定為
yes
(預設為no
),則會在失敗後再次檢查已還原路徑的 WWID,並移除已變更的 WWID。這是防止資料損毀的安全措施。- enable_foreign
multipath-tools
為除裝置對應程式多重路徑之外的其他多重路徑後端提供外掛程式 API。API 支援使用multipath -ll
等標準指令監控和顯示有關多重路徑拓撲的資訊。不支援修改拓撲。enable_foreign
的值是用於比對外部程式庫名稱的規則運算式。預設值為“NONE
”。SUSE Linux Enterprise Server 隨附
nvme
外掛程式,新增了原生 NVMe 多重路徑支援 (請參閱第 18.2.1 節 「多重路徑實作:裝置對應程式和 NVMe」)。若要啟用nvme
外掛程式,請設定defaults { enable_foreign nvme }
18.13.1 處理不可靠 (「臨界」) 的路徑裝置 #
架構中的不穩定狀況可能會導致路徑裝置行為不正常。它們頻繁出現 I/O 錯誤、復原然後再次失敗。此類路徑裝置也稱為「臨界」或「不穩定」路徑。本節概述了 multipath-tools
提供的一些可解決此問題的選項。
如果首次失敗後尚未過去 marginal_path_double_failed_time
,路徑裝置便出現第二次失敗 (從良好轉變為不佳),multipathd
會開始以每秒 10 次申請的速率監控該路徑,監控期為 marginal_path_err_sample_time
。如果在監控期內錯誤率超過 marginal_path_err_rate_threshold
,則會將該路徑歸類為臨界路徑。marginal_path_err_recheck_gap_time
過後,該路徑會再次轉變為正常狀態。
如果所有四個 marginal_path_
數字參數均設定為正值,並且 marginal_pathgroups
未設定為 fpin
,系統便會使用此演算法。從 SUSE Linux Enterprise Server 15 SP1 和 SUSE Linux Enterprise Server 12 SP5 開始,可以使用此演算法。
- marginal_path_double_failed_time
觸發路徑監控的兩次路徑失敗相隔的最長時間 (以秒計)。
- marginal_path_err_sample_time
路徑監控間隔的時長 (以秒計)。
- marginal_path_err_rate_threshold
最小錯誤率 (每千次 I/O)。
- marginal_path_err_recheck_gap_time
使路徑保持為臨界狀態的時間 (以秒計)。
- marginal_pathgroups
此選項從 SLES 15SP3 開始可用。可能的值:
- off
臨界狀態由
multipathd
確定 (見上文)。只要臨界路徑仍處於臨界狀態,就不會恢復這些路徑。這是早於 SUSE Linux Enterprise Server SP3 的版本的預設值和行為,在這些版本中,marginal_pathgroups
選項不可用。- on
與
off
選項類似,但不是將它們保持在失敗狀態,而是將臨界路徑移至單獨的路徑群組,為該路徑群組指定的優先程度將低於所有其他路徑群組 (請參閱第 18.10 節 「設定路徑分組和優先程度」)。僅當其他路徑群組中的所有路徑都失敗時,才會將此路徑群組中的路徑用於 I/O。- fpin
此設定從 SLES 15SP4 開始可用。臨界路徑狀態源自 FPIN 事件 (見下文)。臨界路徑會移至單獨的路徑群組中,具體請參閱
off
的相關內容。此設定不需要在主機端進行其他組態。建議使用這種方法來處理支援 FPIN 的光纖通道結構上的臨界路徑。注意:基於 FPIN 的臨界路徑偵測multipathd
可監聽光纖通道效能影響通知 (FPIN)。如果接收到某個路徑裝置的 FPIN-LI (連結完整性) 事件,該路徑便會進入臨界狀態。此狀態將一直持續,直至在連接該裝置的光纖通道介面卡上接收到 RSCN 或連結啟動事件。
您也可以使用一種更簡單的演算法,這種演算法使用參數 san_path_err_threshold
、san_path_err_forget_rate
和 san_path_err_recovery time
。建議對 SUSE Linux Enterprise Server 15 (GA) 採用此演算法。請參閱 multipath.conf(5)
中的「不穩定路徑偵測」部分。
18.14 最佳實務 #
18.14.1 有關組態的最佳實務 #
大量的組態指令一開始會令人望而生畏。通常,使用空組態便能獲得較好的結果,除非您處於叢集環境中。
下面是一些針對獨立伺服器的一般建議。它們並非強制性要求。如需背景資訊,請參閱前面小節中各參數的相關描述。
defaults { deferred_remove yes find_multipaths smart enable_foreign nvme marginal_pathgroups fpin # 15.4 only, if supported by fabric } devices { # A catch-all device entry. device { vendor .* product .* dev_loss_tmo infinity no_path_retry 60 # 5 minutes path_grouping_policy group_by_prio path_selector "historical-service-time 0" reservation_key file # if using SCSI persistent reservations } # Follow up with specific device entries below, they will take precedence. }
修改 /etc/multipath.conf
檔案後,套用您的設定 (請參閱第 18.8.4 節 「套用 multipath.conf
修改」)。
18.14.2 解讀多重路徑 I/O 狀態 #
若要快速瞭解多重路徑子系統,請使用 multipath
-ll
或 multipathd show topology
。這些指令的輸出具有相同格式。前一個指令讀取核心狀態,而後一個指令列印多重路徑精靈的狀態。兩個狀態通常是相同的。下面是一個輸出範例:
>
sudo
multipathd show topology mpatha1 (3600a098000aad1e300000b4b5a275d452) dm-03 NETAPP,INF-01-004 size=64G features='3 queue_if_no_path pg_init_retries 50'5 hwhandler='1 alua'6 wp=rw7 |-+- 8policy='historical-service-time 2'9 prio=5010 status=active11 | |-12 3:0:0:113 sdb 8:1614 active15 ready16 running17 | `- 4:0:0:1 sdf 8:80 active ready running `-+- policy='historical-service-time 2' prio=10 status=enabled `- 4:0:1:1 sdj 8:144 active ready running
對應名稱。 | |
對應 WWID (如果與對應名稱不同)。 | |
對應裝置的裝置節點名稱。 | |
廠商和產品名稱。 | |
路徑群組。路徑群組下方的縮排行列出了屬於該路徑群組的路徑裝置。 | |
路徑群組使用的路徑選擇器演算法。可以忽略「2」。 | |
路徑群組的優先程度。 | |
路徑群組的狀態 ( | |
路徑裝置。 | |
裝置的匯流排 ID (此處為 SCSI Host:Bus:Target:Lun ID)。 | |
路徑裝置的裝置節點名稱和主要/次要編號。 | |
路徑的核心裝置對應程式狀態 ( | |
多重路徑的路徑裝置狀態 (見下文)。 | |
核心中路徑裝置的狀態。這是與裝置類型相關的值。對於 SCSI,它可以是 |
多重路徑的路徑裝置狀態包括:
|
路徑正常運作 |
|
主動/被動陣列中的被動路徑 |
|
路徑已關閉或無法連接 |
|
檢查程式指令已逾時 |
|
等待完成路徑檢查程式指令 |
|
延遲路徑重新具現化以避免「擺動」 |
|
不可靠的路徑 (僅限 emc 路徑檢查程式) |
18.14.3 在多重路徑裝置上使用 LVM2 #
LVM2 具有內建的多重路徑裝置偵測支援。/etc/lvm/lvm.conf
中預設會啟用該支援:
multipath_component_detection=1
僅當 LVM2 也設定為從 udev 獲取有關裝置內容的資訊時,此功能才可靠:
external_device_info_source="udev"
這是 SUSE Linux Enterprise 15 SP4 中的預設設定,但早期版本中並非如此。您也可以 (儘管通常沒有必要) 為 LVM2 建立過濾運算式,以忽略除多重路徑裝置之外的所有裝置。請參閱 第 18.12.4 節 「參考多重路徑對應」。
18.14.4 解決停止的 I/O #
如果所有路徑同時失敗,並且 I/O 已排入佇列,應用程式可能會停滯很長時間。若要解決此問題,您可以使用以下程序:
在終端機提示符處輸入以下指令:
>
sudo
multipathd disablequeueing map MAPNAME以裝置的正確 WWID 或對應的別名取代
MAPNAME
。此指令會立即使所有排入佇列的 I/O 失敗,並將錯誤傳播到呼叫應用程式。檔案系統將觀察 I/O 錯誤並切換到唯讀模式。
輸入下列指令重新啟動佇列:
>
sudo
multipathd restorequeueing MAPNAME
18.14.5 多重路徑裝置上的 MD RAID #
多重路徑上的 MD RAID 陣列由系統的 udev 規則自動設定。無需在 /etc/mdadm.conf
中進行特殊的組態設定。
18.14.6 在不重新開機的情況下掃描新裝置 #
如果已將系統設定為啟用多重路徑,並且您需要將儲存新增到 SAN,則可以使用 rescan-scsi-bus.sh
程序檔掃描新裝置。該指令的一般語法如下:
>
sudo
rescan-scsi-bus.sh [-a] [-r] --hosts=2-3,5
其中各選項的含義如下:
- -a
使用該選項可確保掃描所有 SCSI 目標來查看是否有新 LUN,否則將僅掃描現有目標。
- -r
使用該選項將允許移除已在儲存端移除的裝置。
- --hosts
使用該選項可指定要掃描的主機匯流排介面卡清單 (預設為掃描全部)。
若要獲取其他選項的說明,請執行 rescan-scsi-bus.sh --help
。
如果 multipathd
在執行中,並且探查到新的 SAN 裝置,系統應該會根據第 18.11 節 「選取要用於多重路徑的裝置」所述的組態自動將它們設定為多重路徑對應。
在 EMC PowerPath 環境中,請勿使用作業系統隨附的 rescan-scsi-bus.sh
公用程式或 HBA 廠商程序檔來掃描 SCSI 匯流排。為了避免潛在的檔案系統損毀,EMC 要求您遵循 EMC PowerPath for Linux 的廠商文件中提供的程序來操作。
18.15 MPIO 疑難排解 #
如果某個系統在具有多重路徑的另一個系統上進入到緊急模式,並列印關於遺失裝置的訊息,原因不外乎以下幾種:
多重路徑裝置選取組態不一致
使用不存在的裝置參考
18.15.1 瞭解裝置選取問題 #
區塊裝置要麽做為多重路徑對應的一部分,要麽直接使用 (掛接為檔案系統、做為交換、LVM 實體磁碟區或其他)。如果裝置已掛接,則 multipathd 想要使其成為多重路徑對應一部分的嘗試將失敗,並顯示「裝置或資源正忙」錯誤。反之亦然,如果 systemd
嘗試掛接已成為多重路徑對應一部分的裝置,則會出現相同的錯誤。
開機期間的儲存裝置啟用由 systemd
、udev
、multipathd
和其他一些工具之間的複雜互動處理。udev
規則起著核心作用。它們會設定裝置內容,用於指示其他子系統應如何使用裝置。與多重路徑相關的 udev 規則會為選定用於多重路徑的裝置設定以下內容:
SYSTEMD_READY=0 DM_MULTIPATH_DEVICE_PATH=1
分割區裝置會從其父裝置繼承這些內容。
如果這些內容設定得不正確,一些工具會忽視這些內容,或者如果設定得太晚,則可能會導致 multipathd
與其他一些子系統之間出現競爭情形。只有一個競爭者能夠勝出;另一個會看到「裝置或資源正忙」錯誤。
這種情況下會出現如下問題:LVM2 套件的工具預設不評估 udev 內容。它們依靠自己的邏輯來確定裝置是否為多重路徑元件,這有時與系統其餘部分的邏輯不符。如需規避此問題的方法,請參閱第 18.14.3 節 「在多重路徑裝置上使用 LVM2」。
假設有這樣一個擁有多重路徑的系統,其根裝置未進行多重路徑處理,並且沒有裝置被排除在多重路徑之外 (請參閱第 18.3.2.2 節 「根檔案系統位於本地磁碟上」中的在 initramfs 中停用多重路徑)。根檔案系統掛接在 initramfs 中。systemd
切換到根檔案系統,並且 multipathd
啟動。由於裝置已掛接,multipathd
未能為其設定多重路徑對應。由於未在 blacklist
中設定根裝置,因此系統會將其視為多重路徑裝置並為其設定 SYSTEMD_READY=0
。
稍後在開機過程中,系統會嘗試掛接其他檔案系統,例如 /var
和 /home
。通常,這些檔案系統將與根檔案系統位於同一裝置上,預設做為根檔案系統自身的 BTRFS 子磁碟區。但 systemd 因 SYSTEMD_READY=0
無法掛接它們。我們陷入了鎖死狀態:無法建立 dm-multipath 裝置,並且基礎裝置因 systemd 而封鎖。無法掛接其他檔案系統,導致開機失敗。
我們目前已經擁有應對此問題的解決方案。 multipathd
會偵測到此情況,並將裝置釋放到 systemd
,之後其可繼續掛接檔案系統。儘管如此,瞭解這個普遍性問題很重要,因為它可能仍會以更難以察覺的方式發生。
18.15.2 瞭解裝置參考問題 #
第 18.7.4.2 節 「initramfs 中永久裝置的名稱」中提供了裝置參考問題的範例。通常情況下會有多個符號連結指向一個裝置節點 (請參閱第 18.12.4 節 「參考多重路徑對應」)。但這些連結並不總是存在;udev
會根據目前的 udev 規則建立它們。例如,如果多重路徑關閉,/dev/mapper/
下多重路徑裝置的符號連結將遺失。因此,對 /dev/mapper/
裝置的任何參考都將失敗。
此類參考可能會出現在許多地方,特別是在 /etc/fstab
和 /etc/crypttab
中、initramfs 中,甚至是在核心指令列上。
若要規避此問題,最安全的方法就是避免使用無法在重新開機後永久保留或相依於系統組態的裝置參考。一般而言,我們建議透過檔案系統自身的內容 (例如 UUID 或標籤) 而不是包含參考的裝置來參考檔案系統 (以及類似的實體,如交換空間)。如果此類參考不可用並且需要裝置參考 (例如,在 /etc/crypttab
中),則應仔細評估選項。例如,在 第 18.12.4 節 「參考多重路徑對應」 中,最佳選項可能是 /dev/disk/by-id/wwn-
連結,因為它也可與 multipath=off
配合使用。
18.15.3 緊急模式下的疑難排解步驟 #
由於存在許多差別非常細微的錯誤情況,因此無法提供逐步復原指南。但憑藉前幾節的背景知識,如果系統因多重路徑問題進入緊急模式,您應該能夠找出問題所在。在您開始除錯前,請確定您已檢查以下問題:
是否已啟用多重路徑服務?
initramfs 中是否包含多重路徑 dracut 模組?
我的根裝置是否設定為多重路徑裝置?如果沒有,根裝置是否如 第 18.11.1 節 「
multipath.conf
中的blacklist
區段」 所述正確排除在多重路徑之外,或者您是否依賴於 initramfs 中不存在多重路徑模組來實現這一點 (請參閱第 18.3.2.2 節 「根檔案系統位於本地磁碟上」)?系統進入緊急模式是在切換到真正的根檔案系統之前還是之後?
如果您不確定最後一個問題的答案,這裡有一個 dracut 緊急提示範例,切換根之前會列印範例所示的內容:
Generating "/run/initramfs/rdsosreport.txt" Entering emergency mode. Exit the shell to continue. Type "journalctl" to view system logs. You might want to save "/run/initramfs/rdsosreport.txt" to a USB stick or /boot after mounting them and attach it to a bug report. Give root password for maintenance (or press Control-D to continue):
如果提及 rdsosreport.txt
,即表明系統仍從 initramfs 中執行。如果您仍然不確定,請登入系統並檢查 /etc/initrd-release
檔案是否存在。此檔案僅存在於 initramfs 環境中。
如果是在切換根之後進入緊急模式,緊急提示內容與此相似,但不會提及 rdsosreport.txt
:
Timed out waiting for device dev-disk-by\x2duuid-c4a...cfef77d.device. [DEPEND] Dependency failed for Local File Systems. [DEPEND] Dependency failed for Postfix Mail Transport Agent. Welcome to emergency shell Give root password for maintenance (or press Control-D to continue):
嘗試透過檢查失敗的 systemd 單元和日誌找出失敗的原因。
#
systemctl --failed#
journalctl -b -o short-monotonic在查看日誌時,確定第一個失敗的單元。當您發現第一處故障時,請非常仔細地檢查該時間點之前和前後的訊息。是否有任何警告或其他可疑訊息?
留意根交換 (「
Switching root.
」) 以及有關 SCSI 裝置、裝置對應程式、多重路徑和 LVM2 的訊息。尋找有關裝置和檔案系統的systemd
訊息 (「Found device
…」、「Mounting
…」、「Mounted
…」)。檢查現有裝置,包括低階裝置和裝置對應程式裝置 (請注意,下面的某些指令可能在 initramfs 中不可用):
#
cat /proc/partitions#
ls -l /sys/class/block#
ls -l /dev/disk/by-id/* /dev/mapper/*#
dmsetup ls --tree#
lsblk#
lsscsi從以上指令的輸出中,您應該能夠瞭解是否成功查探到低階裝置,以及是否設定了任何多重路徑對應和多重路徑分割區。
如果裝置對應程式多重路徑設定不符合您的預期,請檢查 udev 內容,特別是
SYSTEMD_READY
(見上文)#
udevadm info -e如果上一步顯示了未預期的 udev 內容,則表示可能在 udev 規則處理期間出現了問題。檢查其他內容,特別是用於識別裝置的內容 (請參閱第 18.12.1 節 「WWID 和裝置識別」)。如果 udev 內容正確,請再次檢查日誌中是否有
multipathd
訊息。尋找「Device or resource busy
」訊息。如果系統無法掛接或以其他方式啟用裝置,通常可以嘗試以手動方式啟用此裝置:
#
mount /var#
swapon -a#
vgchange -a y大多數情況下,手動啟用都會成功,並允許系統繼續開機 (通常只需登出緊急外圍程序),以及進一步檢查已開機系統中的情況。
如果手動啟用失敗,您可能會看到錯誤訊息,其中會提供有關問題所在的線索。您也可以再次執行這些指令,並指定更高的詳細程度。
此時,您應該知道出了什麼問題 (如果不知道,請聯絡 SUSE 支援部門,並準備好回答上面提出的大部分問題)。
您應該能夠使用一些外圍程序指令來解決這種情況,離開緊急外圍程序,然後成功開機。您仍然需要調整您的組態,以確保日後不會再出現同樣的問題。
否則,您需要將救援系統開機,以手動方式設定裝置以使用
chroot
進入真正的根檔案系統,並根據您在前面的步驟中瞭解到的情況嘗試解決問題。請注意,在這種情況下,根檔案系統的儲存堆疊可能與正常情況不同。根據您的設定,您可能會在建構新 initramfs 時強制新增或省略 dracut 模組。另請參閱第 18.7.4.1 節 「在 initramfs 中啟用或停用多重路徑」。如果問題頻繁發生,或者在每次嘗試開機時都發生,請嘗試以更高的詳細程度開機,以獲取有關失敗的更多資訊。以下核心參數或它們的組合通常很有用:
udev.log-priority=debug1 systemd.log_level=debug2 scsi_mod.scsi_logging_level=0204003 rd.debug4
此外,您也可以為特定驅動程式啟用記錄,並設定序列主控台以在開機期間擷取輸出。
18.15.4 技術資訊文件 #
如需 SUSE Linux Enterprise Server 上多重路徑 I/O 問題疑難排解的相關詳細資訊,請參閱 SUSE 知識庫中的下列技術資訊文件 (TID):