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

17 管理设备的多路径 I/O

本章介绍如何使用多路径 I/O (MPIO) 来管理服务器和块储存设备间多路径的故障转移和路径负载平衡。

17.1 了解多路径 I/O

多路径是服务器与跨多个物理路径(这些路径在服务器中的主机总线适配器和设备储存控制器之间)的同一物理或逻辑块储存设备通讯的能力,通常是在光纤通道 (FC) 或 iSCSI SAN 环境中。当多个通道可用时,您还可以实现与直接挂接的储存器的多个连接。

Linux 的多路径提供连接容错,并可以跨多个活动连接提供负载平衡。当多路径已配置并且正在运行时,它会自动隔离和识别设备连接故障,并重路由 I/O 以改变连接。

常见连接问题包括适配器、电缆或控制器故障。当为一个设备配置多路径 I/O 时,多路径驱动程序将监视设备之间的活动连接。当多路径驱动程序检测到一个活动路径出现 I/O 错误时,它会故障转移到该设备的指定备用路径。当首选路径再次正常时,控制权会返回到首选路径。

17.2 硬件支持

多路径驱动程序和工具支持 SUSE Linux Enterprise Server 适用的所有体系结构。它们支持大多数储存阵列。存放多路径设备的储存阵列必须支持多路径,才能使用多路径驱动程序和工具。某些储存阵列供应商提供自己的多路径管理工具。请查看供应商的硬件文档以确定需要哪些设置。

17.2.1 自动检测到支持多路径的储存阵列

multipath-tools 包自动检测到以下储存阵列:

3PARdata VV
AIX NVDISK
AIX VDASD
APPLE Xserve RAID
COMPELNT Compellent Vol
COMPAQ/HP HSV101、HSV111、HSV200、HSV210、HSV300、HSV400、HSV 450
COMPAQ/HP MSA、HSV
COMPAQ/HP MSA VOLUME
DataCore SANmelody
DDN SAN DataDirector
DEC HSG80
DELL MD3000
DELL MD3000i
DELL MD32xx
DELL MD32xxi
DGC
EMC Clariion
EMC Invista
EMC SYMMETRIX
EUROLOGC FC2502
FSC CentricStor
FUJITSU ETERNUS_DX、DXL、DX400、DX8000
HITACHI DF
HITACHI/HP OPEN
HP A6189A
HP HSVX700
HP LOGICAL VOLUME
HP MSA2012fc、MSA 2212fc、MSA2012i
HP MSA2012sa、MSA2312 fc/i/sa、MCA2324 fc/i/sa、MSA2000s VOLUME
HP P2000 G3 FC|P2000G3 FC/iSCSI|P2000 G3 SAS|P2000 G3 iSCSI
IBM 1722-600
IBM 1724
IBM 1726
IBM 1742
IBM 1745、1746
IBM 1750500
IBM 1814
IBM 1815
IBM 1818
IBM 1820N00
IBM 2105800
IBM 2105F20
IBM 2107900
IBM 2145
IBM 2810XIV
IBM 3303 NVDISK
IBM 3526
IBM 3542
IBM IPR
IBM Nseries
IBM ProFibre 4000R
IBM S/390 DASD ECKD
IBM S/390 DASD FBA
Intel Multi-Flex
LSI/ENGENIO INF-01-00
NEC DISK ARRAY
NETAPP LUN
NEXENTA COMSTAR
Pillar Axiom
PIVOT3 RAIGE VOLUME
SGI IS
SGI TP9100、TP 9300
SGI TP9400、TP9500
STK FLEXLINE 380
STK OPENstorage D280
SUN CSM200_R
SUN LCSM100_[IEFS]
SUN STK6580、STK6780
SUN StorEdge 3510、T4
SUN SUN_6180

一般来说,其他的储存阵列多数都可以用。当自动检测到储存阵列时,将应用多路径的默认设置。如果想要使用非默认设置,则必须手动创建和配置 /etc/multipath.conf 文件。这对不能自动侦测到的硬件也适用。有关信息,请参见第 17.6 节 “创建或修改 /etc/multipath.conf 文件”

要注意下列事项:

17.2.2 测试过的支持多路径的储存阵列

下列供应商生产的储存阵列已在 SUSE Linux Enterprise Server 上经过测试:

EMC
Hitachi
Hewlett-Packard/Compaq
IBM
NetApp
SGI

其他供应商的储存阵列多数也可以用。请查看供应商的文档以获取相关指导。有关 multipath-tools 包可以识别的默认储存阵列的列表,请参见第 17.2.1 节 “自动检测到支持多路径的储存阵列”

17.2.3 需要特定硬件处理程序的储存阵列

要求特殊命令来进行一个路径向另一路径故障转移的储存阵列或要求特殊非标准错误处理的储存阵列,可能要求更多支持。因此,设备映射程序多路径服务有用于硬件处理程序的钩子。例如,已为 EMC CLARiiON CX 系列的阵列提供了一个此类处理程序。

重要
重要:更多信息

请查看硬件供应商的文档以确定是否必须为设备映射程序多路径安装其硬件处理程序。

multipath -t 命令显示一个要求使用特定硬件处理程序进行特殊处理的内部储存阵列表。显示的列表不是受支持储存阵列的穷举列表。仅列出要求特殊处理并且在工具开发期间 multipath-tools 开发人员可以访问的那些阵列。

