在线存储管理

在操作系统运行时,通常希望在不重新启动的情况下添加、删除或重新调整存储设备的大小。本章概述了在系统运行期间,可以在Red Hat Enterprise Linux 7主机系统上重新配置存储设备的过程。它涵盖了iSCSI和光纤通道存储互连;未来可能还会添加其它互连类型。

本章重点介绍如何添加,删除,修改和监视存储设备。 它没有详细讨论光纤通道或iSCSI协议。 有关这些协议的更多信息,请参阅其它文档。

本章引用了不同的sysfs对象。Red Hat建议,在主要的Red Hat Enterprise Linux版本中,sysfs对象名称和目录结构可能会发生变化。这是因为上游Linux内核没有提供稳定的内部API。有关如何以可移植方式引用sysfs对象的指南,请参阅内核源代码树中的文档/usr/share/doc/kernel-doc-version/Documentation/sysfs-rules.txt以获得指南。

创建ISCSI启动器

创建iSCSI目标后,使用iscsiadm实用程序设置启动器。

在Red Hat Enterprise Linux 7中,iSCSI服务默认是延迟启动:该服务在运行iscsiadm命令后启动。

过程1 创建iSCSI启动器

  1. 安装iscsi-initiator-utils

    # yum install iscsi-initiator-utils
    
  2. (可选) 如果为ACL指定了自定义名称,请相应地修改/etc/iscsi/initiatorname.iscsi文件。 例如:

    # cat /etc/iscsi/initiatorname.iscsi
    InitiatorName=iqn.2006-04.com.example.node1
    
  3. 发现目标:

# iscsiadm -m discovery -t st -p target-ip-address 
10.64.24.179:3260,1 iqn.2006-04.com.example:3260
  1. 使用在步骤3中发现的目标IQN登录到目标:

    # iscsiadm -m node -T iqn.2006-04.com.example:3260 -l 
    Logging in to [iface: default, target: iqn.2006-04.com.example:3260, 
    portal: 10.64.24.179,3260] (multiple)
    Login to [iface: default, target: iqn.2006-04.com.example:3260, 
    portal: 10.64.24.179,3260] successful.
    

只要将特定的启动器名称添加到ACL,就可以对连接到同一LUN的任意数量的启动器执行此过程。

光纤通道

本节讨论光纤通道API,原生Red Hat Enterprise Linux 7光纤通道驱动程序以及这些驱动程序的光纤通道功能。

光纤通道API

下面是包含用于提供用户空间API的文件的/sys/class/ 目录列表。在每一项中,主机号是由 H 指定,总线号是 B,目标是 T ,逻辑单元号(LUN)是 L,远程端口号是 R

重要提示

如果您的系统使用多路径软件,则Red Hat建议您在更改本节中描述的任何值之前咨询硬件供应商。

  • Transport: /sys/class/fc_transport/targetH:B:T/

    • port_id — 24位端口ID /地址
    • node_name —64位节点名称
    • port_name —64位端口名称
  • Remote Port: /sys/class/fc_remote_ports/rport-H:B-R/

    • port_id
    • node_name
    • port_name
    • dev_loss_tmo:控制何时从系统中删除scsi设备。 在dev_loss_tmo触发后,将删除scsi设备。

    multipath.conf中,您可以将dev_loss_tmo设置为infinity,这会将其值设置为2,147,483,647秒,或68年,是dev_loss_tmo的最大值。

    在Red Hat Enterprise Linux 7中,如果未设置fast_io_fail_tmo选项,dev_loss_tmo上限为600秒。 默认情况下,如果多路径服务正在运行,则Red Hat Enterprise Linux 7中的fast_io_fail_tmo设置为5秒; 否则,它被设置为off

    • fast_io_fail_tmo: 指定在链接标记为“bad”之前需等待的秒数。一旦链接被标记为错误,对应路径上的现有的运行I/O或任何新的I/O都会失败。

    如果I/O处于阻塞队列中,则在dev_loss_tmo到期且队列被解除阻塞之前它不会失败。

    如果fast_io_fail_tmo设置为除off之外的任何值,则dev_loss_tmo不受限制。 如果fast_io_fail_tmo设置为off,则在从系统中删除设备之前不会发生I/O失败。如果fast_io_fail_tmo设置为数字,则当fast_io_fail_tmo超时触发时,I/O会立即失败。

  • Host: /sys/class/fc_host/hostH/

    • port_id
    • issue_lip:指示驱动程序重新发现远程端口

原生光纤通道驱动程序和功能

Red Hat Enterprise Linux 7附带以下原生光纤通道驱动程序:

  • lpfc
  • qla2xxx
  • zfcp
  • bfa

重要提示

默认情况下,qla2xxx驱动程序在启动器模式下运行。 要将qla2xxx与Linux-IO一起使用,请使用相应的qlini_mode模块参数启用光纤通道目标模式。

首先,确保安装了qla设备的固件包,例如ql2200-firmware或类似的设备固件。

要启用目标模式,请将以下参数添加到 /usr/lib/modprobe.d/qla2xxx.conf qla2xxx模块配置文件中:

options qla2xxx qlini_mode=disabled

然后,使用dracut -f命令重建初始ramdisk(initrd),并重新启动系统以使更改生效。

表1“光纤通道API功能”描述了每个本机Red Hat Enterprise Linux 7驱动程序的不同光纤通道API功能。 X表示对该功能的支持。

表1.光纤通道API功能

lpfcqla2xxxzfcpbfa
Transport port_idXXXX
Transport node_nameXXXX
Transport port_nameXXXX
Remote Port dev_loss_tmoXXXX
Remote Port fast_io_fail_tmoXX [a]X [b]X
Host port_idXXXX
Host issue_lipXXX

[a]从Red Hat Enterprise Linux 5.4开始支持

[b]从Red Hat Enterprise Linux 6.0开始支持

ISCSI

本节介绍iSCSI API和iscsiadm实用程序。 在使用iscsiadm实用程序之前,首先运行yum install iscsi-initiator-utils安装iscsi-initiator-utils软件包。

在Red Hat Enterprise Linux 7中,默认情况下会延迟启动iSCSI服务。 如果root不在iSCSI设备上,或者没有标记为node.startup = automatic的节点,则在运行需要iscsid或iscsi内核模块的iscsiadm命令之前,iSCSI服务将不会启动。例如,运行发现命令iscsiadm -m discovery -t st -p ip:port将导致iscsiadmin启动iSCSI服务。

要强制iscsid守护进程运行并加载iSCSI内核模块,请运行systemctl start iscsid.service

iSCSI API

要获取有关运行中会话的信息,请运行:

# iscsiadm -m session -P 3

此命令显示会话/设备状态,会话ID(sid),某些协商参数以及可通过会话访问的SCSI设备。

对于较短的输出(例如,仅显示sid-to-node映射),请运行:

# iscsiadm -m session -P 0

# iscsiadm -m session

这些命令使用以下格式打印正在运行的会话列表:

driver [sid] target_ip:port,target_portal_group_tag proper_target_name

示例 iscsisadm -m session命令的输出

举例:

# iscsiadm -m session
tcp [2] 10.15.84.19:3260,2 iqn.1992-08.com.netapp:sn.33615311
tcp [3] 10.15.85.19:3260,3 iqn.1992-08.com.netapp:sn.33615311

有关iSCSI API的更多信息,请参阅 /usr/share/doc/iscsi-initiator-utils-version/README

持久命名

红帽企业Linux提供了许多识别存储设备的方法。 在使用时使用正确的选项识别每个设备非常重要,以避免无意中访问错误的设备,尤其是在安装或重新格式化驱动器时。

存储设备的主要和次要编号

sd驱动程序管理的存储设备在内部由主要设备编号及其相关的次要编号集合标识。 用于此目的的主要设备编号不在连续范围内。 每个存储设备由主要编号和一系列次要编号表示,用于识别整个设备或设备内的分区。 分配给设备的主要编号和次要编号与以 sd <letter(s)> [number(s)] 的形式存在的数字之间存在直接关联。 每当sd驱动程序检测到新设备时,就会分配可用的主要编号和次要编号范围。 每当从操作系统中移除设备时,将释放主要编号和次要编号范围以供以后重用。

