18 管理裝置的多重路徑 I/O #
本章描述如何透過使用多重路徑 I/O (MPIO) 管理伺服器和區塊儲存裝置間多重路徑的容錯移轉和路徑負載平衡。
18.1 瞭解多重路徑 I/O #
多重路徑是指伺服器與相同實體或邏輯區塊儲存裝置在伺服器中的主機匯流排介面卡與裝置的儲存控制器之間、跨多重實體路徑進行通訊的能力,通常是在光纖通道 (FC) 或 iSCSI SAN 環境中進行。
Linux 多重路徑提供了連接容錯功能並可在各主動連接之間實現負載平衡。設定並執行多重路徑時,會自動隔離並識別裝置連接失敗,並將 I/O 重新路由至替代連接。
多重路徑針對連接故障提供容錯,但不針對儲存裝置本身的故障提供容錯。針對後者的容錯是透過鏡像等互補技術實現的。
18.1.1 多重路徑的術語 #
- 儲存陣列
包含許多磁碟和多個結構連接 (控制器) 的硬體裝置,為用戶端提供 SAN 或 NAS 儲存。儲存陣列通常具備 RAID 和容錯移轉功能並支援多重路徑。一直以來,主動/被動 (容錯移轉) 和主動/主動 (負載平衡) 儲存陣列的組態是有區別的。這些概念仍舊存在,但它們不過是新式硬體所支援的路徑群組和存取狀態概念的特殊情況。
- 主機、主機系統
執行 SUSE Linux Enterprise Server 的電腦,用做儲存陣列的用戶端系統。
- 多重路徑對應、多重路徑裝置
一組路徑裝置。它代表儲存陣列上的儲存磁碟區,主機系統將其視為單個區塊裝置。
- 路徑裝置、低層級裝置
多重路徑對應的成員,通常是一個 SCSI 裝置。每個路徑裝置代表主機電腦與實際儲存磁碟區之間的唯一連接,例如,來自 iSCSI 工作階段的邏輯單位。在 Linux 裝置對應程式多重路徑下,路徑裝置在主機系統中保持可見且可存取。
- WWID、UID、UUID
「全球通用識別碼」、「唯一識別碼」、「通用唯一識別碼」。WWID 是儲存磁碟區的一個內容,因此,它在多重路徑對應的所有路徑裝置之間保持相同。
multipath-tools
使用 WWID 來確定應將哪些低層級裝置組合到多重路徑對應中。多重路徑依賴使用udev
來確定路徑裝置的 WWID。多重路徑對應的 WWID 永遠不會變更。可以透過/dev/disk/by-id/dm-uuid-mpath-WWID
可靠存取多重路徑裝置。WWID 應與可設定的對應名稱相區分 (請參閱第 18.9 節 「設定使用者易記的名稱或別名」)。
- uevent、udev 事件
由核心傳送至使用者空間並由
udev
子系統處理的事件。在新增、移除裝置或變更裝置內容時會產生 uevent。- 裝置對應程式
Linux 核心中用於建立虛擬區塊裝置的架構。對應裝置的 I/O 操作將重新導向至基礎區塊裝置。裝置對應可以堆疊。裝置對應程式實作自身的事件訊號 (也稱為「裝置對應程式事件」或「dm 事件」)。
18.2 硬體支援 #
多重路徑驅動程式和工具可在 SUSE Linux Enterprise Server 支援的所有架構上使用。不區分通訊協定的一般驅動程式適用於市面上大多數支援多重路徑的儲存硬體。一些儲存陣列廠商會提供其自己的多重路徑管理工具。請參閱廠商的硬體文件以決定所需設定。
18.2.1 多重路徑實作:裝置對應程式和 NVMe #
Linux 中傳統的一般多重路徑實作使用裝置對應程式架構。對於大多數裝置類型 (例如 SCSI 裝置),裝置對應程式多重路徑是唯一可用的實作。裝置對應程式多重路徑可自由設定,且非常靈活。
Linux NVM Express (NVMe) 核心子系統在核心中原生實作多重路徑。這種實作可以降低 NVMe 裝置 (通常是延遲極低的快速裝置) 的計算負荷。原生 NVMe 多重路徑不需要使用者空間元件。從 SLE 15 開始,原生多重路徑一直是 NVMe 多重路徑裝置的預設功能。
本章的其餘內容介紹裝置對應程式多重路徑。
18.2.2 針對多重路徑的儲存陣列自動偵測 #
裝置對應程式多重路徑是一般性的技術。多重路徑裝置偵測只要求核心偵測低層級 (例如 SCSI) 裝置,並要求裝置內容可靠地將多個低層級裝置識別為同一個磁碟區的不同「路徑」,而不是實際不同的裝置。
multipath-tools
套件依廠商和產品名稱偵測儲存陣列。它已驗證多種不同儲存產品的內建組態預設值。請參閱儲存陣列的硬體文件;某些廠商為 Linux 多重路徑組態提供了具體的建議。若要查看在系統上偵測到的內建儲存設定,請執行指令 multipath -T
,具體請參閱第 18.4.5 節 「multipath 指令」。
如果您需要對儲存陣列的內建組態套用變更,請建立並設定 /etc/multipath.conf
檔案。請參閱第 18.6 節 「多重路徑組態」。
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 的陣列) 的硬體處理器。
18.3 規劃多重路徑 #
使用本節中的準則規劃多重路徑 I/O 解決方案。
18.3.1 先決條件 #
您用於多重路徑裝置的儲存陣列必須支援多重路徑。如需詳細資訊,請參閱 第 18.2 節 「硬體支援」。
只有在伺服器中的主機匯流排配接器和區塊儲存裝置的主機匯流排控制器之間存在多重實體路徑時,才需要設定多重路徑。
對於某些儲存陣列,廠商提供了自己的多重路徑軟體來管理陣列之實體和邏輯裝置的多重路徑。在這種情況下,您應根據廠商的指示設定那些裝置的多重路徑。
在虛擬化環境中使用多重路徑時,將在主機伺服器環境中控制多重路徑。請先設定裝置的多重路徑,然後才能將其指派給虛擬訪客機器。
18.3.2 多重路徑安裝類型和 initramfs #
18.3.2.1 根檔案系統位於多重路徑上 (SAN-boot) #
根檔案系統位於多重路徑裝置上 (通常,所有其他檔案系統也位於多重路徑儲存上)。對於僅使用 SAN 或 NAS 儲存的無磁碟伺服器,情況往往如此。在此類系統上,需要支援多重路徑才能開機,並且必須在 initramfs (initrd) 中啟用多重路徑。請參閱第 18.3.2.3 節 「使初始 RAM 磁碟保持同步」。
18.3.2.2 根檔案系統位於本地磁碟上 #
根檔案系統 (可能還包括其他某些檔案系統) 位於本地儲存中,例如,位於直接附加的 SATA 磁碟或本地 RAID 上,但系統額外使用多重路徑 SAN 或 NAS 儲存中的檔案系統。可透過三種不同的方式設定此系統類型:
- 使用 root-on-multipath 設定
所有區塊裝置 (包括本地磁碟) 是多重路徑對應的一部分。然後,此類設定將顯示為只有一個路徑的降級多重路徑對應。如果在使用 YaST 進行初始系統安裝期間啟用了多重路徑,則會建立此組態。這是最簡單的組態,但會產生效能負荷。
multipath-tools
忽略本地磁碟在此組態中,多重路徑在 initramfs 中啟用。可以在安裝後透過黑名單或
find_multipaths
組態參數實現這種組態。- 在 initramfs 中停用多重路徑
如果在使用 YaST 進行初始系統安裝期間未啟用多重路徑 (原因是 YaST 未偵測到多重路徑裝置,或者使用者在安裝期間選擇不啟用多重路徑),則會建立此設定。這是 第 18.3.2.3 節 「使初始 RAM 磁碟保持同步」 不適用的唯一一種情況。
18.3.2.3 使初始 RAM 磁碟保持同步 #
確定初始 RAM 磁碟和開機的系統在對所有區塊裝置使用多重路徑方面保持一致行為。套用多重路徑組態變更後重建 initramfs。
如果在系統中啟用了多重路徑,那麼也需要在 initramfs
中啟用多重路徑,反之亦然。此規則的唯一例外情況是第 18.3.2.2 節 「根檔案系統位於本地磁碟上」中所述的選項 在 initramfs 中停用多重路徑。
多重路徑組態必須在開機的系統與 initrd 之間同步。因此,如果 /etc/multipath.conf
、/etc/multipath/wwids
、/etc/multipath/bindings
或者其他與裝置識別相關的組態檔案或 udev 規則發生變更,則需要使用以下指令重建初始 RAM FS:
>
sudo
dracut -f
如果 initrd
與系統不同步,系統將無法正常開機,啟動程序可能顯示應急外圍程序。如需如何避免或修復此類情況的說明,請參閱第 18.15.2 節 「啟用多重路徑時系統在開機過程中退出到緊急外圍程序」。
若要在非一般情況下重建初始 RAM 磁碟 (例如,從救援系統重建,或使用核心參數 multipath=off
開機後重建),必須格外小心。當且僅當 dracut
在建立 initrd 期間偵測到根檔案系統位於多重路徑裝置上時,它才會自動在初始 RAM 磁碟中包含多重路徑支援。在這種情況下,需要明確啟用或停用多重路徑。
若要在 initrd
中啟用多重路徑支援,請執行以下指令:
>
sudo
dracut --force --add multipath
若要在 initrd
中停用多重路徑支援,請執行以下指令:
>
sudo
dracut --force --omit multipath
18.3.3 磁碟管理任務 #
使用協力廠商 SAN 陣列管理工具或儲存陣列的使用者介面來建立邏輯裝置,並將其指定給主機。確定在兩端正確設定主機身分證明。
可以在執行中的主機上新增或移除磁碟區,但偵測變更時可能需要重新掃描 SCSI 目標並在主機上重新設定多重路徑。
18.3.4 軟體 RAID 和複雜的儲存堆疊 #
多重路徑在 SCSI 磁碟等基本儲存裝置的頂層設定。在多層儲存堆疊中,多重路徑始終位於底層。其他層 (例如軟體 RAID、邏輯磁碟區管理、區塊裝置加密等) 排布在多重路徑之上。因此,對於每個具有多重 I/O 路徑的裝置和要用於軟體 RAID 的裝置來說,您必須先設定多重路徑的裝置,然後才能嘗試建立軟體 RAID 裝置。
如需為現有軟體 RAID 設定多重路徑的相關資訊,請參閱第 18.12 節 「為現有軟體 RAID 設定多重路徑 I/O」。
18.3.5 高可用性解決方案 #
叢集儲存資源的高可用性解決方案在每個節點上之多重路徑服務的基礎上執行。請確定每個節點上 /etc/multipath.conf
檔案中的組態設定在整個叢集中保持一致。
確定多重路徑裝置在所有裝置中的名稱都相同。如需詳細資訊,請參閱第 18.9.1 節 「HA 叢集中的多重路徑裝置名稱」。
用於 LAN 鏡像複製裝置的分散式複製區塊裝置 (DRBD) 高可用性解決方案在多重路徑的基礎上執行。對於每個具有多重 I/O 路徑的裝置和要用於 DRDB 解決方案的裝置來說,您必須先設定多重路徑的裝置,然後才能設定 DRDB。
將多重路徑與依賴於使用共用儲存實現圍籬區隔的叢集軟體 (例如包含 sbd
的 pacemaker
) 一起使用時必須格外小心。如需詳細資料,請參閱第 18.7 節 「設定輪詢、排入佇列和錯誤回復的規則」。
18.4 多重路徑管理工具 #
SUSE Linux Enterprise Server 中的多重路徑支援以 Linux 核心的裝置對應程式多重路徑模組及 multipath-tools
使用者空間套件為基礎。使用多裝置管理公用程式 (multipath
) 可以檢視多重路徑裝置的狀態。
18.4.1 裝置對應程式多重路徑模組 #
裝置對應程式多重路徑 (DM-MP) 模組為 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
開機。
DM-MPIO 可自動設定多重路徑子系統的多種設定。
多重路徑精靈 multipathd
會自動探查路徑並進行分組,還會自動重新測試路徑,以便在先前發生故障的路徑恢復正常時,能自動重新啟用該路徑。這樣會將管理員對生產環境的關注需求降到最低。
DM-MPIO 防範的是裝置路徑中的失敗,而不是裝置本身的失敗。如果其中一個主動路徑遺失 (例如網路卡損壞或光纖纜線被移開),則 I/O 會重新導向到其餘的路徑。如果所有主動路徑均發生故障,則必須喚醒非主動的次要路徑,因此容錯移轉最多會延遲 30 秒,具體視儲存陣列的內容而定。
如果指向給定裝置的每個路徑都發生故障,則傳送至此裝置的 I/O 可能會在核心中排入佇列給定的時間,甚至無限期排入佇列 (在這種情況下,排入佇列的 IO 總量會受到系統記憶體的限制)。
如果磁碟陣列有多個儲存處理器,請確保 SAN 交換器已連接到您要存取的 LUN 所屬的儲存處理器。在大多數磁碟陣列中,所有 LUN 都屬於兩個儲存處理器,因此兩個連接都處於主動模式。
在有些磁碟陣列中,儲存陣列透過儲存處理器來管理流量,因此每次只會顯示一個儲存處理器。一個處理器為主動,另外一個為被動,直到發生了失敗。如果您連接到錯誤的儲存處理器 (路徑為被動的處理器),則可能找不到所需的 LUN,或雖然找到了 LUN,但在嘗試存取時會發生錯誤。
18.4.2 多重路徑 I/O 管理工具 #
套件 multipath-tools
和 kpartx
提供了執行自動路徑探查和分組的工具。
-
multipathd
用於設定和監控多重路徑對應的精靈,以及用來與精靈程序通訊的指令行用戶端。請參閱第 18.4.4 節 「
multipathd
精靈和multipath
指令」。-
multipath
用於執行多重路徑操作的指令行工具。請參閱第 18.4.5 節 「multipath 指令」。
-
kpartx
用於管理多重路徑裝置上的「分割區」的指令行工具。請參閱第 18.5.3 節 「多重路徑裝置上的分割區」。
-
mpathpersist
用於管理 SCSI 永久保留的指令行工具。請參閱第 18.4.6 節 「mpathpersist 公用程式」。
18.4.3 多重路徑裝置上的 MD RAID #
多重路徑上的 MD RAID 陣列由系統的 udev 規則自動設定。不需要在 /etc/mdadm.conf
中進行特殊的組態設定。
18.4.4 multipathd
精靈和 multipath
指令 #
multipathd
是新式 Linux 裝置對應程式多重路徑設定中的最重要部分。此精靈通常是透過 systemd 服務 multipathd.service
啟動的。支援透過 multipathd.socket
啟用通訊端,但強烈建議在包含多重路徑硬體的系統上啟用 multipathd.service
。
multipathd
可處理以下任務 (其中一些任務依賴於組態):
啟動時,偵測路徑裝置並設定從偵測到的裝置的多重路徑對應。
監控 uevent 和裝置對應程式事件,根據需要在多重路徑對應中新增或移除路徑對應,並啟動容錯移轉或錯誤回復操作。
探查到新的路徑裝置時立即設定新對應。
定期檢查路徑裝置以偵測故障,並測試有故障的路徑,以便在它們恢復正常時將其重新啟用。
如果所有路徑都發生故障,
multipathd
將使對應失敗,或者將對應裝置切換到佇列模式,並使其排入佇列給定的一段時間。處理路徑狀態變更,並根據需要切換路徑群組或重新分組路徑。
測試路徑的「臨界」狀態,即導致路徑狀態在正常運作與不正常運作之間來回變化的不穩定結構狀況。
處理路徑裝置的 SCSI 永久保留金鑰 (如果已設定)。請參閱第 18.4.6 節 「mpathpersist 公用程式」。
multipathd
還用做指令行用戶端,透過將互動式指令傳送至執行中的精靈來處理這些指令。用於向精靈傳送指令的一般語法如下:
multipathd COMMAND
或
multipathd -k"COMMAND"
若要進入與精靈交互的模式,請執行:
multipathd -k
許多 multipathd
指令都有等同的 multipath
指令。例如,multipathd show topology
的作用與 multipath -ll
相同。兩者的明顯差別在於,multipathd 指令會查詢執行中 multipathd
精靈的內部狀態,而 multipath 則是直接從核心和 I/O 操作取得資訊。
如果多重路徑精靈正在執行,建議使用 multipathd
指令對系統進行修改。否則,該精靈可能會注意到組態變更並做出回應。在某些情況下,該精靈甚至可能嘗試復原已套用的變更。因此,如果偵測到執行中的精靈,multipath
會自動將某些可能有害的指令 (例如銷毀和衝洗對應) 委派給 multipathd
。
下面的清單描述了常用的 multipathd
指令:
- show topology
顯示目前的對應拓撲和內容。
- show paths
顯示目前已知的路徑裝置。
- show paths format "FORMAT STRING"
使用格式字串顯示目前已知的路徑裝置。使用
show wildcards
可查看支援的格式指定元清單。- show maps
顯示目前設定的對應裝置。
- show maps format FORMAT STRING
使用格式字串顯示目前設定的對應裝置。使用
show wildcards
可查看支援的格式指定元清單。- show config local
顯示 multipathd 目前使用的組態。
- reconfigure
重新讀取組態檔案、重新掃描裝置,並再次設定對應。這基本上等同於重新啟動
multipathd
。有幾個選項在不重新啟動的情況下無法修改。man 頁面multipath.conf(5)
中述及了這些選項。reconfigure
指令只會重新載入發生某種變更的對應裝置。若要強制重新載入每個對應裝置,請使用reconfigure all
。- del map MAP DEVICE NAME
取消設定並刪除給定的對應裝置及其分割區。MAP DEVICE NAME 可以是裝置節點名稱 (例如
dm-0
)、WWID 或對應名稱。如果該裝置正在使用中,則該指令會失敗。
可以使用其他指令來修改路徑狀態、啟用或停用佇列等。如需詳細資料,請參閱 multipathd(8)
。
18.4.5 multipath 指令 #
雖然多重路徑設定大部分是自動完成的,並由 multipathd
處理,但 multipath
對於某些管理任務仍然很有用。下面提供了幾個指令用法範例:
- multipath
偵測路徑裝置並設定找到的所有多重路徑對應。
- multipath -d
類似於
multipath
,但不設定任何對應 (「模擬執行」)。- multipath DEVICENAME
設定特定的多重路徑裝置。DEVICENAME 可按照裝置節點名稱 (
/dev/sdb
) 或者按照major:minor
格式的裝置號碼來表示成員路徑裝置。或者,它可以是多重路徑對應的 WWID 或名稱。- multipath -f DEVICENAME
取消設定 (「衝洗」) 多重路徑對應及其分割區對應。如果該對應或其某個分割區正在使用中,則該指令會失敗。請參閱上文瞭解 DEVICENAME 的可能值。
- multipath -F
取消設定 (「衝洗」) 所有多重路徑對應及其分割區對應。如果這些對應正在使用中,則該指令會失敗。
- multipath -ll
顯示所有目前設定的多重路徑裝置的狀態和拓撲。
- multipath -ll DEVICENAME
顯示指定多重路徑裝置的狀態。請參閱上文瞭解 DEVICENAME 的可能值。
- multipath -t
顯示內部硬體表和使用中的多重路徑組態。如需組態參數的詳細資料,請參閱
multipath.conf(5)
。- multipath -T
功能與
multipath -t
指令類似,但僅顯示在主機上偵測到的硬體的硬體項目。
選項 -v
控制輸出的詳細程度。您可以使用介於 0 (僅限嚴重錯誤) 和 4 (詳細記錄) 之間的值。預設值為 -v2
。可以在 /etc/multipath.conf
中使用 verbosity
選項來變更 multipath
和 multipathd
的預設詳細程度。
18.4.6 mpathpersist 公用程式 #
mpathpersist
公用程式可用於管理裝置對應程式多重路徑裝置上的 SCSI 永久保留。永久保留用於僅限特定的 SCSI 啟動器存取 SCSI 邏輯單位。在多重路徑組態中,必須對給定磁碟區的所有 I_T 聯結 (路徑) 使用相同的保留金鑰;否則,在一個路徑上建立保留可能會導致其他路徑發生故障。
將此公用程式與 /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
,可以在檔案 /etc/multipath/prkeys
中使用 mpathpersist
動態管理保留金鑰。
這是處理多重路徑對應永久保留的建議方法。從 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.5 針對多重路徑設定系統 #
18.5.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>
sudo
systemctl stop multipathd.socket
強烈建議始終在可存取多重路徑硬體的每部主機上啟用並執行 multipathd.service
。但是,有時可能由於移除了多重路徑硬體、要部署其他一些多重路徑軟體或出於疑難排解目的,而需要停用該服務。
若要僅為單次系統開機停用多重路徑,請使用核心參數 multipath=off
。這會影響開機的系統和初始 ramfs (在這種情況下不需要重建初始 ramfs)。
若要永久停用 multipathd 服務,使其不會在系統今後開機時啟動,請執行以下指令:
>
sudo
systemctl disable multipathd>
sudo
systemctl disable multipathd.socket>
sudo
dracut --force --omit multipath
(每次停用或啟用多重路徑服務後,都需要重建 initrd
。請參閱第 18.3.2.3 節 「使初始 RAM 磁碟保持同步」)。
(選擇性) 此外,如果您還想確定不會設定多重路徑裝置 (即使是手動執行 multipath
時),請在重建 initrd 之前,將以下行新增至 /etc/multipath.conf
的末尾:
blacklist { wwid .* }
18.5.2 針對多重路徑準備 SAN 裝置 #
在為 SAN 裝置設定多重路徑 I/O 之前,請視需要執行以下步驟準備 SAN 裝置:
使用廠商工具對 SAN 進行設定並分區。
使用廠商工具設定儲存陣列中主機 LUN 的權限。
如果 SUSE Linux Enterprise Server 未隨附主機匯流排介面卡 (HBA) 的驅動程式,請安裝 HBA 廠商提供的 Linux 驅動程式。如需更多詳細資料,請參閱廠商的特定指示。
如果已偵測到多重路徑裝置並已啟用 multipathd.service
,則應會自動建立多重路徑對應。如果未自動建立,請使用 lsscsi
之類的指令檢查低層級裝置的查探。另外,請使用 journalctl -b
檢查系統記錄。如果 HBA 驅動程式無法探查到 LUN,請檢查 SAN 中的區域設定。尤其是要檢查 LUN 遮罩是否處於使用中,且 LUN 是否正確地指定給伺服器。
如果 HBA 驅動程式可以探查到 LUN,但未建立相應的區塊裝置,則可能需要使用額外的核心參數。請參閱 SUSE 知識庫中的 TID 3955167:Troubleshooting SCSI (LUN) Scanning Issues (SCSI (LUN) 掃描問題疑難排解),網址為 https://www.suse.com/support/kb/doc.php?id=3955167。
18.5.3 多重路徑裝置上的分割區 #
多重路徑對應可以像其路徑裝置一樣包含分割區。分割區表掃描以及為分割區建立裝置節點的操作是由 kpartx
工具在使用者空間中執行的。kpartx
由 udev 規則自動呼叫,通常不需要手動執行。從技術上講,kpartx 建立的「分割區」裝置也是裝置對應程式裝置,這些裝置只會對應父裝置中線性範圍的區塊。可以透過 /dev/disk/by-id/dm-uuid-partN-mpath-WWID
可靠地存取多重路徑裝置的、具有已知 WWID 的第 N 個分割區。
kpartx
呼叫
可以在 /etc/multipath.conf
中使用 skip_kpartx
選項來停用對選定的多重路徑對應呼叫 kpartx
。例如,在虛擬化主機上,這種做法可能很有用。
可以使用 YaST 或者使用 fdisk
或 parted
等工具來如常操作多重路徑裝置上的分割區表和分割區。當分割工具退出時,系統會記下套用於分割區表的變更。如果這種方法不起作用 (通常是因為裝置忙碌),請嘗試執行 multipathd reconfigure
或將系統重新開機。
不能以其他方式使用分割的多重路徑裝置。例如,不能從分割的裝置建立 LVM 實體磁碟區。在執行此操作之前,需要抹除分割區表。
18.6 多重路徑組態 #
內建的 multipath-tools
預設值適用於大多數設定。如需進行自訂,需要建立一個組態檔案。主組態檔案是 /etc/multipath.conf
。此外,與模式 /etc/multipath/conf.d/*.conf
相符的檔案將依字母順序讀取。如需瞭解優先順序規則,請參閱第 18.6.2 節 「multipath.conf 語法」。
檔案 /etc/multipath/wwids
、/etc/multipath/bindings
和 /etc/multipath/prkeys
由 multipath-tools
維護,分別用於儲存關於先前建立的多重路徑對應、對應名稱和 SCSI 永久保留之保留金鑰的永久資訊。請不要編輯產生的這些組態檔案。
除 /etc/multipath.conf
之外的其他組態目錄和檔案的路徑均可設定,但強烈建議不要變更這些路徑。
18.6.1 建立 /etc/multipath.conf 檔案 #
您可以從內建預設值產生 multipath.conf
範本。這會使所有預設設定變為明確的設定。除非修改產生的檔案,否則 multipath-tools
的行為不會變更。若要產生組態範本,請執行:
multipath -T >/etc/multipath.conf
或者,可以建立一個精簡的 /etc/multipath.conf
,其中僅包含您要變更的設定。該行為等同於僅修改所產生範本中的相應行。
18.6.2 multipath.conf 語法 #
/etc/multipath.conf
檔案使用由區段、子區段和屬性/值對組成的階層。
記號由空格分隔。除非用引號括住 (參閱下文),否則連續的空格字元將摺疊成一個空格。
使用井號 (
#
) 和驚嘆號 (!
) 字元會導致將行中的其餘內容作為備註丟棄。區段和子區段在同一行中以區段名稱和左大括號 (
{
) 開頭,並在獨立的一行中以右大括號 (}
) 結尾。屬性和值編寫在一行中。不支援行接續。
屬性和區段名稱必須是關鍵字。
multipath.conf(5)
中闡述了允許的關鍵字。值可以用雙引號 (
"
) 括住。如果值包含空格或備註字元,則必須用引號將其括住。值中的雙引號字元由一對雙引號 (""
) 表示。某些屬性的值是 POSIX 規則運算式 (請參閱
regex(7)
)。它們區分大小寫且位置不固定,例如,「bar
」與「rhabarber
」相符。
語法範例#
section { subsection { attr1 value attr2 "complex value!" attr3 "value with ""quoted"" word" } ! subsection end } # section end
優先順序規則#
如第 18.6 節 「多重路徑組態」的開頭所述,可以建立多個組態檔案。其他檔案遵循與 /etc/multipath.conf
相同的語法規則。區段和屬性可以多次出現。如果在多個檔案中或者在同一檔案的多行中設定了同一個屬性,則讀取的最後一個值優先。
18.6.3 /etc/multipath.conf
區段 #
/etc/multipath.conf
檔案由下列區段構成。某些屬性可以出現在多個區段中。如需詳細資料,請參閱multipath.conf(5)
。
- defaults
一般預設設定。
- blacklist
列出要忽略的裝置。請參閱第 18.8 節 「將非多重路徑裝置加入黑名單」。
- blacklist_exceptions
列出要進行多重路徑處理的裝置,即使它們與黑名單相符。請參閱第 18.8 節 「將非多重路徑裝置加入黑名單」。
- devices
特定於儲存控制器的設定。此區段是
device
子區段的集合。此區段中的值會覆寫defaults
區段中相同屬性的值。- multipaths
個別多重路徑裝置的設定。此區段是
multipath
子區段的清單。值將覆寫defaults
和devices
區段。- overrides
覆寫所有其他區段中的值的設定。
18.6.4 套用 /etc/multipath.conf
修改 #
若要套用組態變更,請執行
>
sudo
multipathd reconfigure
請不要忘記與 initrd 中的組態同步。請參閱第 18.3.2.3 節 「使初始 RAM 磁碟保持同步」。
multipath
套用設定
當 multipathd
正在執行時,請不要使用 multipath
指令套用新設定。否則可能導致設定不一致甚至損壞。
在套用已修改的設定之前,可以先執行以下指令對其進行測試:
multipath -d -v2
此指令顯示要使用建議的拓撲建立的新對應。但是,該指令不顯示是否會移除/衝洗對應。如需更多資訊,請執行以下指令:
multipath -d -v3 2>&1 | less
18.6.5 產生 WWID #
為了在不同的路徑上識別裝置,多重路徑使用每部裝置的全球通用識別碼 (WWID)。如果兩個裝置路徑的 WWID 相同,則假定它們代表同一部裝置。除非有絕對的理由,否則建議不要變更產生 WWID 的方法。如需詳細資料,請參閱 man multipath.conf
。
18.7 設定輪詢、排入佇列和錯誤回復的規則 #
規則本節介紹用於實現容錯的最重要的 multipath-tools
組態參數。
- polling_interval
對路徑裝置進行狀態檢查的時間間隔 (以秒為單位)。預設值為 5 秒。將按照此時間間隔檢查有故障的裝置。對於正常的裝置,最多可將時間間隔增大至
max_polling_interval
秒。- 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 失敗。用心選擇超時值通常可以在使 I/O 失敗
與排入佇列
之間合理權衡。
多重路徑 I/O 的目的是在儲存系統與伺服器之間提供連接容錯。需要的預設行為視伺服器是獨立伺服器還是高可用性叢集中的節點而定。
如果您為獨立伺服器設定了多重路徑 I/O,no_path_retry
設定可使伺服器作業系統在盡可能長的時間內不收到 I/O 錯誤。它將訊息排入佇列,直到多重路徑容錯移轉發生並提供有效的連接為止。
為高可用性叢集中的節點設定多重路徑 I/O 時,您希望多重路徑報告 I/O 故障以觸發資源容錯移轉,而不是等待多重路徑容錯移轉得以解決。在叢集環境中,您必須修改 no_path_retry
設定,以確保在與儲存系統的連接中斷時,叢集節點會收到與叢集驗證程序相關的 I/O 錯誤 (建議設為 heartbeat 容錯的 50%)。此外,您還希望將多重路徑 I/O 錯誤回復設為手動,以避免因路徑故障而造成資源的乒乓效應。
/etc/multipath.conf
檔案應包含 defaults
區段,您可在其中指定輪詢、排入佇列和錯誤回復的預設行為。如果 device
區段中沒有指定此欄位,系統會為該 SAN 組態套用預設設定。
以下各項是已編譯的預設設定。除非您透過建立並設定個人化的 /etc/multipath.conf
檔案來覆寫這些值,否則將會使用它們。
defaults { verbosity 2 # udev_dir is deprecated in SLES 11 SP3 # udev_dir /dev polling_interval 5 # path_selector default value is service-time in SLES 11 SP3 # path_selector "round-robin 0" path selector "service-time 0" path_grouping_policy failover # getuid_callout is deprecated in SLES 11 SP3 and replaced with uid_attribute # getuid_callout "/usr/lib/udev/scsi_id --whitelisted --device=/dev/%n" # uid_attribute is new in SLES 11 SP3 uid_attribute "ID_SERIAL" prio "const" prio_args "" features "0" path_checker "tur" alias_prefix "mpath" rr_min_io_rq 1 max_fds "max" rr_weight "uniform" queue_without_daemon "yes" flush_on_last_del "no" user_friendly_names "no" fast_io_fail_tmo 5 bindings_file "/etc/multipath/bindings" wwids_file "/etc/multipath/wwids" log_checker_err "always" retain_attached_hw_handler "no" detect_prio "no" failback "manual" no_path_retry "fail" }
如需設定輪詢、排入佇列和錯誤回復規則的相關資訊,請參閱第 18.10 節 「設定路徑容錯移轉規則與優先程度」 中的下列參數:
修改 /etc/multipath.conf
檔案後,必須在系統上執行 dracut
-f
重新建立 initrd
,然後重新啟動伺服器,變更才會生效。如需詳細資料,請參閱第 18.6.4 節 「套用 /etc/multipath.conf
修改」。
18.8 將非多重路徑裝置加入黑名單 #
/etc/multipath.conf
檔案可能包含 blacklist
區段,其中會列出所有非多重路徑裝置。您可以透過 WWID (wwid
關鍵字)、裝置名稱 (devnode
關鍵字) 或裝置類型 (device
區段) 將裝置列入黑名單。您還可以使用 blacklist_exceptions
區段,對透過 blacklist
區段中所用的正規表示式列入黑名單的一些裝置啟用多重路徑。
將裝置加入黑名單的慣用方法是透過 WWID 或透過廠商和產品進行。建議不要透過 devnode 加入黑名單,因為裝置節點可能會發生變化,因此對長久識別裝置無幫助。
/etc/multipath.conf
中的規則運算式一般情況下不會運作。僅在與通用字串比對時,它們才會運作。不過,多重路徑的標準組態已包含許多裝置和廠商的規則運算式。將這些規則運算式與其他規則運算式比對並不會運作。請務必僅與執行 multipath -t
後所顯示的字串比對。
您一般可能會忽略非多重路徑裝置,例如 hpsa
、fd
、hd
、md
、dm
、sr
、scd
、st
、ram
、raw
和 loop
。例如,本地 SATA 硬碟和隨身碟沒有多重路徑。如果您希望 multipath
忽略單路徑裝置,請將它們加入 blacklist
區段中。
關鍵字 devnode_blacklist
已被關鍵字 blacklist
取代。
在 SUSE Linux Enterprise Server 12 中使用 glibc 提供的正規表示式。若要與任意字串相符,現在必須使用「.*」
,而不是僅使用「*」
。
例如,若要將本地裝置與 hpsa
驅動程式中的所有陣列列入黑名單,以免受到多重路徑的管理,則 blacklist
區段應為:
blacklist { wwid "26353900f02796769" devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*" devnode "^sd[a-z][0-9]*" }
您也可以只將驅動程式中的分割區 (而不是整個陣列) 列入黑名單。例如,您可以使用以下正規表示式,只將 cciss 驅動程式中的分割區而非整個陣列列入黑名單:
blacklist { devnode "^cciss!c[0-9]d[0-9]*[p[0-9]*]" }
您可以在 blacklist 中新增 device
區段,並使用 vendor
和 product
關鍵字,按特定裝置類型列入黑名單。
blacklist { device { vendor "DELL" product ".*" } }
您可以使用 blacklist_exceptions
區段,對透過 blacklist
區段中所用的正規表示式列入黑名單的一些裝置啟用多重路徑。您可以透過 WWID (wwid
關鍵字)、裝置名稱 (devnode
關鍵字) 或裝置類型 (device
區段) 新增例外。您必須以將相應裝置列入黑名單的相同方式指定例外。也就是說,wwid
例外適用於 wwid
黑名單,devnode
例外適用於 devnode
黑名單,而裝置類型例外適用於裝置類型黑名單。
例如,如果您擁有來自不同廠商的裝置類型,可以針對所需的裝置類型啟用多重路徑。在 blacklist
區段中將所有廠商的裝置類型列入黑名單,然後在 blacklist_exceptions
區段中新增 device
區段,針對所需的裝置類型啟用多重路徑。
blacklist { devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st|sda)[0-9]*" device { vendor "DELL" product ".*" } } blacklist_exceptions { device { vendor "DELL" product "MD3220i" } }
您還可以使用 blacklist_exceptions 僅針對特定裝置啟用多重路徑。例如:
blacklist { wwid ".*" } blacklist_exceptions { wwid "3600d0230000000000e13955cc3751234" wwid "3600d0230000000000e13955cc3751235" }
修改 /etc/multipath.conf
檔案後,必須在系統上執行 dracut
-f
重新建立 initrd
,然後重新啟動伺服器,變更才會生效。如需詳細資料,請參閱第 18.6.4 節 「套用 /etc/multipath.conf
修改」。
重新開機之後,當您發出 multipath -ll
指令時,這些本地裝置應不再列於多重路徑對應中。
find_multipaths
選項
從 SUSE Linux Enterprise Server 12 SP2 開始,多重路徑工具支援 /etc/multipath.conf
中 defaults
區段內的 find_multipaths
選項。此選項會阻止多重路徑和 multipathd
為只有單個路徑的裝置設定多重路徑對應 (如需詳細資料,請參閱 man 5 multipath.conf
)。如此,在某些組態中,管理員就無需為本地 SATA 磁碟等建立黑名單項目。
雖然使用 find_multipaths
選項看似很方便,但也有其弊端。它使得系統開機複雜化且速度變慢,因為對於發現的每部裝置,開機邏輯都需要等到探查了所有裝置之後才能確定裝置是否存在第二個路徑。此外,當一些路徑已關閉或在開機期間不可視時可能會出現問題 — 可能會錯誤地將裝置偵測為單路徑裝置並啟動,導致以後新增更多路徑的操作失敗。
find_multipaths
會將 /etc/multipath/wwids
中所列的具有相符 WWID 的所有裝置視為多重路徑裝置。請注意,第一次啟用 find_multipaths
時不會產生任何效果,除非刪除或編輯了 /etc/multipath/wwids
,因為所有先前存在的多重路徑對應 (包括單路徑對應) 都列於該 wwids 檔案中。在具有多重路徑根檔案系統的 SAN-boot 系統中,請務定 /etc/multipath/wwids
在初始 RAM 磁碟與檔案系統之間保持同步。
總而言之,雖然在某些情況下使用 find_multipaths
可能很方便,但 SUSE 仍建議使用正確設定了黑名單和黑名單例外的預設組態。
18.9 設定使用者易記的名稱或別名 #
多重路徑裝置可透過其 WWID、使用者易記的名稱或您為其指定的別名來識別。/dev/sdn
和 /dev/dm-n
格式的裝置節點名稱可在重新開機時變更,並且每次可能都會指定給不同的裝置。裝置的 WWID、使用者易記的名稱和別名在重新開機期間始終不變,因此是識別裝置的最好方法。
由於以 /dev/sdn
與 /dev/dm-n
形式表示的裝置節點名稱會在系統重新開機時變更,因此最好使用其 WWID 來參考多重路徑裝置。此外,您還可以使用對應至 WWID 的使用者易記名稱或別名,以便在重新開機時唯一識別裝置。
下表介紹了 /etc/multipath.conf
檔案中可用於裝置的裝置名稱類型。如需 multipath.conf
設定的範例,請參閱 /usr/share/doc/packages/multipath-tools/multipath.conf.synthetic
檔案。
名稱類型 |
描述 |
---|---|
WWID (預設) |
序列 WWID (全球識別碼) 是多重路徑裝置的識別碼,保證其全球唯一,永不變更。多重路徑中使用的預設名稱是邏輯單位的 ID,就是 |
使用者易記 |
|
別名 |
別名是管理員為多重路徑裝置指定的全域唯一名稱。別名會置換 WWID 及使用者易記的 如果您使用的是 user_friendly_names,請不要將別名設為 mpathN 格式。否則可能會與自動指定的使用者易記名稱產生衝突,導致提供的裝置節點名稱不正確。 |
/etc/multipath.conf
檔案中的全域多重路徑 user_friendly_names
選項用於啟用或停用對多重路徑裝置使用易記名稱的功能。如果將它設定為 no
(預設值),多重路徑會使用 WWID 做為裝置的名稱。如果將它設定為 yes
,多重路徑會使用 /var/lib/multipath/bindings
檔案,在 /dev/mapper
目錄中以 mpath<N>
格式為裝置指定一個永久的唯一名稱。/etc/multipath.conf
檔案中的 bindings file
選項可用於指定 bindings
檔案的替代位置。
/etc/multipath.conf
檔案中的全域多重路徑 alias
選項用於明確地為裝置指定名稱。如果為多重路徑裝置設定了別名,則會使用別名而不是 WWID 或易記名稱。
在下列情況下,使用 user_friendly_names
選項可能會產生問題:
- 根裝置正在使用多重路徑:
如果系統根裝置正在使用多重路徑,而您使用了
user_friendly_names
選項,則會將/var/lib/multipath/bindings
檔案中的使用者易記設定包含在initrd
中。如果您之後變更儲存設定,例如新增或移除裝置,則initrd
中的繫結設定會與/var/lib/multipath/bindings
中的繫結設定不符。警告:結合不相符項目initrd
與/var/lib/multipath/bindings
之間的繫結不符會導致將錯誤的掛接點指定給裝置,進而造成檔案系統損毀及資料遺失。為了避免此問題發生,建議您對系統根裝置使用預設 WWID 設定。請勿將別名用於系統根裝置。裝置名稱將會不同,因此使用別名會使您失去透過核心指令行順利關閉多重路徑的功能。
- 從另一個分割區掛接 /var:
user_friendly_names
組態檔案的預設位置是/var/lib/multipath/bindings
。如果/var
資料不在系統根設備上,而是從另一個分割區掛接,則設定多重路徑時無法獲取bindings
檔案。請確定
/var/lib/multipath/bindings
檔案位於系統根設備上,並且多重路徑可以找到它。例如,可以按如下所示操作:將
/var/lib/multipath/bindings
檔案移至/etc/multipath/bindings
。將 /
etc/multipath.conf
之defaults
區段中的bindings_file
選項設定為這個新位置。例如:defaults { user_friendly_names yes bindings_file "/etc/multipath/bindings" }
- initrd 中存在多重路徑:
即使系統根裝置不在多重路徑上,
initrd
中也有可能包含多重路徑。例如,如果系統根裝置位於 LVM 上,便可能會出現這種情況。如果您使用user_friendly_names
選項並且initrd
中存在多重路徑,則應該使用參數multipath=off
開機,以免發生問題。這會在系統開機期間於
initrd
中停用多重路徑。系統開機之後,boot.multipath
與multipathd
開機程序檔便能啟用多重路徑。- HA 叢集中的多重路徑:
如需詳細資料,請參閱第 18.9.1 節 「HA 叢集中的多重路徑裝置名稱」。
若要啟用使用者易記名稱或指定別名:
使用
root
權限在文字編輯器中開啟/etc/multipath.conf
檔案。(選擇性) 修改
/var/lib/multipath/bindings
檔案的位置。替代路徑必須是系統根裝置上可存取的位置,並且多重路徑必須能夠找到它。
將
/var/lib/multipath/bindings
檔案移至/etc/multipath/bindings
。將 /
etc/multipath.conf
之defaults
區段中的bindings_file
選項設定為這個新位置。例如:defaults { user_friendly_names yes bindings_file "/etc/multipath/bindings" }
(選擇性,但不建議) 啟用使用者易記的名稱:
取消
Defaults
區段及其結束括號的註解。取消
user_friendly_names option
的註解,然後將「否」值變更為「是」。例如:
## Use user-friendly names, instead of using WWIDs as names. defaults { user_friendly_names yes }
(選擇性) 在
multipath
區段中使用alias
選項,為裝置指定您自己的名稱。例如:
## Use alias names, instead of using WWIDs as names. multipaths { multipath { wwid 36006048000028350131253594d303030 alias blue1 } multipath { wwid 36006048000028350131253594d303041 alias blue2 } multipath { wwid 36006048000028350131253594d303145 alias yellow1 } multipath { wwid 36006048000028350131253594d303334 alias yellow2 } }
重要:WWID 與 WWN 的對比在
/etc/multipath.conf
檔案中定義裝置別名時,請確定使用的是每個裝置的 WWID (例如3600508e0000000009e6baa6f609e7908
) 而不是其 WWN,後者會以0x
取代裝置 ID 的第一個字元,例如0x600508e0000000009e6baa6f609e7908
。儲存變更,然後關閉檔案。
修改
/etc/multipath.conf
檔案後,必須在系統上執行dracut
-f
重新建立initrd
,然後重新啟動伺服器,變更才會生效。如需詳細資料,請參閱第 18.6.4 節 「套用/etc/multipath.conf
修改」。
若要直接使用整個 LUN (例如,若您使用 SAN 功能分割您的儲存區),可為 mkfs
、/etc/fstab
、您的應用程式等使用 /dev/disk/by-id/xxx
名稱。分割的裝置會將 _part<n>
附加到裝置名稱中,例如 /dev/disk/by-id/xxx_part1
。
在 /dev/disk/by-id
目錄中,多重路徑對應裝置會以裝置的 dm-uuid*
名稱或別名 (如果在 /etc/multipath.conf
檔案中為它指定了別名) 表示。scsi-
與 wwn-
裝置名稱表示裝置的實體路徑。
18.9.1 HA 叢集中的多重路徑裝置名稱 #
請執行下列操作,來確定多重路徑裝置名稱在所有裝置中都相同:
使用 UUID 及別名來確保多重路徑裝置名稱在叢集中的所有節點上都保持一致。別名在所有節點中必須是唯一的。將
/etc/multipath.conf
檔案從該節點複製到叢集中所有其他節點的/etc/
目錄下。使用多重路徑對應裝置的連結時,請確定在
/dev/disk/by-id
目錄中指定dm-uuid*
名稱或別名,而不是裝置的固定路徑例項。如需更多資訊,請參閱第 18.9 節 「設定使用者易記的名稱或別名」。將
user_friendly_names
組態選項設為no
以將其停用。使用者易記的名稱對於某個節點而言是唯一的,但是叢集中的每個節點可能無法為裝置指定相同的使用者易記名稱。
如果您確實需要使用使用者易記名稱,則可以執行下列操作,強制系統定義的使用者易記名稱在叢集中的所有節點上都保持一致:
在一個節點上的
/etc/multipath.conf
檔案中:將
user_friendly_names
組態選項設為yes
以將其啟用。多重路徑會使用
/var/lib/multipath/bindings
檔案,在/dev/mapper
目錄中以mpath<N>
格式為裝置指定一個永久的唯一名稱。(選擇性) 設定
/etc/multipath.conf
檔案之defaults
區段中的bindings_file
選項,以指定bindings
檔案的替代位置。預設位置為
/var/lib/multipath/bindings
。
設定節點上的所有多重路徑裝置。
將
/etc/multipath.conf
檔案從該節點複製到叢集中所有其他節點的/etc/
目錄下。將
bindings
檔案從該節點複製到叢集中所有其他節點上的bindings_file
路徑中。修改
/etc/multipath.conf
檔案後,必須在系統上執行dracut
-f
重新建立initrd
,然後重新啟動節點,變更才會生效。如需詳細資料,請參閱第 18.6.4 節 「套用/etc/multipath.conf
修改」。這適用於所有受影響的節點。
18.10 設定路徑容錯移轉規則與優先程度 #
在 Linux 主機上,若一個儲存控制器有多個路徑,則每個路徑會顯示為獨立的區塊裝置,導致單個 LUN 有多個區塊裝置。裝置對應程式多重路徑服務會偵測到多個路徑具有同一個 LUN ID,然後會使用該 ID 建立新的多重路徑裝置。例如,若主機上有兩個 HBA 透過未分區的光纖通道交換器連接至具有兩個連接埠的某個儲存控制器,則該主機會探查到四個區塊裝置,即 /dev/sda
、/dev/sdb
、/dev/sdc
與 /dev/sdd
。裝置對應程式多重路徑服務會建立單個區塊裝置 /dev/mpath/mpath1
,由它來透過以上 4 個基礎區塊裝置重新路由 I/O。
本節說明如何指定容錯移轉的規則及如何設定路徑的優先程度。請注意,修改 /etc/multipath.conf
檔案後,必須在系統上執行 dracut
-f
重新建立 initrd
,然後重新啟動伺服器,變更才會生效。如需詳細資料,請參閱第 18.6.4 節 「套用 /etc/multipath.conf
修改」。
18.10.1 設定路徑容錯移轉規則 #
搭配 -p
選項使用 multipath
指令可設定路徑容錯移轉規則:
>
sudo
multipath DEVICENAME -p POLICY
用以下其中一個規則選項取代 POLICY:
規則選項 |
描述 |
---|---|
failover |
(預設) 每個優先程度群組對應一個路徑。 |
multibus |
所有路徑都在一個優先程度群組中。 |
group_by_serial |
每個偵測到的序號對應一個優先程度群組。 |
group_by_prio |
每個路徑優先程度值對應一個優先程度群組。優先程度由註標程式決定,在 |
group_by_node_name |
每個目標節點名稱對應一個優先程度群組。目標節點名稱取自 |
18.10.2 設定容錯移轉優先程度 #
您必須在 /etc/multipath.conf
檔案中手動輸入裝置的容錯移轉優先程度。/usr/share/doc/packages/multipath-tools/multipath.conf.annotated
檔案中提供了所有設定與選項的範例。
18.10.2.1 瞭解優先程序群組與屬性 #
優先程度群組是進入相同實體 LUN 的路徑集合。依預設,I/O 以輪替方式發佈到群組的所有路徑。multipath
指令會根據 SAN 的 path_grouping_policy 設定,在該 SAN 中自動為每個 LUN 建立優先程度群組。multipath
指令會將群組中路徑的數量乘以群組的優先程度,來決定哪個群組為主要群組。計算值最高的群組為主要群組。主要群組中的所有路徑都失敗時,計算值次高的優先程度群組成為主動群組。
路徑優先程度是指定給路徑的整數值。值越大,優先程度越高。系統使用了外部程式來指定每個路徑的優先程度。對於指定的裝置,優先程度相同的路徑屬於同一個優先程度群組。
prio
設定在 /etc/multipath.conf
檔案的 defaults{}
或 devices{}
區段中使用。當為 multipaths{)
區段中的個別 multipath
定義指定該設定時,系統會靜默地將其忽略。prio
行會指定優先程度排序器。如果優先程度排序器需要引數,您可以在另一行上使用 prio_args
關鍵字來指定該引數。
Defaults 或 Devices 區段的 PRIO 設定#
prio
指定要呼叫以取得路徑優先程度值的優先程度排序程式。系統會將每個路徑群組的權數加總,以判斷發生故障時要使用的下一個路徑群組。
如果指定的優先程度排序器需要引數,請使用
prio_args
關鍵字進行指定。如果未指定任何
prio
關鍵字,則所有路徑的優先程度均相等。預設設定為const
,且prio_args
設定沒有值。prio "const" prio_args ""
優先程度排序器範例如下:
優先程度排序程式
描述
alua
根據 SCSI-3 ALUA 設定產生路徑優先程度。
const
為所有路徑產生相同的優先程度。
emc
為 EMC 陣列產生路徑優先程度。
hdc
為 Hitachi HDS Modular 儲存陣列產生路徑優先程度。
hp_sw
為主動/待命模式下的 Compaq/HP 控制器產生路徑優先程度。
ontap
為 NetApp 陣列產生路徑優先程度。
random
為每個路徑產生隨機優先程度。
rdac
為 LSI/Engenio RDAC 控制器產生路徑優先程度。
weightedpath
依據您在
prio_args
的引數中指定的加權值產生路徑優先程度。path_latency
依據延遲演算法產生路徑優先程度,您可以透過
prio_args
關鍵字來設定該演算法。
prio_args
引數#
這些是需要引數的優先程度排序器的引數。大多數 prio
程式都不需要引數。沒有預設值。該值取決於 prio
設定以及優先程度排序器是否需要以下任何引數:
- weighted
需要格式為
[hbtl|devname|serial|wwn]
REGEX1 PRIO1 REGEX2 PRIO2... 的值規則運算式必須採用 SCSI H:B:T:L 格式,例如 1:0:.:.和 *:0:0:.,並帶有權數值,其中 H、B、T 和 L 分別代表裝置的主機、匯流排、目標以及 LUN ID。例如:
prio "weightedpath" prio_args "hbtl 1:.:.:. 2 4:.:.:. 4"
- devname
Regex 為裝置名稱格式。例如:sda、sd.e
- serial
Regex 為序號格式。例如:.*J1FR.*324。請使用
multipathd show paths format %z
指令查詢您的序號。(multipathd show wildcards
會顯示所有format
萬用字元。)- alua
如果為某部裝置 (
alua exclusive_pref_bit
) 設定了exclusive_pref_bit
,那麼設定了preferred path
的路徑將永遠在其自身的路徑群組中。- path_latency
如果遠端儲存陣列和本地儲存陣列使用的硬體類型相同,則可使用
path_latency
調整這兩個陣列之間的延遲。遠端陣列上的延遲通常更高,因此您可以微調延遲,使兩個陣列的時間更接近。這需要格式為io_num=20 base_num=10
的值組。io_num
是連續傳送到目前路徑的讀取 IO 數,用於計算平均路徑延遲。有效值為 2 到 200 的整數。base_num
是對數的底數,用於分割不同的優先程度排名。有效值為 2 到 10 的整數。最大平均延遲值為 100s,最小值為 1 μs。例如,如果base_num=10
,則路徑將被分至路徑延遲 <=1 μs、(1 μs, 10 μs]、(10 μs, 100 μs)、(100 μs, 1 ms)、(1 ms, 10 ms)、(10 ms, 100 ms)、(100 ms, 1 s)、(1 s, 10 s)、(10 s, 100 s)、>100 s 的各優先程度群組。
多重路徑屬性#
多重路徑屬性用於控制裝置的多重路徑 I/O 行為。您可以將屬性指定為所有多重路徑裝置的預設值。此外,還可以指定僅套用至指定多重路徑裝置的屬性,方法是在多重路徑組態檔案的 multipaths
區段中為該裝置建立一個項目。
user_friendly_names
指定是使用全球 ID (WWID) 還是使用
/var/lib/multipath/bindings
檔案為多重路徑裝置指定格式為/dev/mapper/mpathN
、永久且唯一的別名。此選項可以在
devices
區段和multipaths
區段中使用。值
描述
no
(預設) 使用
/dev/disk/by-id/
位置中所顯示的 WWID。yes
自動產生易記名稱做為多重路徑裝置的別名來取代實際的 ID。
failback
指定是否監控失敗路徑的復原狀況,並指出失敗路徑恢復使用後群組進行錯誤回復所花的時間。
失敗路徑復原後,系統會依據此設定將該路徑重新新增到啟用了多重路徑的路徑清單中。多重路徑會評估優先程度群組,並在主要路徑的優先程度高於次要群組時,變更主動優先程度群組。
值
描述
manual
(預設) 不監控失敗路徑的復原狀況。管理員會執行
multipath
指令來更新已啟用的路徑與優先程度群組。followover
僅當路徑群組的第一個路徑處於使用中狀態時,才執行自動錯誤回復。這可以防止某個節點在另一個節點已要求容錯移轉時自動錯誤回復。
immediate
某路徑復原後,立即啟用該路徑。
N
某路徑復原後,等待 N 秒後再啟用此路徑。指定一個大於 0 的整數值。
對於叢集環境中的多重路徑,建議將錯誤回復設為
manual
,以防止多重路徑容錯移轉發生乒乓效應。failback "manual"
重要:確認請務必向儲存系統廠商確認錯誤回復設定。不同的儲存系統可能需要不同的設定。
no_path_retry
指定路徑失敗時要採取的行為。
值
描述
N
指定在
multipath
停止佇列且使路徑失敗之前的重試次數。指定一個大於 0 的整數值。在叢集中,您可以指定值「0」來防止排入佇列,並允許資源進行容錯移轉。
fail
指定立即失敗 (不排入佇列)。
queue
永不停止佇列 (在路徑恢復正常之前始終排入佇列)。
在叢集中作業時,建議在
/etc/multipath.conf
檔案中將重試設定設為fail
或0
。這會導致儲存連接中斷時,讓資源進行容錯移轉。否則,該訊息會排入佇列,而不會發生資源容錯移轉。no_path_retry "fail" no_path_retry "0"
重要:確認請務必向儲存系統廠商確認重試設定。不同的儲存系統可能需要不同的設定。
path_checker
決定路徑的狀態。
值
描述
directio
讀取具有直接 I/O 的第一個磁區,這對於 DASD 裝置非常有用。在
systemd
日誌中記錄失敗訊息 (請參閱第 21 章 「journalctl
:查詢systemd
日誌」)。tur
將 SCSI 測試單元就緒指令發送至裝置。這是較佳設定 (若 LUN 支援)。若指令失敗,將不會在
systemd
記錄日誌中填入訊息。CUSTOM_VENDOR_VALUE
有些 SAN 廠商會提供自訂 path_checker 選項:
cciss_tur
:: 檢查 HP 智慧型儲存陣列的路徑狀態。emc_clariion
:: 查詢 EMC Clariion EVPD 的 0xC0 頁以決定路徑狀態。hp_sw
:: 檢查包含主動/待命韌體之 HP 儲存陣列的路徑狀態 (Up、Down 或 Ghost)。rdac
:: 檢查 LSI/Engenio RDAC 儲存控制器的路徑狀態。
path_grouping_policy
指定由指定控制器代管之多重路徑裝置的路徑分組規則。
值
描述
failover
(預設) 每個優先程度群組指定一個路徑,以便每次只使用一個路徑。
multibus
所有有效的路徑均屬於一個優先程度群組。流量透過群組中的所有主動路徑來保持負載平衡。
group_by_prio
每個路徑優先程度值對應一個優先程度群組。優先程度相同的路徑位於同一個優先程度群組中。優先程度由外部程式指定。
group_by_serial
路徑根據 SCSI 目標序號 (控制器節點 WWN) 來分組。
group_by_node_name
每個目標節點名稱指定一個優先程度群組。目標節點名稱取自
/sys/class/fc_transport/target*/node_name
中。path_selector
指定用於負載平衡的 path-selector 演算法。
值
描述
round-robin 0
用於平衡優先程度群組中所有主動路徑之間的流量的負載平衡演算法。
queue-length 0
與 least-pending 選項類似,是一個可平衡多個路徑上進行中的 I/O 數量的動態負載平衡器。
service-time 0
(預設值) 可根據延遲情況來平衡多個路徑上之 I/O 的服務時間導向型負載平衡器。
- pg_timeout
指定路徑群組逾時處理。不能指定任何值,已設定了內部預設值。
polling_interval
指定一個路徑檢查週期結束與下一個路徑檢查週期開始之間的時間 (以秒為單位)。
指定一個大於 0 的整數值。預設值為 5。請務必向儲存系統廠商確認 polling_interval 設定。不同的儲存系統可能需要不同的設定。
rr_min_io_rq
在切換至目前路徑群組中的下一個路徑之前,使用基於要求的 device-mapper-multipath 指定路由至某個路徑之 I/O 要求的數量。
指定一個大於 0 的整數值。預設值為 1。
rr_min_io_rq "1"
rr_weight
指定用於計算路徑權重的方式。
值
描述
uniform
(預設) 所有路徑都擁有相同的輪替權數。
priorities
每個路徑的權重由路徑的優先程度乘以 rr_min_io_rq 設定來確定。
uid_attribute
提供唯一路徑識別碼的 udev 屬性。預設值為
ID_SERIAL
。
18.10.2.2 設定輪替式負載平衡 #
所有路徑都處於主動狀態。I/O 設定為在移至序列中的下一個開啟路徑之前需經過秒數的時間或數個 I/O 異動。
18.10.2.3 設定單一路徑容錯移轉 #
優先程度最高 (設定值最低) 的單一路徑對流量而言是主動路徑。其他路徑可用於容錯移轉,但只有在發生容錯移轉時才會使用。
18.10.2.4 將 I/O 路徑分組以進行輪替式負載平衡 #
具有相同優先程度的多個路徑都歸入主動群組。該群組中的所有路徑都失敗時,裝置會容錯移轉至優先程度次高的群組。群組中的所有路徑以輪替式負載平衡方式共用流量負載。
18.10.3 報告目標路徑群組 #
使用 SCSI 報告目標連接埠群組 (sg_rtpg(8)
) 指令。如需資訊,請參閱 sg_rtpg(8)
的線上文件。
18.11 設定根裝置的多重路徑 I/O #
SUSE Linux Enterprise Server
中的 /boot
和 /root 可以使用並支援裝置對應程式多重路徑 I/O (DM-MPIO)。此外,YaST 安裝程式中的 YaST 磁碟分割程式支援在安裝期間啟用多重路徑。
18.11.1 安裝時啟用多重路徑 I/O #
若要在多重路徑裝置上安裝作業系統,在安裝時必須執行多重路徑軟體。在系統安裝過程中,multipathd
精靈不會自動啟動。您可以使用 YaST 磁碟分割程式中的 選項來啟動。
18.11.1.1 安裝時在主動/主動多重路徑儲存 LUN 上啟用多重路徑 I/O #
安裝期間,在
螢幕上選擇 。選取
主圖示,按一下 按鈕,然後選取 。啟動多重路徑。
YaST 即會開始重新掃描磁碟,然後顯示可用的多重路徑裝置 (例如
/dev/disk/by-id/dm-uuid-mpath-3600a0b80000f4593000012ae4ab0ae65
)。之後所有的處理步驟都應使用此裝置。按
繼續安裝。
18.11.1.2 安裝時在主動/被動多重路徑儲存 LUN 上啟用多重路徑 I/O #
在系統安裝過程中,multipathd
精靈不會自動啟動。您可以使用 YaST 磁碟分割程式中的 選項來啟動。
若要在主動/被動多重路徑儲存 LUN 上安裝時啟用多重路徑 I/O:
安裝期間,在
螢幕上選擇 。選取
主圖示,按一下 按鈕,然後選取 。啟動多重路徑。
YaST 即會開始重新掃描磁碟,然後顯示可用的多重路徑裝置 (例如
/dev/disk/by-id/dm-uuid-mpath-3600a0b80000f4593000012ae4ab0ae65
)。之後所有的處理步驟都應使用此裝置。記下裝置路徑與 UUID,稍後會用到。按
繼續安裝。所有設定都設好且安裝完成後,YaST 即會開始寫入開機載入程式資訊,並顯示重新啟動系統的倒數計時。請按一下Ctrl–Alt–F5 存取主控台。
按鈕停止倒數計時,然後按使用主控台確定是否在
/boot/grub/device.map
檔案中為hd0
項目輸入了被動路徑。執行此動作非常必要,因為安裝程序無法區分主動路徑與被動路徑。
輸入以下指令,將根裝置掛接至
/mnt
:>
sudo
mount /dev/disk/by-id/UUID;_part2 /mnt例如,輸入:
>
sudo
mount /dev/disk/by-id/dm-uuid-mpath-3600a0b80000f4593000012ae4ab0ae65_part2 /mnt輸入以下指令,將開機裝置掛接至
/mnt/boot
:>
sudo
mount /dev/disk/by-id/UUID_part1 /mnt/boot例如,輸入:
>
sudo
mount /dev/disk/by-id/dm-uuid-mpath-3600a0b80000f4593000012ae4ab0ae65_part2 /mnt/boot在
/mnt/boot/grub/device.map
檔案中,確定hd0
項目是否指向被動路徑,然後執行下列其中一項動作:主動路徑:: 不需要執行任何動作。跳過所有剩餘的步驟,按 Ctrl–Alt–F7 返回 YaST 圖形環境,然後繼續安裝。
被動路徑:: 必須變更組態並重新安裝開機載入程式。
如果
hd0
項目指向被動路徑,請變更組態並重新安裝開機載入程式:在主控台提示符處輸入以下指令:
mount -o bind /dev /mnt/dev mount -o bind /sys /mnt/sys mount -o bind /proc /mnt/proc chroot /mnt
在主控台中執行
multipath -ll
,然後檢查輸出以尋找主動路徑。被動路徑會有
ghost
標記。在
/boot/grub/device.map
檔案中,將hd0
項目變更為主動路徑並儲存變更,然後關閉檔案。輸入以下指令,重新安裝開機載入程式:
grub-install /dev/disk/by-id/UUID_part1 /mnt/boot
例如,輸入:
grub-install /dev/disk/by-id/dm-uuid-mpath-3600a0b80000f4593000012ae4ab0ae65_part2 /mnt/boot
輸入下列指令:
exit umount /mnt/* umount /mnt
按 Ctrl–Alt–F7 返回 YaST 圖形環境。
按一下
繼續執行安裝的重新開機作業。
18.11.2 為現有根裝置啟用多重路徑 I/O #
將 Linux 安裝為僅有單個路徑處於主動狀態,最好是磁碟分割程式中列出了
by-id
符號連結的路徑。使用安裝期間所用的
/dev/disk/by-id
路徑來掛接裝置。開啟或建立
/etc/dracut.conf.d/10-mp.conf
並新增以下行 (請注意前置空格):force_drivers+=" dm-multipath"
對於 IBM Z,請在執行
dracut
之前先編輯/etc/zipl.conf
檔案,以/etc/fstab
中使用的 by-id 資訊變更zipl.conf
中的 by-path 資訊。執行
dracut
-f
以更新initrd
影像。對於 IBM Z,請在執行
dracut
之後執行zipl
。重新載入伺服器。
18.11.3 在根裝置上停用多重路徑 I/O #
將 multipath=off
新增至核心指令行。這可以透過 YaST 開機載入程式模組來完成。開啟 › ,並將參數新增至兩個指令行。
這只會影響根裝置,而不會影響所有其他裝置。
18.12 為現有軟體 RAID 設定多重路徑 I/O #
理想狀況下,您應該先設定裝置的多重路徑,然後再將它們當成軟體 RAID 裝置的元件使用。如果您在建立任何軟體 RAID 裝置後再新增多重路徑,則系統重新開機時可能會先啟動 multipath
服務,然後再啟動 DM-MPIO 服務,導致 RAID 可能會無法使用多重路徑。您可以使用本節所述的程序,讓多重路徑針對多先前存在的軟體 RAID 執行。
例如,在下列情況中,您可能需要設定軟體 RAID 中裝置的多重路徑:
如果在執行全新安裝或升級期間建立新的軟體 RAID,將其做為磁碟分割設定的一部分。
如果將軟體 RAID 中的裝置當成成員裝置或備品之前未設定裝置以進行多重路徑。
如果透過將新的 HBA 配接器新增至伺服器,或擴充 SAN 中的儲存子系統來擴展您的系統。
下列指示假設軟體 RAID 裝置為 /dev/mapper/mpath0
,這是核心可辨識的裝置名稱。它會假設您已依照第 18.9 節 「設定使用者易記的名稱或別名」所述在 /etc/multipath.conf
檔案中啟用了使用者易記的名稱。
請務必修改適用於軟體 RAID 的設備名稱的指示。
開啟終端機主控台。
請在下列步驟中使用此主控台輸入指令,除非導向到其他位置。
如果目前已掛接或正在執行任何軟體 RAID 裝置,請對每個裝置輸入以下指令來卸載並停止裝置。
>
sudo
umount /dev/mapper/mpath0>
sudo
mdadm --misc --stop /dev/mapper/mpath0輸入以下指令停止
md
服務:>
sudo
systemctl stop mdmonitor輸入以下指令啟動
multipathd
精靈:>
systemctl start multipathd啟動多重路徑服務之後,驗證軟體 RAID 的元件裝置是否列在
/dev/disk/by-id
目錄中。請執行下列其中一個步驟:已列出裝置:: 裝置名稱現在應該有連至裝置對應程式多重路徑裝置名稱的符號連結,如
/dev/dm-1
。未列出裝置:: 輸入以下指令來衝洗和重新探查裝置,強制多重路徑服務辨識裝置:
>
sudo
multipath -F>
sudo
multipath -v0裝置現在應該列於
/dev/disk/by-id
中,並擁有連至其裝置對應程式多重路徑裝置名稱的符號連結。例如:lrwxrwxrwx 1 root root 10 2011-01-06 11:42 dm-uuid-mpath-36006016088d014007e0d0d2213ecdf11 -> ../../dm-1
輸入以下指令重新啟動
mdmonitor
服務和 RAID 裝置:>
sudo
systemctl start mdmonitor輸入以下指令檢查軟體 RAID 的狀態:
>
sudo
mdadm --detail /dev/mapper/mpath0RAID 的元件裝置應與其裝置對應程式多重路徑裝置名稱相符,這些裝置名稱在
/dev/disk/by-id
目錄中列為裝置的符號連結。如果根 (
/
) 裝置或其任何部分 (例如/var
、/etc
、/log
) 位於 SAN 上,並且需要使用多重路徑開機,請重建initrd
:>
dracut -f --add-multipath重新開機伺服器以套用變更。
檢查 RAID 狀態,以驗證軟體 RAID 陣列是否正確地顯示在多重路徑裝置頂部。輸入
>
sudo
mdadm --detail /dev/mapper/mpath0例如:
Number Major Minor RaidDevice State
0 253 0 0 active sync /dev/dm-0
1 253 1 1 active sync /dev/dm-1
2 253 2 2 active sync /dev/dm-2
mdadm
工具要求以 ID 而非裝置節點路徑存取裝置。如需詳細資訊,請參閱第 18.4.3 節 「多重路徑裝置上的 MD RAID」。
18.13 在多重路徑裝置上使用 LVM2 #
使用多重路徑時,資源的所有路徑都顯示為裝置樹狀結構中的裝置。依預設,LVM 會檢查裝置樹狀結構中任何裝置的頂層是否存在多重路徑裝置。如果 LVM 在頂層找到了多重路徑裝置,它會假設該裝置是多重路徑元件,並忽略 (基礎) 裝置。這很可能是您期望的行為,但也可以在 /etc/lvm/lvm.conf
中變更此行為。如果將 multipath_component_detection 設定為 1,LVM 會掃描多重路徑元件裝置。lvm.conf 中的預設項目是:
# By default, LVM2 will ignore devices used as component paths # of device-mapper multipath devices. # 1 enables; 0 disables. multipath_component_detection = 1
18.14 最佳實務 #
18.14.1 在不重新開機的情況下掃描新裝置 #
如果已將您的系統設定為啟用多重路徑,而您稍後需要將儲存新增到 SAN,則可以使用 rescan-scsi-bus.sh
程序檔掃描新的裝置。依預設,此程序檔會掃描所有 HBA 的一般 LUN 範圍。該指令的一般語法如下所示:
>
sudo
rescan-scsi-bus.sh [options] [host [host ...]]
對於大多數儲存子系統,該程序檔都可在不使用任何選項的情況下成功執行。不過,在某些特殊情況下,可能需要使用一或多個選項。如需詳細資料,請執行 rescan-scsi-bus.sh --help
。
在 EMC PowerPath 環境中,請勿使用作業系統隨附的 rescan-scsi-bus.sh
公用程式或 HBA 廠商程序檔來掃描 SCSI 匯流排。為了避免潛在的檔案系統損毀,EMC 要求您遵循 EMC PowerPath for Linux 的廠商文件中提供的程序來操作。
使用以下程序掃描裝置,以便在不將系統重新開機的情況下使這些裝置適用於多重路徑。
在儲存子系統中,使用廠商的工具來配置裝置並更新其存取控制設定,以允許 Linux 系統存取新的儲存。如需詳細資料,請參閱廠商提供的文件。
掃描主機的所有目標,以使 Linux 核心的 SCSI 子系統的中間層級可辨識其新裝置。在終端機主控台提示符處輸入
>
sudo
rescan-scsi-bus.sh根據您的設定,您可能需要搭配選用參數執行
rescan-scsi-bus.sh
。如需詳細資料,請參閱rescan-scsi-bus.sh --help
。請在
systemd
日誌中檢查掃描進度 (如需詳細資料,請參閱第 21 章 「journalctl
:查詢systemd
日誌」)。在終端機主控台提示符處輸入:>
sudo
journalctl -r此指令會顯示記錄的最後幾行。例如:
>
sudo
journalctl -r Feb 14 01:03 kernel: SCSI device sde: 81920000 Feb 14 01:03 kernel: SCSI device sdf: 81920000 Feb 14 01:03 multipathd: sde: path checker registered Feb 14 01:03 multipathd: sdf: path checker registered Feb 14 01:03 multipathd: mpath4: event checker started Feb 14 01:03 multipathd: mpath5: event checker started Feb 14 01:03:multipathd: mpath4: remaining active paths: 1 Feb 14 01:03 multipathd: mpath5: remaining active paths: 1 [...]重複上述步驟,以新增通過 Linux 系統中連接至新裝置的其他 HBA 配接器的路徑。
執行
multipath
指令辨識可設定 DM-MPIO 組態的裝置。在終端機主控台提示符處輸入>
sudo
multipath您現在可以設定新裝置以進行多重路徑了。
18.14.2 在不重新開機的情況下掃描新分割裝置 #
使用本節中的範例,可以在不重新開機的情況下偵測新增的多重路徑 LUN。
在 EMC PowerPath 環境中,請勿使用作業系統隨附的 rescan-scsi-bus.sh
公用程式或 HBA 廠商程序檔來掃描 SCSI 匯流排。為了避免潛在的檔案系統損毀,EMC 要求您遵循 EMC PowerPath for Linux 的廠商文件中提供的程序來操作。
開啟終端機主控台。
掃描主機的所有目標,以使 Linux 核心的 SCSI 子系統的中間層級可辨識其新裝置。在終端機主控台提示符處輸入
>
rescan-scsi-bus.sh根據您的設定,您可能需要搭配選用參數執行
rescan-scsi-bus.sh
。如需詳細資料,請參閱rescan-scsi-bus.sh --help
。輸入以下指令驗證裝置是否已探查到 (例如連結是否具有一個新的時戳):
>
ls -lrt /dev/dm-*也可以輸入以下指令在
/dev/disk/by-id
中驗證裝置:>
ls -l /dev/disk/by-id/輸入以下指令驗證新裝置是否顯示在記錄中:
>
sudo
journalctl -r使用文字編輯器在
/etc/multipath.conf
檔案中新增裝置的新別名定義,如data_vol3
。例如,如果 UUID 為
36006016088d014006e98a7a94a85db11
,請進行下列變更:defaults { user_friendly_names yes } multipaths { multipath { wwid 36006016088d014006e98a7a94a85db11 alias data_vol3 } }
輸入以下指令建立裝置的分割區表:
>
fdisk /dev/disk/by-id/dm-uuid-mpath-<UUID>以裝置 WWID 取代 UUID,例如
36006016088d014006e98a7a94a85db11
。輸入以下指令觸發 udev:
>
sudo
echo 'add' > /sys/block/DM_DEVICE/uevent例如,若要為
dm-8
上的分割區產生裝置對應程式裝置,請輸入:>
sudo
echo 'add' > /sys/block/dm-8/uevent在裝置
/dev/disk/by-id/dm-uuid-mpath-UUID_partN
上建立檔案系統。根據您選擇的檔案系統,您可以使用下列指令之一實現此目的:mkfs.btrfs
mkfs.ext3
、mkfs.ext4
或mkfs.xfs
。如需詳細資料,請參閱相應的 man 頁面。以實際 UUID 和分割區編號取代UUID_partN
,例如 36006016088d014006e98a7a94a85db11_part1。輸入以下指令為新分割區建立標籤:
>
sudo
tune2fs -L LABELNAME /dev/disk/by-id/dm-uuid-UUID_partN以實際 UUID 和分割區編號取代
UUID_partN
,例如 36006016088d014006e98a7a94a85db11_part1。以您選擇的標籤取代 LABELNAME。輸入以下指令以重新設定 DM-MPIO,使其讀取別名:
>
sudo
multipathd -k'reconfigure'輸入以下指令驗證
multipathd
是否可辨識裝置:>
sudo
multipath -ll使用文字編輯器在
/etc/fstab
檔案中新增掛接項目。此時,您在上一步中建立的別名在
/dev/disk/by-label
目錄中尚不存在。為/dev/dm-9
路徑新增一個掛接項目,然後在下次重新開機到以下項目之前變更該項目LABEL=LABELNAME
建立要做為掛接點的目錄,然後掛接裝置。
18.14.3 檢視多重路徑 I/O 狀態 #
查詢多重路徑 I/O 狀態會輸出多重路徑對應的目前狀態。
multipath -l
選項會顯示上次執行路徑檢查程式後目前的路徑狀態。該選項不會執行路徑檢查程式。
multipath -ll
選項會執行路徑檢查程式,更新路徑資訊,然後顯示目前的狀態資訊。此指令永遠都會顯示路徑狀態的最新資訊。
>
sudo
multipath -ll 3600601607cf30e00184589a37a31d911 [size=127 GB][features="0"][hwhandler="1 emc"] \_ round-robin 0 [active][first] \_ 1:0:1:2 sdav 66:240 [ready ][active] \_ 0:0:1:2 sdr 65:16 [ready ][active] \_ round-robin 0 [enabled] \_ 1:0:0:2 sdag 66:0 [ready ][active] \_ 0:0:0:2 sdc 8:32 [ready ][active]
它會針對每個裝置顯示裝置的 ID、大小、功能和硬體處理器。
在探查裝置時,裝置的路徑會自動分到不同的優先程度群組。每次只有一個優先程度群組處於主動狀態。對於主動/主動組態,所有路徑都屬於同一個群組。對於主動/被動組態,被動路徑位於另外的優先程度群組中。
指令會顯示每個群組的下列資訊:
用於平衡群組內 I/O 的排程規則,如輪替式
該群組是處於主動、已停用還是已啟用狀態
該群組是否為第一個 (優先程度最高) 群組
群組內包含的路徑
指令會顯示每個路徑的下列資訊:
實體位址,格式為 HOST:BUS:TARGET:LUN,例如 1:0:1:2
裝置節點名稱,如
sda
Major:minor 號碼
裝置的狀態
iostat
在多重路徑環境中,iostat
指令可能會導致非預期的結果。依預設,iostat
會過濾掉所有沒有 I/O 的區塊裝置。若要使 iostat
顯示所有裝置,請使用:
iostat -p ALL
18.14.4 在出錯狀況下管理 I/O #
如果所有路徑同時失敗,您可能需要啟用 queue_if_no_path 設定多重路徑,以將 I/O 排入佇列。如果不啟用,I/O 便會在所有路徑都失敗時立即失敗。在驅動程式、HBA 或光纖出現假性錯誤,且這類錯誤會導致所有路徑遺失的特定情況下,應將 DM-MPIO 設定為將所有 I/O 排入佇列,且永不向上傳播錯誤。
在叢集中使用多重路徑裝置時,您可以選擇停用 queue_if_no_path。如此,系統就不會將 I/O 排入佇列,而是自動使路徑失效,並會將 I/O 錯誤升級,產生叢集資源容錯移轉。
啟用 queue_if_no_path 會導致 I/O 在有路徑重新啟用之前無限期地排入佇列,因此請確定 multipathd
正在執行,且對您的情況有效。否則,在重新開機或手動返回到容錯移轉以取代佇列之前,I/O 可能會無限期地擱置於受影響的多重路徑裝置中。
若要測試案例,請執行下列步驟:
開啟終端機主控台。
輸入以下指令啟動裝置 I/O 的佇列功能而非容錯移轉:
>
sudo
dmsetup message DEVICE_ID 0 queue_if_no_path以裝置的 ID 取代 DEVICE_ID。0 值代表磁區,當不需要磁區資訊時使用。
例如,輸入:
>
sudo
dmsetup message 3600601607cf30e00184589a37a31d911 0 queue_if_no_path輸入以下指令返回到裝置 I/O 的容錯移轉:
>
sudo
dmsetup message DEVICE_ID 0 fail_if_no_path此指令會立即使所有排入佇列的 I/O 失敗。
以裝置的 ID 取代 DEVICE_ID。例如,輸入:
>
sudo
dmsetup message 3600601607cf30e00184589a37a31d911 0 fail_if_no_path
若要對所有路徑都失敗的情況設定佇列 I/O,請執行下列步驟:
開啟終端機主控台。
在文字編輯器中開啟
/etc/multipath.conf
檔案。取消預設區段及其結束括號的註解,然後新增
default_features
設定,如下所示:defaults { default_features "1 queue_if_no_path" }
修改
/etc/multipath.conf
檔案後,您必須執行dracut
-f
在系統中重新建立initrd
,然後重新開機以使變更生效。當您準備好返回到裝置 I/O 的容錯移轉時,請輸入:
>
sudo
dmsetup message MAPNAME 0 fail_if_no_path以裝置對應的別名或裝置 ID 取代 MAPNAME。0 值代表磁區,當不需要磁區資訊時使用。
此指令會立即使所有排入佇列的 I/O 失敗,並將錯誤傳播到呼叫應用程式。
18.14.5 解決停止的 I/O #
如果所有路徑同時失敗,且 I/O 雖已排入佇列卻被擱置時,請執行下列步驟:
在終端機主控台提示符處輸入以下指令:
>
sudo
dmsetup message MAPNAME 0 fail_if_no_path以裝置的正確裝置 ID 或對應的別名取代
MAPNAME
。0 值代表磁區,當不需要磁區資訊時使用。此指令會立即使所有排入佇列的 I/O 失敗,並將錯誤傳播到呼叫應用程式。
輸入下列指令重新啟動佇列:
>
sudo
dmsetup message MAPNAME 0 queue_if_no_path
18.14.6 設定 IBM Z 裝置的預設設定 #
對包含多重路徑功能的 IBM Z 裝置進行的測試表明,應將 dev_loss_tmo
參數設定為無限 (2147483647),將 fast_io_fail_tmo
參數設定為 5 秒。若您使用的是 IBM Z 裝置,請依照以下方式修改 /etc/multipath.conf
檔案以指定這些值:
defaults { dev_loss_tmo 2147483647 fast_io_fail_tmo 5 }
dev_loss_tmo
參數設定將某個多重路徑連結標記為失敗之前需等待的秒數。若該路徑失敗,則目前在該路徑上的所有 I/O 都會失敗。預設值會因所用的裝置驅動程式而有所不同。若要使用驅動程式的內部逾時,請將值設定為零 (0)。也可以將其設定為「infinity」或 2147483647,如此會將其設定為最大值 2147483647 秒 (68 年)。
fast_io_fail_tmo
參數設定偵測到連結問題後將 I/O 確定為失敗之前需等待的時間。到達該驅動程式的 I/O 都會失敗。如果 I/O 排在擁堵的佇列中,則未到 dev_loss_tmo
時間且佇列未疏通之前 I/O 不會失敗。
如果您修改了 /etc/multipath.conf
檔案,只有在您更新多重路徑對應或 multipathd
精靈 (systemctl restart multipathd
) 重新啟動後,變更才會套用。
18.14.7 將多重路徑與 NetApp 裝置搭配使用 #
將多重路徑用於 NetApp 裝置時,建議在 /etc/multipath.conf
檔案中進行如下設定:
為 NetApp 裝置全域設定下列參數的預設值:
max_fds max queue_without_daemon no
在硬體表中為 NetApp 裝置設定下列參數的預設值:
dev_loss_tmo infinity fast_io_fail_tmo 5 features "3 queue_if_no_path pg_init_retries 50"
18.14.8 將 --noflush 與多重路徑裝置搭配使用 #
在多重路徑裝置上執行時,應始終使用 --noflush
選項。
例如,在執行表格重新載入的程序檔中,應使用 --noflush
選項進行恢復,以確保所有重要 I/O 不會被衝洗,因為您需要多重路徑拓樸資訊。
load resume --noflush
18.14.9 根裝置為多重路徑裝置時的 SAN 逾時設定 #
所有路徑都已失敗並已從系統移除時,多重路徑裝置上包含根目錄 (/
) 的系統可能會停止,因為系統會收到儲存子系統 (例如光纖通道儲存陣列) 發出的 dev_loss_tmo
逾時通知。
如果系統裝置設定了多個路徑,且多重路徑 no_path_retry
設定處於啟用狀態,您應相應地修改儲存子系統的 dev_loss_tmo
設定,以確保在所有路徑失效的情況下不會移除任何裝置。強烈建議您將 dev_loss_tmo
的值設為等於或大於多重路徑中 no_path_retry
設定的值。
建議按如下方式設定儲存子系統的 dev_los_tmo
:
<dev_loss_tmo> = <no_path_retry> * <polling_interval>
其中,以下定義適用於多重路徑值:
no_path_retry
定義多重路徑 I/O 嘗試多少次後路徑視為遺失並停止將 I/O 排入佇列。polling_interval
是執行路徑檢查的時間間隔 (以秒為單位)。
每個多重路徑值都應在 /etc/multipath.conf
組態檔案中設定。如需更多資訊,請參閱第 18.6 節 「多重路徑組態」。
18.15 MPIO 疑難排解 #
本節說明 MPIO 的一些已知問題和可能的解決方案。
18.15.1 在多重路徑裝置上安裝 GRUB2 #
在具有 Btrfs 的傳統 BIOS 系統上,grub2-install
可能會失敗,並顯示權限遭拒。若要解決此問題,請確定 /boot/grub2/SUBDIR/
子磁碟區是以讀寫 (rw) 模式掛接的。SUBDIR 可以是 x86_64-efi
或 i386-pc
。
18.15.2 啟用多重路徑時系統在開機過程中退出到緊急外圍程序 #
在開機過程中,系統退出到緊急外圍程序,並顯示類似如下的訊息:
[ OK ] Listening on multipathd control socket. Starting Device-Mapper Multipath Device Controller... [ OK ] Listening on Device-mapper event daemon FIFOs. Starting Device-mapper event daemon... Expecting device dev-disk-by\x2duuid-34be48b2\x2dc21...32dd9.device... Expecting device dev-sda2.device... [ OK ] Listening on udev Kernel Socket. [ OK ] Listening on udev Control Socket. Starting udev Coldplug all Devices... Expecting device dev-disk-by\x2duuid-1172afe0\x2d63c...5d0a7.device... Expecting device dev-disk-by\x2duuid-c4a3d1de\x2d4dc...ef77d.device... [ OK ] Started Create list of required static device nodes ...current kernel. Starting Create static device nodes in /dev... [ OK ] Started Collect Read-Ahead Data. [ OK ] Started Device-mapper event daemon. [ OK ] Started udev Coldplug all Devices. Starting udev Wait for Complete Device Initialization... [ OK ] Started Replay Read-Ahead Data. Starting Load Kernel Modules... Starting Remount Root and Kernel File Systems... [ OK ] Started Create static devices [* ] (1 of 4) A start job is running for dev-disk-by\x2du...(7s / 1min 30s) [* ] (1 of 4) A start job is running for dev-disk-by\x2du...(7s / 1min 30s) ... Timed out waiting for device dev-disk-by\x2duuid-c4a...cfef77d.device. [DEPEND] Dependency failed for /opt. [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):
在此階段,您將在 initrd 環境中的暫時 dracut
緊急外圍程序中工作。若要永久保留以下所述的組態變更,您需要在已安裝系統的環境中執行這些變更。
確定系統根 (
/
) 檔案系統。檢查/proc/cmdline
的內容並尋找root=
參數。驗證是否已掛接根檔案系統:
>
sudo
systemctl status sysroot.mount提示依預設,
dracut
會將根檔案系統掛接到/sysroot
之下。從現在起,我們假設根檔案系統已掛接到
/sysroot
下。在
/sysroot
下掛接系統所需的檔案系統,使用chroot
指令移至該目錄,然後掛接所有檔案系統。例如:>
sudo
for x in proc sys dev run; do mount --bind /$x /sysroot/$x; done>
sudo
chroot /sysroot /bin/bash>
sudo
mount -a如需更多詳細資料,請參閱 第 48.5.2.3 節 「存取已安裝系統」。
依照以下程序中的建議變更多重路徑或 dracut 組態。記得重建
initrd
以包含修改。透過輸入
exit
指令退出chroot
環境,然後退出緊急外圍程序並按 Ctrl–D 來將伺服器重新開機。
如果根檔案系統不在多重路徑上,卻啟用了多重路徑,則需要此修復。在此類設定中,多重路徑會嘗試為未列入黑名單的所有裝置設定其路徑。由於具有根檔案系統的裝置已掛接,它對於多重路徑而言是無法存取的,因而會導致路徑設定失敗。您可以在 /etc/multipath.conf
中將根裝置列入黑名單來正確設定多重路徑,從而修復此問題。
在緊急外圍程序中執行
multipath -v2
,並確定根檔案系統的裝置。指令將產生類似如下的輸出:#
multipath -v2 Dec 18 10:10:03 | 3600508b1001030343841423043300400: ignoring map|
與:
之間的字串是列入黑名單所需的 WWID。開啟
/etc/multipath.conf
並新增以下內容:blacklist { wwid "WWID" }
使用您在上一步中擷取的 ID 取代 WWID。如需詳細資訊,請參閱第 18.8 節 「將非多重路徑裝置加入黑名單」。
使用以下指令重建
initrd
:>
dracut -f --add-multipath
initrd
#
如果 initrd
與系統之間的多重路徑狀態 (已啟用或已停用) 不相同,則需要執行此修復程序。若要修復此問題,請重建 initrd
:
如果已在系統中啟用多重路徑,請透過以下指令重建支援多重路徑的 initrd:
>
dracut --force --add multipath如果已在系統中停用多重路徑,請透過以下指令重建支援多重路徑的 initrd:
>
dracut --force -o multipath
initrd
#如果 initrd 不包含用於存取網路連接儲存的驅動程式,則需要此修復。例如,如果系統是在沒有多重路徑的情況下安裝的,或者當新增或更換相應硬體時,就可能需要執行此修復程序。
將所需的驅動程式新增至檔案
/etc/dracut.conf.d/01-dist.conf
中的變數force_drivers
。例如,如果系統包含由hpsa
驅動程式存取的 RAID 控制器,且多重路徑裝置連接至 qla23xx 驅動程式所存取的 QLogic 控制器,則此項目應為:force_drivers+="hpsa qla23xx"
使用以下指令重建
initrd
:>
dracut -f --add-multipath為了防止在連接網路儲存失敗時系統開機進入應急模式,建議將掛接選項
_netdev
新增到/etc/fstab
中的相應項目。
18.15.3 升級至多重路徑 0.4.9 或更高版本後個別裝置的 PRIO 設定失敗 #
從版本 0.4.9 開始,多重路徑工具使用 /etc/multipath.conf
檔案中 defaults{}
或 devices{}
區段內的 prio
設定。當關鍵字 prio
是為 multipaths{)
區段中的個別 multipath
定義而指定時,它會無訊息式地忽略該關鍵字。
多重路徑工具 0.4.8 允許 multipaths{)
區段內個別 multipath
定義中的 prio 設定置換 defaults{}
或 devices{}
區段內的 prio
設定。
18.15.4 升級至 multipath-tools-0.4.9 或更高版本後使用引數的 PRIO 設定失敗 #
從 multipath-tools-0.4.8
升級到 multipath-tools-0.4.9
後,/etc/multipath.conf
檔案中的 prio
設定對於需要引數的優先程度排序器將會損壞。在 multipath-tools-0.4.9 中,prio
關鍵字用於指定優先程度排序器,prio_args
關鍵字則用於為需要引數的優先程度排序器指定引數。以前,優先程度排序器及其引數都在同一 prio
行上指定。
例如,在 multipath-tools-0.4.8 中,下行用於指定優先程度排序器,並且在同一行中指定其引數。
prio "weightedpath hbtl [1,3]:.:.+:.+ 260 [0,2]:.:.+:.+ 20"
升級到 multipath-tools-0.4.9 或更高版本後,該指令會導致錯誤。訊息類似下方所列:
<Month day hh:mm:ss> | Prioritizer 'weightedpath hbtl [1,3]:.:.+:.+ 260 [0,2]:.:.+:.+ 20' not found in /lib64/multipath
若要解決此問題,請使用文字編輯器修改 /etc/multipath.conf
檔案中的 prio
行。建立兩行,在 prio
行上指定優先程度排序器,並在其下的 prio_args
行上指定優先程度排序器引數:
prio "weightedpath" prio_args "hbtl [1,3]:.:.+:.+ 260 [0,2]:.:.+:.+ 20"
執行 sudo systemctl restart multipathd
重新啟動 multipathd
精靈以使變更生效。
18.15.5 技術資訊文件 #
如需有關在 SUSE Linux Enterprise Server 上對多重路徑 I/O 問題進行疑難排解的資訊,請參閱 SUSE 知識庫中的下列技術資訊文件 (TID):