重要
重要:例外

真正支持活动/活动多路径的阵列不要求特殊处理,所以 multipath -t 命令不会列出它们。

multipath -t 表中的列表不一定表示在该特定硬件上测试过 SUSE Linux Enterprise Server。对于已测试过的储存阵列的列表,请参见第 17.2.2 节 “测试过的支持多路径的储存阵列”

17.3 规划多路径

当规划多路径 I/O 解决方案时,请使用本节中的准则。

17.3.1 先决条件

  • 多路径在设备级别进行管理。

  • 用于多路径设备的储存阵列必须支持多路径。有关详细信息,请参见第 17.2 节 “硬件支持”

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

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

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

17.3.2 磁盘管理任务

尝试为有多个路径的物理或逻辑设备配置多路径之前,请执行以下磁盘管理任务:

  • 使用第三方工具将物理磁盘刻为几个较小的逻辑磁盘。

  • 使用第三方工具将物理或逻辑磁盘分区。如果在运行的系统中更改分区,设备映射程序多路径 (DM-MP) 模块不会自动检测和反映这些更改。DM-MPIO 必须重新初始化,这通常要求重引导。

  • 使用第三方 SAN 阵列管理工具创建和配置硬件 RAID 设备。

  • 使用第三方 SAN 阵列管理工具创建诸如 LUN 的逻辑设备。给定阵列支持的逻辑设备类型取决于阵列供应商。

17.3.3 软件 RAID

Linux 软件 RAID 管理软件在多路径的基础上运行。对于具有多个 I/O 路径以及您计划在软件 RAID 中使用的每个设备,必须将该设备配置为支持多路径,才能尝试创建软件 RAID 设备。不能自动发现多路径设备。软件 RAID 并不了解在底层运行的多路径管理。

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

17.3.4 高可用性解决方案

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

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

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

17.3.5 始终让 initrd 与系统配置保持同步

使用多路径时最重要的一项要求是,需确保在根文件系统及引导系统所需的所有其他文件系统方面,initrd 与已安装的系统行为一致。如果在系统中启用了多路径,那么也需要在 initrd 中启用多路径,反之亦然。有关详细信息,请参见第 17.5.1 节 “启用、禁用、启动和停止多路径 I/O 服务”

如果 initrd 与系统不同步,系统将无法正常引导,启动过程将显示紧急外壳。有关如何避免或修复此类情况的说明,请参见第 17.15.1 节 “启用多路径时系统在引导过程中退出到紧急外壳”

17.4 多路径管理工具

SUSE Linux Enterprise Server 中的多路径支持以 Linux 内核的设备映射程序多路径模块及 multipath-tools 用户空间包为基础。您可以使用多设备管理实用程序 (multipath) 查看多路径设备的状态。

17.4.1 设备映射程序多路径模块

设备映射程序多路径 (DM-MP) 模块为 Linux 提供多路径功能。DM-MPIO 是在 SUSE Linux Enterprise Server 上实施多路径的首选解决方案。它是该产品随附的唯一一个多路径选项,完全受 SUSE 支持。

DM-MPIO 可以为各种设置自动配置多路径子系统。每个设备最多可配置 8 个路径。支持活动/不活动(一个路径活动、其他路径不活动)或活动/活动(所有路径都是活动,带循环负载平衡)的配置。

DM-MPIO 框架可按两种方式扩展:

DM-MPIO 的用户空间组件负责自动路径发现和分组以及自动路径再测试,以便先前失败的路径在恢复正常后可以自动重新启用。这可以最大程度地降低管理员对生产环境的关注。

DM-MPIO 保护设备路径以及设备本身不会出故障。如果一个活动路径丢失(例如,一个网络适配器 I/O 断开或光纤电缆被删除),I/O 会重定向到剩余的路径。如果该配置是活动/不活动,则路径会故障转移到一个不活动路径。如果正在使用循环负载平衡配置,则会在剩余正常路径间平衡通讯量。如果所有活动路径均失败,则必须唤醒不活动的辅助路径,因此需经过大约 30 秒的延迟之后才会开始故障转移。

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

注意
注意:储存处理器

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

表 17.1︰ 储存阵列的多路径 I/O 功能

储存阵列的功能

描述

活动/不活动控制器

一个控制器是活动的,为所有 LUN 提供服务。第二个控制器充当备用控制器。第二个控制器还将 LUN 提供给多路径组件,以便操作系统了解冗余路径。如果主控制器失败,第二个控制器会接管,并且它为所有 LUN 提供服务。

在某些阵列中,LUN 可以指派给不同的控制器。给定的 LUN 指派给要充当活动控制器的一个控制器。一个控制器一次可为任何 LUN 执行磁盘 I/O,第二个控制器是该 LUN 的备用控制器。第二个控制器也提供这些路径,但不可执行磁盘 I/O。使用该 LUN 的服务器连接到该 LUN 的指派的控制器。如果一组 LUN 的主控制器失败,第二个控制器会接管,并且它为所有 LUN 提供服务。

活动/活动控制器

两个控制器均分所有 LUN 的负载,并且可以处理任何 LUN 的磁盘 I/O。如果一个控制器失败,第二个处理器会自动处理所有通讯。

负载平衡

设备映射程序多路径驱动程序自动对所有活动路径中的通讯平衡负载。

控制器故障转移