当检测到每个设备时,为其分配主要编号和次要编号号码范围以及相关的sd名称。这意味着,如果设备检测的顺序发生变化,主要编号和次要编号范围以及相关的sd名称之间的关联就会发生变化。虽然对于某些硬件配置(例如,内部SCSI控制器和磁盘,它们的SCSI目标ID由机箱中的物理位置指定)来说,这是不寻常的,但它仍然可以发生。可能发生这种情况的例子如下:

  • 磁盘可能无法启动或响应SCSI控制器。 这将导致普通设备探测器无法检测到它。 系统无法访问磁盘,后续设备将具有主要和次要编号范围,包括相关的sd名称向下移动。 例如,如果未检测到通常称为sdb的磁盘,则通常称为sdc的磁盘将显示为sdb
  • SCSI控制器(主机总线适配器或HBA)可能无法初始化,导致无法检测到连接到该HBA的所有磁盘。 连接到随后探测的HBA的任何磁盘将被分配不同的主要和次要编号范围,以及不同的关联sd名称。
  • 如果系统中存在不同类型的HBA,则驱动程序初始化的顺序可能会改变。 这将导致连接到这些HBA的磁盘以不同的顺序被检测到。如果将HBA移动到系统上的不同PCI插槽,也会发生这种情况。
  • 例如,由于存储阵列或中间交换机断电,在探测存储设备时,使用光纤通道,iSCSI或FCoE适配器连接到系统的磁盘可能无法访问。 如果存储阵列上线比系统启动需要更长的时间,则系统在电源故障后重新启动时可能会发生这种情况。 虽然某些光纤通道驱动程序支持为WWPN映射指定持久性SCSI目标ID的机制,但这不会导致主要和次要编号范围以及相关的sd名称被保留,它只会提供一致的SCSI目标ID编号。

这些原因使得在引用设备时(例如在 /etc/fstab 文件中)使用主要和次要编号范围或关联的sd名称是不合需要的。 可能会安装错误的设备并导致数据损坏。

但是,有时候,即使使用其它机制(例如设备报告错误时),仍然需要引用sd名称。 这是因为Linux内核在有关设备的内核消息中使用sd名称(以及SCSI主机/通道/目标/ LUN元组)。

全球标识符(WWID)

全球标识符(WWID) 可用于可靠的设备识别。它是SCSI标准要求所有SCSI设备使用的持久的、独立于系统的ID.。WWID标识符保证对每个存储设备是唯一的,并且独立于用于访问设备的路径。

通过发出SCSI查询来检索设备标识关键产品数据(DIVPD)(页 0x83)或单元序列号(USN)(页0x80),可以获得此标识符。从这些WWID到当前 /dev/sd名称的映射可以在 /dev/disk/by-id/ 目录中维护的符号链接中看到。

示例 WWID

例如,具有页0x83标识符的设备将具有:

scsi-3600508b400105e210000900000490000 -> ../../sda

或者,具有页0x80标识符的设备将具有:

scsi-SSEAGATE_ST373453LW_3HW1RHM6 -> ../../sda

红帽企业Linux自动维护从基于WWID的设备名称到该系统上当前 /dev/sd 名称的正确映射。 应用程序可以使用 /dev/disk/by-id/ 名称来引用磁盘上的数据,即使设备的路径发生更改,甚至从不同系统访问设备时也是如此。

如果从系统到设备有多条路径,DM Multipath将使用WWID来检测此情况。 然后,DM Multipath/dev/mapper/wwid 目录中显示单个“伪设备”,例如 /dev/mapper/3600508b400105df70000e00000ac0000

命令multipath -l显示到非持久标识符的映射:

主机:通道:目标:LUN/dev/sd名称和主要:次要编号。

3600508b400105df70000e00000ac0000 dm-2 vendor,product 
[size=20G][features=1 queue_if_no_path][hwhandler=0][rw] 
\_ round-robin 0 [prio=0][active] 
 \_ 5:0:1:1 sdc 8:32  [active][undef] 
 \_ 6:0:1:1 sdg 8:96  [active][undef]
\_ round-robin 0 [prio=0][enabled] 
 \_ 5:0:0:1 sdb 8:16  [active][undef] 
 \_ 6:0:0:1 sdf 8:80  [active][undef]

DM Multipath自动维护每个基于WWID的设备名称与系统上相应的 /dev/sd名称的正确映射。 这些名称在路径更改中是持久的,并且在从不同系统访问设备时它们是一致的。

当使用user_friendly_names功能(DM Multipath)时,WWID将映射到 /dev/mapper/mpathn 形式的名称。 默认情况下,此映射在文件 /etc/multipath/bindings 中维护。 只要维护该文件,这些mpathn名称就是持久的。

重要提示

如果使用user_friendly_names,则需要执行其它步骤才能在集群中获取一致的名称。 请参阅DM Multipath一书中的“在集群中保持多路径设备名称一致”部分。

除了系统提供的这些持久性名称之外,您还可以使用udev规则来实现您自己的持久性名称,映射到存储的WWID。

通过/dev/disk/by- *中的udev机制管理的设备名称

udev机制由三个主要部分组成:

内核

  生成在添加,删除或更改设备时发送到用户空间的事件。

udevd服务

  接收事件。

udev规则

  指定udev服务接收内核事件时要执行的操作。

此机制用于Linux中的所有类型的设备,而不仅仅用于存储设备。 对于存储设备,Red Hat Enterprise Linux包含udev规则,这些规则在 /dev/disk/ 目录中创建符号链接,允许通过其内容,唯一标识符,序列号或用于访问设备的硬件路径来引用存储设备。

/dev/disk/by-label/

  此目录中的条目提供符号名称,该名称通过设备中存储的内容(即数据)中的标签引用存储设备。 blkid实用程序用于从设备读取数据并确定设备的名称(即标签)。 例如:

/dev/disk/by-label/Boot

注意

信息是从设备上的内容(即数据)获得的,如果是内容被复制到另一个设备,标签将保持不变。

该标签还可用于在**/etc/fstab**中使用以下语法引用设备:

LABEL=Boot

/dev/disk/by-uuid/

  此目录中的条目提供符号名称,该名称通过存储在设备上的内容(即数据)中的唯一标识符引用存储设备。 blkid实用程序用于从设备读取数据并获取设备的唯一标识符(即UUID)。 例如:

UUID=3e6be9de-8139-11d1-9106-a43f08d823a6

/dev/disk/by-id/

  此目录中的条目提供一个符号名,该名称通过唯一标识符(不同于所有其它存储设备)引用存储设备。
标识符是设备的属性,但没有存储在设备上的内容(即数据)中。例如:

/dev/disk/by-id/scsi-3600508e000000000ce506dc50ab0ad05
/dev/disk/by-id/wwn-0x600508e000000000ce506dc50ab0ad05

  id是从设备的全球标识符(WWID)或设备序列号获得的。 /dev/disk/by-id/ 条目还可以包括分区号。 例如:

/dev/disk/by-id/scsi-3600508e000000000ce506dc50ab0ad05-part1
/dev/disk/by-id/wwn-0x600508e000000000ce506dc50ab0ad05-part1

/dev/disk/by-path/

  此目录中的条目提供符号名称,该名称通过用于访问设备的硬件路径引用存储设备,从对PCI层次结构中的存储控制器的引用开始,包括SCSI主机,通道,目标和LUN编号以及可选的分区号。 虽然这些名称比使用主要和次要编号或sd名称更可取,但必须谨慎使用,以确保目标编号在光纤通道SAN环境中不会发生变化(例如,通过使用持久绑定),并且如果主机适配器被移动到其它PCI插槽,则名称的使用会被更新。 此外,如果HBA无法探测,如果驱动程序以不同的顺序加载,或者系统上安装了新的HBA,则SCSI主机号可能会发生变化。 by-path列表的一个示例是:

/dev/disk/by-path/pci-0000:03:00.0-scsi-0:1:0:0

  /dev/disk/by-path/ 条目还可以包含分区号,例如:

/dev/disk/by-path/pci-0000:03:00.0-scsi-0:1:0:0-part1
udev设备命名约定的限制

udev命名约定有以下一些限制。

  • 在执行查询时可能无法访问设备,因为在为udev事件处理udev规则时,udev机制可能依赖于查询存储设备的能力。 当设备不在服务器机箱中时,光纤通道,iSCSI或FCoE存储设备更有可能发生这种情况。
  • 内核还可能在任何时候发送udev事件,从而使得处理规则,并可能导致在设备不可访问时删除 /dev/disk/by-*/ 链接。
  • 在生成udev事件和处理udev事件之间可能存在延迟,例如检测到大量设备时,以及用户空间udevd服务需要花费一定时间来处理每个事件的规则。这可能会在内核检测到设备和 /dev/disk/by-*/ 名称可用之间造成延迟。
  • 因调用udev规则的外部程序(例如 blkid) 可能会在短时间内打开设备,使得设备无法用于其它用途。
修改持久命名属性

虽然udev命名属性是持久的,因为它们不会在系统重启时自行更改,但有些属性也是可配置的。 您可以为以下持久性命名属性设置自定义值:

  • UUID: 文件系统UUID

  • LABEL: 文件系统标签

由于UUIDLABEL属性与文件系统相关,因此需要使用的工具取决于该分区上的文件系统。

  • 要更改XFS文件系统的UUIDLABEL属性,请卸载文件系统,然后使用xfs_admin实用程序更改属性:
# umount /dev/device
# xfs_admin [-U new_uuid] [-L new_label] /dev/device
# udevadm settle
  • 要更改ext4,ext3或ext2文件系统的UUIDLABEL属性,请使用tune2fs实用程序:
# tune2fs [-U new_uuid] [-L new_label] /dev/device
# udevadm settle

new_uuid替换为您要设置的UUID; 例如,1cdfbc07-1c90-4984-b5ec-f61943f5ea50。 用标签替换new_label; 例如,backup_data

注意

更改udev属性发生在后台,可能需要很长时间。 udevadm settle命令等待更改完全注册,这可确保您的下一个命令能够正确使用新属性。

您还应该在创建新设备后使用该命令; 例如,在使用parted工具创建具有自定义PARTUUIDPARTLABEL属性的分区之后,或者在创建新文件系统之后。

删除存储设备

在删除对存储设备本身的访问之前,建议先从设备备份数据。然后,刷新I/O并删除对设备的所有操作系统引用(如下所述)。 如果设备使用多路径,则对多路径“伪设备”(“全球标识符(WWID)”部分)和表示设备路径的每个标识符执行此操作。 如果只删除多路径设备的一条路径,并且其它路径仍然存在,则过程更简单,如“添加存储设备或路径”一节中所述。

当系统处于内存压力下时,建议不要卸下存储设备,因为I / O刷新会增加负载。 要确定内存压力级别,请运行命令vmstat 1 100; 如果出现以:

  • 可用内存小于总内存的5%,每100个样本超过10个(free命令也可用于显示总内存)。
  • 交换处于活动状态(vmstat输出中的siso列非零)。

删除对设备的所有访问的一般过程如下:

  1. 关闭设备的所有用户并根据需要备份设备数据。

  2. 使用umount卸载挂载设备的任何文件系统。

  3. 使用它从任何md和LVM卷中删除设备。如果设备是LVM卷组的成员,则可能需要使用pvmove命令将数据移出设备,然后使用vgreduce命令删除物理卷,之后(可选地)使用pvemove从磁盘中删除LVM元数据。

  4. 如果设备使用多路径,请运行multipath -l并记下设备的所有路径。 然后,使用multipath -f device 删除多路径设备。

  5. 在系统上的应用程序、脚本或实用程序中,删除对设备基于路径的名称的任何引用,如 /dev/sd/dev/disk/by-pathmajor:minor号。这对于确保将来添加的不同设备不会被误认为是当前设备非常重要。

  6. 最后,从SCSI子系统中删除设备的每个路径。 为此,请使用命令echo 1 > /sys/block/device-name /device/delete,例如,device-name 可能是sde

    此操作的另一个变体是echo 1> /sys/class/scsi_device*/h:c:t:l*/device/delete,其中 h 是HBA号, c 是HBA上的通道, t 是SCSI目标ID, 而 l 是LUN。

    注意

    不推荐使用这些命令的旧形式echo“scsi remove-single-device 0 0 0 0”> /proc/scsi/scsi

您可以从各种命令(例如lsscsiscsi_idmultipath -lls -l /dev/disk/by- )确定设备的*device-name ,HBA编号,HBA通道,SCSI目标ID和LUN。

执行上述过程后,可以从正在运行的系统中安全地物理移除设备。 这样做时没有必要停止对其它设备的I/O.

不推荐使用其它过程,例如物理移除设备,然后重新扫描SCSI总线(如“扫描存储互连”一节中所述)以更新操作系统状态以反映更改。 这将导致I/O超时引起的延迟,并且可能会意外删除设备。 如果需要重新扫描互连,则必须在暂停I/O时完成,如“扫描存储互连”一节中所述。

删除存储设备中的路径

如果要删除使用多路径的设备的一条路径(不影响设备的其它路径),则一般过程如下:

  1. 在系统上的应用程序、脚本或实用程序中,删除对设备基于路径的名称的任何引用,如 /dev/sd/dev/disk/by-pathmajor:minor号。这对于确保将来添加的不同设备不会被误认为是当前设备非常重要。

  2. 使用echo offline> /sys/block/sda/device/state使路径脱机。

    这将导致发送到设备此路径上的任何后续I/O立即失败。Device-mapper-multipath将继续使用设备的其余路径。

  3. 从SCSI子系统中删除路径。 为此,请使用命令echo 1> /sys/block/device-name/device/delete,其中 device-name 可能是sde

执行上述过程后,可以从正在运行的系统中安全地删除路径。 完成此操作后无需停止I/O,因为device-mapper-multipath将根据配置的路径分组和故障转移策略将I/O重新路由到其余路径。

不推荐使用其它过程,例如物理移除电缆,然后重新扫描SCSI总线以更新操作系统状态以反映更改。 这将导致I/O超时引起的延迟,并且可能会意外删除设备。 如果需要重新扫描互连,则必须在暂停I/O时完成,如“扫描存储互连”一节中所述。

添加存储设备或路径

添加设备时,请注意系统分配给新设备的基于路径的设备名称(例如 /dev/sd 名称,major:minor 号和 /dev/disk/by-path名称)可能在以前被现已删除的设备使用过。 因此,请确保已删除对基于路径的设备名称的所有旧引用。 否则,新设备可能会被误认为是旧设备。

添加存储设备或路径

  1. 添加存储设备或路径的第一步是物理上允许访问新存储设备或现有设备的新路径。 这是使用光纤通道或iSCSI存储服务器上的供应商特定命令完成的。 执行此操作时,请记下将呈现给主机的新存储的LUN值。 如果存储服务器是光纤通道,还要记下存储服务器的全球节点名称(WWNN),并确定存储服务器上的所有端口是否都有单个WWNN。 如果不是这种情况,请记下将用于访问新LUN的每个端口的全球端口名称(WWPN)。

  2. 接下来,让操作系统知道新的存储设备或现有设备的路径。建议使用的命令是:

    echo "c t l" >  /sys/class/scsi_host/hosth/scan
    

    在上一个命令中,h 是HBA号,c 是HBA上的通道,t 是SCSI目标ID,l 是LUN。

    注意

    不推荐使用此命令的旧形式echo “scsi add-single-device 0 0 0 0”> /proc/scsi/scsi

  a.在某些光纤通道硬件中,在执行循环初始化协议(LIP)操作之前,操作系统可能看不到RAID阵列上新创建的LUN。 有关如何执行此操作的说明,请参见“扫描存储互连”一节。

重要提示

