跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 储存管理指南 / 网络储存 / 管理设备的多路径 I/O
适用范围 SUSE Linux Enterprise Server 15 SP4

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 节 “硬件支持”

  • 仅当在服务器中的主机总线适配器和块储存设备的主机总线控制器之间存在多个物理路径时,才需要配置多路径。

  • 对于某些储存阵列,供应商提供其自己的多路径软件以管理该阵列物理和逻辑设备的多路径。在这种情况下,您应遵循供应商关于为这些设备配置多路径的说明。

  • 当在虚拟化环境中使用多路径时,多路径在主机服务器环境中控制。先配置设备的多路径,再将其指派给虚拟 Guest 计算机。

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 设备。

有关为现有软件 RIAD 设置多路径的信息,请参见第 18.12 节 “为现有软件 RAID 配置多路径 I/O”

18.3.5 高可用性解决方案

群集储存资源的高可用性解决方案基于每个节点上的多路径服务运行。确保每个节点上的 /etc/multipath.conf 文件中的配置设置在整个群集中保持一致。

确保多路径设备在所有设备中的名称都相同。有关细节,请参考第 18.9.1 节 “HA 群集中的多路径设备名称”

用于跨 LAN 镜像设备的分布式复制块设备 (DRBD) 高可用性解决方案在多路径的基础上运行。对于具有多个 I/O 路径并且您计划在 DRDB 解决方案中使用的每个设备,必须先将该设备配置为支持多路径,再配置 DRBD。

将多路径与依赖于使用共享储存实现屏蔽的群集软件(例如包含 sbdpacemaker)一起使用时必须格外小心。有关详细信息,请参见 第 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 设备。

注意
注意:将 DM-MP 用于 NVMe 设备

SUSE Linux Enterprise Server 15 开始,建议将本机 NVMe 多路径(请参见第 18.2.1 节 “多路径实现:设备映射程序和 NVMe”)用于 NVMe,并且默认情况下会使用它。要禁用本机 NVMe 多路径并改用设备映射程序多路径,请使用内核参数 nvme-core.multipath=0 引导。

DM-MPIO 可以为各种设置自动配置多路径子系统。

多路径守护程序 multipathd 负责自动路径发现和分组以及自动路径再测试,以便先前发生故障的路径在恢复正常后可以自动重新启用。这可以最大程度地降低管理员对生产环境的关注。

DM-MPIO 保护设备路径以及设备本身不会出故障。如果一个活动路径丢失(例如,一个网络适配器 I/O 断开或光纤电缆被删除),I/O 会重定向到剩余的路径。如果所有活动路径均发生故障,则必须唤醒不活动的辅助路径,因此故障转移最多会延迟 30 秒,具体取决于储存阵列的属性。

如果指向给定设备的每条路径都发生故障,则发往此设备的 I/O 可能会在内核中排队给定的时间,甚至无限期排队(在这种情况下,排队的 IO 总量会受到系统内存的限制)。

如果一个磁盘阵列有多个储存处理器,请确保 SAN 交换机连接到拥有要访问的 LUN 的储存处理器。在多数磁盘阵列上,所有 LUN 均属于这两个储存处理器,所以两个连接都是活动的。

注意
注意:储存处理器

在某些磁盘阵列上,储存阵列通过储存处理器管理通讯,以便一次仅显示一个储存处理器。一个处理器是活动的,另一个是不活动的,直到发生故障。如果您连接到错误的储存处理器(具有不活动路径的那个),则可能无法看到所需的 LUN,或者可能看到这些 LUN,但在尝试访问它们时会出错。

18.4.2 多路径 I/O 管理工具

multipath-toolskpartx 软件包提供了负责执行自动路径发现和分组的工具。

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
注意
注意:multipath 和 multipathd 如何配合工作

许多 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。有几个选项在不重启动的情况下无法修改。手册页 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) 或者按主要:次要编号格式的设备编号来表示成员路径设备。或者,它可以是多路径映射的 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 选项来更改 multipathmultipathd 的默认详细程度。