当活动控制器故障转移到不活动控制器(或备用控制器)时,设备映射程序多路径驱动程序会自动激活主机和备用控制器之间的路径,使它们成为主路径。

引导/根设备支持

在 SUSE Linux Enterprise Server 10 和更高版本中,根 (/) 设备支持多路径。主机服务器必须连接到引导设备当前活动的控制器和储存处理器。

在 SUSE Linux Enterprise Server 11 和更高版本中,/boot 设备支持多路径。

设备映射程序多路径将多路径设备的每个路径检测为独立的 SCSI 设备。SCSI 设备名的格式为 /dev/sdN,其中 N 是为该设备自动生成的字母,从 a 开始,并在设备创建时顺序发放,例如 /dev/sda/dev/sdb 等。如果设备数超过 26,则会使用两个字母,这样在 /dev/sdz 后的下一个设备将命名为 /dev/sdaa/dev/sdab 等。

如果未自动检测到多路径,则您可以在 /etc/multipath.conf 文件中手动配置它们。multipath.conf 文件在您创建和配置之前是不存在的。有关信息,请参见第 17.6 节 “创建或修改 /etc/multipath.conf 文件”

17.4.2 多路径 I/O 管理工具

multipath-toolskpartx 包提供了负责执行自动路径发现和分组的工具。它们会定期自动测试路径,这样,先前失败的路径在恢复正常后,便可自动重新启用。这可以最大程度地降低管理员对生产环境的关注。

表 17.2︰ multipath-tools 包中的工具

工具

描述

multipath

扫描系统中的多路径设备并组装它们。

multipathd

等候映射事件,然后执行 multipath

kpartx

将线性 devmaps 映射到多路径设备上的分区,使得能够为设备上的分区创建多路径监视。

mpathpersist

管理设备映射程序多路径设备上的 SCSI 永久保留。

17.4.3 对多路径设备使用 MDADM

udev 是默认设备处理程序,系统会自动知道设备的全球 ID 而不是设备节点名。它解决了以前版本的 MDADM 和 LVM 中的问题,即配置文件(mdadm.conflvm.conf)不能正确识别多路径设备。

与 LVM2 一样,MDADM 也要求通过 ID 而非设备节点路径访问设备。因此,/etc/mdadm.conf 中的 DEVICE 项应如下设置:

DEVICE /dev/disk/by-id/*

如果要使用用户友好的名称,请按以下方式指定路径,以便在配置多路径后仅对设备映射程序名称进行扫描:

DEVICE /dev/disk/by-id/dm-uuid-.*-mpath-.*

17.4.4 multipath 命令

使用 Linux 的 multipath(8) 命令配置和管理多路径设备。该命令的一般语法如下所示:

multipath [-v verbosity_level] [-b bindings_file] [-d] [-h|-l|-ll|-f|-F|-B|-c|-q|-r|-w|-W|-t] [-p failover|multibus|group_by_serial|group_by_prio|group_by_node_name] [DEVICENAME]

有关细节,请参见 man 8 multipath

常规示例

multipath

配置所有多路径设备。

multipath DEVICENAME

配置特定多路径设备。

使用诸如 /dev/sdb(如 udev 的 $DEVNAME 变量中所示)的设备节点名或采用 major:minor 格式替换 DEVICENAME。也可以使用该设备的多路径映射名称。

multipath -f

选择性地抑制多路径映射及其设备映射的分区。

multipath -d

排演。显示潜在多路径设备,但不创建任何设备,也不更新设备映射。

multipath -v2 -d

显示试运行中潜在多路径设备的多路径映射信息。-v2 选项仅显示本地磁盘。这种详细级别仅打印创建或更新的多路径名称,用于为 kpartx 之类的其他工具提供输入。

如果设备已经存在且未作更改,则无输出。使用 multipath -ll 可以查看配置的多路径设备的状态。

multipath -v2 DEVICENAME

配置特定潜在多路径设备并显示它的多路径映射信息。这种详细级别仅打印创建的或更新的多路径名称,以用来为 kpartx 之类的其他工具提供输入。

如果设备已经存在且未作更改,则无输出。使用 multipath -ll 可以查看配置的多路径设备的状态。

使用诸如 /dev/sdb(如 udev 的 $DEVNAME 变量中所示)的设备节点名或采用 major:minor 格式替换 DEVICENAME。也可以使用该设备的多路径映射名称。

multipath -v3

配置潜在多路径设备并显示它们的多路径映射信息。这种详细级别打印所有检测到的路径、多路径和设备映射。WWID 和 devnode 列入黑名单的设备都会显示。

multipath -v3 DEVICENAME

配置特定潜在多路径设备并显示相关信息。-v3 选项显示完整的路径列表。这种详细级别打印所有检测到的路径、多路径和设备映射。WWID 和 devnode 列入黑名单的设备都会显示。

使用诸如 /dev/sdb(如 udev 的 $DEVNAME 变量中所示)的设备节点名或采用 major:minor 格式替换 DEVICENAME。也可以使用该设备的多路径映射名称。

multipath -ll

显示所有多路径设备的状态。

multipath -ll DEVICENAME

显示特定多路径设备的状态。

使用诸如 /dev/sdb(如 udev 的 $DEVNAME 变量中所示)的设备节点名或采用 major:minor 格式替换 DEVICENAME。也可以使用该设备的多路径映射名称。

multipath -F

刷新所有未用多路径设备映射。它不解析多路径,且不删除设备。

multipath -F DEVICENAME

刷新特定多路径设备的未用多路径设备映射。它不解析多路径,且不删除设备。

使用诸如 /dev/sdb(如 udev 的 $DEVNAME 变量中所示)的设备节点名或采用 major:minor 格式替换 DEVICENAME。也可以使用该设备的多路径映射名称。

multipath -p [ failover | multibus | group_by_serial | group_by_prio | group_by_node_name ]

指定下表中所述的其中一个组策略选项来设置组策略:

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

策略选项

描述

failover

(默认)每个优先级组对应一个路径。您一次只能使用一个路径。

multibus

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

group_by_serial

每个检测到的 SCSI 序列号(控制器节点全球编号)一个优先级组。

group_by_prio

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

group_by_node_name

每个目标节点名一个优先级组。目标节点名是在 /sys/class/fc_transport/target*/node_name 位置获取的。