如果需要LIP,则必须在执行此操作时停止I/O.

  b.如果已在RAID阵列上添加了新LUN但仍未由操作系统配置,请使用sg_luns命令(sg3_utils软件包的一部分)确认阵列导出的LUN列表。 这将向RAID阵列发出SCSI REPORT LUNS命令,并返回存在的LUN列表。

对于为所有端口实现单个WWNN的光纤通道存储服务器,您可以通过在sysfs中搜索WWNN来确定正确的 hct 值(即HBA号,HBA通道和SCSI目标ID)。

确定正确的h,c和t值

例如,如果存储服务器的WWNN是0x5006016090203181,请使用:

# grep 5006016090203181 /sys/class/fc_transport/*/node_name

这应该显示类似于以下内容的输出:

/sys/class/fc_transport/target5:0:2/node_name:0x5006016090203181 
/sys/class/fc_transport/target5:0:3/node_name:0x5006016090203181 
/sys/class/fc_transport/target6:0:2/node_name:0x5006016090203181 
/sys/class/fc_transport/target6:0:3/node_name:0x5006016090203181

这表示此目标有四条光纤通道路由(两个单通道HBA,每个通向两个存储端口)。 假设LUN值为56,则以下命令将配置第一个路径:

# echo "0 2 56" >  /sys/class/scsi_host/host5/scan

必须为新设备的每个路径执行此操作。

对于未为所有端口实现单个WWNN的光纤通道存储服务器,您可以通过搜索sysfs中的每个WWPN来确定正确的HBA号,HBA通道和SCSI目标ID。

确定HBA号,HBA通道和SCSI目标ID的另一种方法是引用已在与新设备相同的路径上配置的另一个设备。 这可以通过各种命令来完成,例如lsscsiscsi_idmultipath -lls -l /dev/disk/by- 。 可以使用此信息以及新设备的LUN号(如上所示)来探测和配置新设备的路径。

  1. 将所有SCSI路径添加到设备后,执行multipath命令,并检查设备是否已正确配置。 此时,可以将设备添加到md,LVM,mkfsmount中。

如果遵循上述步骤,则可以安全地将设备添加到正在运行的系统中。 完成此操作后,无需停止对其他设备的I/O. 当存储I/O正在进行时,不建议使用涉及重新扫描(或重置)SCSI总线的其它过程,这些过程会导致操作系统更新其状态以反映当前设备连接。

扫描存储互连

某些命令允许您重置,扫描或同时重置和扫描一个或多个互连,这可能会在一次操作中添加和删除多个设备。 此类扫描可能会造成中断,因为它可能会导致 /O操作超时时出现延迟,并意外删除设备。 Red Hat建议仅在必要时使用互连扫描。 扫描存储互连时,请遵守以下限制:

  • 在执行过程之前,必须暂停和刷新受影响互连上的所有I/O,并在I/O恢复之前检查扫描结果。
  • 与移除设备一样,当系统处于内存压力下时,不建议进行互连扫描。 要确定内存压力级别,请运行vmstat 1 100命令。 如果空闲内存小于总内存的5%(每100个样本超过10个样本),则不建议进行互连扫描。此外,如果交换处于活动状态(vmstat输出中的siso列非零),则不建议进行互连扫描。 free命令也可以显示总内存。

以下命令可用于扫描存储互连:

echo “1” > /sys/class/fc_host/host/issue_lip

  此操作执行循环初始化协议(LIP),扫描互连,并使SCSI层更新以反映总线上当前的设备。从本质上说,LIP是重置总线,并导致设备的添加和删除。此过程对于在光纤通道互连上配置新的SCSI目标是必需的。

请注意,issue_lip是一个异步操作。 该命令可在整个扫描完成之前完成。 您必须监视 /var/log/messages 以确定issue_lip何时完成。

lpfcqla2xxxbnx2fc驱动程序支持issue_lip。 有关Red Hat Enterprise Linux中每个驱动程序支持的API功能的更多信息,请参阅表“光纤通道API功能”。

/usr/bin/rescan-scsi-bus.sh

  /usr/bin/rescan-scsi-bus.sh脚本是在Red Hat Enterprise Linux 5.4中引入的。 默认情况下,此脚本扫描系统上的所有SCSI总线,并更新SCSI层以反映总线上的新设备。 该脚本提供了其它选项,允许删除设备和发出LIP。 有关此脚本的详细信息(包括已知问题),请参见“通过rescan-scsi-bus.sh添加/删除逻辑单元”一节。

echo “- - -” > /sys/class/scsi_host/hosth/scan

  这与“添加存储设备或路径”一节中描述的命令相同,用于添加存储设备或路径。 但是,在这种情况下,通道号,SCSI目标ID和LUN值将替换为通配符。 允许使用标识符和通配符的任意组合,因此您可以根据需要将命令设置为特定或广泛。 此过程添加LUN,但不删除它们。

modprobe --remove driver-name, modprobe driver-name

  运行modprobe --remove driver-name命令后跟modprobe driver-name命令完全重新初始化驱动程序控制的所有互连的状态。 尽管相当极端,但在某些情况下使用所描述的命令可能是适当的。 例如,可以使用这些命令以使用不同的模块参数值重新启动驱动程序。

ISCSI发现配置

默认的iSCSI配置文件是 /etc/iscsi/iscsid.conf 。 此文件包含iscsidiscsiadm使用的iSCSI设置。

在目标发现期间,iscsiadm工具使用**/etc/iscsi/iscsid.conf**中的设置创建两种类型的记录:

/var/lib/iscsi/nodes中的节点记录

  登录目标时,iscsiadm使用此文件中的设置。

/var/lib/iscsi/discovery_type中的发现记录

  在对同一目标执行发现时,iscsiadm使用此文件中的设置。

在使用不同的发现设置之前,首先删除当前的发现记录(即 /var/lib/iscsi/discovery_type )。 为此,请使用以下命令:

# iscsiadm -m discovery -t discovery_type -p target_IP:port -o delete

此处,discovery_type可以是sendtargetsisnsfw

有关不同类型的发现的详细信息,请参阅iscsiadm(8)手册页的DISCOVERY TYPES部分。

有两种方法可以重新配置发现记录设置:

  • 在执行发现之前直接编辑**/etc/iscsi/iscsid.conf**文件。 发现设置使用前缀 discovery ; 要查看它们,请运行:

    # iscsiadm -m discovery -t discovery_type -p target_IP:port
    
  • 或者,iscsiadm也可用于直接更改发现记录设置,如下所示:

    # iscsiadm -m discovery -t discovery_type -p target_IP:port -o update -n setting -v %value
    

    有关可用设置选项和每个选项的有效选项的更多信息,请参阅iscsiadm(8)手册页。

配置发现设置后,任何后续尝试发现新目标都将使用新设置。 有关如何扫描新iSCSI目标的详细信息,请参见“扫描iSCSI互连”一节。

有关配置iSCSI目标发现的更多信息,请参阅iscsiadmiscsid的手册页。 /etc/iscsi/iscsid.conf文件还包含有关正确配置语法的示例。

配置ISCSI offload和接口绑定

本章介绍如何设置iSCSI接口,以便在使用软件iSCSI时将会话绑定到NIC端口。 它还描述了如何设置用于支持卸载的网络设备的接口。

可以将网络子系统配置为确定iSCSI接口应该用于绑定的路径/NIC。例如,如果门户和NIC是在不同的子网上设置的,那么就不需要手动配置iSCSI接口来进行绑定。

在尝试配置iSCSI接口进行绑定之前,请先运行以下命令:

# ping -I ethX target_IP

如果ping失败,那么您将无法将会话绑定到NIC。 如果是这种情况,请首先检查网络设置。

查看可用的iface配置

以下iSCSI启动器实现支持iSCSI offload和接口绑定:

软件iSCSI

  此堆栈为每个会话分配一个iSCSI主机实例(即scsi_host),每个会话只有一个连接。 因此,/sys/class_scsi_host/proc scsi 将为您登录的每个连接/会话报告 scsi_host