18.4.6 mpathpersist 实用程序

mpathpersist 实用程序用于管理设备映射程序多路径设备上的 SCSI 永久保留。永久保留用于仅限特定的 SCSI 发起端访问 SCSI 逻辑单元。在多路径配置中,必须对给定卷的所有 I_T 节点(路径)使用相同的保留密钥;否则,在一条路径上创建保留可能会导致其他路径发生故障。

将此实用程序与 /etc/multipath.conf 文件中的 reservation_key 属性配合使用可以设置 SCSI 设备的永久保留。当且仅当设置了此选项时,multipathd 守护程序才会检查新发现的路径或重新启用的路径的永久保留。

您可以将该属性添加到 multipath.confdefaultsmultipaths 部分。例如:

multipaths {
    multipath {
        wwid             3600140508dbcf02acb448188d73ec97d
        alias            yellow
        reservation_key  0x123abc
    }
}

为适用于永久管理的所有 mpath 设备设置 reservation_key 参数后,使用 multipathd reconfigure 重新装载配置。

注意
注意: 使用“reservation_key file

如果在 multipath.confdefaults 部分使用了特殊值 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

强烈建议始终在有权访问多路径硬件的每台主机上启用并运行 multipathd.service。但是,有时可能因为去除了多路径硬件、要部署其他一些多路径软件或出于查错目的,而需要禁用该服务。