multipath -t

显示内部硬件表和活动的多路径配置。有关配置参数的细节,请参见 man multipath

17.4.5 mpathpersist 实用程序

mpathpersist 实用程序可用来管理设备映射程序多路径设备上的 SCSI 永久保留。该命令的一般语法如下所示:

mpathpersist [options] [device]

有关细节,请参见 man 8 mpathpersist

将此实用程序与 /etc/multipath.conf 文件中的服务操作保留密钥(reservation_key 属性)搭配使用,设置 SCSI 设备的永久保留。默认情况下不会使用该属性。如果未设置该属性,multipathd 守护程序不会检查新发现的路径或已重新启用的路径的永久保留。

reservation_key <RESERVATION_KEY>

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

multipaths {
  multipath {
    wwid   XXXXXXXXXXXXXXXX
    alias      yellow
    reservation_key  0x123abc
  }
}

设置所有适合永久管理的多路径设备的 reservation_key 参数,然后运行以下命令重启动 multipathd 守护程序:

sudo systemctl restart multipathd

设置它之后,您可以在 mpathpersist 命令中指定保留密钥。

示例

mpathpersist --out --register --param-sark=123abc --prout-type=5 -d /dev/mapper/mpath9

注册 /dev/mapper/mpath9 设备的服务操作保留密钥。

mpathpersist -i -k -d /dev/mapper/mpath9

读取 /dev/mapper/mpath9 设备的服务操作保留密钥。

mpathpersist --out --reserve --param-sark=123abc --prout-type=8 -d /dev/mapper/mpath9

保留 /dev/mapper/mpath9 设备的服务操作保留密钥。

mpathpersist -i -s -d /dev/mapper/mpath9

读取 /dev/mapper/mpath9 设备的保留状态。

17.5 为多路径配置系统

17.5.1 启用、禁用、启动和停止多路径 I/O 服务

要允许多路径服务在引导时启动,请运行以下命令:

sudo systemctl enable multipathd

要在正在运行的系统中手动启动服务,或是检查其状态,请输入以下其中一个命令:

sudo systemctl start multipathd
sudo systemctl status multipathd

要在当前会话中停止多路径服务,以及要禁用该服务以便在系统下次引导时不启动它,请运行以下命令:

sudo systemctl stop multipathd
sudo systemctl disable multipathd
重要
重要:重构建 initrd

每次启用或禁用多路径服务时,还需要重构建 initrd,否则系统可能无法再引导。启用多路径服务时,还要运行以下命令以重构建 initrd:

dracut --force --add multipath

禁用服务时,则运行以下命令以重构建 initrd:

dracut --force -o multipath

(可选)此外,如果您还想确保不设置多路径设备(即使手动启动了多路径),请在重构建 initrd 之前,将以下几行添加到 /etc/multipath.conf 的末尾:

blacklist {
    wwid ".*"
}

17.5.2 为多路径准备 SAN 设备

配置 SAN 设备的多路径 I/O 之前,请按需要执行以下操作准备 SAN 设备:

  • 使用供应商工具配置 SAN 并设置区域。

  • 使用供应商工具为储存阵列上的主机 LUN 配置访问权限。

  • 安装 Linux HBA 驱动程序模块。安装好模块后,驱动程序会自动扫描 HBA,以发现对该主机有访问权限的任何 SAN 设备。它将这些 SAN 设备提供给主机以进行进一步的配置。

    注意
    注意:无本机多路径

    确保您正在使用的 HBA 驱动程序没有启用本机多路径。

    有关更多细节,请参见供应商的特定说明。

  • 装载驱动程序模块之后,发现指派给特定阵列 LUN 或分区的设备节点。

  • 如果将 SAN 设备用作服务器上的根设备,请按第 17.14.9 节 “根设备为多路径时的 SAN 超时设置”中所述修改设备超时设置。

如果 HBA 驱动程序没有看到这些 LUN,则可以使用 lsscsi 检查操作系统是否正确看到这些 SCSI 设备。如果 HBA 驱动程序没有看到这些 LUN,请检查 SAN 的区域设置。特别是要检查 LUN 屏蔽是否是活动的,以及是否已将 LUN 正确指派给服务器。