Offload iSCSI

  此堆栈为每个PCI设备分配一个scsi_host。 因此,主机总线适配器上的每个端口将显示为不同的PCI设备,每个HBA端口具有不同的scsi_host

为了管理这两种类型的启动器实现,iscsiadm使用iface结构。使用此结构,必须在 /var/lib/iscsi/ifaces 中输入用于绑定会话的每个HBA端口、软件iSCSI或网络设备(ethX)的iface配置。

要查看可用的iface配置,请运行iscsiadm -m iface。 这将显示以下格式的iface信息:

iface_name 
transport_name,hardware_address,ip_address,net_ifacename,initiator_name

有关每个值/设置的说明,请参阅下表。

表 iface设置

设置描述
iface_nameiface配置名称。
transport_name驱动的名称
hardware_addressMAC地址
ip_address此端口使用的IP地址
net_iface_name用于软件iSCSI会话的vlan或别名绑定的名称。 对于iSCSI offload,net_iface_name将为 <empty> ,因为此值在重启时不会持久。
initiator_name此设置用于覆盖启动器的默认名称,该名称在 /etc/iscsi/initiatorname.iscsi 中定义

iscsiadm -m iface命令的示例输出

以下是iscsiadm -m iface命令的示例输出:

iface0 qla4xxx,00:c0:dd:08:63:e8,20.15.0.7,default,iqn.2005-
06.com.redhat:madmax
iface1 qla4xxx,00:c0:dd:08:63:ea,20.15.0.9,default,iqn.2005-
06.com.redhat:madmax

对于软件iSCSI,每个iface配置必须具有唯一的名称(少于65个字符)。 支持offload的网络设备的iface_nametransport_name.hardware_name格式显示。

使用Chelsio网卡的iscsiadm -m iface输出

例如,使用Chelsio网卡的系统上的iscsiadm -m iface的示例输出可能显示为:

default tcp,<empty>,<empty>,<empty>,<empty>
iser iser,<empty>,<empty>,<empty>,<empty>
cxgb3i.00:07:43:05:97:07 cxgb3i,00:07:43:05:97:07,<empty>,<empty>,
<empty>

还可以以更友好的方式显示特定iface配置的设置。 为此,请使用选项 -I iface_name。 这将以以下格式显示设置:

iface.setting = value

使用带有Chelsio聚合网络适配器的iface设置

使用前面的示例,同一Chelsio聚合网络适配器的iface设置(即iscsiadm -m iface -I cxgb3i.00:07:43:05:97:07)将显示为:

# BEGIN RECORD 2.0-871
iface.iscsi_ifacename = cxgb3i.00:07:43:05:97:07
iface.net_ifacename = <empty>
iface.ipaddress = <empty>
iface.hwaddress = 00:07:43:05:97:07
iface.transport_name = cxgb3i
iface.initiatorname = <empty>
# END RECORD

为软件iSCSI配置iface

如前所述,每个将用于绑定会话的网络对象都需要iface配置。

之前

要为软件iSCSI创建iface配置,请运行以下命令:

# iscsiadm -m iface -I iface_name --op=new

这将使用指定的 iface_name 创建一个新的iface配置。 如果现有的iface配置已经具有相同的 iface_name,那么它将被一个新的空的覆盖。

要配置iface配置的特定设置,请使用以下命令:

# iscsiadm -m iface -I iface_name --op=update -n iface.setting -v hw_address

示例 设置iface0的MAC地址

例如,要将iface0的MAC地址(hardware_address)设置为00:0F:1F:92:6B:BF,请运行:

# iscsiadm -m iface -I iface0 --op=update -n iface.hwaddress -v 00:0F:1F:92:6B:BF

警告

不要使用defaultiser作为iface名称。 这两个字符串都是iscsiadm用于向后兼容的特殊值。 任何名为defaultiser的手动创建的iface配置都将禁用向后兼容性。

为iSCSI offload配置iface

默认情况下,iscsiadm为每个端口创建iface配置。 要查看可用的iface配置,请在软件iSCSI中使用相同的命令:iscsiadm -m iface

在使用网卡的iface进行iSCSI offload之前,首先将offload接口的iface.ipaddress值设置为接口应使用的启动器IP地址:

  • 对于使用be2iscsi驱动程序的设备,在BIOS设置屏幕中配置IP地址。

  • 对于所有其它设备,要配置iface的IP地址,请使用:

    # iscsiadm -m iface -I iface_name -o update -n iface.ipaddress -v initiator_ip_address
    

示例 设置Chelsio卡的iface IP地址

例如,要在使用iface名称为cxgb3i.00:07:43:05:97:07的卡时将iface IP地址设置为20.15.0.66,请使用:

# iscsiadm -m iface -I cxgb3i.00:07:43:05:97:07 -o update -n iface.ipaddress -v 20.15.0.66

将iface绑定/解绑到门户

每当使用iscsiadm扫描互连时,它将首先检查 /var/lib/iscsi/ifaces中每个iface配置的iface.transport设置。 然后,iscsiadm实用程序将发现的门户绑定到iface.transporttcp的任何iface

出于兼容性原因,实现了此行为。 要覆盖它,请使用 -I iface_name指定要绑定到 iface的门户,如下所示:

# iscsiadm -m discovery -t st -p target_IP:port -I iface_name -P 1

默认情况下,iscsiadm实用程序不会自动将任何门户绑定到使用offload的iface配置。 这是因为这样的iface配置不会将iface.transport设置为tcp。 因此,iface配置需要手动绑定到已发现的门户。

还可以防止门户绑定到任何现有的iface。 为此,请使用default作为iface_name,如下所示:

# iscsiadm -m discovery -t st -p IP:port -I default -P 1

要删除一个目标和iface之间的绑定,请使用:

# iscsiadm -m node -targetname proper_target_name -I iface0 --op=delete

要删除特定iface的所有绑定,请使用:

# iscsiadm -m node -I iface_name --op=delete

要删除特定门户的绑定(例如,对于Equallogic目标),请使用:

# iscsiadm -m node -p IP:port -I iface_name --op=delete

注意

如果 /var/lib/iscsi/iface中没有定义iface配置且未使用 -I选项,则iscsiadm将允许网络子系统决定特定门户应使用哪个设备。

扫描ISCSI互连

对于iSCSI,如果目标发送iSCSI异步事件,指示添加了新存储,则扫描将自动完成。对于iSCSI,如果目标发送iSCSI异步事件,指示添加了新存储,则扫描将自动完成。

但是,如果目标不发送iSCSI异步事件,则需要使用iscsiadm实用程序手动扫描它们。 但是,在执行此操作之前,您需要首先检索正确的 –targetname–portal值。 如果您的设备模型仅支持每个目标的单个逻辑单元和门户,请使用iscsiadm向主机发出sendtargets命令,如下所示:

# iscsiadm -m discovery -t sendtargets -p target_IP:port

输出将以以下格式显示:

target_IP:port,target_portal_group_tag proper_target_name

示例 使用iscsiadm发出sendtargets命令

例如,在具有iqn.1992-08.com.netapp:sn.33615311proper_target_name10.15.85.19:3260target_IP:port的目标上,输出可能显示为:

10.15.84.19:3260,2 iqn.1992-08.com.netapp:sn.33615311
10.15.85.19:3260,3 iqn.1992-08.com.netapp:sn.33615311

在此示例中,目标有两个门户,每个门户使用target_ip:port*** 10.15.84.19:326010.15.85.19:3260*。

要查看将为每个会话使用哪种iface配置,请添加 -P 1选项。 此选项还将以树格式打印会话信息,如下所示:

Target:proper_target_name
    Portal:target_IP:port,target_portal_group_tag
        Iface Name:iface_name

示例 查看iface配置

例如,使用iscsiadm -m discovery -t sendtargets -p 10.15.85.19:3260 -P 1,输出可能显示为:

Target:iqn.1992-08.com.netapp:sn.33615311
    Portal:10.15.84.19:3260,2
        Iface Name:iface2
    Portal:10.15.85.19:3260,3
        Iface Name:iface2