仅为单次系统引导禁用多路径,请使用内核参数 multipath=off。这会影响引导的系统和初始 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 知识库 (https://www.suse.com/support/kb/doc.php?id=3955167) 中的 TID 3955167:Troubleshooting SCSI (LUN) Scanning Issues(SCSI (LUN) 扫描问题查错)。

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 或者使用 fdiskparted 等工具来操作多路径设备上的分区表和分区。当分区工具退出时,系统将会记下应用于分区表的更改。如果这种方法不起作用(通常是因为设备繁忙),请尝试运行 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/prkeysmultipath-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 子部分的列表。值将覆盖 defaultsdevices 部分。

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 加入黑名单,因为设备节点可能会更改,因此对长久标识设备无帮助。

警告
警告:multipath.conf 中的正则表达式

/etc/multipath.conf 中的正则表达式一般情况下起作用。只有与通用字符串匹配时,它们才会起作用。不过,多路径的标准配置已包含许多设备和供应商的正则表达式。将正则表达式与其他正则表达式相匹配不起作用。请务必只与运行 multipath -t 后显示的字符串进行匹配。

您通常可能会忽略非多路径设备,例如 hpsafdhdmddmsrscdstramrawloop。例如,本地 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 部分,并使用 vendorproduct 关键词按特定设备类型加入黑名单。

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.confdefaults 部分中的 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 文件。

表 18.1︰ 多路径设备名称类型比较

名称类型

说明

WWID(默认)

WWID(全球标识符)序列是保证全球唯一且不会更改的多路径设备标识符。在多路径中使用的默认名称是 /dev/disk/by-id 目录中的逻辑单元的 ID。例如,WWID 为 3600508e0000000009e6baa6f609e7908 的设备将作为 /dev/disk/by-id/scsi-3600508e0000000009e6baa6f609e7908 列出。

用户友好

/dev/mapper 目录中的设备映射程序多路径设备名称也参考逻辑单元的 ID。这些多路径设备名称都是用户友好的名称,格式为 /dev/mapper/mpath<N>,比如 /dev/mapper/mpath0。名称是唯一且永久的,因为它们使用 /var/lib/multipath/bindings 文件跟踪 UUID 和用户友好的名称之间的关联。

Alias

别名是由管理员为多路径设备提供的全局唯一名称。别名会覆盖 WWID 和用户友好的 /dev/mapper/mpathN 名称。

如果您使用的是 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 选项,则 initrd 文件中将会包含 /var/lib/multipath/bindings 文件中的用户友好设置。如果稍后更改储存设置,比如添加或删除了设备,则 initrd 内的绑定设置和 /var/lib/multipath/bindings 中的绑定设置之间会存在不匹配。

警告
警告:绑定不匹配项

initrd/var/lib/multipath/bindings 之间的绑定不匹配会导致对设备指派错误的挂载点,进而导致文件系统损坏和数据丢失。

为了避免此问题,建议对系统根设备使用默认 WWID 设置。对于系统根设备不应使用别名。由于设备名称不同,因此使用别名会导致您无法通过内核命令行无缝关闭多路径。

从另一个分区挂载 /var:

user_friendly_names 配置文件的默认位置是 /var/lib/multipath/bindings。如果 /var 数据不是位于系统 root 设备上,而是从另一个分区挂载,则设置多路径时 bindings 文件不可用。

请确保 /var/lib/multipath/bindings 文件在系统 root 设备上可用,并且多路径可以找到它。例如,可以按如下操作来确保这一点:

  1. /var/lib/multipath/bindings 文件移动到 /etc/multipath/bindings

  2. 将 /etc/multipath.confdefaults 部分的 bindings_file 选项设置为此新位置。例如:

    defaults {
                   user_friendly_names yes
                   bindings_file "/etc/multipath/bindings"
    }
initrd 中存在多路径:

即使系统根设备不在多路径上,多路径也可以包含在 initrd 中。例如,如果系统根设备位于 LVM 上,就可能会发生这种情况。如果您使用 user_friendly_names 选项,且多路径在 initrd 中,则应当使用参数 multipath=off 进行引导,以免出现问题。

这样在系统引导过程中仅禁用了 initrd 中的多路径。系统引导后,boot.multipathmultipathd 引导脚本能够激活多路径。

HA 群集中的多路径:

有关详细信息,请参见 第 18.9.1 节 “HA 群集中的多路径设备名称”

启用用户友好名称或指定别名:

  1. 使用 root 权限在文本编辑器中打开 /etc/multipath.conf 文件。

  2. (可选)修改 /var/lib/multipath/bindings 文件的位置。

    备用路径必须在系统根设备上可用,且多路径可以找到它。

    1. /var/lib/multipath/bindings 文件移动到 /etc/multipath/bindings

    2. 将 /etc/multipath.confdefaults 部分的 bindings_file 选项设置为此新位置。例如:

      defaults {
                user_friendly_names yes
                bindings_file "/etc/multipath/bindings"
      }
  3. (可选但不建议使用)启用用户友好的名称:

    1. 取消注释 defaults 部分及其结尾括号。

    2. 取消注释 user_friendly_names 选项,然后将其值从 No 更改为 Yes。

      例如:

      ## Use user-friendly names, instead of using WWIDs as names.
      defaults {
        user_friendly_names yes
      }
  4. (可选)使用 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)。

  5. 保存更改,然后关闭该文件。

  6. 修改 /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”以禁用它。用户友好名称对某个节点是唯一的,但群集中各个节点上的设备不得指派相同的用户友好名称。

注意
注意:用户友好名称

如果您确实需要使用用户友好名称,则可以执行下列操作,强制系统定义的用户友好名称在群集的所有节点中保持一致:

  1. 在一个节点上的 /etc/multipath.conf 文件中:

    1. user_friendly_names 配置选项设置为“yes”以启用它。

      多路径会使用 /var/lib/multipath/bindings 文件,在 /dev/mapper 目录中以 mpath<N> 格式为设备指派一个永久的唯一名称。

    2. (可选)设置 /etc/multipath.conf 文件的 defaults 部分中的 bindings_file 选项,以指定 bindings 文件的备用位置。

      默认位置为 /var/lib/multipath/bindings

  2. 设置该节点上的所有多路径设备。

  3. /etc/multipath.conf 文件从该节点复制到群集中所有其他节点的 /etc/ 目录下。

  4. 从该节点将 bindings 文件复制到群集中所有其他节点的 bindings_file 路径。

  5. 修改 /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,由它来通过以上四个底层块设备重新路由 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 替换为以下策略选项之一:

表 18.2︰ multipath -p 命令的组策略选项

策略选项

说明

failover

(默认)每个优先级组对应一个路径。

multibus

一个优先级组中的所有路径。

group_by_serial

每个检测到的序列号一个优先级组。

group_by_prio

每个路径优先级值一个优先级组。优先级由调出程序在 /etc/multipath.conf 配置文件中指定为 global、per-controller 或 per-multipath 选项来确定。

group_by_node_name

每个目标节点名一个优先级组。目标节点名是在 /sys/class/fc_transport/target*/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 文件中将重试设置设为 fail0。如此一来,当与储存的连接中断时便可让资源进行故障转移。否则会将消息排队而不会发生资源故障转移。

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

用于平衡路径上运行中 I/O 数的动态负载平衡器,类似于 least-pending 选项。

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

  1. 安装期间,在建议的分区屏幕上选择专家分区程序

  2. 选择硬盘主图标,单击配置按钮,然后选择配置多路径

  3. 启动多路径。

    YaST 会开始重扫描磁盘,并显示可用的多路径设备(如 /dev/disk/by-id/dm-uuid-mpath-3600a0b80000f4593000012ae4ab0ae65)。它是应做所有进一步处理的设备。

  4. 单击下一步继续安装。

18.11.1.2 安装时在主动/被动多路径储存 LUN 上启用多路径 I/O

multipathd 守护程序在系统安装过程中不会自动激活。您可以使用 YaST 分区程序中的配置多路径选项来启动它。