如果 HBA 驱动程序看到这些 LUN,但没有相应的块设备,则需要其他内核参数来更改 SCSI 设备扫描行为,例如表示 LUN 不连续编号。有关信息,请参见 SUSE 知识库 (https://www.suse.com/support/kb/doc.php?id=3955167) 中的 TID 3955167:Troubleshooting SCSI (LUN) Scanning Issues(SCSI (LUN) 扫描问题查错)。

17.5.3 将多路径设备分区

不建议使用但支持有多个路径的分区设备。使用 kpartx 工具无需重引导即可在多路径设备中创建分区。也可以在尝试配置多路径之前,使用 YaST 中的“分区程序”功能或使用第三方分区工具对设备分区。

多路径设备是设备映射程序设备。虽然使用命令行工具(例如 parted、kpartx 或 fdisk)可以修改设备映射程序设备,但这并不一定会生成更新其他层所需的 udev 事件。对设备映射程序设备分区之后,您应该检查多路径映射,确保已映射设备映射程序设备。如果未映射它们,您可以重新映射多路径设备,或重引导服务器,以取得多路径映射中的所有新分区。

多路径设备上的一个分区的设备映射程序设备不同于一个独立设备。使用整个设备创建 LVM 逻辑卷时,必须指定不包含分区的设备。如果将多路径分区指定为 LVM 逻辑卷的目标设备,则 LVM 会认为底层物理设备已分区,创建将会失败。如果需要细分 SAN 设备,则可以拆分 SAN 设备上的 LUN,并将每个 LUN 作为独立的多路径设备显示给服务器。

17.6 创建或修改 /etc/multipath.conf 文件

只有创建 /etc/multipath.conf,该文件才会存在。除非您创建多路径配置文件并进行个性化设置,否则在运行守护程序 multipathd 时,将自动应用默认的多路径设备设置。

重要
重要: 测试及永久性应用 /etc/multipath.conf 中的更改

无论您何时创建或修改 /etc/multipath.conf 文件,当保存该文件时都不会自动应用更改。这样,您便可以在提交更改之前,先进行试运行以校验这些更改。如果对修改后的设置满意,便可按第 17.6.4 节 “应用 /etc/multipath.conf 文件更改以更新多路径映射”中所述来更新多路径映射。

17.6.1 创建 /etc/multipath.conf 文件

  1. 使用惯用的编辑器创建一个空的 /etc/multipath.conf 文件。

  2. 确保为您的 SAN 添加相应的 device 部分。多数供应商提供关于正确设置 device 部分的文档。请注意,不同的 SAN 需要单独的 device 部分。

    如果要使用自动检测到的储存子系统(请参见第 17.2.1 节 “自动检测到支持多路径的储存阵列”),则不需要添加 device,因为在此情况下将会应用此设备的默认设置。

  3. 创建 blacklist 部分,在其中包含您计算机的所有非多路径设备。有关详细信息,请参见第 17.8 节 “将非多路径设备列入黑名单”

  4. 视需要在配置文件中添加更多部分。有关简要介绍,请参考第 17.6.2 节 “/etc/multipath.conf 文件中的部分”。运行 man 5 multipath.conf 时会有更多细节可用。

  5. 完成后,保存 /etc/multipath.conf 并按第 17.6.3 节 “校验 /etc/multipath.conf 文件中的多路径设置”中所述测试您的设置。

  6. 成功校验配置后,请按第 17.6.4 节 “应用 /etc/multipath.conf 文件更改以更新多路径映射”中所述应用配置。

17.6.2 /etc/multipath.conf 文件中的部分

/etc/multipath.conf 文件由下列部分构成。有关细节,请参见 man 5 multipath.conf

defaults

多路径 I/0 的常规默认设置。如果在相应的设备或多路径部分中未提供值,则会使用这些值。有关信息,请参阅第 17.7 节 “配置巡回检测、排队及故障回复的默认策略”

blacklist

列出不作为候选多路径而丢弃的设备名称。可以通过设备节点名称 (devnode)、设备 WWID (wwid) 或设备供应商或产品字符串 (device) 来识别设备。您通常可能会忽略非多路径设备,例如 hpsafdhdmddmsrscdstramrawloop。有关详细信息和示例,请参见第 17.8 节 “将非多路径设备列入黑名单”

blacklist_exceptions

列出即使包含在黑名单中仍视为候选多路径的设备的设备名称。可以通过设备节点名称 (devnode)、设备 WWID (wwid) 或设备供应商或产品字符串 (device) 来识别设备。您必须使用黑名单中使用的相同关键字指定例外的设备。例如,如果您在黑名单中对设备使用了关键字 devnode,则需同样使用关键字 devnode 在黑名单例外中排除一些设备。您无法使用 devnode 关键词将设备加入黑名单,也无法使用 wwid 关键词排除其中某些设备。有关详细信息和示例,请参见第 17.8 节 “将非多路径设备列入黑名单”

multipaths

指定单个多路径设备的设置。除不支持单个设置的设置外,这些值会重写配置文件的 defaultsdevices 部分中的其他指定值。

devices

指定单个储存控制器的设置。这些值会重写配置文件的 defaults 部分中指定的值。如果您使用默认情况下不受支持的储存阵列,则可以创建 devices 子部分,以指定该储存阵列的默认设置。如果关键字允许,则可以使用单个多路径设备的设置重写这些值。

有关信息,请参见以下内容:

17.6.3 校验 /etc/multipath.conf 文件中的多路径设置

无论您何时创建或修改 /etc/multipath.conf 文件,当保存该文件时都不会自动应用更改。您可以在更新多路径映射之前对该设置执行试运行,以校验多路径设置。

在服务器命令提示符处输入

sudo multipath -v2 -d

此命令会扫描设备,然后显示如果提交更改设置将产生的效果。该命令假设在您修改 /etc/multipath.conf 文件并执行试运行时,守护程序 multipathd 已使用旧的(或默认)多路径设置运行。如果更改可接受,请继续下一步。

其输出类似于如下内容:

26353900f02796769
[size=127 GB]
[features="0"]
[hwhandler="1    emc"]

\_ round-robin 0 [first]
  \_ 1:0:1:2 sdav 66:240  [ready ]
  \_ 0:0:1:2 sdr  65:16   [ready ]

\_ round-robin 0
  \_ 1:0:0:2 sdag 66:0    [ready ]
  \_ 0:0:0:2 sdc   8:32   [ready ]

路径可分为多个优先级组。一次只有一个优先级组是活动的。要为活动/活动配置建模,所有路径都要分入同一个组。要构建活动/不活动配置,不应同时活动的路径要放在几个不同的优先级组中。这在设备发现中通常自动发生。

输出显示在组里用来平衡 I/O 的顺序、日程安排策略以及每个优先级组的路径。对于每个路径,显示其物理地址 (host:bus:target:lun)、设备节点名称、主要:次要编号以及状态。

在试运行中使用详细级别 -v3,即可查看所有检测到的路径、多路径和设备映射。它同时显示 WWID 和设备节点列入黑名单的设备。

以下示例显示了有两个 Qlogic HBA 连接到 Xiotech Magnitude 3000 SAN 的 64 位 SLES 11 SP2 服务器的 -v3 输出。为了简化示例,省略了一些多重项。

tux > sudo multipath -v3 d
dm-22: device node name blacklisted
< content omitted >
loop7: device node name blacklisted
< content omitted >
md0: device node name blacklisted
< content omitted >
dm-0: device node name blacklisted
sdf: not found in pathvec
sdf: mask = 0x1f
sdf: dev_t = 8:80
sdf: size = 105005056
sdf: subsystem = scsi
sdf: vendor = XIOtech
sdf: product = Magnitude 3D
sdf: rev = 3.00
sdf: h:b:t:l = 1:0:0:2
sdf: tgt_node_name = 0x202100d0b2028da
sdf: serial = 000028DA0014
sdf: getuid= "/lib/udev/scsi_id --whitelisted --device=/dev/%n" (config file default)
sdf: uid = 200d0b2da28001400 (callout)
sdf: prio = const (config file default)
sdf: const prio = 1
[...]
ram15: device node name blacklisted
[...]
===== paths list =====
uuid              hcil    dev dev_t pri dm_st  chk_st  vend/prod/rev
200d0b2da28001400 1:0:0:2 sdf 8:80  1   [undef][undef] XIOtech,Magnitude 3D
200d0b2da28005400 1:0:0:1 sde 8:64  1   [undef][undef] XIOtech,Magnitude 3D
200d0b2da28004d00 1:0:0:0 sdd 8:48  1   [undef][undef] XIOtech,Magnitude 3D
200d0b2da28001400 0:0:0:2 sdc 8:32  1   [undef][undef] XIOtech,Magnitude 3D
200d0b2da28005400 0:0:0:1 sdb 8:16  1   [undef][undef] XIOtech,Magnitude 3D
200d0b2da28004d00 0:0:0:0 sda 8:0   1   [undef][undef] XIOtech,Magnitude 3D
params = 0 0 2 1 round-robin 0 1 1 8:80 1000 round-robin 0 1 1 8:32 1000
status = 2 0 0 0 2 1 A 0 1 0 8:80 A 0 E 0 1 0 8:32 A 0
sdf: mask = 0x4
sdf: path checker = directio (config file default)
directio: starting new request
directio: async io getevents returns 1 (errno=Success)
directio: io finished 4096/0
sdf: state = 2
[...]

17.6.4 应用 /etc/multipath.conf 文件更改以更新多路径映射

/etc/multipath.conf 文件的更改在 multipathd 运行时不会生效。进行更改后,保存并关闭该文件,然后执行以下操作以应用更改并更新多路径映射:

  1. 停止 multipathd 服务:

    sudo systemctl stop multipathd
  2. 通过输入以下命令,清除旧的多路径绑定

    sudo /sbin/multipath -F
  3. 通过输入以下命令,创建新的多路径绑定

    sudo /sbin/multipath -v2 -l
  4. 重启动 multipathd 服务:

    sudo systemctl start multipathd
  5. 在系统中运行 dracut -f 重新创建 initrd 映像,然后重引导以使更改生效。

17.6.5 生成 WWID

为了在不同的路径上识别设备,多路径使用每台设备的全球通用标识 (WWID)。如果两个设备路径的 WWID 相同,则假定它们代表同一台设备。除非有绝对的理由,否则建议不要更改生成 WWID 的方法。有关细节,请参见 man multipath.conf

17.7 配置巡回检测、排队及故障回复的默认策略

多路径 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        "/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"
  }