这意味着目标iqn.1992-08.com.netapp:sn.33615311将使用iface2作为其iface配置。

对于某些设备模型,单个目标可能具有多个逻辑单元和门户。 在这种情况下,首先向主机发出sendtargets命令,以在目标上找到新的门户。 然后,使用以下命令重新扫描现有会话:

# iscsiadm -m session --rescan

您还可以通过指定会话的 SID 值来重新扫描特定会话,如下所示:

# iscsiadm -m session -r SID --rescan

如果您的设备支持多个目标,则需要向主机发出sendtargets命令以查找每个目标的新门户。 使用**–rescan**选项重新扫描现有会话以发现现有会话上的新逻辑单元。

重要提示

用于检索 –targetname–portal值的sendtargets命令会覆盖 /var/lib/iscsi/nodes数据库的内容。 然后使用 /etc/iscsi/iscsid.conf中的设置重新填充此数据库。 但是,如果会话当前已登录并正在使用,则不会发生这种情况。

要安全地添加新目标/门户或删除旧目标/门户,请分别使用 -o new-o delete选项。 例如,要添加新目标/门户而不覆盖 /var/lib/iscsi/nodes,请使用以下命令:

# iscsiadm -m discovery -t st -p target_IP -o new

要删除目标在发现期间没有显示的**/var/lib/iscsi/nodes**条目,请使用:

# iscsiadm -m discovery -t st -p target_IP -o delete

您还可以同时执行这两项任务,如下所示:

# iscsiadm -m discovery -t st -p target_IP -o delete -o new

sendtargets命令将产生以下输出:

ip:port,target_portal_group_tag proper_target_name

示例 sendtargets命令的输出

例如,给定具有单个目标,逻辑单元和门户的设备,并使用equallogic-iscsi1作为 target_name,输出应类似于以下内容:

10.16.41.155:3260,0 iqn.2001-05.com.equallogic:6-8a0900-ac3fe0101-
63aff113e344a4a2-dl585-03-1

请注意,proper_target_nameip:port ,target_portal_group_tag 与“iSCSI API”部分中相同名称的值相同。

此时,您现在拥有手动扫描iSCSI设备所需的正确 –targetname–portal值。 为此,请运行以下命令:

# iscsiadm --mode node --targetname proper_target_name --portal ip:port,target_portal_group_tag  --login

示例 完整的iscsiadm命令

使用我们之前的示例(其中proper_target_nameequallogic-iscsi1),完整命令将是:

# iscsiadm --mode node --targetname  iqn.2001-05.com.equallogic:6-8a0900-ac3fe0101-63aff113e344a4a2-dl585-03-1  --portal 10.16.41.155:3260,0 --login

登录到ISCSI目标

如章节“iSCSI”中所述,必须运行iSCSI服务才能发现或登录目标。 要启动iSCSI服务,请运行:

# systemctl start iscsi

执行此命令时,iSCSI init脚本将自动登录到node.startup设置配置为automatic的目标。 这是所有目标的node.startup的默认值。

要防止自动登录目标,请将node.startup设置为manual。 为此,请运行以下命令:

# iscsiadm -m node --targetname proper_target_name -p target_IP:port -o update -n node.startup -v manual

删除整个记录也会阻止自动登录。 为此,请运行:

# iscsiadm -m node --targetname proper_target_name -p target_IP:port -o delete

要从网络上的iSCSI设备自动挂载文件系统,请使用 _netdev选项在 /etc/fstab中为挂载添加一个分区条目。例如,要在启动期间自动将iSCSI设备sdb挂载到 /mount/iscsi,请将以下代码行添加到 /etc/fstab中:

/dev/sdb /mnt/iscsi ext3 _netdev 0 0

要手动登录iSCSI目标,请使用以下命令:

# iscsiadm -m node --targetname proper_target_name -p target_IP:port -l

proper_target_nametarget_IP:port 指的是目标的全名和IP地址/端口组合。 有关更多信息,请参见“iSCSI API”部分和“扫描iSCSI互连”部分。

调整联机逻辑单元(LUN)的大小

在大多数情况下,完全调整在线逻辑单元的大小涉及两件事:调整逻辑单元本身的大小并反映相应多路径设备的大小更改(如果在系统上启用了多路径)。

要调整在线逻辑单元的大小,请首先通过存储设备的阵列管理界面修改逻辑单元大小。 此过程因每个阵列而异; 因此,请参阅存储阵列供应商文档以获取更多相关信息。

注意

为了调整在线文件系统的大小,文件系统不得驻留在分区设备上。

调整光纤通道逻辑单元的大小

修改在线逻辑单元大小后,重新扫描逻辑单元以确保系统检测到更新的大小。 要对光纤通道逻辑单元执行此操作,请使用以下命令:

# echo 1 > /sys/block/sdX/device/rescan

重要提示

要在使用多路径的系统上重新扫描光纤通道逻辑单元,请为每个sd设备(即sd1sd2等)执行上述命令,该命令表示多路径逻辑单元的路径。 要确定哪些设备是多路径逻辑单元的路径,请使用multipath -ll; 然后,找到与要调整大小的逻辑单元匹配的条目。 建议您参考每个条目的WWID,以便更容易找到哪个匹配正在调整大小的逻辑单元。

调整iSCSI逻辑单元的大小

修改在线逻辑单元大小后,重新扫描逻辑单元以确保系统检测到更新的大小。 要对iSCSI设备执行此操作,请使用以下命令:

# iscsiadm -m node --targetname target_name -R

将***target_name***替换为设备所在目标的名称。

注意

您还可以使用以下命令重新扫描iSCSI逻辑单元:

# iscsiadm -m node -R -I interface

interface 替换为已调整大小的逻辑单元的相应接口名称(例如,iface0)。 此命令执行两个操作:

  • 它以与命令echo“ - - - ”> /sys/class/scsi_host/host/scan相同的方式扫描新设备(请参见章节“扫描iSCSI互连”)。
  • 它以与命令echo 1> /sys/block/sdX/device/rescan相同的方式重新扫描新的/修改的逻辑单元。 请注意,此命令与用于重新扫描光纤通道逻辑单元的命令相同。

更新多路径设备的大小

如果在系统上启用了多路径,则还需要将逻辑单元大小的更改反映到逻辑单元的相应多路径设备(在调整逻辑单元大小后)。 这可以通过multipathd完成。 为此,请首先确保使用systemctl status multipathd运行multipathd。 确认multipathd可操作后,运行以下命令:

# multipathd -k"resize map multipath_device"