在安装时为主动/被动多路径储存 LUN 启用多路径 I/O:

  1. 安装期间,在建议的分区屏幕上选择专家分区程序

  2. 选择硬盘主图标,单击配置按钮,然后选择配置多路径

  3. 启动多路径。

    YaST 会开始重扫描磁盘,并显示可用的多路径设备(如 /dev/disk/by-id/dm-uuid-mpath-3600a0b80000f4593000012ae4ab0ae65)。它是应做所有进一步处理的设备。记下设备路径和 UUID,您以后会需要这些信息。

  4. 单击下一步继续安装。

  5. 所有设置都设好且安装完成后,YaST 即会开始写入引导加载程序信息,并显示重启动系统的倒计时。单击停止按钮停止倒计时,然后按 CtrlAltF5 访问控制台。

  6. 通过控制台确定是否在 /boot/grub/device.map 文件中为 hd0 条目输入了不活动路径。

    这一点是必需的,因为安装时不会区分活动和不活动路径。

    1. 输入以下命令将根设备挂载 /mnt

      > sudo mount /dev/disk/by-id/UUID;_part2 /mnt

      例如,输入

      > sudo mount /dev/disk/by-id/dm-uuid-mpath-3600a0b80000f4593000012ae4ab0ae65_part2 /mnt
    2. 输入以下命令将引导设备挂载 /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
    3. /mnt/boot/grub/device.map 文件中,确定 hd0 条目是否指向不活动路径,然后执行下列其中一项操作:

      • 活动路径:: 不需要执行任何操作。跳过所有剩余的步骤,按 CtrlAltF7 返回 YaST 图形环境,然后继续安装。

      • 不活动路径:: 必须更改配置并重新安装引导加载程序。

  7. 如果 hd0 条目指向不活动路径,请更改配置并重新安装引导加载程序:

    1. 在控制台提示符处输入以下命令:

                mount -o bind /dev /mnt/dev
                mount -o bind /sys /mnt/sys
                mount -o bind /proc /mnt/proc
                chroot /mnt
    2. 在控制台中,运行 multipath -ll,然后检查输出以找到活动路径。

      不活动路径标有 ghost 字样。

    3. /boot/grub/device.map 文件中,将 hd0 条目更改为活动路径,保存更改并关闭文件。

    4. 输入以下命令重新安装引导加载程序

      grub-install /dev/disk/by-id/UUID_part1 /mnt/boot

      例如,输入

      grub-install /dev/disk/by-id/dm-uuid-mpath-3600a0b80000f4593000012ae4ab0ae65_part2 /mnt/boot
    5. 输入以下命令:

      exit
      umount /mnt/*
      umount /mnt
  8. CtrlAltF7 返回 YaST 图形环境。

  9. 单击确定继续安装重引导。

18.11.2 为现有根设备启用多路径 I/O

  1. 将 Linux 安装为仅有一个路径活动,最好是分区程序中列出 by-id 符号链接的路径。

  2. 使用安装期间使用的 /dev/disk/by-id 路径挂载设备。

  3. 打开或创建 /etc/dracut.conf.d/10-mp.conf,并在其中添加以下行(请注意前导空格):

    force_drivers+=" dm-multipath"
  4. 对于 IBM Z,请在运行 dracut 之前先编辑 /etc/zipl.conf 文件,以 /etc/fstab 中使用的相同 by-id 信息更改 zipl.conf 中的 by-path 信息。

  5. 运行 dracut -f 更新 initrd 映像。

  6. 对于 IBM Z,请在运行 dracut 之后运行 zipl

  7. 重引导服务器。

18.11.3 在根设备上禁用多路径 I/O

向内核命令行中添加 multipath=off。这可以通过 YaST 引导加载程序模块来完成。打开引导加载程序安装 ›  内核参数,并将参数添加到两个命令行中。

这仅会影响根设备。不会影响所有其他设备。

18.12 为现有软件 RAID 配置多路径 I/O

理想的情况下,应先为设备配置多路径,再将这些设备用作软件 RAID 设备的组件。如果创建任何软件 RAID 设备之后添加多路径,则在重引导时,DM-MPIO 服务可能会比 multipath 服务启动得晚,导致多路径似乎不可用于 RAID。您可以使用本节中的过程使多路径对先前现有的软件 RAID 运行。

例如,您可能需要在以下情况中对软件 RAID 中的设备配置多路径:

  • 如果在全新安装或升级期间将一个新的软件 RAID 创建为分区设置的一部分。

  • 如果在软件 RAID 将设备用作成员设备或备用设备之前,没有将这些设备配置为支持多路径。

  • 如果通过向服务器添加新的 HBA 适配器或扩展 SAN 中的储存子系统而增加了系统规模。

注意
注意:假设条件

以下说明假定软件 RAID 设备是 /dev/mapper/mpath0,这是内核可以识别的设备名。它假设您已按照第 18.9 节 “配置用户用好的名称或别名”所述在 /etc/multipath.conf 文件中启用了用户友好的名称。

确保将这些说明中的设备名修改为您的软件 RAID 的设备名。

  1. 打开一个终端控制台。

    除非另行说明,请使用此控制台输入以下步骤中的命令。

  2. 如果当前已挂载或正在运行任何软件 RAID 设备,请对每个设备输入以下命令来卸载并停止设备。

    > sudo umount /dev/mapper/mpath0
    > sudo mdadm --misc --stop /dev/mapper/mpath0
  3. 输入以下命令停止 md 服务

    > sudo systemctl stop mdmonitor
  4. 输入以下命令启动 multipathd 守护程序:

    > systemctl start multipathd
  5. 启动多路径服务之后,校验软件 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
  6. 输入以下命令重启动 mdmonitor 服务和 RAID 设备

    > sudo systemctl start mdmonitor
  7. 通过输入以下命令,检查软件 RAID 的状态

    > sudo mdadm --detail /dev/mapper/mpath0

    RAID 的组件设备应匹配在 /dev/disk/by-id 目录中列为设备符号链接的设备映射程序多路径设备名。

  8. 如果根 (/) 设备或其任何部分(例如 /var/etc/log)位于 SAN 上,并且需要使用多路径引导,请重构建 initrd

    > dracut -f --add-multipath
  9. 重引导服务器以应用更改。

  10. 通过检查 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 与多路径设备配合使用

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 脚本扫描新设备。默认情况下,此脚本将扫描具有典型 LUN 范围的所有 HBA。该命令的一般语法如下所示:

> sudo rescan-scsi-bus.sh [options] [host [host ...]]

对于大多数储存子系统,此脚本可在无选项的情况下成功运行。不过,在某些特殊情况下,可能需要使用一或多个选项。有关细节,请运行 rescan-scsi-bus.sh --help

警告
警告:EMC PowerPath 环境

在 EMC PowerPath 环境中,请勿使用操作系统随附的 rescan-scsi-bus.sh 实用程序或 HBA 供应商脚本来扫描 SCSI 总线。为了避免可能发生的文件系统损坏,EMC 要求您遵照 EMC PowerPath for Linux 的供应商文档中提供的过程操作。

使用以下过程扫描设备并在不重引导系统的情况下使这些设备可用于多路径。

  1. 在储存子系统上,使用供应商的工具分配设备并更新其访问控制设置,以允许 Linux 系统访问新的储存区。有关细节,请参见供应商的文档。

  2. 在所有目标中扫描查找一个主机,使其新设备为 Linux 内核 SCSI 子系统的中间层所知。在终端控制台提示符下,输入

    > sudo rescan-scsi-bus.sh

    根据您的设置,您可能需要结合可选参数运行 rescan-scsi-bus.sh。有关细节,请参见 rescan-scsi-bus.sh --help

  3. 请在 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
    [...]
  4. 重复上述步骤,以添加通过 Linux 系统上连接到新设备的其他 HBA 适配器的路径。

  5. 运行 multipath 命令以识别 DM-MPIO 配置的设备。在终端控制台提示符下,输入

    > sudo multipath

    现在可以为多路径配置新设备了。

18.14.2 在不重引导的情况下扫描新的分区设备

使用本节中的示例,在不重引导的情况下检测新添加的多路径 LUN。

警告
警告:EMC PowerPath 环境

在 EMC PowerPath 环境中,请勿使用操作系统随附的 rescan-scsi-bus.sh 实用程序或 HBA 供应商脚本来扫描 SCSI 总线。为了避免可能发生的文件系统损坏,EMC 要求您遵照 EMC PowerPath for Linux 的供应商文档中提供的过程操作。

  1. 打开一个终端控制台。

  2. 在所有目标中扫描查找一个主机,使其新设备为 Linux 内核 SCSI 子系统的中间层所知。在终端控制台提示符下,输入

    > rescan-scsi-bus.sh

    根据您的设置,您可能需要结合可选参数运行 rescan-scsi-bus.sh。有关细节,请参见 rescan-scsi-bus.sh --help

  3. 通过输入以下命令校验该设备是否可见(例如链接是否有一个新的时戳)

    > ls -lrt /dev/dm-*

    您也可以通过输入以下命令来校验设备存在于 /dev/disk/by-id

    > ls -l /dev/disk/by-id/
  4. 通过输入以下命令,校验新设备是否出现在日志中

    > sudo journalctl -r
  5. 使用文本编辑器,在 /etc/multipath.conf 文件中为该设备添加新的别名定义,例如 data_vol3

    例如,如果 UUID 是 36006016088d014006e98a7a94a85db11,则进行以下更改:

    defaults {
         user_friendly_names   yes
      }
    multipaths {
         multipath {
              wwid    36006016088d014006e98a7a94a85db11
              alias  data_vol3
              }
      }
  6. 通过输入以下命令,为该设备创建分区表

    > fdisk /dev/disk/by-id/dm-uuid-mpath-<UUID>

    使用设备的 WWID(如 36006016088d014006e98a7a94a85db11)替换 UUID。

  7. 通过输入以下命令触发 udev

    > sudo echo 'add' > /sys/block/DM_DEVICE/uevent

    例如,要为 dm-8 上的分区生成设备映射程序设备,请输入

    > sudo echo 'add' > /sys/block/dm-8/uevent
  8. 在设备 /dev/disk/by-id/dm-uuid-mpath-UUID_partN 上创建文件系统。根据您选择的文件系统,您可以使用以下其中一个命令实现此目的:mkfs.btrfs mkfs.ext3mkfs.ext4mkfs.xfs。有关细节,请参见相应的手册页。用实际的 UUID 和分区编号替换 UUID_partN,例如 36006016088d014006e98a7a94a85db11_part1。

  9. 输入以下命令为新分区创建标签:

    > sudo tune2fs -L LABELNAME /dev/disk/by-id/dm-uuid-UUID_partN

    用实际的 UUID 和分区编号替换 UUID_partN,例如 36006016088d014006e98a7a94a85db11_part1。用您选择的标签替换 LABELNAME

  10. 输入以下命令以重配置 DM-MPIO,使其读取别名:

    > sudo multipathd -k'reconfigure'
  11. 通过输入以下命令,校验该设备已由 multipathd 识别

    > sudo multipath -ll
  12. 使用文本编辑器在 /etc/fstab 文件中添加新的挂载项。

    此时,您在上一步中创建的别名还不在 /dev/disk/by-label 目录中。为 /dev/dm-9 路径添加一个挂载项,然后在下次重引导到以下项目之前更改该项目

    LABEL=LABELNAME
  13. 创建要作为挂载点的目录,然后挂载设备。

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

  • 主要:次要编号

  • 设备的状态

注意
注意:在多路径设置中使用 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,直到重引导或手动返回到故障转移而不是排队。

测试该情形:

  1. 打开一个终端控制台。

  2. 输入以下命令激活设备 I/O 的排队而非故障转移

    > sudo dmsetup message DEVICE_ID 0 queue_if_no_path

    DEVICE_ID 替换为您设备的 ID。值 0 代表扇区,在不需要扇区信息时使用该值。

    例如,输入:

    > sudo dmsetup message 3600601607cf30e00184589a37a31d911 0 queue_if_no_path
  3. 输入以下命令返回到设备 I/O 的故障转移

    > sudo dmsetup message DEVICE_ID 0 fail_if_no_path

    该命令会立即导致所有排队的 I/O 失败。

    DEVICE_ID 替换为您设备的 ID。例如,输入

    > sudo dmsetup message 3600601607cf30e00184589a37a31d911 0 fail_if_no_path

在所有路径失败的情形下设置将 I/O 排队:

  1. 打开一个终端控制台。

  2. 在文本编辑器中打开 /etc/multipath.conf

  3. 取消注释 defaults 部分及其结尾括号,然后如下所示添加 default_features 设置:

    defaults {
      default_features "1 queue_if_no_path"
    }
  4. 修改 /etc/multipath.conf 文件后,您必须运行 dracut -f 在系统中重新创建 initrd,然后重引导以使更改生效。

  5. 当您准备好返回到设备 I/O 的故障转移时,请输入

    > sudo dmsetup message MAPNAME 0 fail_if_no_path

    MAPNAME 替换为该设备映射的别名或设备 ID。值 0 代表扇区,在不需要扇区信息时使用该值。

    此命令会立即导致所有排队的 I/O 失败,并且将该错误传播到调用的应用程序。

18.14.5 解决停止的 I/O

如果所有路径同时失败,并且 I/O 排队并停止,请执行以下操作:

  1. 在终端控制台提示符下输入以下命令:

    > sudo dmsetup message MAPNAME 0 fail_if_no_path

    MAPNAME 替换为设备的正确设备 ID 或映射别名。值 0 代表扇区,在不需要扇区信息时使用该值。

    此命令会立即导致所有排队的 I/O 失败,并且将该错误传播到调用的应用程序。

  2. 输入以下命令重新激活排队:

    > 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 是将路径视为丢失并停止 IO 排队前多路径 I/O 的重试次数。

  • polling_interval 是路径检查的间隔时间(以秒为单位)。

以上多路径值都应该从 /etc/multipath.conf 配置文件进行设置。有关信息,请参见第 18.6 节 “多路径配置”

18.15 MPIO 查错

本节对 MPIO 的一些已知问题以及可行的解决方案进行了说明。

18.15.1 在多路径设备上安装 GRUB2

在具有 Btrfs 的传统 BIOS 系统上,grub2-install 可能会失败,并显示权限被拒。要解决此问题,请确保以读写 (rw) 模式挂载 /boot/grub2/SUBDIR/ 子卷。SUBDIR 可以是 x86_64-efii386-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 紧急外壳中工作。要永久保留以下所述的配置更改,您需要在已安装系统的环境中执行这些更改。

  1. 确定系统根 (/) 文件系统。检查 /proc/cmdline 的内容并查找 root= 参数。

  2. 校验是否已挂载根文件系统:

    > sudo systemctl status sysroot.mount
    提示
    提示

    默认情况下,dracut 会将根文件系统挂载到 /sysroot 之下。

    从现在开始,我们假设根文件系统已挂载到 /sysroot 下。

  3. /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 节 “访问已安装系统”

  4. 按照以下过程中的建议更改多路径或 dracut 配置。请记得重构建 initrd 以包含修改。

  5. 通过输入 exit 命令退出 chroot 环境,然后退出紧急外壳并按 CtrlD 来重引导服务器。

过程 18.1︰ 紧急外壳:将文件系统加入黑名单

如果根文件系统不在多路径上,却启用了多路径,则需要此修复。在此类设置中,多路径会尝试为未加入黑名单的所有设备设置其路径。由于具有根文件系统的设备已挂载,它对于多路径而言是无法访问的,因而会导致路径设置失败。您可以在 /etc/multipath.conf 中将根设备加入黑名单来正确设置多路径,从而修复此问题。

  1. 在紧急外壳中运行 multipath -v2 并确定根文件系统的设备。产生的输出如下所示:

    # multipath -v2
    Dec 18 10:10:03 | 3600508b1001030343841423043300400: ignoring map

    | : 之间的字符串是加入黑名单所需的 WWID。

  2. 打开 /etc/multipath.conf 并添加以下内容:

    blacklist {
      wwid "WWID"
    }

    使用在上一步中获取的 ID 替换 WWID。有关更多信息,请参见第 18.8 节 “将非多路径设备加入黑名单”

  3. 使用以下命令重构建 initrd

    > dracut -f --add-multipath
过程 18.2︰ 紧急外壳:重构建 initrd

如果 initrd 与系统之间的多路径状态(已启用或已禁用)不相同,则需要执行此修复过程。要修复此问题,请重构建 initrd

  • 如果已在系统中启用多路径,请通过以下命令重构建支持多路径的 initrd:

    > dracut --force --add multipath

    如果已在系统中禁用多路径,请通过以下命令重构建支持多路径的 initrd:

    > dracut --force -o multipath
过程 18.3︰ 紧急外壳:重构建 initrd

如果 initrd 不包含用于访问网络挂接储存的驱动程序,则需要此修复。例如,如果系统是在没有多路径的情况下安装的,或者当添加或更换相应硬件时,就可能需要执行此修复过程。

  1. 将所需的驱动程序添加至文件 /etc/dracut.conf.d/01-dist.conf 中的变量 force_drivers。例如,如果系统包含 hpsa 驱动程序访问的 RAID 控制器,且多路径设备连接到由 qla23xx 驱动程序访问的 QLogic 控制器,该项将会如下所示:

    force_drivers+="hpsa qla23xx"
  2. 使用以下命令重构建 initrd

    > dracut -f --add-multipath
  3. 为了防止在挂接网络储存失败时系统引导到紧急模式,建议将挂载选项 _netdev 添加到 /etc/fstab 中的相应项。

18.15.3 升级到多路径 0.4.9 或更高版本后单个设备的 PRIO 设置不起作用

从 0.4.9 版开始,多路径工具使用 /etc/multipath.conf 文件 defaults{}devices{} 部分中的 prio 设置。当为 multipaths{} 部分中的单个 multipath 定义指定关键字 prio 时,它将被忽略而无反馈。

多路径工具 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):