有关巡回检测、排队和故障回复策略设置的信息,请参见第 17.10 节 “配置路径故障转移策略和优先级”中的以下参数:

修改 /etc/multipath.conf 文件后,必须在系统上运行 dracut -f 重新创建 initrd,然后重启动服务器,更改才会生效。有关详细信息,请参见第 17.6.4 节 “应用 /etc/multipath.conf 文件更改以更新多路径映射”

17.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,然后重启动服务器,更改才会生效。有关详细信息,请参见第 17.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 仍建议使用正确配置了黑名单和黑名单例外的默认配置。

17.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 文件。

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

名称类型

描述

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 和用户友好的名称之间的关联。

别名

别名是由管理员为多路径设备提供的全局唯一名称。别名会覆盖 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 群集中的多路径:

有关详细信息,请参见第 17.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
           }
    }
    重要
    重要:WWWID 与 WWN 的比较

    /etc/multipath.conf 文件中定义设备别名时,请确保使用每个设备的 WWID(如 3600508e0000000009e6baa6f609e7908)而不是它的 WWN(以 0x 替换设备 ID 的第一个字符,如 0x600508e0000000009e6baa6f609e7908)。

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

  6. 修改 /etc/multipath.conf 文件后,必须在系统上运行 dracut -f 重新创建 initrd,然后重启动服务器,更改才会生效。有关详细信息,请参见第 17.6.4 节 “应用 /etc/multipath.conf 文件更改以更新多路径映射”