multipath_device 变量是 /dev/mapper中设备的相应多路径条目。 根据系统上多路径的设置方式, multipath_device 可以是以下两种格式之一:

  • mpathX,其中X是设备的相应条目(例如,mpath0
  • WWID; 例如,3600508b400105e210000900000490000

要确定哪个多路条目对应于已调整大小的逻辑单元,请运行multipath -ll。 这将显示系统中所有现有多路径条目的列表,以及相应设备的主要和次要编号。

重要提示

如果有任何排队到 multipath_device 的命令,请不要使用multipathd -k“resize map multipath_device”。 也就是说,当 no_path_retry 参数(在 /etc/multipath.conf中)设置为“queue”并且没有到设备的活动路径时,不要使用此命令。

有关多路径的更多信息,请参阅[Red Hat Enterprise Linux 7 DM多路径指南]:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/dm_multipath/index

更改在线逻辑单元的读/写状态

某些存储设备为用户提供了将设备状态从读/写(R/W)更改为只读(RO)以及从RO更改为R/W的功能。 这通常通过存储设备上的管理接口来完成。 进行更改时,操作系统不会自动更新其设备状态视图。 按照本章中描述的步骤使操作系统了解更改。

运行以下命令,将XYZ替换为所需的设备标识符,以确定操作系统当前设备的R/W状态视图:

# blockdev --getro /dev/sdXYZ

以下命令也适用于Red Hat Enterprise Linux 7:

# cat /sys/block/sdXYZ/ro 1 = read-only 0 = read-write

使用multipath时,请参考multipath -ll命令的第二行输出中的ro或rw字段。 例如:

36001438005deb4710000500000640000 dm-8 GZ,GZ500
[size=20G][features=0][hwhandler=0][ro]
\_ round-robin 0 [prio=200][active]
 \_ 6:0:4:1  sdax 67:16  [active][ready]
 \_ 6:0:5:1  sday 67:32  [active][ready]
\_ round-robin 0 [prio=40][enabled]
 \_ 6:0:6:1  sdaz 67:48  [active][ready]
 \_ 6:0:7:1  sdba 67:64  [active][ready]

要更改R/W状态,请使用以下过程:

  1. 要将设备从RO移至R/W,请参阅步骤2。

    要将设备从R/W移至RO,请确保不会再发出写入。 通过停止应用程序或通过使用适当的特定于应用程序的操作来执行此操作。

    使用以下命令确保完成所有未完成的写入I/O:

    # blockdev --flushbufs /dev/device
    

    用所需的指示符替换设备; 对于DM多路径,这是设备在 /dev /mapper 中的条目。 例如,/dev/mapper/mpath3

  2. 使用存储设备的管理界面将逻辑单元的状态从R/W更改为RO,或从RO更改为R/W. 每个阵列的程序都不同。 有关更多信息,请参阅适用的存储阵列供应商。

  3. 执行设备的重新扫描,以更新操作系统的设备R/W状态视图。 如果使用DM多路径,请在发出命令告知multipath重新加载其设备映射之前,对设备的每个路径执行此重新扫描。

“重新扫描逻辑单元”一节中对此过程进行了详细说明。

重新扫描逻辑单元

修改在线逻辑单元读/写状态后,如“更改在线逻辑单元的读/写状态”一节所述,重新扫描逻辑单元以确保系统使用以下命令检测更新状态:

# echo 1 > /sys/block/sdX/device/rescan

要重新扫描使用多路径的系统上的逻辑单元,请为表示多路径逻辑单元路径的每个sd设备执行上述命令。 例如,在sd1,sd2和所有其它sd设备上运行该命令。 要确定哪些设备是多路径单元的路径,请使用multipath -ll,然后找到与要更改的逻辑单元匹配的条目。

示例 使用multipath -ll命令

例如,上面的multipath -ll显示具有WWID为36001438005deb4710000500000640000的LUN的路径。 在这种情况下,请输入:

# echo 1 > /sys/block/sdax/device/rescan
# echo 1 > /sys/block/sday/device/rescan
# echo 1 > /sys/block/sdaz/device/rescan
# echo 1 > /sys/block/sdba/device/rescan
更新多路径设备的R/W状态

如果启用了多路径,则在重新扫描逻辑单元后,其状态的更改将需要反映在逻辑单元的相应多路径驱动器中。 通过使用以下命令重新加载多路径设备映射来执行此操作:

# multipath -r

然后可以使用multipath -ll命令确认更改。

文档

更多信息可以在Red Hat知识库中找到。 要访问它,请导航到https://www.redhat.com/wapps/sso/login.html?redirect=https://access.redhat.com/knowledge/并登录。然后访问https://access.redhat.com/kb/docs/DOC-32850上的文章。

通过RESCAN-SCSI-BUS.SH添加/删除逻辑单元

sg3_utils包提供rescan-scsi-bus.sh脚本,该脚本可以根据需要自动更新主机的逻辑单元配置(在将设备添加到系统之后)。 rescan-scsi-bus.sh脚本还可以在支持的设备上执行issue_lip。 有关如何使用此脚本的更多信息,请参阅rescan-scsi-bus.sh --help

要安装sg3_utils软件包,请运行yum install sg3_utils

rescan-scsi-bus.sh的已知问题

使用rescan-scsi-bus.sh脚本时,请注意以下已知问题:

  • 为了使rescan-scsi-bus.sh正常工作,LUN0必须是第一个映射的逻辑单元。 rescan-scsi-bus.sh只能检测第一个映射的逻辑单元(如果它是LUN0)。 rescan-scsi-bus.sh将无法扫描任何其它逻辑单元,除非它检测到第一个映射的逻辑单元,即使您使用 –nooptscan选项也是如此。
  • 如果第一次映射逻辑单元,则竞争条件要求rescan-scsi-bus.sh运行两次。 在第一次扫描期间,rescan-scsi-bus.sh仅添加LUN0; 在第二次扫描中添加所有其它逻辑单元。
  • 当使用 –remove 选项时,rescan-scsi-bus.sh脚本中的缺陷错误地执行了识别逻辑单元大小更改的功能。
  • rescan-scsi-bus.sh脚本无法识别ISCSI逻辑单元删除。

修改链接丢失行为

本节介绍如何修改使用光纤通道或iSCSI协议的设备的链路丢失行为。

光纤通道(FC)

如果驱动程序实现了传输dev_loss_tmo回调,则在检测到传输问题时将阻止通过链接对设备的访问尝试。 要验证设备是否被阻止,请运行以下命令:

# cat /sys/block/device/device/state

如果设备被阻止,此命令将返回blocked。 如果设备运行正常,此命令将返回 running

过程 确定远程端口的状态

  1. 要确定远程端口的状态,请运行以下命令:

    # cat /sys/class/fc_remote_port/rport-H:B:R/port_state
    
  2. 当远程端口(以及通过它访问的设备)被阻止时,此命令将返回Blocked。 如果远程端口正常运行,该命令将返回Online

  3. 如果在dev_loss_tmo秒内未解决问题,则将取消阻止rport和设备,并且该设备上运行的所有I/O(以及发送到该设备的任何新I/O)都将失败。

过程更改dev_loss_tmo

  • 要更改dev_loss_tmo值,可echo 所需值到文件。 例如,要将dev_loss_tmo设置为30秒,请运行:

    # echo 30 > /sys/class/fc_remote_port/rport-H:B:R/dev_loss_tmo
    

有关dev_loss_tmo的更多信息,请参见“光纤通道API”一节。

当链路丢失超过dev_loss_tmo时,scsi_devicesdN设备将被删除。通常,Fiber Channel class将保持设备原样,即 /dev/sdx将保持为 /dev/sdx。 这是因为目标绑定是由光纤通道驱动程序保存的,因此当目标端口返回时,SCSI地址将被忠实地重新创建。但是,不能保证这一点;只有在LUN的存储盒配置没有进行额外更改的情况下,sdx才会被恢复。

具有dm-multipath的iSCSI设置

如果实现了dm-multipath,建议将iSCSI计时器设置为立即将命令推迟到多路径层。 要配置它,请将以下行嵌套在 {in /etc/multipath.conf中的device

features  "1 queue_if_no_path"

这可确保在dm-multipath层中所有路径都出现故障时重试I/O错误并排队。

您可能需要进一步调整iSCSI计时器,以便更好地监控SAN的问题。 您可以配置的可用iSCSI计时器是NOP-Out Interval/Timeouts和replacement_timeout,将在以下各节中讨论。

NOP-Out Interval/Timeout

为了帮助监视SAN问题,iSCSI层向每个目标发送NOP-Out请求。如果NOP-Out请求超时,iSCSI层的响应方式是使任何正在运行的命令失败,并指示SCSI层在可能的情况下重新排队这些命令。

当使用dm-multipath时,SCSI层将使那些运行中的命令失败并将它们推迟到多路径层。 然后多路径层在另一条路径上重试那些命令。 如果未使用dm-multipath,则会在完全失败之前重试这些命令5次。

默认情况下,NOP-Out请求之间的间隔为10秒。 要调整此项,请打开 /etc/iscsi/iscsid.conf 并编辑以下行:

node.conn[0].timeo.noop_out_interval = [interval value]

设置后,iSCSI层将每隔*[interval value]*秒向每个目标发送一个NOP-Out请求。

默认情况下,NOP-Out请求在10秒内超时。 要调整此项,请打开**/etc/iscsi/iscsid.conf**并编辑以下行:

node.conn[0].timeo.noop_out_timeout = [timeout value]

这将iSCSI层设置为在 [timeout value] 秒后超时NOP-Out请求

SCSI错误处理程序

如果SCSI错误处理程序正在运行,则当NOP-Out请求在该路径上超时时,路径上运行的命令不会立即失败。 相反,这些命令将在replacement_timeout秒后失败。 有关replacement_timeout的更多信息,请参见“replacement_timeout”部分。

要验证SCSI错误处理程序是否正在运行,请运行:

# iscsiadm -m session -P 3
replacement_timeout

replacement_timeout控制iSCSI层在失败任何命令之前应等待超时路径/会话重新建立自身的时间。 默认的replacement_timeout值为120秒。

要调整replacement_timeout,请打开**/etc/iscsi/iscsid.conf**并编辑以下行:

node.session.timeo.replacement_timeout = [replacement_timeout]

/etc/multipath.conf中的1 queue_if_no_path选项将iSCSI计时器设置为立即将命令推迟到多路径层(请参见章节“使用dm-multipath的iSCSI设置”)。 此设置可防止I/O错误传播到应用程序; 因此,您可以将replacement_timeout设置为15-20秒。

通过配置较低的replacement_timeout,I/O可以快速发送到新路径并执行(如果发生NOP-Out超时),而iSCSI层会尝试重新建立失败的路径/会话。 如果所有路径超时,则多路径和设备映射器层将根据 /etc/multipath.conf 中的设置而不是 /etc/iscsi/iscsid.conf 在内部对I/O进行排队。

重要提示

无论您的考虑因素是故障转移速度还是安全性,replacement_timeout的建议值都将取决于其他因素。 这些因素包括网络,目标和系统工作负载。 因此,建议您在将任何新配置应用于任务关键型系统之前,对replacements_timeout进行全面测试。

iSCSI Root

直接通过iSCSI磁盘访问根分区时,应设置iSCSI计时器,以便iSCSI层有几次机会尝试重新建立路径/会话。 此外,命令不应快速重新排队到SCSI层。 这与实现dm-multipath时应该采取的措施相反。

首先,应禁用NOP-Outs。 您可以通过将NOP-Out间隔和超时设置为零来完成此操作。 要设置它,请打开 /etc/iscsi/iscsid.conf并进行如下编辑:

node.conn[0].timeo.noop_out_interval = 0
node.conn[0].timeo.noop_out_timeout = 0

与此一致,replacement_timeout应设置为高数字。 这将指示系统等待很长时间以使路径/会话重新建立自身。 要调整replacement_timeout,请打开 /etc/iscsi/iscsid.conf 并编辑以下行:

node.session.timeo.replacement_timeout = replacement_timeout

配置 /etc/iscsi/iscsid.conf后,必须重新发现受影响的存储。这将允许系统加载和使用 /etc/iscsi/iscsid.conf 中的任何新值。 有关如何发现iSCSI设备的更多信息,请参见“扫描iSCSI互连”一节。

配置特定会话的超时

您还可以为特定会话配置超时并使其非持久性(而不是使用 /etc/iscsi/iscsid.conf)。 为此,请运行以下命令(相应地替换变量):

# iscsiadm -m node -T target_name -p target_IP:port -o update -n node.session.timeo.replacement_timeout -v $timeout_value

重要提示

对于涉及根分区访问的iSCSI会话,建议使用此处描述的配置。 对于涉及访问其它类型存储的iSCSI会话(即,在使用dm-multipath的系统中),请参见“使用dm-multipath进行iSCSI设置”一节。

控制SCSI命令计时器和设备状态

Linux SCSI层在每个命令上设置一个计时器。 当此计时器到期时,SCSI层将停顿主机总线适配器(HBA)并等待所有未完成的命令超时或完成。 之后,SCSI层将激活驱动程序的错误处理程序。

触发错误处理程序时,它会按顺序尝试以下操作(直到成功执行一个操作):

  1. 中止命令。

  2. 重置设备。

  3. 重置总线。

  4. 重置主机。

如果所有这些操作都失败,则设备将设置为offline状态。 发生这种情况时,该设备的所有I / O都将失败,直到问题得到纠正并且用户将设备设置为running

但是,如果设备使用FC协议并且rport被阻止,则该过程是不同的。在这种情况下,驱动程序等待几秒钟以使rport再次联机,然后再激活错误处理程序。 这可以防止设备因临时传输问题而脱机。

设备状态

要显示设备的状态,请使用:

# cat /sys/block/device-name/device/state

要将设备设置为running状态,请使用:

# echo running > /sys/block/device-name/device/state

命令计时器

要控制命令计时器,请修改**/sys/block/device-name/device/timeout**文件:

# echo value > /sys/block/device-name/device/timeout

使用要实现的超时值(以秒为单位)替换命令中的 value

故障排除在线存储配置

本节提供用户在线存储重新配置期间遇到的常见问题的解决方案。

逻辑单元删除状态不反映在主机上。

  在配置的文件管理器上删除逻辑单元时,更改不会反映在主机上。 在这种情况下,当使用dm-multipath时,lvm命令将无限期挂起,因为逻辑单元现在已变得陈旧

要解决此问题,请执行以下过程(处理陈旧的逻辑单元):

  1. 确定 /etc/lvm/cache/.cache中哪些mpath链接条目特定于陈旧逻辑单位。 为此,请运行以下命令:
# ls  -l /dev/mpath | grep stale-logical-unit

示例 确定特定的mpath链接条目

例如,如果 stale-logical-unit 是3600d0230003414f30000203a7bc41a00,可能会出现以下结果:

lrwxrwxrwx 1 root root 7 Aug  2 10:33 /3600d0230003414f30000203a7bc41a00 -> ../dm-4
lrwxrwxrwx 1 root root 7 Aug  2 10:33 /3600d0230003414f30000203a7bc41a00p1 -> ../dm-5

这意味着3600d0230003414f30000203a7bc41a00映射到两个mpath链接:dm-4dm-5

  1. 接下来,打开 /etc/lvm/cache/.cache 。 删除包含 stale-logical-unit 的所有行以及 stale-logical-unit 映射到的mpath链接。

    示例 删除相关行

    使用上一步中的相同示例,您需要删除的行是:

    /dev/dm-4 
    /dev/dm-5 
    /dev/mapper/3600d0230003414f30000203a7bc41a00
    /dev/mapper/3600d0230003414f30000203a7bc41a00p1
    /dev/mpath/3600d0230003414f30000203a7bc41a00
    /dev/mpath/3600d0230003414f30000203a7bc41a00p1
    

使用EH_DEADLINE配置错误恢复的最长时间

重要提示

在大多数情况下,不需要启用 eh_deadline 参数。在某些特定情况下,使用 eh_deadline 参数可能很有用,例如,如果在光纤通道交换机和目标端口之间发生链路丢失,并且主机总线适配器(HBA)未收到已注册的状态更改通知(RSCN)。在这种情况下,I/O请求和错误恢复命令都是超时的,而不是遇到错误。在这种环境中设置 eh_deadline 可以设置恢复时间的上限,这使得失败的I/O可以在另一条可用路径上通过多路径进行重试。

但是,如果启用了RSCN,则HBA不会注册链接变得不可用,或者两者都没有, eh_deadline 功能不会提供额外的好处,因为I/O和错误恢复命令会立即失败,这允许多路径重试。

SCSI主机对象 eh_deadline 参数使您可以配置SCSI错误处理机制在停止和重置整个HBA之前尝试执行错误恢复的最长时间。

eh_deadline 的值以秒为单位指定。 默认设置为off,禁用时间限制并允许进行所有错误恢复。 除了使用 sysfs之外,还可以使用 scsi_mod.eh_deadline 内核参数为所有SCSI HBA设置默认值。

请注意,当 eh_deadline 到期时,HBA会重置,这会影响该HBA上的所有目标路径,而不仅仅是失败的路径。 因此,如果某些冗余路径由于其它原因而不可用,则可能发生I/O错误。 仅当所有目标上都具有完全冗余的多路径配置时,才启用 eh_deadline

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值