18 管理设备的多路径 I/O #
本章介绍如何使用多路径 I/O (MPIO) 来管理服务器和块存储设备间多路径的故障转移和路径负载平衡。
18.1 了解多路径 I/O #
多路径是服务器与跨多个物理路径(这些路径在服务器中的主机总线适配器和设备存储控制器之间)的同一物理或逻辑块存储设备通讯的能力,通常是在光纤通道 (FC) 或 iSCSI SAN 环境中。
Linux 的多路径提供连接容错,并可以跨多个活动连接提供负载平衡。当多路径已配置并且正在运行时,它会自动隔离和识别设备连接故障,并重路由 I/O 以改变连接。
多路径针对连接故障提供容错能力,但不针对存储设备本身的故障提供容错能力。针对后者的容错是通过镜像等互补技术实现的。
18.1.1 多路径术语 #
- 存储阵列
包含许多磁盘和多个结构连接(控制器)的硬件设备,为客户端提供 SAN 存储空间。存储阵列通常具备 RAID 和故障转移功能并支持多路径。一直以来,主动/被动(故障转移)和主动/主动(负载平衡)存储阵列的配置是有区别的。这些概念仍然存在,但它们不过是新式硬件所支持的路径组和访问状态概念的特殊情况。
- 主机、主机系统
运行 SUSE Linux Enterprise Server 的计算机,充当存储阵列的客户端系统。
- 多路径映射、多路径设备
一组路径设备。它代表存储阵列上的存储卷,被主机系统视为单个块设备。
- 路径设备
多路径映射的成员,通常是一个 SCSI 设备。每个路径设备代表主机计算机与实际存储卷之间的唯一连接,例如,来自 iSCSI 会话的逻辑单元。
- WWID
“全球标识符”
multipath-tools
使用 WWID 来确定应将哪些低级设备汇编到多路径映射中。WWID 必须与可配置的映射名称区分开(请参见第 18.12 节 “多路径设备名称和 WWID”)。- uevent、udev 事件
由内核发送到用户空间并由
udev
子系统处理的事件。在添加、去除设备或更改设备属性时会生成 uevent。- 设备映射程序
Linux 内核中用于创建虚拟块设备的框架。被映射设备的 I/O 操作将重定向到底层块设备。设备映射可以堆叠。设备映射程序实现自身的事件信令(也称为“设备映射程序事件”或“dm 事件”)。
- initramfs
初始 RAM 文件系统,由于历史原因,也称为“初始 RAM 磁盘”(initrd)(请参见第 16.1 节 “术语”)。
- ALUA
“非对称逻辑单元访问”,随 SCSI 标准 SCSI-3 引入的概念。存储卷可以通过多个端口访问,这些端口按不同状态(活动、待机等)的端口组进行组织。ALUA 定义了用于查询端口组及其状态以及更改端口组状态的 SCSI 命令。支持 SCSI 的现代存储阵列通常也支持 ALUA。
18.2 硬件支持 #
多路径驱动程序和工具可在 SUSE Linux Enterprise Server 支持的所有体系结构上使用。协议无关的通用驱动程序适用于市场上大多数支持多路径的存储硬件。某些存储阵列供应商提供自己的多路径管理工具。请查看供应商的硬件文档以确定需要哪些设置。
18.2.1 多路径实现:设备映射程序和 NVMe #
Linux 中的传统通用多路径实现使用设备映射程序框架。对于 SCSI 设备等大多数设备类型,设备映射程序多路径是唯一可用的实现。设备映射程序多路径具有很高的可配置性和灵活性。
Linux NVM Express (NVMe) 内核子系统在内核中本机实现多路径。这种实现可以降低 NVMe 设备(通常是延迟极低的快速设备)的计算开销。本机 NVMe 多路径不需要用户空间组件。从 SLE 15 开始,本机多路径一直是 NVMe 多路径设备的默认设置。有关细节,请参见第 17.2.4 节 “多路径”。
本章介绍设备映射程序多路径及其用户空间组件 multipath-tools
。multipath-tools
也可对本机 NVMe 多路径提供有限的支持(请参见第 18.13 节 “其他选项”)。
18.2.2 针对多路径的存储阵列自动检测 #
设备映射程序多路径是一种通用技术。多路径设备检测只要求内核检测低级(例如 SCSI)设备,并要求设备属性可靠地将多个低级设备标识为同一个卷的不同“路径”,而不是实际不同的设备。
multipath-tools
软件包按供应商和产品名称检测存储阵列。它提供了多种不同存储产品的内置配置默认值。请查阅您的存储阵列的硬件文档:某些供应商为 Linux 多路径配置提供了具体的建议。
如果您需要对存储阵列的内置配置应用更改,请参阅第 18.8 节 “多路径配置”。
multipath-tools
为许多存储阵列提供内置预设。给定存储产品存在此类预设并不意味着该存储产品的供应商已使用 dm-multipath
测试了该产品,也不意味着该供应商认可或支持对该产品使用 dm-multipath
。如有支持相关的问题,请始终查阅原始供应商文档。
18.2.3 需要特定硬件处理程序的存储阵列 #
对于某些存储阵列,需要运行特殊命令才能从一条路径故障转移到另一条路径,或需要使用非标准的错误处理方法。这些特殊命令和方法由 Linux 内核中的硬件处理程序实现。新式 SCSI 存储阵列支持 SCSI 标准中定义的“非对称逻辑单元访问”(ALUA) 硬件处理程序。除 ALUA 之外,SLE 内核还包含 Netapp E 系列 (RDAC)、Dell/EMC CLARiiON CX 阵列系列和 HP 传统阵列的硬件处理程序。
从 Linux 内核 4.4 开始,Linux 内核已自动检测到大多数阵列(包括所有支持 ALUA 的阵列)的硬件处理程序。唯一的要求是在探测相应设备时加载设备处理程序模块。multipath-tools
软件包会安装适当的配置文件来确保满足此要求。一旦设备处理程序关联到给定设备,就不能再更改。
18.3 规划多路径 #
当规划多路径 I/O 解决方案时,请使用本节中的准则。
18.3.1 先决条件 #
用于多路径设备的存储阵列必须支持多路径。有关详细信息,请访问 第 18.2 节 “硬件支持”。
仅当在服务器中的主机总线适配器和块存储设备的主机总线控制器之间存在多个物理路径时,才需要配置多路径。
对于某些存储阵列,供应商提供其自己的多路径软件以管理该阵列物理和逻辑设备的多路径。在这种情况下,您应遵循供应商关于为这些设备配置多路径的说明。
当在虚拟化环境中使用多路径时,多路径在主机服务器环境中控制。先配置设备的多路径,再将其指派给虚拟 Guest 计算机。
18.3.2 多路径安装类型 #
我们根据处理根设备的方式来区分安装类型。第 18.4 节 “在多路径系统上安装 SUSE Linux Enterprise Server”介绍了在安装期间和安装后如何创建不同的设置。
18.3.2.1 根文件系统位于多路径上 (SAN-boot) #
根文件系统位于多路径设备上。对于仅使用 SAN 存储空间的无磁盘服务器,一般都是如此。在此类系统上,需要支持多路径才能完成引导,并且必须在 initramfs 中启用多路径。
18.3.2.2 根文件系统位于本地磁盘上 #
根文件系统(可能还包括其他某些文件系统)位于本地存储设备中,例如,位于直接挂接的 SATA 磁盘或本地 RAID 上,但系统另外还会使用多路径 SAN 存储空间中的文件系统。可以通过三种不同的方式配置这种系统类型:
- 为本地磁盘设置多路径
所有块设备(包括本地磁盘)是多路径映射的一部分。根设备将显示为只有一条路径的降级多路径映射。如果在使用 YaST 进行初始系统安装期间启用了多路径,则会创建此配置。
- 将本地磁盘排除在多路径之外
在此配置中,多路径是在 initramfs 中启用的,但根设备明确排除在多路径之外(请参见第 18.11.1 节 “
multipath.conf
中的blacklist
部分”)。过程 18.1 “安装后对根磁盘禁用多路径”介绍了如何设置此配置。- 在 initramfs 中禁用多路径
如果在使用 YaST 进行初始系统安装期间未启用多路径,则会创建此设置。这种配置相当脆弱;请考虑改用其他选项之一。
18.3.3 磁盘管理任务 #
使用第三方 SAN 阵列管理工具或存储阵列的用户界面来创建逻辑设备,并将其分配到主机。确保在两端正确配置主机身份凭证。
可以在正在运行的主机中添加或去除卷,但要检测到相应更改,可能需要重新扫描 SCSI 目标并在主机上重新配置多路径。请参见 第 18.14.6 节 “在不重引导的情况下扫描新设备”。
在某些磁盘阵列上,存储阵列通过存储处理器管理流量。一个处理器是活动的,另一个是不活动的,直到发生故障。如果您连接到被动存储处理器,则可能找不到所需的 LUN,或者虽然找到了这些 LUN,但在尝试访问它们时会发生 I/O 错误。
如果一个磁盘阵列有多个存储处理器,请确保 SAN 交换机已连接到您要访问的 LUN 所属的主动存储处理器。
18.3.4 软件 RAID 和复杂的存储堆栈 #
多路径是在 SCSI 磁盘等基本存储设备的顶层设置的。在多层存储堆栈中,多路径始终位于底层。其他层(例如软件 RAID、逻辑卷管理、块设备加密等)排布在多路径之上。因此,对于具有多个 I/O 路径以及要用于软件 RAID 的每个设备,必须先将该设备配置为支持多路径,然后才能尝试创建软件 RAID 设备。
18.3.5 高可用性解决方案 #
群集存储资源的高可用性解决方案基于每个节点上的多路径服务运行。确保每个节点上的 /etc/multipath.conf
文件中的配置设置在整个群集中保持一致。
确保多路径设备在所有设备中的名称都相同。有关细节,请参考第 18.12 节 “多路径设备名称和 WWID”。
用于跨 LAN 镜像设备的分布式复制块设备 (DRBD) 高可用性解决方案在多路径的基础上运行。对于具有多个 I/O 路径并且您计划在 DRDB 解决方案中使用的每个设备,必须先将该设备配置为支持多路径,再配置 DRBD。
将多路径与依赖于使用共享存储实现屏蔽的群集软件(例如包含 sbd
的 pacemaker
)一起使用时必须格外小心。有关详细信息,请参见第 18.9.2 节 “群集服务器上的排队策略”。
18.4 在多路径系统上安装 SUSE Linux Enterprise Server #
在配有多路径硬件的系统上安装 SUSE Linux Enterprise Server 时,不需要指定特殊的安装参数。
18.4.1 在未连接多路径设备的情况下安装 #
您可能希望在本地磁盘上执行安装,而不先配置结构和存储装置,以便稍后再将多路径 SAN 设备添加到系统。在此情况下,安装将像在非多路径系统上一样进行。完成安装后,虽然会安装 multipath-tools
,但将禁用 systemd
服务 multipathd.service
。系统将如第 18.3.2.2 节 “根文件系统位于本地磁盘上”中的在 initramfs 中禁用多路径所述进行配置。添加 SAN 硬件前,您将需要启用并启动 multipathd.service
。我们建议在 /etc/multipath.conf
中为根设备创建 blacklist
项(请参见第 18.11.1 节 “multipath.conf
中的 blacklist
部分”)。
18.4.2 在连接了多路径设备的情况下安装 #
如果在安装时有多路径设备连接到系统,YaST 会检测到这些设备,并在进入分区阶段前显示弹出窗口询问您是否应启用多路径。
如果您在此提示窗口中选择“否”(不建议如此),安装将按照第 18.4.1 节 “在未连接多路径设备的情况下安装”所述进行。在分区阶段,请勿使用/编辑稍后将成为多路径映射一部分的设备。
如果您在多路径提示窗口中选择“是”,multipathd
将在安装期间运行。不会有设备添加到 /etc/multipath.conf
的 blacklist
部分,因此,在分区对话框中,所有 SCSI 和 DASD 设备(包括本地磁盘)都将显示为多路径设备。安装后,所有 SCSI 和 DASD 设备都将是多路径设备(如第 18.3.2.1 节 “根文件系统位于多路径上 (SAN-boot)”中所述)。
此过程假定您将系统安装在本地磁盘上,并在安装期间启用了多路径,以便根设备现在位于多路径上,但您更希望按照第 18.3.2.2 节 “根文件系统位于本地磁盘上”中的“将本地磁盘排除在多路径之外”所述设置系统。
检查您的系统,以获取本地根设备的
/dev/mapper/...
引用,并将它们替换为在设备不再是多路径映射时仍然有效的引用(请参见第 18.12.4 节 “引用多路径映射”)。如果以下命令未找到引用,您无需应用更改:>
sudo
grep -rl /dev/mapper/ /etc切换到
dracut
的by-uuid
永久设备策略(请参见第 18.7.4.2 节 “initramfs 中永久设备的名称”):>
echo 'persistent_policy="by-uuid"' | \ sudo tee /etc/dracut.conf.d/10-persistent-policy.conf确定根设备的 WWID:
>
multipathd show paths format "%i %d %w %s" 0:2:0:0 sda 3600605b009e7ed501f0e45370aaeb77f IBM,ServeRAID M5210 ...此命令会列显所有路径设备及其 WWID 和供应商/产品信息。您将能识别出根设备(此处为 ServeRAID 设备)并记下 WWID。
使用您刚刚确定的 WWID 在
/etc/multipath.conf
中创建一个黑名单项(请参见第 18.11.1 节 “multipath.conf
中的blacklist
部分”)。暂时先不要应用这些设置:blacklist { wwid 3600605b009e7ed501f0e45370aaeb77f }
重构建 initramfs:
>
sudo
dracut -f重引导。您的系统应使用非多路径根磁盘引导。
18.5 在多路径系统上更新 SLE #
联机更新系统时,您可以按第 5 章 “联机升级”中所述操作。
系统的脱机更新过程与第 18.4 节 “在多路径系统上安装 SUSE Linux Enterprise Server”所述的全新安装类似。系统没有 blacklist
,因此,如果用户选择启用多路径,根设备将显示为多路径设备,即使它通常不是多路径设备。当 dracut
在更新过程中构建 initramfs 时,它看到的存储堆栈与在引导后系统上看到的不同。请参见第 18.7.4.2 节 “initramfs 中永久设备的名称”和第 18.12.4 节 “引用多路径映射”。
18.6 多路径管理工具 #
SUSE Linux Enterprise Server 中的多路径支持以 Linux 内核的设备映射程序多路径模块及 multipath-tools
用户空间软件包为基础。
通用多路径功能由设备映射程序多路径 (DM-MP) 模块处理。有关细节,请参见第 18.6.1 节 “设备映射程序多路径模块”。
multipath-tools
和 kpartx
软件包提供了用于处理自动路径发现和分组的工具。这些工具包括:
multipathd
用于设置和监控多路径映射的守护程序,以及用来与守护程序进程通讯的命令行客户端。请参见 第 18.6.2 节 “
multipathd
守护程序”。multipath
用于执行多路径操作的命令行工具。请参见 第 18.6.3 节 “
multipath
命令”。kpartx
用于管理多路径设备上的“分区”的命令行工具。请参见 第 18.7.3 节 “多路径设备上的分区和
kpartx
”。mpathpersist
用于管理 SCSI 永久保留的命令行工具。请参见 第 18.6.4 节 “SCSI 永久保留和
mpathpersist
”。
18.6.1 设备映射程序多路径模块 #
设备映射程序多路径 (DM-MP) 模块 dm-multipath.ko
为 Linux 提供了通用多路径功能。DM-MPIO 是 SUSE Linux Enterprise Server 中适用于 SCSI 和 DASD 设备的首选多路径解决方案,它也适用于 NVMe 设备。
从 SUSE Linux Enterprise Server 15 开始,建议为 NVMe 使用本机 NVMe 多路径(请参见第 18.2.1 节 “多路径实现:设备映射程序和 NVMe”),并且默认会使用该功能。要禁用本机 NVMe 多路径并改用设备映射程序多路径(不建议如此),请使用内核参数 nvme-core.multipath=0
引导。
设备映射程序多路径模块可处理以下任务:
在活动路径组内的多个路径上分配负载。
注意到路径设备上的 I/O 错误,并将这些设备标记为发生故障,这样就不会向它们发送 I/O。
当活动路径组中的所有路径都失败时切换路径组。
如果所有路径都失败,则使多路径设备上的 I/O 失败或排队,具体取决于配置。
以下任务由 multipath-tools
软件包中的用户空间组件处理,而不是由设备映射程序多路径模块处理:
发现代表同一存储设备的不同路径的设备,并基于这些设备组合多路径映射。
将具有相似属性的路径设备收集到路径组。
主动监控路径设备是否出现故障或重新实例化。
监控路径设备的添加和去除。
设备映射程序多路径模块未提供易于使用的设置和配置用户界面。
有关 multipath-tools
软件包中各组件的细节,请参见第 18.6.2 节 “multipathd
守护程序”。
DM-MPIO 预防的是设备路径中的故障,而不是设备本身的故障,例如媒体错误。后一种错误必须通过其他方式来预防,例如复制。
18.6.2 multipathd
守护程序 #
multipathd
是新式 Linux 设备映射程序多路径设置中的最重要部分。此守护程序通常通过 systemd 服务 multipathd.service
来启动(请参见第 18.7.1 节 “启用、启动和停止多路径服务”)。
multipathd
可处理以下任务(其中一些任务依赖于配置):
启动时,检测路径设备并设置来自检测到的设备的多路径映射。
监控 uevent 和设备映射程序事件,根据需要在多路径映射中添加或去除路径映射,并启动故障转移或故障回复操作。
发现新的路径设备时立即设置新映射。
定期检查路径设备以检测故障,并测试有故障的路径,以便在它们恢复正常时重新启用它们。
如果所有路径都发生故障,
multipathd
将使映射失败,或者将映射设备切换到排队模式并让其排队给定的一段时间。处理路径状态更改,并根据需要切换路径组或将路径重新分组。
测试路径的“边际”状态,即导致路径状态在正常运行和非正常运行之间来回变化的不稳定结构状况。
处理路径设备的 SCSI 永久保留密钥(如果已配置)。请参见第 18.6.4 节 “SCSI 永久保留和
mpathpersist
”。
multipathd
还可充当命令行客户端,通过将交互式命令发送到正在运行的守护程序来处理这些命令。用于向守护程序发送命令的一般语法如下:
>
sudo
multipathd COMMAND
或
>
sudo
multipathd -k'COMMAND'
此守护程序还可在交互模式下运行,允许您发送多个后续命令:
>
sudo
multipathd -k
许多 multipathd
命令都有等效的 multipath
命令。例如,multipathd
show topology
的作用与 multipath
-ll
相同。两者的显著差别在于,multipathd 命令会查询正在运行的 multipathd
守护程序的内部状态,而 multipath 则是直接从内核和 I/O 操作获取信息。
如果多路径守护程序正在运行,我们建议使用 multipathd
命令对系统进行修改。否则,该守护程序可能会注意到配置更改并做出反应。在某些情况下,守护程序甚至可能尝试撤消已应用的更改。如果检测到正在运行的守护程序,multipath
会自动将某些可能带来风险的命令(例如销毁和刷新映射)委派给 multipathd
。
下面的列表介绍了常用的 multipathd
命令:
- show topology
显示当前映射拓扑和属性。请参见 第 18.14.2 节 “解读多路径 I/O 状态”。
- show paths
显示当前已知的路径设备。
- show paths format "FORMAT STRING"
使用格式字符串显示当前已知的路径设备。使用
show wildcards
可查看支持的格式说明符列表。- show maps
显示当前配置的映射设备。
- show maps format FORMAT STRING
使用格式字符串显示当前配置的映射设备。使用
show wildcards
可查看支持的格式说明符列表。- show config local
显示 multipathd 当前正在使用的配置。
- reconfigure
重新读取配置文件、重新扫描设备,并再次设置映射。这基本上等同于重启动
multipathd
。有几个选项在不重启动的情况下无法修改。手册页multipath.conf(5)
中提到了这些选项。reconfigure
命令只会重新加载以某种形式发生更改的映射设备。要强制重新加载每个映射设备,请使用reconfigure all
(从 SUSE Linux Enterprise Server 15 SP4 开始提供;在以前的版本上,reconfigure
可以重新加载每个映射)。- del map MAP DEVICE NAME
取消配置并删除给定的映射设备及其分区。MAP DEVICE NAME 可以是设备节点名称(例如
dm-0
)、WWID 或映射名称。如果该设备正在使用中,则该命令将会失败。- switchgroup map MAP DEVICE NAME group N
切换到索引(从 1 开始)为指定数字的路径组。对于具有手动故障回复的映射,这很有用(请参见第 18.9 节 “配置故障转移、排队及故障回复的策略”)。
可以使用其他命令来修改路径状态、启用或禁用队列等。有关详细信息,请参见multipathd(8)
。
18.6.3 multipath
命令 #
尽管多路径的大部分设置工作是自动完成并由 multipathd
处理,您仍可使用 multipath
来执行某些管理任务。下面提供了几个命令用法示例:
- multipath
检测路径设备并配置找到的所有多路径映射。
- multipath -d
类似于
multipath
,但不设置任何映射(“试运行”)。- multipath DEVICENAME
配置特定多路径设备。DEVICENAME 可以使用设备节点名称 (
/dev/sdb
) 或major:minor
格式的设备编号来指定成员路径设备。或者,它可以是多路径映射的 WWID 或名称。- multipath -f DEVICENAME
取消配置(“刷新”)某个多路径映射及其分区映射。如果该映射或其某个分区正在使用中,该命令将会失败。有关 DEVICENAME 的可能值,请参见上文。
- multipath -F
取消配置(“刷新”)所有多路径映射及其分区映射。如果这些映射正在使用中,该命令将会失败。
- multipath -ll
显示所有当前配置的多路径设备的状态和拓扑。请参见 第 18.14.2 节 “解读多路径 I/O 状态”。
- multipath -ll DEVICENAME
显示特定多路径设备的状态。有关 DEVICENAME 的可能值,请参见上文。
- multipath -t
显示内部硬件表和活动的多路径配置。有关配置参数的细节,请参见
multipath.conf(5)
。- multipath -T
功能与
multipath -t
命令类似,但仅显示与主机上检测到的硬件匹配的硬件项。
选项 -v
控制输出的详细程度。提供的值会覆盖 /etc/multipath.conf
中的 verbosity
选项。请参见 第 18.13 节 “其他选项”。
18.6.4 SCSI 永久保留和 mpathpersist
#
mpathpersist
实用程序用于管理设备映射程序多路径设备上的 SCSI 永久保留。永久保留用于仅限特定的 SCSI 发起端访问 SCSI 逻辑单元。在多路径配置中,必须对给定卷的所有 I_T 节点(路径)使用相同的保留密钥;否则,在一台路径设备上创建保留会导致其他路径发生 I/O 错误。
将此实用程序与 /etc/multipath.conf
文件中的 reservation_key
属性配合使用可以设置 SCSI 设备的永久保留。当且仅当设置了此选项时,multipathd
守护程序才会检查新发现的路径或重新启用的路径的永久保留。
您可以将该属性添加到 multipath.conf
的 defaults
或 multipaths
部分。例如:
multipaths { multipath { wwid 3600140508dbcf02acb448188d73ec97d alias yellow reservation_key 0x123abc } }
为适用于永久管理的所有 mpath 设备设置 reservation_key
参数后,使用 multipathd reconfigure
重新加载配置。
reservation_key file
”
如果在 multipath.conf
的 defaults
部分使用了特殊值 reservation_key file
,则可以使用 mpathpersist
以动态方式在文件 /etc/multipath/prkeys
中管理保留密钥。
这是处理多路径映射的永久保留的建议方法。从 SUSE Linux Enterprise Server 12 SP4 开始可以使用这种方法。
使用命令 mpathpersist
可查询和设置由 SCSI 设备组成的多路径映射的永久保留。有关细节,请参见手册页 mpathpersist(8)
。命令行选项与 sg3_utils
软件包中 sg_persist
的选项相同。sg_persist(8)
手册页详细解释了选项的语义。
在以下示例中,DEVICE 表示设备映射程序多路径设备,例如 /dev/mapper/mpatha
。以下命令连同长选项一起列出,以便于阅读。所有选项都可以替换为单个字母,例如 mpathpersist -oGS 123abc
DEVICE
。
- mpathpersist --in --read-keys DEVICE
读取设备的已注册保留密钥。
- mpathpersist --in --read-reservation DEVICE
显示设备的现有保留。
- mpathpersist --out --register --param-sark=123abc DEVICE
为设备注册一个保留密钥。这会为主机上的所有 I_T 节点(路径设备)添加保留密钥。
- mpathpersist --out --reserve --param-rk=123abc --prout-type=5 DEVICE
使用先前注册的密钥为设备创建类型 5(“独占写入 - 仅限注册者”)保留。
- mpathpersist --out --release --param-rk=123abc --prout-type=5 DEVICE
释放设备的类型 5 保留。
- mpathpersist --out --register-ignore --param-sark=0 DEVICE
从设备中删除现有的保留密钥。
18.7 针对多路径配置系统 #
18.7.1 启用、启动和停止多路径服务 #
要允许多路径服务在引导时启动,请运行以下命令:
>
sudo
systemctl enable multipathd
要在正在运行的系统中手动启动该服务,请输入:
>
sudo
systemctl start multipathd
要重启动该服务,请输入:
>
sudo
systemctl restart multipathd
在大多数情况下不需要重启动该服务。要简单地让 multipathd
重新加载其配置,请运行:
>
sudo
systemctl reload multipathd
要检查该服务的状态,请输入:
>
sudo
systemctl status multipathd
要停止当前会话中的多路径服务,请运行:
>
sudo
systemctl stop multipathd multipathd.socket
停止服务不会去除现有的多路径映射。要去除未使用的映射,请运行以下命令:
>
sudo
multipath -F
multipathd.service
保持为启用状态
我们强烈建议始终将 multipathd.service
保持为启用状态,并让其在配有多路径硬件的系统上运行。虽然该服务支持 systemd
的套接字激活机制,但我们不建议您依赖于该机制。如果禁用该服务,系统在引导期间将不会设置多路径映射。
如果您需要在出现上述警告的情况下禁用多路径,例如因为要部署第三方多路径软件,请执行以下操作。确保系统不会使用多路径设备的硬编码引用(请参见第 18.15.2 节 “了解设备引用问题”)。
要仅为单次系统引导禁用多路径,请使用内核参数 multipath=off
。这会影响已引导的系统和 initramfs(在这种情况下不需要重构建)。
要永久禁用 multipathd 服务,使其不会在今后引导系统时启动,请运行以下命令:
>
sudo
systemctl disable multipathd multipathd.socket>
sudo
dracut --force --omit multipath
(每当禁用或启用多路径服务后,都请重构建 initramfs
。请参阅第 18.7.4 节 “保持 initramfs 同步”。)
如果您想确保不设置多路径设备(即使是手动运行 multipath
时),请在重构建 initramfs 之前,将以下几行添加到 /etc/multipath.conf
的末尾:
blacklist { wwid .* }
18.7.2 针对多路径准备 SAN 设备 #
配置 SAN 设备的多路径 I/O 之前,请按需要执行以下操作准备 SAN 设备:
使用供应商工具配置 SAN 并设置区域。
使用供应商工具为存储阵列上的主机 LUN 配置访问权限。
如果 SUSE Linux Enterprise Server 未随附主机总线适配器 (HBA) 的驱动程序,请安装 HBA 供应商提供的 Linux 驱动程序。有关更多细节,请参见供应商的特定说明。
如果检测到多路径设备且已启用 multipathd.service
,系统应该会自动创建多路径映射。如果未自动创建,第 18.15.3 节 “紧急模式中的查错步骤” 会列出一些可用于检查该情况的外壳命令。如果 HBA 驱动程序未检测到这些 LUN,请检查 SAN 中的区域设置。特别是要检查 LUN 屏蔽是否是活动的,以及是否已将 LUN 正确指派给服务器。
如果 HBA 驱动程序可以检测到 LUN,但未创建相应的块设备,则可能需要使用额外的内核参数。请参见 https://www.suse.com/support/kb/doc.php?id=3955167 上 SUSE 知识库中的 TID 3955167: Troubleshooting SCSI (LUN) Scanning Issues。
18.7.3 多路径设备上的分区和 kpartx
#
多路径映射可以像其路径设备一样包含分区。分区表扫描以及为分区创建设备节点的操作是由 kpartx
工具在用户空间中执行的。kpartx
由 udev 规则自动调用;通常不需要手动运行它。有关引用多路径分区的方法,请参见第 18.12.4 节 “引用多路径映射”。
kpartx
可以在 /etc/multipath.conf
中使用 skip_kpartx
选项来禁止对选定的多路径映射调用 kpartx
。例如,在虚拟化主机上,这种做法可能很有用。
使用 YaST 或者 fdisk
或 parted
等工具,可以照常操作多路径设备上的分区表和分区。当分区工具退出时,系统将会记下应用于分区表的更改。如果这种方法不起作用(通常是因为设备繁忙),请尝试运行 multipathd
reconfigure
或重引导系统。
18.7.4 保持 initramfs 同步 #
对于所有块设备,是否以及如何使用多路径,初始 RAM 文件系统 (initramfs) 与已引导系统的行为务必要保持一致。应用多路径配置更改后重构建 initramfs。
如果在系统中启用了多路径,那么也需要在 initramfs
中启用多路径,反之亦然。此规则的唯一例外情况是第 18.3.2.2 节 “根文件系统位于本地磁盘上”中所述的选项 在 initramfs 中禁用多路径。
必须在已引导系统与 initramfs 之间同步多路径配置。因此,如果您更改 /etc/multipath.conf
、/etc/multipath/wwids
和 /etc/multipath/bindings
中的任一文件,或者其他与设备标识相关的配置文件或 udev 规则,请使用以下命令重构建 initramfs:
>
sudo
dracut -f
如果 initramfs
与系统不同步,系统将无法正常引导,启动过程可能会显示紧急外壳。有关如何避免或修复此类情况的说明,请参见第 18.15 节 “MPIO 查错”。
18.7.4.1 在 initramfs 中启用或禁用多路径 #
如果要在非一般情况下重构建 initramfs(例如,从救援系统重构建,或使用内核参数 multipath=off
引导后重构建),必须格外小心。当且仅当 dracut
在构建 initramfs 期间检测到根文件系统位于多路径设备上时,它才会自动在 initramfs 中包含多路径支持。在这种情况下,需要显式启用或禁用多路径。
要在 initramfs
中启用多路径支持,请运行以下命令:
>
sudo
dracut --force --add multipath
要在 initramfs
中禁用多路径支持,请运行以下命令:
>
sudo
dracut --force --omit multipath
18.7.4.2 initramfs 中永久设备的名称 #
dracut
生成 initramfs 时必须引用要永久挂载的磁盘和分区,以确保系统能够正常引导。当 dracut
检测到多路径设备时,出于此目的,它默认将使用 DM-MP 设备名称,比如
/dev/mapper/3600a098000aad73f00000a3f5a275dc8-part1
如果系统始终以多路径模式运行,这样将不会产生问题。但如果系统在不使用多路径的情况下启动(如第 18.7.4.1 节 “在 initramfs 中启用或禁用多路径”所述),那么使用这样的 initramfs 引导时将会失败,因为 /dev/mapper
设备将不存在。请参见第 18.12.4 节 “引用多路径映射”了解其他可能的问题情景和一些背景信息。
要防止此类情况发生,请使用 --persistent-policy
选项更改 dracut
的永久设备命名策略。我们建议设置 by-uuid
使用策略:
>
sudo
dracut --force --omit multipath --persistent-policy=by-uuid
18.8 多路径配置 #
内置的 multipath-tools
默认值适用于大多数设置。如需进行自定义,需要创建一个配置文件。主配置文件为 /etc/multipath.conf
。此外,还需考虑 /etc/multipath/conf.d/
中的文件。有关其他信息,请参见 第 18.8.2.1 节 “其他配置文件和优先级规则”。
一些存储供应商在其文档中发布了多路径选项的建议值。这些值通常代表供应商在其环境中测试后认为最适合相应存储产品的值。请参见 第 18.2.2 节 “针对多路径的存储阵列自动检测” 中的免责声明。
multipath-tools
内置了适用于许多存储阵列的默认值,这些默认值均源自供应商发布的建议。请运行 multipath -T
查看设备的当前设置,并将其与供应商的建议进行比较。
18.8.1 创建 /etc/multipath.conf
#
建议您创建只包含要更改的设置的最小 /etc/multipath.conf
。在很多情况下,您根本不需要创建 /etc/multipath.conf
。
如果您想要使用包含所有可能配置指令的配置模板,请运行:
multipath -T >/etc/multipath.conf
18.8.2 multipath.conf
语法 #
/etc/multipath.conf
文件使用由部分、子部分和选项/值对组成的层次结构。
空格会将令牌分隔开。多个连续的空格字符将压缩成一个空格,除非用引号将它们括住(参见下文)。
井号 (
#
) 和感叹号 (!
) 字符会使系统将行中的其余内容视为注释而予以忽略。部分和子部分以部分名称和同一行中的左花括号 (
{
) 开头,以独立一行中的右花括号 (}
) 结尾。选项和值编写在一行中。不支持续行。
选项和部分名称必须是关键字。
multipath.conf(5)
中阐述了允许的关键字。值可以用双引号 (
"
) 括住。如果值包含空格或注释字符,则必须用引号将其括住。值中的双引号字符由一对双引号 (""
) 表示。某些选项的值是 POSIX 正则表达式(请参见
regex(7)
)。它们区分大小写且位置不固定,因此,“bar
”会与“rhabarber
”匹配,但不会与“Barbie”匹配。
以下示例展示了相应语法:
section { subsection { option1 value option2 "complex value!" option3 "value with ""quoted"" word" } ! subsection end } # section end
18.8.2.1 其他配置文件和优先级规则 #
除了 /etc/multipath.conf
,工具会读取与 /etc/multipath.conf.d/*.conf
模式匹配的文件。其他文件遵循与 /etc/multipath.conf
相同的语法规则。部分和选项可以多次出现。如果在多个文件中或者在同一文件的多行中设置了同一个部分的同一个选项,则以最后一个值为准。在 multipath.conf
的各个部分之间,适用不同的优先级规则。请参见下文。
18.8.3 multipath.conf
中的各个部分 #
/etc/multipath.conf
文件由下列部分构成。某些选项可以出现在多个部分中。有关详细信息,请参见 multipath.conf(5)
。
- defaults
一般默认设置。
重要:覆盖内置设备属性内置硬件特定设备属性优先于
defaults
部分中的设置。因此,所需的更改必须在devices
或overrides
部分中进行。- blacklist
列出要忽略的设备。请参见第 18.11.1 节 “
multipath.conf
中的blacklist
部分”。- blacklist_exceptions
列出要进行多路径处理的设备,即使它们与黑名单匹配。请参见第 18.11.1 节 “
multipath.conf
中的blacklist
部分”。- devices
特定于存储控制器的设置。此部分是
device
子部分的集合。此部分中的值会覆盖defaults
部分中相同选项的值以及multipath-tools
的内置设置。devices
部分中的device
项将与使用正则表达式的设备的供应商和产品进行匹配。这些项将“合并”,为设备设置匹配部分中的所有选项。如果在多个匹配device
部分中设置了相同的选项,则以最后一个设备项为准,即使它不如之前的项那么“符合情况”。此规则还适用于匹配项在不同配置文件中的情况(请参见第 18.8.2.1 节 “其他配置文件和优先级规则”)。在以下示例中,设备SOMECORP STORAGE
将使用fast_io_fail_tmo 15
。devices { device { vendor SOMECORP product STOR fast_io_fail_tmo 10 } device { vendor SOMECORP product .* fast_io_fail_tmo 15 } }
- multipaths
单个多路径设备的设置。此部分是
multipath
子部分的列表。值会覆盖defaults
和devices
部分。- overrides
覆盖所有其他部分中的值的设置。
18.8.4 应用 multipath.conf
修改 #
要应用配置更改,请运行:
>
sudo
multipathd reconfigure
请不要忘记与 initramfs 中的配置同步。请参见 第 18.7.4 节 “保持 initramfs 同步”。
multipath
应用设置
当 multipath
正在运行时,请不要使用 multipathd
命令应用新设置。否则可能导致设置不一致甚至损坏。
可以在应用已修改的设置之前先对其进行测试,方法是运行:
>
sudo
multipath -d -v2
此命令会显示要使用建议的拓扑创建的新映射,但不显示是否会去除/刷新映射。要获得更多信息,请以更高的详细程度运行:
>
sudo
multipath -d -v3 2>&1 | less
18.9 配置故障转移、排队及故障回复的策略 #
多路径 I/O 旨在于存储系统与服务器之间提供连接容错。所需的默认行为取决于服务器是独立服务器还是高可用性群集中的一个节点。
本节介绍用于实现容错的最重要 multipath-tools
配置参数。
- polling_interval
对路径设备进行健康检查的时间间隔(以秒为单位)。默认值为 5 秒。将按此时间间隔检查有故障的设备。对于健康状况良好的设备,最多可将时间间隔增加到
max_polling_interval
秒。- detect_checker
如果此选项设置为
yes
(默认值,建议采用),multipathd
会自动检测最佳路径检查算法。- path_checker
用于检查路径状态的算法。如果您需要启用该检查程序,请按如下所示禁用
detect_checker
:defaults { detect_checker no }
下面仅列出了最重要的算法。有关完整的算法列表,请参见
multipath.conf(5)
。- tur
发送 TEST UNIT READY 命令。对于支持 ALUA 的 SCSI 设备,这是默认设置。
- directio
使用异步 I/O (aio) 读取设备扇区。
- rdac
适用于 NetAPP E 系列和类似阵列的设备特定检查程序。
- none
不执行路径检查。
- checker_timeout
如果设备在给定时间内未响应路径检查程序命令,则将其视为发生故障。默认值是设备内核的 SCSI 命令超时(通常为 30 秒)。
- fast_io_fail_tmo
如果在 SCSI 传输层上检测到错误(例如在光纤通道远程端口上),内核传输层将在传输恢复前等待此选项所指定的时长(以秒为单位)。这段时间过后,路径设备将会失败并显示为“传输脱机”状态。这对多路径非常有用,因为它允许对经常发生的一类错误快速进行路径故障转移。该值必须与在相应结构中进行重新配置所需的典型时间间隔相匹配。默认值 5 秒对光纤通道而言很合适。iSCSI 等其他传输可能需要更长的超时。
- dev_loss_tmo
如果 SCSI 传输端点(例如光纤通道远程端口)再也无法访问,内核会在端口再次出现前等待此选项所指定的时长(以秒为单位),这段时间过后,内核会永久去除 SCSI 设备节点。去除设备节点是一项复杂的操作,容易产生竞态条件或死锁,最好避免此类操作。因此,我们建议将此选项设置为较高的值。支持特殊值
infinity
。默认值为 10 分钟。为避免死锁状态,multipathd
会确保 I/O 排队(请参见no_path_retry
)在dev_loss_tmo
到期之前停止。- no_path_retry
决定当给定多路径映射的所有路径都发生故障时会发生什么情况。可能的值有:
- fail
使多路径映射上的 I/O 失败。这会导致上层(例如挂载的文件系统)发生 I/O 错误。受影响的文件系统(也可能是整个主机)将进入降级模式。
- queue
多路径映射上的 I/O 在设备映射程序层中排队,并在路径设备重新可用时发送到设备。这是避免丢失数据的最安全选项,但如果路径设备长时间不能恢复,使用该值可能会造成负面影响。从设备读取数据的进程将会挂起并处于不间断休眠 (
D
) 状态。排队的数据会占用内存,而被占用的内存不可供进程使用。最终,内存将会耗尽。- N
N 是一个正整数。使映射设备保持排队模式 N 个轮询间隔。在这段时间消逝后,
multipathd
将使映射设备失败。如果polling_interval
为 5 秒且no_path_retry
为 6,则multipathd
会将 I/O 排队大约 6 * 5 = 30 秒,然后使映射设备上的 I/O 失败。
- flush_on_last_del
如果设置为
yes
并且映射的所有路径设备均已删除(与只是失败不同),系统在去除映射前,会使映射内的所有 I/O 失败。默认值为no
。- deferred_remove
如果设置为
yes
并且映射的所有路径设备均已删除,系统会等待占有者关闭映射设备的文件描述符,之后才刷新并去除映射设备。如果路径在最后一个占有者关闭映射之前重新出现,则延迟去除操作将会取消。默认值为no
。- failback
如果不活动路径组中发生故障的路径设备恢复,
multipathd
会重新评估所有路径组的路径组优先级(请参见第 18.10 节 “配置路径分组和优先级”)。重新评估后,优先级最高的路径组有可能会成为当前不活动路径组之一。此参数决定在此状况下将发生什么情况。重要:遵循供应商的建议最佳故障回复策略取决于存储设备的属性。因此,强烈建议联系存储装置供应商来确定
failback
设置。- manual
除非管理员运行
multipathd switchgroup
,否则什么也不会发生(请参见第 18.6.2 节 “multipathd
守护程序”)。- immediate
立即激活优先级最高的路径组。这通常可以提升性能,特别是在独立的服务器上,但它不应该用于阵列,因为在阵列上改变路径组代价更高。
- followover
与
immediate
相似,但仅在刚变为活动状态的路径是其路径组中唯一一个健康状况良好的路径时,才执行故障回复。此选项对群集配置很有用,可以防止某个节点在另一个节点先请求了故障转移时自动故障回复。- N
N 是一个正整数。在激活优先级最高的路径组之前,等待 N 个轮询间隔。如果在此期间内优先级再次变化,则等待期重新开始。
- eh_deadline
设置一个近似值,以指定在设备无响应,SCSI 命令超时且无错误响应的情况下,处理 SCSI 错误所花费时间的上限(以秒为单位)。截止期限过后,内核将执行一次完整的 HBA 重置。
修改 /etc/multipath.conf
文件后,应用您的设置(请参见第 18.8.4 节 “应用 multipath.conf
修改”)。
18.9.1 独立服务器上的排队策略 #
如果为独立服务器配置了多路径 I/O,设置为 queue
值的 no_path_retry
可使服务器操作系统在尽可能长的时间内不收到 I/O 错误。它会使消息排队,直至发生多路径故障转移。如果不需要“无限期”排队(见上文),请选择一个您认为足够高的数值,以便存储路径能在正常情况下恢复(见上文)。
18.9.2 群集服务器上的排队策略 #
在为高可用性群集中的节点配置多路径 I/O 时,您需要让多路径报告 I/O 故障,以触发资源故障转移而不是等待多路径故障转移被解决。在群集环境中,您必须修改 no_path_retry
设置,以确保当与存储系统断开连接时,群集节点会收到与群集验证进程相关的 I/O 错误(建议为 Heartbeat 容错的 50%)。此外,您还希望将多路径 failback
设为 manual
或 followover
,以免因路径失败而造成资源的乒乓效应。
18.10 配置路径分组和优先级 #
多路径映射中的路径设备会划分到路径组中,也称为优先级组。任何时间只有一个路径组接收 I/O。multipathd
可向路径组指派优先级。在包含活动路径的路径组中,根据为映射配置的故障回复策略激活优先级最高的组(请参见第 18.9 节 “配置故障转移、排队及故障回复的策略”)。路径组的优先级是路径组中活动路径设备的优先级的平均值。路径设备的优先级是根据设备属性计算出的整数值(请参见下方 prio
选项的说明)。
本节介绍了与确定优先级和进行路径分组相关的 multipath.conf
配置参数。
- path_grouping_policy
指定用于将路径合并成组的方法。此处仅列出最重要的策略;有关其他不常使用的值,请参见
multipath.conf(5)
。- failover
每个路径组一个路径。对于传统的“主动/被动”存储阵列,此设置很有用。
- multibus
一个路径组中的所有路径。对于传统“主动/主动”阵列,此设置很有用。
- group_by_prio
将路径优先级相同的路径设备分为一组。对于支持非对称访问状态(例如 ALUA)的新式阵列,此选项很有用。
multipathd
设置的优先级组与alua
或sysfs
优先级算法结合使用时,将与存储阵列通过 ALUA 相关 SCSI 命令报告的主要目标端口组相匹配。
使用相同的策略名称时,可以通过以下命令临时更改多路径映射的路径分组策略:
>
sudo
multipath -p POLICY_NAME MAP_NAME- marginal_pathgroups
如果设置为
on
或fpin
,“边际”路径设备存储在单独的路径组中。这与使用中的路径分组算法无关。请参见 第 18.13.1 节 “处理不可靠(“边际”)的路径设备”。- detect_prio
如果设置为
yes
(默认值,建议采用),multipathd
会自动检测用于为存储设备设置优先级的最佳算法,并忽略prio
设置。在实际情况中,这意味着在检测到 ALUA 支持时使用sysfs
优先级算法。- prio
确定获取路径设备优先级的方法。如果您覆盖此设置,请按如下方式禁用
detect_prio
:defaults { detect_prio no }
下面仅列出了最重要的方法。系统还提供了其他几种方法,主要用于支持旧式硬件。有关完整的列表,请参见
multipath.conf(5)
。- alua
使用 SCSI-3 ALUA 访问状态获取路径优先级值。可选
exclusive_pref_bit
参数可用于更改设置了 ALUA“首选主要目标端口组”(PREF) 位的设备的行为:prio alua prio_args exclusive_pref_bit
如果设置了此选项,“首选”路径将获得优先于其他活动/优化路径的优先级。否则,将会为所有活动/优化路径指派相同的优先级。
- sysfs
与
alua
类似,但它不向设备发送 SCSI 命令,而是从sysfs
获取访问状态。这会使 I/O 负载比alua
要少,但并不适用于所有支持 ALUA 的存储阵列。- const
对所有路径使用常量值。
- path_latency
测量路径设备上的 I/O 延迟(从 I/O 提交到完成所花的时间),并为低延迟设备分配较高的优先级。有关详细信息,请参见
multipath.conf(5)
。该算法仍处于实验阶段。- weightedpath
根据名称、序列号、Host:Bus:Target:Lun ID (HBTL) 或光纤通道 WWN 为路径指派优先级。优先级值不会随时间推移而发生变化。该方法需要
prio_args
参数,有关细节,请参见multipath.conf(5)
。例如:prio weightedpath prio_args "hbtl 2:.*:.*:.* 10 hbtl 3:.*:.*:.* 20 hbtl .* 1"
这会为 SCSI 主机 3 上的设备分配比 SCSI 主机 2 上的设备更高的优先级,并为所有其他设备分配较低的优先级。
- prio_args
一些
prio
算法需要额外的参数。这些参数在此选项中指定,其语法取决于算法。请参见上文。- hardware_handler
内核在切换路径组时用来激活路径设备的内核模块的名称。此选项对最新的内核没有影响,因为系统会自动检测硬件处理程序。请参见 第 18.2.3 节 “需要特定硬件处理程序的存储阵列”。
- path_selector
用于在活动路径组的路径之间平衡负载的内核模块名称。可用的选项取决于内核配置。由于历史原因,在
multipath.conf
中,名称必须一律用引号括住并后跟一个“0”,如下所示:path_selector "queue-length 0"
- service-time
估算在所有路径上完成待处理 I/O 所需的时间,并选择值最低的路径。此为默认设置。
- historical-service-time
根据历史服务时间(系统保留的不断变化的平均值)和未完成请求的数量估算未来的服务时间。估算在所有路径上完成待处理 I/O 所需的时间,并选择值最低的路径。
- queue-length
选择当前待处理 I/O 请求数量最少的路径。
- round-robin
采用循环方式切换路径。可以使用选项
rr_min_io_rq
和rr_weight
调整在切换到下一个路径之前提交到当前路径的请求数量。- io-affinity
此路径选择器目前不适用于
multipath-tools
。
修改 /etc/multipath.conf
文件后,应用您的设置(请参见第 18.8.4 节 “应用 multipath.conf
修改”)。
18.11 选择要用于多路径的设备 #
在具有多路径设备的系统上,您可能希望避免在某些设备(通常是本地磁盘)上设置多路径映射。multipath-tools
提供了多种方法来配置应视为多路径设备的设备。
一般而言,在本地磁盘的基础上仅使用单个设备设置“降级”多路径映射,则不会出现问题。系统可正常工作,且不需要进行额外的配置。然而,一些管理员认为这会造成混乱,或者普遍反对这种不必要的多路径。另外,多路径层也会造成轻微的性能开销。另请参见第 18.3.2.2 节 “根文件系统位于本地磁盘上”。
修改 /etc/multipath.conf
文件后,应用您的设置(请参见第 18.8.4 节 “应用 multipath.conf
修改”)。
18.11.1 multipath.conf
中的 blacklist
部分 #
/etc/multipath.conf
文件可能包含 blacklist
部分,其中会列出 multipathd
和 multipath
应该忽略的所有设备。以下示例展示了可用于排除设备的方法:
blacklist { wwid 3600605b009e7ed501f0e45370aaeb77f 1 device { 2 vendor ATA product .* } protocol scsi:sas 3 property SCSI_IDENT_LUN_T10 4 devnode "!^dasd[a-z]*" 5 }
| |
此 | |
通过
从 SLES 15 SP1 和 SLES 12 SP5 开始支持此格式。 | |
此 | |
建议仅对使用正则表达式的设备类采用通过
该示例展示了仅在 |
默认情况下,multipath-tools
会忽略除 SCSI、DASD 或 NVMe 以外的所有设备。从技术上讲,内置的 devnode 排除列表就是下面这个被否定的正则表达式:
devnode !^(sd[a-z]|dasd[a-z]|nvme[0-9])
18.11.2 multipath.conf
中的 blacklist exceptions
部分 #
有时,需要仅将非常具体的设备配置为用于多路径。在这种情况下,需默认排除设备,并将应成为多路径映射一部分的设备定义为例外。blacklist_exceptions
部分就用于实现此目的。该部分的典型用法如下方示例所示,该示例排除了所有存储设备,产品字符串为“NETAPP”的存储设备除外:
blacklist { wwid .* } blacklist_exceptions { device { vendor ^NETAPP$ product .* } }
blacklist_exceptions
部分支持上文所述适用于 blacklist
部分的所有方法。
blacklist_exceptions
中的 property
指令是强制性的,因为每个设备必须至少具有一个“允许的”udev 属性,才能被视为多路径的路径设备(属性的值无关紧要)。property
的内置默认值为
property (SCSI_IDENT_|ID_WWN)
系统只会包含至少具有一个与此正则表达式匹配的 udev 属性的设备。
18.11.3 影响选择设备的其他选项 #
除了 blacklist
选项外,/etc/multipath.conf
中的数个其他设置也会影响哪些设备可视为多路径设备。
- find_multipaths
此选项控制首次遇到未排除的设备时
multipath
和multipathd
的行为。可能的值有:- greedy
将
/etc/multipath.conf
中的blacklist
未排除的所有设备视为多路径设备。这是 SUSE Linux Enterprise 的默认设置。如果此设置处于活动状态,则防止将设备添加到多路径映射的唯一方法是将它们设置为排除。- strict
排除所有设备,即便它不在
/etc/multipath.conf
的blacklist
部分中,除非设备的 WWID 列于/etc/multipath/wwids
文件中。用户需要手动维护 WWID 文件(请参见下面的注释)。- yes
如果设备满足
strict
的条件,或系统中至少存在一个拥有相同 WWID 的其他设备,则会将设备视为多路径设备。- smart
首次遇到新的 WWID 时,会将其暂时标记为多路径设备。
multipathd
会等待一段时间,看看是否会有拥有相同 WWID 的其他路径出现。如果这类路径出现,则会照常设置多路径映射。如果没有出现,当等待超时后,这个设备就会作为非多路径设备释放到系统中。使用选项find_multipaths_timeout
可以配置该超时。此选项依赖于
systemd
功能,这些功能仅在 SUSE Linux Enterprise Server 15 上提供。
注意:维护/etc/multipath/wwids
multipath-tools
会在/etc/multipath/wwids
文件(“WWID 文件”)中保留之前所设置多路径映射的记录。WWID 列于此文件中的设备会被视为多路径设备。根据find_multipaths
的任何值(greedy
除外)选择多路径设备时,该文件都必不可少。如果
find_multipaths
设置为yes
或smart
,multipathd
会在设置新映射后向/etc/multipath/wwids
添加 WWID,以便日后能够更快地检测到这些映射。可以手动修改 WWID 文件:
>
sudo
multipath -a 3600a098000aad1e3000064e45f2c2355 1>
sudo
multipath -w /dev/sdf 2在
strict
模式下,这是添加新多路径设备的唯一方法。修改 WWID 文件后,运行multipathd reconfigure
以应用更改。我们建议在应用对 WWID 文件的更改后重构建 initramfs(请参见第 18.7.4 节 “保持 initramfs 同步”)。- allow_usb_devices
如果此选项设置为
yes
,则会考虑将 USB 存储设备用于多路径。默认值为no
。
18.12 多路径设备名称和 WWID #
multipathd
和 multipath
会在内部使用 WWID 来识别设备。WWID 还会用作默认的映射名称。为了方便起见,multipath-tools
支持为多路径设备指派更简单、更容易记住的名称。
18.12.1 WWID 和设备标识 #
多路径操作必须能够可靠地检测到代表同一存储卷的各路径的设备。为实现此目的,multipath-tools
使用了设备的全球通用标识 (WWID)(有时也称为通用唯一 ID (UUID) 或唯一 ID(UID — 请勿与“用户 ID”混淆))。映射设备的 WWID 一律与其路径设备的 WWID 相同。
默认情况下,系统会从 sysfs 文件系统读取设备属性或使用特定的 I/O 命令,根据设备的 udev 属性(在 udev 规则中确定)推断路径设备的 WWID。要查看设备的 udev 属性,请运行以下命令:
>
udevadm info /dev/sdx
multipath-tools
用于派生 WWID 的 udev 属性如下:
对于 SCSI 设备,使用
ID_SERIAL
(请勿将此与设备的“序列号”混淆)对于 DASD 设备,使用
ID_UID
对于 NVMe 设备,使用
ID_WWN
无法更改正在使用的多路径映射的 WWID。如果所映射路径设备的 WWID 因配置更改而发生改变,则需要销毁该映射,并使用新的 WWID 设置新映射。如果旧映射正被使用,则无法执行此操作。在极端情况下,WWID 更改可能会导致数据损坏。因此,必须严格避免应用会导致映射 WWID 更改的配置更改。
在 /etc/multipath.conf
中启用 uid_attrs
选项可以做到这一点,请参见第 18.13 节 “其他选项”。
18.12.2 为多路径映射设置别名 #
可以在 /etc/multipath.conf
的 multipaths
部分中设置任意映射名称,如下如下:
multipaths { multipath { wwid 3600a098000aad1e3000064e45f2c2355 alias postgres } }
别名较为易懂,但需要将它们分别指派给每个映射,这在大型系统上可能很麻烦。
18.12.3 使用自动生成的用户友好名称 #
multipath-tools
还支持自动生成的别名,即所谓的“用户友好名称”。别名的命名方案遵循以下模式:mpathINDEX,其中 INDEX 为小写字母(以 a
开头)。因此,第一个自动生成的别名为 mpatha
,下一个为 mpathb
、然后是 mpathc
,直至 mpathz
。之后是 mpathaa
、mpathab
等,以此类推。
映射名称只有在永久存在时才有用。multipath-tools
会在 /etc/multipath/bindings
文件(“bindings 文件”)中记录指派的名称。创建新映射时,首先会在此文件中查找 WWID。如果未找到,则会为映射指派可用性最低的用户友好名称。
第 18.12.2 节 “为多路径映射设置别名”中所述的明确别名优先于用户友好名称。
/etc/multipath.conf
中的以下选项会影响用户友好名称:
- user_friendly_names
如果设置为
yes
,则会分配并使用用户友好名称。否则,将使用 WWID 作为映射名称,除非配置了别名。- alias_prefix
用于创建用户友好名称的前缀,默认为
mpath
。
对于群集操作,设备名称必须在群集的所有节点间都相同。multipath-tools
配置必须在节点之间保持同步。如果使用 user_friendly_names
,multipathd
可以在运行时修改 /etc/multipath/bindings
文件。此类修改必须动态复制到所有节点。这同样适用于 /etc/multipath/wwids
(请参见第 18.11.3 节 “影响选择设备的其他选项”)。
可以在运行时更改映射名称。使用本节中所述的任何方法以及运行 multipathd
reconfigure
都可更改映射名称,而不干扰系统运行。
18.12.4 引用多路径映射 #
从技术上讲,多路径映射是设备映射程序设备,其名称一般采用 /dev/dm-n
格式,其中 n 为整数。这些名称不是永久存在的。切勿使用它们引用多路径映射。udev
创建指向这些设备的各种符号链接,这些链接更适合作为永久引用。这些链接的不同之处在于它们不会随特定配置的更改而改变。下面的典型示例展示了所有指向同一设备的各种符号链接。
/dev/disk/by-id/dm-name-mpathb1 -> ../../dm-1 /dev/disk/by-id/dm-uuid-mpath-3600a098000aad73f00000a3f5a275dc82 -> ../../dm-1 /dev/disk/by-id/scsi-3600a098000aad73f00000a3f5a275dc83 -> ../../dm-1 /dev/disk/by-id/wwn-0x600a098000aad73f00000a3f5a275dc84 -> ../../dm-1 /dev/mapper/mpathb5 -> ../dm-1
这两种链接使用映射名称来引用映射。因此,如果映射名称更改(例如,如果您启用或禁用用户友好名称),链接也会更改。 | |
此链接使用设备映射程序 UUID,即
要确保仅引用多路径设备,最好采用设备映射程序 UUID。例如, filter = [ "a|/dev/disk/by-id/dm-uuid-mpath-.*|", "r|.*|" ] | |
这些链接通常指向路径设备。多路径设备会取代这些链接,因为该设备具有更高的 udev 链接优先级(请参见 |
对于 kpartx
工具创建的多路径映射上的分区,存在类似的符号链接,它们源自父设备名称或 WWID 和分区号:
/dev/disk/by-id/dm-name-mpatha-part2 -> ../../dm-5 /dev/disk/by-id/dm-uuid-part2-mpath-3600a098000aad1e300000b4b5a275d45 -> ../../dm-5 /dev/disk/by-id/scsi-3600a098000aad1e300000b4b5a275d45-part2 -> ../../dm-5 /dev/disk/by-id/wwn-0x600a098000aad1e300000b4b5a275d45-part2 -> ../../dm-5 /dev/disk/by-partuuid/1c2f70e0-fb91-49f5-8260-38eacaf7992b -> ../../dm-5 /dev/disk/by-uuid/f67c49e9-3cf2-4bb7-8991-63568cb840a4 -> ../../dm-5 /dev/mapper/mpatha-part2 -> ../dm-5
请注意,分区通常也有 by-uuid
链接,该链接不引用设备本身,而是引用设备包含的文件系统。一般最好使用这些链接。即使将文件系统复制到不同的设备或分区,这些链接也不会改变。
当 dracut
构建 initramfs 时,会在 initramfs 中创建设备的硬编码引用,并默认使用 /dev/mapper/$MAP_NAME
引用。如果 initramfs 中使用的映射名称与构建 initramfs 时使用的名称不匹配,在引导期间将找不到这些硬编码引用,导致引导失败。这种情况通常不会发生,因为 dracut
会将所有多路径配置文件添加到 initramfs 中。但如果 initramfs 是从不同的环境(例如,在救援系统中或在脱机更新期间)构建的,就会出现问题。为防止这类引导失败,请更改 dracut
的 persistent_policy
设置(如第 18.7.4.2 节 “initramfs 中永久设备的名称”所述)。
18.13 其他选项 #
本节列出了一些到目前为止尚未提及的有用 multipath.conf
选项。有关完整列表,请参见 multipath.conf(5)
。
- verbosity
控制
multipath
和multipathd
的日志详细程度。命令行选项-v
可覆盖这两个命令的此设置。值可以介于 0(仅限致命错误)和 4(详细日志记录)之间。默认值为 2。- uid_attrs
此选项可实现对 udev 事件处理的优化,即所谓的“uevent 合并”。它在数百个路径设备可能同时发生故障或重新出现的环境中非常有用。为了确保路径 WWID 不会更改(请参见第 18.12.1 节 “WWID 和设备标识”),值应该完全按下方所示设置:
defaults { uid_attrs "sd:ID_SERIAL dasd:ID_UID nvme:ID_WWN" }
- skip_kpartx
如果针对多路径设备设置为
yes
(默认为no
),请勿在给定设备的基础上创建分区设备(请参见第 18.7.3 节 “多路径设备上的分区和kpartx
”)。可以用于虚拟机使用的多路径设备。以前的 SUSE Linux Enterprise Server 版本使用参数“features 1 no_partitions
”来实现同样的效果。- max_sectors_kb
限制在多路径映射的所有路径设备的单个 I/O 请求中发送的最大数据量。
- ghost_delay
在主动/被动阵列上,可能会发生被动路径(处于“ghost”状态)先于主动路径被探测到的情况。如果立即激活映射并发送 I/O,可能会导致花费很大代价才能激活路径。此参数指定在激活映射之前等待映射的活动路径出现的时间(以秒为单位)。默认值为
no
(不进行 ghost 延迟)。- recheck_wwid
如果设置为
yes
(默认为no
),则会在失败后再次检查已恢复路径的 WWID,并去除已改变的 WWID。这是防止数据损坏的安全措施。- enable_foreign
multipath-tools
为除设备映射程序多路径之外的其他多路径后端提供插件 API。API 支持使用multipath -ll
等标准命令来监控和显示有关多路径拓扑的信息。不支持修改拓扑。enable_foreign
的值是用于匹配外部库名称的正则表达式。默认值为 “NONE
”.SUSE Linux Enterprise Server 随附
nvme
插件,增加了本机 NVMe 多路径支持(请参见第 18.2.1 节 “多路径实现:设备映射程序和 NVMe”)。要启用nvme
插件,请设置defaults { enable_foreign nvme }
18.13.1 处理不可靠(“边际”)的路径设备 #
架构中的不稳定状况可能会导致路径设备行为不正常。它们频繁出现 I/O 错误、恢复然后再次失败。此类路径设备也称为“边际”或“不稳定”路径。本节概述了 multipath-tools
提供的一些可解决此问题的选项。
如果首次失败后尚未过去 marginal_path_double_failed_time
,路径设备便出现第二次失败(从良好转变为不佳),multipathd
会开始以每秒 10 次请求的速率监控路径,监控期为 marginal_path_err_sample_time
。如果在监控期内错误率超过 marginal_path_err_rate_threshold
,则该路径会归类为边际路径。marginal_path_err_recheck_gap_time
过后,该路径会再次转变为正常状态。
如果所有四个 marginal_path_
数值参数均设置为正值,并且 marginal_pathgroups
未设置为 fpin
,系统便会使用此算法。从 SUSE Linux Enterprise Server 15 SP1 和 SUSE Linux Enterprise Server 12 SP5 开始,可以使用此算法。
- marginal_path_double_failed_time
触发路径监控的两次路径失败相隔的最长时间(以秒为单位)。
- marginal_path_err_sample_time
路径监控间隔的时长(以秒为单位)。
- marginal_path_err_rate_threshold
最小错误率(每千次 I/O)。
- marginal_path_err_recheck_gap_time
使路径保持为边际状态的时间(以秒为单位)。
- marginal_pathgroups
此选项从 SLES 15SP3 开始可用。可能的值为:
- off
边际状态由
multipathd
确定(见上文)。只要边际路径仍处于边际状态,它们就不会重新启用。这是低于 SP3 的 SUSE Linux Enterprise Server 版本的默认值和行为,在这些版本中,marginal_pathgroups
选项不可用。- on
与
off
选项类似,但不是将它们保持在失败状态,而是将边际路径移到单独的路径组,为该路径组指派的优先级将低于所有其他路径组(请参见第 18.10 节 “配置路径分组和优先级”)。仅当其他路径组中的所有路径都失败时,此路径组中的路径才会用于 I/O。- fpin
此设置从 SLES 15SP4 开始可用。边际路径状态源自 FPIN 事件(见下文)。边际路径会移到单独的路径组中,具体请参见
off
的相关内容。此设置不需要在主机端进行进一步配置。建议使用这种方法来处理支持 FPIN 的光纤通道结构上的边际路径。注意:基于 FPIN 的边际路径检测multipathd
侦听光纤通道性能影响通知 (FPIN)。如果接收到某个路径设备的 FPIN-LI(链接完整性)事件,该路径便会进入边际状态。此状态将一直持续,直到在连接该设备的光纤通道适配器上接收到 RSCN 或链接开启事件。
您也可以使用一种更简单的算法,该算法使用参数 san_path_err_threshold
、san_path_err_forget_rate
和 san_path_err_recovery time
。建议对 SUSE Linux Enterprise Server 15 (GA) 采用此算法。请参见 multipath.conf(5)
中的“不稳定路径检测”部分。
18.14 最佳实践 #
18.14.1 有关配置的最佳实践 #
大量的配置指令一开始会令人望而生畏。通常,使用空配置便能获得较好的结果,除非您处于群集环境中。
下面是一些针对独立服务器的一般建议。它们并非强制性要求。有关背景信息,请参见前面小节中各参数的相关说明。
defaults { deferred_remove yes find_multipaths smart enable_foreign nvme marginal_pathgroups fpin # 15.4 only, if supported by fabric } devices { # A catch-all device entry. device { vendor .* product .* dev_loss_tmo infinity no_path_retry 60 # 5 minutes path_grouping_policy group_by_prio path_selector "historical-service-time 0" reservation_key file # if using SCSI persistent reservations } # Follow up with specific device entries below, they will take precedence. }
修改 /etc/multipath.conf
文件后,应用您的设置(请参见第 18.8.4 节 “应用 multipath.conf
修改”)。
18.14.2 解读多路径 I/O 状态 #
要快速了解多路径子系统,请使用 multipath
-ll
或 multipathd show topology
。这些命令的输出具有相同格式。前一个命令读取内核状态,而后一个命令列显多路径守护程序的状态。两个状态通常是相同的。下面是一个输出示例:
>
sudo
multipathd show topology mpatha1 (3600a098000aad1e300000b4b5a275d452) dm-03 NETAPP,INF-01-004 size=64G features='3 queue_if_no_path pg_init_retries 50'5 hwhandler='1 alua'6 wp=rw7 |-+- 8policy='historical-service-time 2'9 prio=5010 status=active11 | |-12 3:0:0:113 sdb 8:1614 active15 ready16 running17 | `- 4:0:0:1 sdf 8:80 active ready running `-+- policy='historical-service-time 2' prio=10 status=enabled `- 4:0:1:1 sdj 8:144 active ready running
映射名称。 | |
映射 WWID(如果与映射名称不同)。 | |
映射设备的设备节点名称。 | |
供应商和产品名称。 | |
路径组。路径组下方的缩进行列出了属于该路径组的路径设备。 | |
路径组使用的路径选择器算法。可以忽略“2”。 | |
路径组的优先级。 | |
路径组的状态( | |
路径设备。 | |
设备的总线 ID(此处为 SCSI Host:Bus:Target:Lun ID)。 | |
路径设备的设备节点名称和主要/次要编号。 | |
路径的内核设备映射程序状态( | |
多路径的路径设备状态(见下文)。 | |
内核中路径设备的状态。这是与设备类型相关的值。对于 SCSI,它可以是 |
多路径的路径设备状态包括:
|
路径健康状况良好 |
|
主动/被动阵列中的被动路径 |
|
路径已关闭或无法访问 |
|
检查程序命令超时 |
|
等待完成路径检查程序命令 |
|
延迟路径重新实例化以避免“摆动” |
|
不可靠的路径(仅限 emc 路径检查程序) |
18.14.3 在多路径设备上使用 LVM2 #
LVM2 内置了多路径设备检测支持。/etc/lvm/lvm.conf
中默认会激活该支持:
multipath_component_detection=1
仅当 LVM2 也配置为从 udev 获取有关设备属性的信息时,此功能才可靠:
external_device_info_source="udev"
这是 SUSE Linux Enterprise 15 SP4 中的默认设置,但早期版本中并非如此。您也可以(尽管通常没有必要)为 LVM2 创建过滤表达式,以忽略除多路径设备之外的所有设备。请参见 第 18.12.4 节 “引用多路径映射”。
18.14.4 解决停止的 I/O #
如果所有路径同时失败并且 I/O 已排入队列,应用程序可能会停滞很长时间。要解决此问题,您可以使用以下程序:
在终端提示符处输入以下命令:
>
sudo
multipathd disablequeueing map MAPNAME将
MAPNAME
替换为设备的正确 WWID 或映射别名。此命令会立即导致所有排队的 I/O 失败,并且将该错误传播到调用的应用程序。文件系统将监测到 I/O 错误并切换到只读模式。
输入以下命令重新激活排队:
>
sudo
multipathd restorequeueing MAPNAME
18.14.5 多路径设备上的 MD RAID #
多路径上的 MD RAID 阵列是由系统的 udev 规则自动设置的。无需在 /etc/mdadm.conf
中进行特殊配置。
18.14.6 在不重引导的情况下扫描新设备 #
如果已将系统配置为启用多路径,并且您需要向 SAN 添加存储设备,则可以使用 rescan-scsi-bus.sh
脚本扫描新设备。该命令的一般语法如下:
>
sudo
rescan-scsi-bus.sh [-a] [-r] --hosts=2-3,5
其中各选项的含义如下:
- -a
使用该选项可确保扫描所有 SCSI 目标来查看是否有新 LUN,否则将仅扫描现有目标。
- -r
使用该选项将允许去除已在存储端去除的设备。
- --hosts
使用该选项可指定要扫描的主机总线适配器列表(默认为扫描所有)。
要获取其他选项的帮助,请运行 rescan-scsi-bus.sh --help
。
如果 multipathd
正在运行并且发现了新的 SAN 设备,系统应该会根据第 18.11 节 “选择要用于多路径的设备”所述的配置自动将它们设置为多路径映射。
在 EMC PowerPath 环境中,请勿使用操作系统随附的 rescan-scsi-bus.sh
实用程序或 HBA 供应商脚本来扫描 SCSI 总线。为了避免可能发生的文件系统损坏,EMC 要求您遵照 EMC PowerPath for Linux 的供应商文档中提供的过程操作。
18.15 MPIO 查错 #
如果某个系统在具有多路径的另一个系统上进入紧急模式,并列显有关丢失设备的消息,原因不外乎以下几种:
多路径设备选择配置不一致
使用不存在的设备引用
18.15.1 了解设备选择问题 #
块设备要么用作多路径映射的一部分,要么直接使用(挂载为文件系统、用作交换、LVM 物理卷或其他)。如果设备已挂载,则 multipathd 想要使其成为多路径映射一部分的尝试将失败,并显示“设备或资源正忙”错误。反之亦然,如果 systemd
尝试挂载已成为多路径映射一部分的设备,则会出现相同的错误。
引导期间的存储设备激活由 systemd
、udev
、multipathd
和其他一些工具之间的复杂交互处理。udev
规则起着核心作用。它们会设置设备属性,用于指示其他子系统应如何使用设备。与多路径相关的 udev 规则为选择用于多路径的设备设置以下属性:
SYSTEMD_READY=0 DM_MULTIPATH_DEVICE_PATH=1
分区设备会从其父设备继承这些属性。
如果这些属性设置得不正确,某些工具会忽视这些属性;如果设置得太晚,则可能会导致 multipathd
与其他一些子系统之间出现竞态条件。只有一个竞争者能够胜出;另一个会看到“设备或资源正忙”错误。
这种情况下会出现如下问题:LVM2 套件的工具默认不评估 udev 属性。它们依靠自己的逻辑来确定设备是否是多路径组件,这有时与系统其余部分的逻辑不匹配。有关规避此问题的方法,请参见第 18.14.3 节 “在多路径设备上使用 LVM2”。
假设有这样一个拥有多路径的系统,其根设备未进行多路径处理,并且多路径中排除任何设备(请参见第 18.3.2.2 节 “根文件系统位于本地磁盘上”中的“在 initramfs 中禁用多路径”)。根文件系统挂载在 initramfs 中。systemd
切换到根文件系统,并且 multipathd
启动。由于设备已挂载,multipathd
未能为其设置多路径映射。由于未在 blacklist
中配置根设备,因此系统会将其视为多路径设备并为其设置 SYSTEMD_READY=0
。
稍后在引导过程中,系统会尝试挂载其他文件系统,比如 /var
和 /home
。通常,这些文件系统将与根文件系统位于同一设备上,默认作为根文件系统本身的 BTRFS 子卷。但 systemd 因 SYSTEMD_READY=0
无法挂载它们。我们陷入了死锁状态:无法创建 dm-multipath 设备,并且底层设备因 systemd 被封锁。无法挂载其他文件系统,导致引导失败。
我们目前已经拥有应对此问题的解决方案。 multipathd
会检测到此情况并将设备释放到 systemd
,之后其可继续挂载文件系统。尽管如此,了解这个普遍性问题很重要,因为它可能仍会以更难以察觉的方式发生。
18.15.2 了解设备引用问题 #
第 18.7.4.2 节 “initramfs 中永久设备的名称”中提供了设备引用问题的示例。通常情况下会有多个符号链接指向一个设备节点(请参见第 18.12.4 节 “引用多路径映射”)。但这些链接并不总是存在;udev
会根据当前的 udev 规则创建它们。例如,如果多路径关闭,/dev/mapper/
下多路径设备的符号链接将丢失。因此,对 /dev/mapper/
设备的任何引用都将失败。
此类引用可能会出现在许多地方,特别是在 /etc/fstab
和 /etc/crypttab
中、initramfs 中,甚至是在内核命令行上。
要规避此问题,最安全的方法就是避免使用无法在重引导后永久保留或依赖于系统配置的设备引用。一般而言,我们建议通过文件系统本身的属性(如 UUID 或标签)来引用文件系统(以及类似的实体,如交换空间),而不要通过包含文件系统的设备来引用。如果此类引用不可用并且需要设备引用(例如,在 /etc/crypttab
中),则应仔细评估选项。例如,在 第 18.12.4 节 “引用多路径映射” 中,最佳选项可能是 /dev/disk/by-id/wwn-
链接,因为它也可与 multipath=off
搭配使用。
18.15.3 紧急模式中的查错步骤 #
由于存在许多差别非常细微的错误情况,因此无法提供分步恢复指南。但凭借前几小节的背景知识,如果系统因多路径问题进入紧急模式,您应该能够找出问题所在。在您开始调试前,请确保您已检查以下问题:
多路径服务是否已启用?
initramfs 中是否包含多路径 dracut 模块?
我的根设备是否配置为多路径设备?如果没有,根设备是否如 第 18.11.1 节 “
multipath.conf
中的blacklist
部分” 所述正确排除在多路径之外,或者您是否依赖于 initramfs 中多路径模块的缺失来实现这一点(请参见第 18.3.2.2 节 “根文件系统位于本地磁盘上”)?系统进入紧急模式是在切换到真正的根文件系统之前还是之后?
如果您不确定最后一个问题的答案,这里有一个 dracut 紧急提示示例,切换根之前会列显示例所示的内容:
Generating "/run/initramfs/rdsosreport.txt" Entering emergency mode. Exit the shell to continue. Type "journalctl" to view system logs. You might want to save "/run/initramfs/rdsosreport.txt" to a USB stick or /boot after mounting them and attach it to a bug report. Give root password for maintenance (or press Control-D to continue):
如果提到 rdsosreport.txt
,即表明系统仍从 initramfs 中运行。如果您仍然不确定,请登录并检查 /etc/initrd-release
文件是否存在。此文件仅存在于 initramfs 环境中。
如果是在切换根之后进入紧急模式,紧急提示内容与此相似,但不会提到 rdsosreport.txt
:
Timed out waiting for device dev-disk-by\x2duuid-c4a...cfef77d.device. [DEPEND] Dependency failed for Local File Systems. [DEPEND] Dependency failed for Postfix Mail Transport Agent. Welcome to emergency shell Give root password for maintenance (or press Control-D to continue):
尝试通过检查失败的 systemd 单元和日记来找出失败的原因。
#
systemctl --failed#
journalctl -b -o short-monotonic在查看日记时,确定第一个失败的单元。当您发现第一处故障时,请非常仔细地检查该时间点之前和前后的消息。是否有任何警告或其他可疑消息?
留意根交换(“
Switching root.
”)以及有关 SCSI 设备、设备映射程序、多路径和 LVM2 的消息。查找有关设备和文件系统的systemd
消息(“Found device
…”、“Mounting
…”、“Mounted
…”)。检查现有设备,包括低级设备和设备映射程序设备(请注意,下面的某些命令可能在 initramfs 中不可用):
#
cat /proc/partitions#
ls -l /sys/class/block#
ls -l /dev/disk/by-id/* /dev/mapper/*#
dmsetup ls --tree#
lsblk#
lsscsi从以上命令的输出中,您应该能够了解是否成功探测到低级设备,以及是否设置了任何多路径映射和多路径分区。
如果设备映射程序多路径设置不符合您的预期,请检查 udev 属性,特别是
SYSTEMD_READY
(见上文)#
udevadm info -e如果上一步显示了非预期的 udev 属性,则表明可能是在 udev 规则处理期间出现了问题。检查其他属性,特别是用于标识设备的属性(请参见第 18.12.1 节 “WWID 和设备标识”)。如果 udev 属性正确,请再次检查日记中是否有
multipathd
消息。查找“Device or resource busy
”消息。如果系统无法挂载或以其他方式激活设备,通常可以尝试手动激活该设备:
#
mount /var#
swapon -a#
vgchange -a y大多数情况下,手动激活都会成功,并允许继续引导系统(通常只需从紧急外壳注销),以及进一步检查引导后系统中的情况。
如果手动激活失败,您可能会看到错误消息,其中会提供有关问题所在的线索。您也可以再次尝试这些命令,并指定更高的详细程度。
此时,您应该知道出了什么问题(如果不知道,请联系 SUSE 支持部门并准备好回答上面提出的大部分问题)。
运行一些外壳命令应该就能解决该问题,然后退出紧急外壳并成功引导。您仍然需要调整您的配置以确保以后不会再出现同样的问题。
如果无法解决,您将需要引导救援系统,手动设置设备以使用
chroot
进入真正的根文件系统,并尝试根据您在前面的步骤中了解到的情况解决问题。请注意,在这种情况下,根文件系统的存储堆栈可能与正常情况不同。根据您的设置,您可能会在构建新 initramfs 时强制添加或省略 dracut 模块。另请参见第 18.7.4.1 节 “在 initramfs 中启用或禁用多路径”。如果问题频繁发生,或者在每次尝试引导时都发生,请尝试以更高的详细程度引导,以获取有关失败的更多信息。以下内核参数或它们的组合通常很有用:
udev.log-priority=debug1 systemd.log_level=debug2 scsi_mod.scsi_logging_level=0204003 rd.debug4
此外,您也可以为某些驱动程序启用日志记录,并配置串行控制台以在引导期间捕获输出。
18.15.4 技术信息文档 #
有关 SUSE Linux Enterprise Server 上多路径 I/O 问题查错的详细信息,请参见 SUSE 知识库中的下列技术信息文档 (TID):