如果要直接使用整个 LUN(例如,如果您使用 SAN 功能对储存区分区),可为 mkfsfstab、应用程序等使用 /dev/disk/by-id/xxx 名称。已分区设备的设备名称后将追加 _part<n>,例如 /dev/disk/by-id/xxx_part1

/dev/disk/by-id 目录中,通过设备名 dm-uuid* 或别名(如果在 /etc/multipath.conf 文件中为其指派了别名)表示多路径映射设备。设备名 scsi-wwn- 表示设备的物理路径。

17.9.1 HA 群集中的多路径设备名称

请执行下列操作来确保多路径设备名称在所有设备中都相同:

  • 使用 UUID 和别名确保多路径设备名称在集群中的所有节点上保持一致。别名在所有节点上必须唯一。将 /etc/multipath.conf 文件从该节点复制到群集中所有其他节点的 /etc/ 目录下。

  • 当使用多路径映射设备的链接时,请确保在 /dev/disk/by-id 目录中指定 dm-uuid* 名称或别名,而不是设备的固定路径实例。有关信息,请参阅第 17.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,然后重启动节点,更改才会生效。有关细节,请参见第 17.6.4 节 “应用 /etc/multipath.conf 文件更改以更新多路径映射”。这适用于所有受影响的节点。

17.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,然后重启动服务器,更改才会生效。有关详细信息,请参见第 17.6.4 节 “应用 /etc/multipath.conf 文件更改以更新多路径映射”

17.10.1 配置路径故障转移策略

使用带 -p 选项的 multipath 命令来设置路径故障转移策略:

sudo multipath DEVICENAME -p POLICY

POLICY 替换为以下策略选项之一:

表 17.5︰ 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 位置获取的。

17.10.2 配置故障转移优先级

必须在 /etc/multipath.conf 文件中手动输入设备的故障转移优先级。/usr/share/doc/packages/multipath-tools/multipath.conf.annotated 文件中有所有设置和选项的示例。

17.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 设置以及优先级排序程序是否需要自变量。

prio_args 自变量

说明

weighted

需要格式为 [hbtl|devname|serial|wwn] REGEX1 PRIO1 REGEX2 PRIO2... 的值

hbtl
   Regex must be of SCSI H:B:T:L format, for example  1:0:.:.
   and *:0:0:., with a weight value, where H, B, T, L are the
   host, bus, target, and LUN  IDs for a device. For example:

   prio "weightedpath"
   prio_args "hbtl 1:.:.:. 2 4:.:.:. 4"

devname

Regex 为设备名称格式。例如:sda、sd.e

serial

Regex 为序列号格式。For example: .*J1FR.*324。请使用 multipathd show paths format %z 命令查询您的序列号。(multipathd show wildcards 会显示所有 format 通配符。)

path_latency

如果远程储存阵列和本地储存阵列使用的是相同类型的硬件,您可以使用 path_latency 调整这两个阵列之间的延迟。通常情况下,远程阵列上的延迟会更高。这需要格式为 io_num=20 base_num=10 的值对。

io_num
   The number of read IOs sent to the current path continuously, which
   are used to calculate the average path latency. Valid values are
   integers from  2 to 200.

base_num
   The base number value of logarithmic scale, used to partition
   different priority ranks. Valid values: Integer, 2 - 10. The maximum
   average latency value is 100s, the minimum is 1us. For example:
   If  base_num=10, the paths will be grouped in priority groups with
   path  latency <=1us, (1us, 10us], (10us, 100us], (100us, 1ms],
   (1ms, 10ms], (10ms, 100ms], (100ms, 1s], (1s, 10s], (10s, 100s],
   >100s

alua

如果为某个设备 (alua exclusive_pref_bit) 设置了 exclusive_pref_bit,那么设置了 preferred path 的路径将始终在其自身的路径组中。

多路径属性

多路径属性用于控制设备的多路径 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 日记中记录失败讯息(请参见第 15 章 “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

17.10.2.2 配置循环负载平衡

所有路径都是活动的。I/O 被配置为等候数秒或一定的 I/O 事务数,再移到序列中下一个打开的路径。

17.10.2.3 配置单路径故障转移

具有最高优先级(设置值为最低)的一个路径是活动的,可以进行通讯。其他路径可用于故障转移,但在发生故障转移前不会使用。

17.10.2.4 为循环负载平衡将 I/O 路径分组

具有相同优先级的多个路径分在活动的组中。当该组中的所有路径失败时,设备会故障转移到下一个最高优先级的组。该组中的所有路径以循环负载平衡的方式共享通讯负载。

17.10.3 报告目标路径组

使用 SCSI 报告目标端口组 (sg_rtpg(8)) 命令。有关信息,请参见 sg_rtpg(8) 的手册页。

17.11 为根设备配置多路径 I/O

SUSE Linux Enterprise Server 中的 /boot/root 可以使用并支持设备映射程序多路径 I/O (DM-MPIO)。此外,YaST 安装程序中的 YaST 分区程序支持在安装时启用多路径。

17.11.1 安装时启用多路径 I/O

要在多路径设备上安装操作系统,安装时必须运行多路径软件。multipathd 守护程序在系统安装过程中不会自动激活。您可以使用 YaST 分区程序中的配置多路径选项来启动它。

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

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

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

  3. 启动多路径。

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

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

17.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

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

      例如,输入

      mount /dev/disk/by-id/dm-uuid-mpath-3600a0b80000f4593000012ae4ab0ae65_part2 /mnt
    2. 输入以下命令将引导设备装入 /mnt/boot

      mount /dev/disk/by-id/UUID_part1 /mnt/boot

      例如,输入

      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. 单击确定继续安装重引导。

17.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. 重引导服务器。

17.11.3 禁用根设备上的 I/O 多路径

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

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

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

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

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

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

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

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

注意
注意:假设条件

以下说明假定软件 RAID 设备是 /dev/mapper/mpath0,这是内核可以识别的设备名。它假设您已按照第 17.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 设备

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

    mdadm --detail /dev/mapper/mpath0

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

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

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

  10. 通过检查 RAID 状态,校验软件 RAID 阵列在多路径设备之上正确工作。输入

    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 而不是设备节点路径访问设备。有关详细信息,请参见第 17.4.3 节 “对多路径设备使用 MDADM”

17.13 在多路径设备上使用 LVM2

使用多路径时,资源的所有路径都显示为设备树中的设备。默认情况下,LVM 会检查设备树中任何设备的顶层是否存在多路径设备。如果 LVM 在顶层找到了多路径设备,它会假设该设备是多路径组件,并忽略(底层)设备。这很可能是您期望的行为,但也可以在 /etc/lvm/lvm.conf 中更改。如果将 multipath_component_detection 设置为 0,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

17.14 最佳实践

17.14.1 在不重引导的情况下扫描新设备

如果系统已针对多路径进行配置并且稍后需要向 SAN 添加更多储存区,则可以使用脚本 rescan-scsi-bus.sh 扫描新设备。默认情况下,此脚本将扫描具有典型 LUN 范围的所有 HBA。该命令的一般语法如下所示:

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 日记中检查扫描进度(有关细节,请参见第 15 章 “journalctl:查询 systemd 日记)。在终端控制台提示符下,输入

    sudo journalctl -r

    此命令显示日志的最后 行。例如:

    tux > 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

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

17.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. 创建要作为安装点的目录,然后装入设备。

17.14.3 查看多路径 I/O 状态

查询多路径 I/O 状态会输出多路径映射的当前状态。

multipath -l 选项可显示从上次运行路径检查程序以来的当前路径状态。它不会运行路径检查程序。

multipath -ll 选项运行路径检查程序,更新路径信息,然后显示当前状态信息。此命令始终显示关于路径状态的最新信息。

tux > 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

  • 主要:次要编号

  • 设备的状态

17.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 失败,并且将该错误传播到调用的应用程序。

17.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

17.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) 后才会应用。

17.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"

17.14.8 对多路径设备使用 --noflush

在多路径设备上运行时,应始终使用 --noflush选项。

例如,在执行重新装载表的脚本中,应继续使用 --noflush 选项以确保任何未解决的 I/O 不会被刷新,因为您需要多路径拓扑信息。

load
resume --noflush

17.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 配置文件进行设置。有关信息,请参阅第 17.6 节 “创建或修改 /etc/multipath.conf 文件”

17.15 MPIO 查错

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

17.15.1 启用多路径时系统在引导过程中退出到紧急外壳

在引导过程中,系统退出到紧急外壳,并显示类似如下的讯息:

[  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
[   13.682489] floppy0: no floppy controllers found
[*     ] (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):

在下列情况下,可能会发生此问题:

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

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

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

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

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

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

    blacklist {
      wwid "WWWID"
    }

    用在上一步中获取的 ID 替换 WWWID。有关详细信息,请参见第 17.8 节 “将非多路径设备列入黑名单”

  3. CtrlD 退出紧急外壳并重引导服务器。

过程 17.2︰ 应急外壳:重构建 initrd

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

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

    dracut --force --add multipath

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

    dracut --force -o multipath
  2. CtrlD 退出紧急外壳并重引导服务器。

过程 17.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 中的相应项。

  4. CtrlD 退出紧急外壳并重引导服务器。

17.15.2 升级到多路径 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 设置。

17.15.3 升级到 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 守护程序,以使更改生效。

17.15.4 技术信息文档

有关 SUSE Linux Enterprise Server 上多路径 I/O 问题的查错信息,请参见 SUSE 知识库中的下列技术信息文档 (TID):