Too young, too simple. Sometimes, naive & stupid

Linux网络存储管理

在操作系统运行时,通常需要添加,删除或重新调整存储设备的大小,而无需重新引导。本章概述在系统运行时可用于在Red Hat Enterprise Linux 7主机系统上重新配置存储设备的过程。它涵盖了iSCSI和光纤通道存储互连; 其他互连类型可能会在未来添加。

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

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

在线存储重新配置必须小心。过程中的系统故障或中断可能会导致意外的结果。红帽建议您在更改操作期间尽可能减少系统负载。这将减少I / O错误,内存不足错误或在配置更改期间发生的类似错误的可能性。以下部分提供了更具体的指导方针。

另外,Red Hat建议您在重新配置在线存储之前备份所有数据。

Target 设置

帽企业版Linux 7使用targetcli shell作为查看,编辑和保存Linux-IO目标配置的前端,而无需直接操作内核目标的配置文件。targetcli工具是一个命令行界面,允许管理员将由文件,卷,本地SCSI设备或RAM磁盘支持的本地存储资源导出到远程系统。targetcli工具具有基于树的布局,包含内置的选项卡完成,并提供完整的自动完成支持和内联文档。

targetcli层次结构并不总是与内核接口完全匹配,因为targetcli在可能的情况下被简化了。

要确保所做的更改targetcli是持久性的,请启动并启用目标服务:

1
2
# systemctl start target
# systemctl enable target

安装和运行targetcli

要安装targetcli, 使用:

1
# yum install targetcli

启动 target 服务:

1
# systemctl start target

配置target 开机启动:

1
# systemctl enable target

使用targetcli命令,然后使用该ls命令进行树形界面的布局:

1
2
3
4
5
6
7
8
9
10
11
# targetcli
:
/> ls
o- /........................................[...]
o- backstores.............................[...]
| o- block.................[Storage Objects: 0]
| o- fileio................[Storage Objects: 0]
| o- pscsi.................[Storage Objects: 0]
| o- ramdisk...............[Storage Ojbects: 0]
o- iscsi...........................[Targets: 0]
o- loopback........................[Targets: 0]

例如,在红帽企业版Linux 7.0中,使用targetcliBash命令targetcli iscsi/ create不起作用,并且不会返回错误。从红帽企业版Linux 7.1开始,提供了一个错误状态代码来使用targetclishell脚本更有用。

创建一个Backstore

后台支持在本地机器上存储导出的LUN数据的不同方法。创建一个存储对象定义了backstore使用的资源。

在红帽企业Linux 6中,术语’backing-store’用来指代创建的映射。然而,为了避免混淆“后端存储”的各种方式,在红帽企业版Linux 7中,术语“存储对象”是指创建的映射,“后端”用于描述不同类型的后备设备。

LIO支持的后端设备是:

  • FILEIO(Linux文件备份存储)

    FILEIO存储对象可以支持write_backwrite_thru操作。在write_back使本地文件系统缓存。这样可以提高性能,但会增加数据丢失的风险。建议使用write_back=false禁用,write_back以支持write_thru

要创建文件夹存储对象,请运行该命令。例如: /backstores/fileio create *file_name file_location file_size* write_back=false

例如:

1
2
/> /backstores/fileio create file1 /tmp/disk1.img 200M write_back=false
Created fileio file1 with size 209715200
  • BLOCK(Linux BLOCK设备)

    块驱动程序允许使用任何在/sys/blockLIO中使用的块设备。这包括物理设备(例如,HDD,SSD,CD,DVD)和逻辑设备(例如软件或硬件RAID卷或LVM卷)。

BLOCK后台通常提供最好的性能。

要使用/dev/sdb块设备创建BLOCK backstore ,请使用以下命令:

1
2
3
/> /backstores/block create name=block_backend dev=/dev/sdb
Generating a wwn serial.
Created block storage object block_backend using /dev/sdb.
  • PSCSI(Linux直通SCSI设备)

    任何支持直接传递SCSI命令而无需SCSI模拟的存储对象,以及与lsscsi一起出现的基础SCSI设备/proc/scsi/scsi(如SAS硬盘驱动器)都可以配置为后端存储。此子系统支持SCSI-3及更高版本。

    PSCSI只能由高级用户使用。高级SCSI命令(如用于量测逻辑单元分配(ALUAs)或永久保留(例如VMware ESX和vSphere使用的那些))通常不会在设备固件中实现,并可能导致故障或崩溃。如有疑问,请使用BLOCK进行生产设置。

    要为物理SCSI设备创建PSCSI后端存储,在本例中使用的TYPE_ROM设备/dev/sr0使用:

1
2
3
backstores/pscsi/ create name=pscsi_backend dev=/dev/sr0
Generating a wwn serial.
Created pscsi storage object pscsi_backend using /dev/sr0
  • 内存拷贝RAM磁盘(Linux RAMDISK_MCP)

    内存拷贝RAM磁盘(ramdisk)为RAM磁盘提供完整的SCSI模拟,并为启动器使用内存拷贝分离内存映射。这为多会话提供了能力,并且对于用于生产目的的快速,易变的大容量存储特别有用。

    要创建1GB RAM磁盘后端存储,请使用以下命令:

1
2
3
/> backstores/ramdisk/ create name=rd_backend size=1GB
Generating a wwn serial.
Created rd_mcp ramdisk rd_backend with size 1GB.

创建 iSCSI Target

要创建一个iSCSI目标:

  1. 运行 targetcli.

  2. 进入iSCSI配置路径:

1
/> iscsi/

注意

cd命令也被接受来改变目录,以及简单地列出要移入的路径。

  1. 使用默认目标名称创建一个iSCSI目标。
1
2
3
4
/iscsi> create 
Created target
iqn.2003-01.org.linux-iscsi.hostname.x8664:sn.78b473f296ff
Created TPG1

或者使用指定的名称创建一个iSCSI目标。

1
2
3
/iscsi > create iqn.2006-04.com.example:444
Created target iqn.2006-04.com.example:444
Created TPG1
  1. 验证 ls 在列出目标时新创建的目标是否可见
1
2
3
4
5
6
7
/iscsi > ls
o- iscsi.......................................[1 Target]
o- iqn.2006-04.com.example:444................[1 TPG]
o- tpg1...........................[enabled, auth]
o- acls...............................[0 ACL]
o- luns...............................[0 LUN]
o- portals.........................[0 Portal]

配置 iSCSI 门户

要配置iSCSI门户,必须首先创建iSCSI目标并将其与TPG相关联。

Note

从Red Hat Enterprise Linux 7.1创建iSCSI目标时,也会创建一个默认门户。此门户设置为使用默认端口号(即0.0.0.0:3260)监听所有IP地址 。删除此项并只添加指定的门户,请使用 /iscsi/*iqn-name*/tpg1/portals delete ip_address=0.0.0.0 ip_port=3260创建一个新门户 .

创建一个iSCSI门户

  1. 进入TPG
1
/iscsi> iqn.2006-04.example:444/tpg1/
  1. 有两种方法可以创建一个门户网站:创建一个默认的门户网站,或创建一个门户网站来指定要监听的IP地址。

    创建默认门户使用默认的iSCSI端口3260,并允许目标侦听该端口上的所有IP地址。

1
2
3
4
/iscsi/iqn.20...mple:444/tpg1> portals/ create
Using default IP port 3260
Binding to INADDR_Any (0.0.0.0)
Created network portal 0.0.0.0:3260

要创建指定要侦听的IP地址的门户,请使用以下命令。

1
2
3
/iscsi/iqn.20...mple:444/tpg1> portals/ create 192.168.122.137
Using default IP port 3260
Created network portal 192.168.122.137:3260
  1. 使用ls命令验证新创建的门户是否可见。
1
2
3
4
5
6
/iscsi/iqn.20...mple:444/tpg1> ls
o- tpg.................................. [enambled, auth]
o- acls ......................................[0 ACL]
o- luns ......................................[0 LUN]
o- portals ................................[1 Portal]
o- 192.168.122.137:3260......................[OK]

配置LUN

要配置LUN,请先创建存储对象。

配置LUN

  1. 创建已经创建的存储对象的LUN。
1
2
3
4
5
6
7
8
/iscsi/iqn.20...mple:444/tpg1> luns/ create /backstores/ramdisk/ramdisk1
Created LUN 0.

/iscsi/iqn.20...mple:444/tpg1> luns/ create /backstores/block/block1
Created LUN 1.

/iscsi/iqn.20...mple:444/tpg1> luns/ create /backstores/fileio/file1
Created LUN 2.
  1. 显示更改.
1
2
3
4
5
6
7
8
9
/iscsi/iqn.20...mple:444/tpg1> ls
o- tpg.................................. [enambled, auth]
o- acls ......................................[0 ACL]
o- luns .....................................[3 LUNs]
| o- lun0.........................[ramdisk/ramdisk1]
| o- lun1.................[block/block1 (/dev/vdb1)]
| o- lun2...................[fileio/file1 (/foo.img)]
o- portals ................................[1 Portal]
o- 192.168.122.137:3260......................[OK]

请注意,与tgtd红帽企业版Linux 6中使用的情况相比,默认的LUN名称从0开始,而不是1 。

默认情况下,创建具有读写权限的LUN。如果在创建ACL后添加了新的LUN,该LUN将自动映射到所有可用的ACL。这可能会导致安全风险。使用以下过程以只读方式创建LUN。

创建一个只读LUN

  1. 要创建具有只读权限的LUN,请首先使用以下命令:
1
2
/> set global auto_add_mapped_luns=false
Parameter auto_add_mapped_luns is now 'false'.

这可以防止将LUN自动映射到现有的ACL,从而允许手动映射LUN。

  1. 接下来,使用该命令手动创建LUN ,iscsi/*target_iqn_name*/tpg1/acls/*initiator_iqn_name*/ create mapped_lun=*next_sequential_LUN_number* tpg_lun_or_backstore=*backstore*write_protect=1.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/> iscsi/iqn.2015-06.com.redhat:target/tpg1/acls/iqn.2015-06.com.redhat:initiator/ create mapped_lun=1 tpg_lun_or_backstore=/backstores/block/block2 write_protect=1
Created LUN 1.
Created Mapped LUN 1.
/> ls
o- / ...................................................... [...]
o- backstores ........................................... [...]
<snip>
o- iscsi ......................................... [Targets: 1]
| o- iqn.2015-06.com.redhat:target .................. [TPGs: 1]
| o- tpg1 ............................ [no-gen-acls, no-auth]
| o- acls ....................................... [ACLs: 2]
| | o- iqn.2015-06.com.redhat:initiator .. [Mapped LUNs: 2]
| | | o- mapped_lun0 .............. [lun0 block/disk1 (rw)]
| | | o- mapped_lun1 .............. [lun1 block/disk2 (ro)]
| o- luns ....................................... [LUNs: 2]
| | o- lun0 ...................... [block/disk1 (/dev/vdb)]
| | o- lun1 ...................... [block/disk2 (/dev/vdc)]
<snip>

mapped_lun1行现在在末尾有(ro)(与mapped_lun0(rw)不同),说明它是只读的。

配置ACL

为将要连接的每个启动器创建一个ACL。这会在启动器连接时强制进行身份验证,从而只允许向每个启动器公开LUN。通常每个启动器都可以独占访问LUN。目标和发起者都有唯一的识别名称。必须知道启动程序的唯一名称才能配置ACL。对于open-iscsi启动器,可以在 /etc/iscsi/initiatorname.iscsi 找到。

配置ACL

  1. 进入acls目录。
1
/iscsi/iqn.20...mple:444/tpg1> acls/
  1. 创建一个ACL。要么使用启动器中的启动器名称/etc/iscsi/initiatorname.iscsi,要么使用更容易记住的名称, 例如:
1
2
3
4
5
/iscsi/iqn.20...444/tpg1/acls> create iqn.2006-04.com.example.foo:888
Created Node ACL for iqn.2006-04.com.example.foo:888
Created mapped LUN 2.
Created mapped LUN 1.
Created mapped LUN 0.

上面的例子的行为取决于使用的设置。在这种情况下,使用全局设置auto_add_mapped_luns。这会自动将LUN映射到任何创建的ACL。

  1. 显示更改.
1
2
3
4
5
6
/iscsi/iqn.20...444/tpg1/acls> ls
o- acls .................................................[1 ACL]
o- iqn.2006-04.com.example.foo:888 ....[3 Mapped LUNs, auth]
o- mapped_lun0 .............[lun0 ramdisk/ramdisk1 (rw)]
o- mapped_lun1 .................[lun1 block/block1 (rw)]
o- mapped_lun2 .................[lun2 fileio/file1 (rw)]

配置以太网光纤通道 (FCoE) Target

确认基本FCoE设置已完成,并fcoeadm -i显示配置的FCoE接口。

配置FCoE目标

  1. 设置FCoE目标需要安装targetcli包及其相关性。

  2. 在FCoE接口上创建FCoE目标实例。

1
/> tcm_fc/ create 00:11:22:33:44:55:66:77

如果系统上存在FCoE接口,则选项卡完成后将create列出可用接口。如果没有,请确保fcoeadm -i显示活动接口。

  1. 将一个backstore映射到目标实例。

    将Backstore映射到目标实例的示例

1
/> tcm_fc/00:11:22:33:44:55:66:77
1
/> luns/ create /backstores/fileio/example2
  1. 允许从FCoE启动器访问LUN。
1
/> acls/ create 00:99:88:77:66:55:44:33

LUN现在应该可以被该启动器访问。

  1. 要使更改在重新启动时保持不变,请在出现提示时使用saveconfig命令并键入yes。如果没有这样做,配置将在重启后丢失。

  2. 通过输入exit或输入 ctrl+D 退出targetcli

使用 targetcli 删除对象

要删除一个backstore,请使用以下命令:

1
/> /backstores/backstore-type/backstore-name

要删除iSCSI目标的某些部分(如ACL),请使用以下命令:

1
/> /iscsi/iqn-name/tpg/acls/ delete iqn-name

要删除整个目标(包括所有ACL,LUN和门户),请使用以下命令:

1
/> /iscsi delete iqn-name

创建一个 ISCSI INITIATOR

在红帽企业版Linux 7中,默认情况下,iSCSI服务是延迟启动的:运行iscsiadm命令后服务启动。

创建一个iSCSI启动器

  1. 安装 iscsi-initiator-utils:
1
# yum install iscsi-initiator-utils
  1. 如果ACL 中给出了自定义名称,则相应地修改该/etc/iscsi/initiatorname.iscsi文件。例如:
1
2
# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2006-04.com.example.node1
  1. 发现 target:
1
2
# iscsiadm -m discovery -t st -p target-ip-address 
10.64.24.179:3260,1 iqn.2006-04.com.example:3260
  1. target 服务器上的TPG节点中设置用户创建的ACL:
1
/iscsi/iqn.20...scsi:444/tpg1> set attribute generate_node_acls=1
`exit` 退出
  1. 使用在步骤3中发现的目标IQN登录到目标:
1
2
3
# 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.

光纤通道

Fibre Channel API

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

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_tmoinfinity, 其值设置为 2,147,483,647 seconds, 或 68 years, 并且是 dev_loss_tmo最大值 .

    在红帽企业版Linux 7中,如果不设置该fast_io_fail_tmo选项,dev_loss_tmo则上限为600秒。默认情况下,fast_io_fail_tmo如果multipathd服务正在运行,在Red Hat Enterprise Linux 7中设置为5秒; 否则,设置为off

  • fast_io_fail_tmo:指定在将链接标记为“不良”之前等待的秒数。一旦链接被标记为坏,现有的正在运行的I / O或其相应路径上的任何新I / O都会失败。

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

    如果fast_io_fail_tmo设置为任何值offdev_loss_tmo则不封顶。如果fast_io_fail_tmo设置为off,则在将设备从系统中移除之前,不会发生I / O故障。如果fast_io_fail_tmo设置为一个数字,则当fast_io_fail_tmo超时触发时,I / O将立即失败。

Host: /sys/class/fc_host/host*H*/

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

本地光纤通道驱动程序和功能

红帽企业Linux 7附带下列本地光纤通道驱动程序:

  • lpfc
  • qla2xxx
  • zfcp
  • bfa

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

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

要启用目标模式,请将以下参数添加到/usr/lib/modprobe.d/qla2xxx.conf

1
options qla2xxx qlini_mode=disabled

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

光纤通道API功能

lpfc qla2xxx zfcp bfa
Transport port_id X X X X
Transport node_name X X X X
Transport port_name X X X X
Remote Port dev_loss_tmo X X X X
Remote Port fast_io_fail_tmo X X X X
Host port_id X X X X
Host issue_lip X X X

通过以太网接口配置光纤通道

设置和部署以太网光纤通道(FCoE)接口需要两个包:

  • fcoe-utils
  • lldpad

安装这些软件包后,请执行以下步骤以通过虚拟LAN(VLAN)启用FCoE:

配置以太网接口以使用FCoE

  1. 要配置新的VLAN,请复制现有的网络脚本, /etc/fcoe/cfg-eth0, a并将名称更改为支持FCoE的以太网设备。
1
# cp /etc/fcoe/cfg-ethx  /etc/fcoe/cfg-ethX
  1. 如果您希望设备在启动时自动加载, 在相应的文件中进行设置 ONBOOT=yes

  2. 通过运行以下命令来 启动数据中心桥接守护进程 (dcbd) :

1
# systemctl start lldpad
  1. 对于实现硬件DCBX客户端的网络接口,请跳过此步骤。

    对于需要软件DCBX客户端的接口,通过运行以下命令在以太网接口上启用数据中心桥接:

1
# dcbtool sc ethX dcb on

然后,运行以下命令在以太网接口上启用FCoE:

1
# dcbtool sc ethX app:fcoe e:1

请注意,只有dcbd在以太网接口的设置没有改变的情况下,这些命令才有效。

  1. 现在使用以下命令加载FCoE设备
1
# ip link set dev ethX up
  1. 使用以下命令启动FCoE:
1
# systemctl start fcoe

如果Fabric上的所有其他设置都正确,则FCoE设备即将出现。要查看已配置的FCoE设备,请运行:

1
# fcoeadm -i

在正确配置以太网接口以使用FCoE之后,Red Hat建议您设置FCoE并lldpad在启动时运行该服务。为此,请使用systemctl实用程序:

1
# systemctl enable lldpad
1
# systemctl enable fcoe

运行该# systemctl stop fcoe命令会停止守护程序,但不会重置FCoE接口的配置。为此,请运行该# systemctl -s SIGHUP kill fcoe命令。

从红帽企业版Linux 7开始,网络管理器可以查询和设置具有DCB功能的以太网接口的DCB设置。

配置FCOE接口以在引导时自动挂载

您可以通过udev规则autofs,和其他类似的方法安装新发现的磁盘。然而,有时候,特定的服务可能需要在启动时挂载FCoE磁盘。在这种情况下,应在服务运行后立即安装FCoE磁盘,fcoe启动需要FCoE磁盘的任何服务之前安装。

要将FCoE磁盘配置为在引导时自动挂载,请将适当的FCoE挂载代码添加到服务的启动脚本中fcoe。该fcoe启动脚本/etc/init.d/fcoe

无论您使用的是简单格式的FCoE磁盘,LVM还是多路径设备节点,FCoE安装代码对于每个系统配置都是不同的。

例25.2。FCoE安装代码

以下是通过通配符指定安装文件系统的FCoE安装代码示例/etc/fstab

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
mount_fcoe_disks_from_fstab()
{
local timeout=20
local done=1
local fcoe_disks=($(egrep 'by-path\/fc-.*_netdev' /etc/fstab | cut -d ' ' -f1))

test -z $fcoe_disks && return 0

echo -n "Waiting for fcoe disks . "
while [ $timeout -gt 0 ]; do
for disk in ${fcoe_disks[*]}; do
if ! test -b $disk; then
done=0
break
fi
done

test $done -eq 1 && break;
sleep 1
echo -n ". "
done=1
let timeout--
done

if test $timeout -eq 0; then
echo "timeout!"
else
echo "done!"
fi

# mount any newly discovered disk
mount -a 2>/dev/null
}

在服务脚本启动守护进程之后 mount_fcoe_disks_from_fstab函数应该被调用。 fcoe 脚本启动 fcoemon 守护进程之后. 这将挂载以下路径指定的FCoE磁盘

1
2
/dev/disk/by-path/fc-0xXX:0xXX /mnt/fcoe-disk1 ext3  defaults,_netdev    0 0
/dev/disk/by-path/fc-0xYY:0xYY /mnt/fcoe-disk2 ext3 defaults,_netdev 0 0

与项fc-_netdev子串启用mount_fcoe_disks_from_fstab功能,以确定FCoE的磁盘挂载项。

ISCSI

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

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

要强制运行iscsid守护程序并加载iSCSI内核模块,请运行service iscsid force-start

iSCSI API

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

1
# iscsiadm -m session -P 3

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

对于较短的输出(例如,仅显示sid到节点的映射),请运行:

1
# iscsiadm -m session -P 0

或者

1
# iscsiadm -m session

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

1
driver [sid] target_ip:port,target_portal_group_tag proper_target_name

iscsisadm -m session命令的输出

1
2
3
4
# 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

持久命名

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

主要和次要的存储设备

sd驱动程序管理的存储设备在内部由一系列主要设备编号及其相关次要编号进行标识。用于此目的的主要设备编号不在连续的范围内。每个存储设备都由一个主号码和一系列次号码来表示,这些号码用来标识设备中的整个设备或分区。分配给设备的主号码和次号码以及形式中的号码之间存在直接联系。只要驾驶员检测到新设备,就会分配可用的主号码和次号码范围。无论何时将设备从操作系统中移除,主要号码和次要号码范围都被释放以供以后再次使用。

主要和次要号码范围和相关sd名称在检测到时分配给每个设备。这意味着,sd如果设备检测顺序发生变化,则主号码和次号码范围以及相关联的名称之间的关联可能会发生变化。尽管在某些硬件配置(例如,使用内部SCSI控制器和磁盘的SCSI目标ID由其机箱内的物理位置分配)的情况下,这种情况并不常见。发生这种情况的例子如下:

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

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

然而,有时sd甚至在使用另一种机制时(例如,当设备报告错误时)仍然需要引用这些名称。这是因为Linux内核sd在关于设备的内核消息中使用了名称(还有SCSI主机/通道/目标/ LUN元组)。

全球标识符(WWID)

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

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

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

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

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

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

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

如果从系统到设备有多条路径,则DM多路径使用WWID来检测此路径DM多路径然后在/dev/mapper/wwid目录中呈现单个“伪装置” ,例如/dev/mapper/3600508b400105df70000e00000ac0000

命令multipath -l显示映射到非永久标识符:,名称和编号。

1
2
3
4
5
6
7
8
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多路径会自动维护每个基于WWID的设备名称/dev/sd与系统上相应名称的正确映射。这些名称在路径更改中保持不变,并且在从不同系统访问设备时是一致的。

使用DM Multipathuser_friendly_names特性时,WWID被映射到表单的名称。 默认情况下,该映射在文件 /etc/multipath/bindings中维护. 只要该文件被保留,这些名称就是持久的。

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

设备名称管理由udev机制/dev/disk/by-*

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

  • The kernel

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

  • The udevd service

    接收事件。

  • The udev rules

    Specifies the action to take when the udev service receives the kernel events.指定udev服务收到内核事件时要执行的操作。

这种机制用于Linux中的所有类型的设备,而不仅仅用于存储设备。对于存储设备,红帽企业版Linux包含的udev规则可以在/dev/disk/目录中创建符号链接,允许存储设备的内容,唯一标识符,序列号或用于访问设备的硬件路径。

  • /dev/disk/by-label/

    此目录中的条目提供了一个符号名称,该名称通过存储在设备上的内容(即数据)中的标签来引用存储设备。的BLKID实用程序用于从所述设备读取数据并确定一个名称(即,标记)的装置。例如:

1
/dev/disk/by-label/Boot

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

1
LABEL=Boot

/dev/disk/by-uuid/

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

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

/dev/disk/by-id/

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

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

该ID是从设备的全球ID或设备序列号获得的。这些/dev/disk/by-id/条目还可以包括分区号。例如:

1
2
/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主机号码可能会发生变化。旁路列表的一个例子是

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

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

1
/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事件发生时和处理时间之间可能存在一定的延迟,例如当检测到大量设备,并且用户空间udevd服务需要一些时间来处理每个设备的规则时。这可能会导致内核检测到设备和/dev/disk/by-*/名称可用之间的延迟。
  • 诸如由规则调用的blkid之类的外部程序可能会在短时间内打开设备,使设备无法进入其他用途。

修改持久命名属性

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

  • UUID:文件系统UUID
  • LABEL:文件系统标签

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

  • 要更改UUIDLABELXFS文件系统的属性,卸载文件系统,然后使用xfs_admin实用程序来更改属性:
1
2
3
# umount /dev/device
# xfs_admin [-U new_uuid] [-L new_label] /dev/device
# udevadm settle
  • 要改变UUIDLABEL一个EXT4,ext3或ext2文件系统的属性,可以使用tune2fs实用程序:
1
2
# 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命令将等待更改完全注册,这将确保您的下一个命令能够正确使用新的属性。

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

卸下存储设备

在删除对存储设备本身的访问之前,建议先从设备备份数据。之后,刷新I / O并删除所有操作系统对设备的引用。如果设备使用多路径,则对多路径“伪设备”和代表设备路径的每个标识符都执行此操作。如果只删除多路径设备的路径,其他路径将保留,则过程更简单,

当系统处于内存压力下时,不建议取出存储设备,因为I / O刷新将添加到负载。要确定内存压力的级别,运行命令vmstat 1 100; 如果出现以下情况,建议不要拆除设备

  • 空闲内存少于每100个10个以上采样总数的5%(该命令free也可用于显示总内存)。
  • 交换处于活动状态(非零si和输出中的sovmstat)。

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

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

  2. 使用umount卸载该安装的设备的文件系统。

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

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

  5. 运行 blockdev --flushbufs device 刷新任何未完成的I / O到设备的所有路径。 这对于原始设备来说尤为重要。

  6. 删除任何引用到设备的基于路径的名字一样/dev/sd/dev/disk/by-path或者major:minor number,在应用程序,脚本,或在系统上的实用程序。这对确保未来添加的不同设备不会被误认为当前设备非常重要。

  7. 最后,从SCSI子系统中删除设备的每个路径。要做到这一点,使用命令在那里可能,例如。 echo 1 > /sys/block/device-name/device/delete

    此操作的另一个变体是:HBA号在哪里是HBA 上的通道,是SCSI目标ID,是LUN。

    echo 1 > /sys/class/scsi_device/h:c:t:l/device/delete, .

    Note

    这些命令的旧形式, echo "scsi remove-single-device 0 0 0 0" > /proc/scsi/scsi已被弃用。

可以判断device-name,HBA数目,HBA信道,SCSI目标ID和LUN从各种命令,诸如设备 lsscsi, scsi_id, multipath -l, and ls -l /dev/disk/by-.

可以将设备从运行的系统中安全地移出。这样做不需要停止对其他设备的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立即失败。设备映射器多路径将继续使用设备的剩余路径。

  3. 从SCSI子系统中删除路径。为了这样做,使用命令,其中可以是,例如。 echo 1 > /sys/block/*device-name*/device/delete``*device-name*``sde

可以安全地从正在运行的系统中删除该路径。在此过程中不必停止I / O,因为设备映射器多路径将根据配置的路径分组和故障转移策略将I / O重新路由到其余路径。

其他程序,例如物理移除电缆,然后重新扫描SCSI总线以使操作系统状态更新以反映更改,不建议使用。这会由于I / O超时而导致延迟,并且可能会意外删除设备。如果需要执行互连的重新扫描,则必须在I / O暂停时完成。

添加存储设备或路径

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

添加存储设备或路径

  1. 添加存储设备或路径的第一步是在物理上启用对新存储设备的访问或对现有设备的新路径。这是通过在光纤通道或iSCSI存储服务器上使用特定于供应商的命令完成的。这样做时,请注意将显示给主机的新存储的LUN值。如果存储服务器是光纤通道,请注意存储服务器的全球通用节点名称(WWNN),并确定存储服务器上的所有端口是否存在单个WWNN。如果不是这种情况,请记下将用于访问新LUN的每个端口的全球端口名称(WWPN)。

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

1
$ 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已被弃用。

  1. 在某些光纤通道硬件中,在执行*循环初始化协议*(LIP)操作之前,RAID阵列上新创建的LUN可能对操作系统不可见。



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

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

对于实现单个WWNN对所有端口光纤通道存储服务器,您可以确定正确的h,c,和t 值 (即HBA数量,HBA通道和SCSI目标ID),在sysfs中搜索WWNN .

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

1
$ grep 5006016090203181 /sys/class/fc_transport/*/node_name

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

1
2
3
4
/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,那么下面的命令将配置第一个路径:

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

这必须为新设备的每个路径完成。

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

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

  1. 将所有SCSI路径添加到设备后,执行该multipath命令,并检查设备是否已正确配置。此时,可以将设备添加到mdLVM mkfs,或者mount,例如。

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

扫描存储互连

某些命令允许您重置,扫描或同时重置和扫描一个或多个互连,这可能会在一次操作中添加和删除多个设备。这种类型的扫描可能会造成干扰,因为在I / O操作超时的同时会造成延迟,并意外移除设备。红帽建议仅在必要时使用互连扫描。扫描存储互连时,请遵守以下限制:

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

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

  • echo "1" > /sys/class/fc_host/host/issue_lip

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

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

    lpfcqla2xxxbnx2fc驱动程序的支持issue_lip。有关红帽企业版Linux中每个驱动程序支持的API功能的更多信息

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

    /usr/bin/rescan-scsi-bus.sh脚本是在红帽企业Linux 5.4中引入的。默认情况下,此脚本扫描系统上的所有SCSI总线,并更新SCSI层以反映总线上的新设备。该脚本提供了额外的选项来允许设备移除和发行LIP。

  • 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。该文件包含iscsid和使用的iSCSI设置iscsiadm

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

  • 节点记录 /var/lib/iscsi/nodes

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

  • 发现记录在 /var/lib/iscsi/*discovery_type*

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

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

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

在这里,discovery_type可以是sendtargetsisnsfw

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

  • 编辑 /etc/iscsi/iscsid.conf 在执行发现之前直接. 发现设置使用前缀discovery; 要查看它们,请运行:
1
# iscsiadm -m discovery -t discovery_type -p target_IP:port
  • 或者,iscsiadm也可以用来直接更改发现记录设置,如下所示:
1
# iscsiadm -m discovery -t discovery_type -p target_IP:port -o update -n setting -v %value

配置ISCSI卸载和接口绑定

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

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

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

1
$ ping -I eth X  target_IP

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

查看可用的iface配置

以下iSCSI启动器实施支持iSCSI卸载和接口绑定:

  • 软件iSCSI

    此堆栈为scsi_host每个会话分配一个iSCSI主机实例(即),每个会话只有一个连接。作为结果,/sys/class_scsi_host/proc/scsi会报告scsi_host你登录到每个连接/会话。

  • 卸载iSCSI

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

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

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

1
iface_name  transport_name,hardware_address,ip_address,net_ifacename,initiator_name

请参阅下表,

设置 描述
iface_name iface 配置名称。
transport_name 设备名称
hardware_address MAC 地址
ip_address 用于此端口的IP地址
net_iface_name 名称用于vlan软件iSCSI会话的别名绑定。对于iSCSI卸载,net_iface_name将是<empty>因为这个值在重新启动时不是持久的。
initiator_name 此设置用于覆盖/etc/iscsi/initiatorname.iscsi中定义的启动器的默认名称

iscsiadm -m iface命令的输出示例

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

1
2
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个字符)。该iface_name网络设备支持卸载出现在格式。

iscsiadm -m iface使用Chelsio网卡输出

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

1
2
3
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更友好的方式显示特定配置的设置。为此,请使用该选项。这将以以下格式显示设置

1
iface.setting = value

使用ifaceChelsio融合网络适配器的设置

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

1
2
3
4
5
6
7
8
# 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每个将用于绑定会话的网络对象都需要配置。

之前

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

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

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

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

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

设置MAC地址iface0

例如,要设置的MAC地址(hardware_address的)iface000:0F:1F:92:6B:BF,运行:

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

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

为iSCSI卸载配置iface

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

在使用iface网卡进行iSCSI卸载之前,首先设置设备应使用的IP地址。对于使用be2iscsi驱动程序的设备,在BIOS设置屏幕中配置IP地址。对于所有其他设备,要配置使用的IP地址iface

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

设置ifaceChelsio卡的IP地址

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

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

将iface绑定/解除绑定到Portal

每当iscsiadm用于扫描互连时,都会首先检查iface.transport每个iface配置的设置/var/lib/iscsi/ifaces。在iscsiadm随后实用程序将绑定发现的门户网站的任何ifaceiface.transporttcp

出于兼容性的原因,此行为已实施。要覆盖这个,使用指定哪个入口绑定到一个,如下所示:

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

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

也可以防止门户绑定到任何现有的iface。要做到这一点,使用defaultiface_name,如:

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

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

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

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

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

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

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

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

扫描ISCSI互连

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

但是,如果目标不发送iSCSI异步事件,则需要使用该iscsiadm实用程序手动扫描它们。然而,在这样做之前,您需要先检索正确--targetname--portal值。如果您的设备型号仅支持每个目标的单个逻辑单元和门户,请使用iscsiadmsendtargets主机发出命令,如下所示:

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

输出将以以下格式显示:

1
target_IP:port,target_portal_group_tag proper_target_name

使用iscsiadm发出一个sendtargets命令

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

1
2
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

In this example, the target has two portals, each using *target_ip:port*s of 10.15.84.19:3260 and 10.15.85.19:3260.

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

1
2
3
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,输出可能会显示为:

1
2
3
4
5
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.33615311iface2用作其iface配置。

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

1
# iscsiadm -m session --rescan

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

1
# iscsiadm -m session -r SID --rescan

如果您的设备支持多个目标,则需要向sendtargets主机发出命令,以便为每个目标找到新的入口。重新扫描现有会话以使用该--rescan选项在现有会话上发现新的逻辑单元。

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

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

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

要删除/var/lib/iscsi/nodes目标在发现过程中未显示的条目,请使用:

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

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

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

sendtargets命令将产生以下输出:

1
ip:port,target_portal_group_tag proper_target_name

sendtargets命令的输出

例如,给定一个具有单个目标,逻辑单元和门户equallogic-iscsi1的设备*target_name*,其输出应与以下内容类似:

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

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

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

完整的iscsiadm命令

使用我们前面的例子(*proper_target_name*equallogic-iscsi1),完整的命令是:

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

登录到ISCSI目标

必须运行iSCSI服务才能发现或登录目标。要启动iSCSI服务,请运行:

1
# systemctl start iscsi

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

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

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

删除整个记录也会阻止自动登录。要做到这一点,运行:

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

要从网络上的iSCSI设备自动安装文件系统,请/etc/fstab使用该_netdev选项为安装添加分区条目。例如,为了自动iSCSI设备安装sdb/mount/iscsi启动过程中,下面的行添加到/etc/fstab

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

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

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

proper_target_nametarget_IP:port指全名和目标的IP地址/端口组合。

RESIZING 调整在线逻辑单元的大小

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

要调整联机逻辑单元的大小,请首先通过存储设备的阵列管理界面修改逻辑单元大小。这个过程与每个数组不同,因此,请查阅您的存储阵列供应商文档以获取更多信息。

Note

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

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

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

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

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

调整iSCSI逻辑单元的大小

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

1
# iscsiadm -m node --targetname target_name -R

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

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

1
# iscsiadm -m node -R -I interface

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

  • 它以与命令相同的方式扫描新设备

    echo "- - -" > /sys/class/scsi_host/*host*/scan

  • 它以与命令相同的方式重新扫描新的/修改的逻辑单元 echo 1 > /sys/block/sdX/device/rescan 请注意,该命令与用于重新扫描光纤通道逻辑单元的命令相同。

更新多路径设备的大小

如果系统启用了多路径,则还需要将逻辑单元大小的变化反映到逻辑单元的相应多路径设备(调整逻辑单元大小之后)。这可以通过multipathd。为此,首先确保multipathd正在运行使用service multipathd status。一旦您验证了multipathd可操作性,请运行以下命令:

1
# multipathd -k "resize map multipath_device"

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

  • mpathXX您的设备的相应条目在哪里(例如mpath0
  • WWID; 例如,3600508b400105e210000900000490000

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

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

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

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

1
# blockdev --getro /dev/sdXYZ

以下命令也可用于红帽企业版Linux 7:

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

使用多路径时,请参阅命令输出的第二行中的rorw字段multipath -ll。例如:

1
2
3
4
5
6
7
8
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状态,请使用以下步骤:

改变R/W状态

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

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

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

1
# blockdev --flushbufs /dev/device

用所需的代号替换设备 ; 对于设备映射器多路径,这是您设备的条目dev/mapper。例如。 /dev/mapper/mpath3

  1. 使用存储设备的管理接口将逻辑单元的状态从R / W更改为RO,或将RO更改为R/W。这个过程对每个数组都不相同。查阅适用的存储阵列供应商文档以获取更多信

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

重新扫描逻辑单元

在线逻辑单元的读/写状态”所述,修改了在线逻辑单元读/写状态之后,重新扫描逻辑单元以确保系统检测到更新状态命令:

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

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

使用multipath -11命令

例如,multipath -11以上显示了WWID为36001438005deb4710000500000640000的LUN的路径。在这种情况下,输入:

1
2
3
4
# 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状态

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

1
# multipath -r

multipath -11命令可以用来确认更改。

通过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; 在第二次扫描中添加所有其他逻辑单元。
  • rescan-scsi-bus.sh当使用该--remove选项时 ,脚本中的错误错误地执行识别逻辑单元大小变化的功能。
  • rescan-scsi-bus.sh脚本不识别ISCSI逻辑单元删除。

修改链路丢失行为

This section describes how to modify the link loss behavior of devices that use either Fibre Channel or iSCSI protocols.

光纤通道

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

1
$ cat /sys/block/device/device/state

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

确定远程端口的状态

  1. 要确定远程端口的状态,请运行以下命令:
1
2
$ cat
/sys/class/fc_remote_port/rport-H:B:R/port_state
  1. Blocked当远程端口(以及通过它访问的设备)被阻塞时, 该命令将返回。如果远程端口正常运行,命令将返回Online

  2. 如果问题在dev_loss_tmo几秒内不能解决,则rport和设备将被解除阻塞,并且该设备上运行的所有I/O(以及任何发送到该设备的新I/O)都将失败。

更改dev_loss_tmo

  • 要更改该dev_loss_tmo值,echo请将所需的值更改为该文件。例如,要设置dev_loss_tmo为30秒,请运行:
1
2
$ echo 30 >
/sys/class/fc_remote_port/rport-H:B:R/dev_loss_tmo

iSCSI设置dm-multipath

如果dm-multipath已实施,则建议将iSCSI定时器设置为立即将命令延迟到多路径层。要配置它,请将以下行嵌套device/etc/multipath.conf

1
features		"1 queue_if_no_path"

这确保了如果dm-multipath图层中的所有路径都失败,I / O错误将重试并排队。

您可能需要进一步调整iSCSI定时器,以更好地监控SAN的问题。您可以配置可用的iSCSI计时器是NOP超时间隔/超时replacement_timeout,这在下面的章节中讨论。

NOP输出间隔/超时

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

dm-multipath使用时,SCSI层将会使那些正在运行的命令失效,并将它们推迟到多路径层。多路径层然后在另一条路径上重试这些命令。如果dm-multipath没有被使用,这些命令是完全失败之前重试五次。

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

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

一旦设置,iSCSI层将每[间隔值]秒发送一个NOP-Out请求给每个目标。

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

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

这会将iSCSI层设置为在[超时值]秒后超时一个NOP-Out请求。

SCSI错误处理程序

如果SCSI错误处理程序正在运行,当路径上的NOP-Out请求超时时,在路径上运行命令将不会立即失败。相反,这些命令将 replacement_timeout几秒钟失败。

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

1
#iscsiadm -m session -P 3

replacement_timeout

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

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

1
node.session.timeo.replacement_timeout = [replacement_timeout]

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

重要

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

iSCSI根

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

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

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

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

1
node.session.timeo.replacement_timeout = replacement_timeout

配置完成后/etc/iscsi/iscsid.conf,您必须重新发现受影响的存储。这将允许系统加载和使用任何新的值/etc/iscsi/iscsid.conf

配置特定会话超时

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

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

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

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

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

  1. 中止命令。
  2. 重置设备。
  3. 重置总线。
  4. 重置主机。

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

但是,如果设备使用光纤通道协议并且rport被阻止,则该过程是不同的。在这种情况下,驱动程序rport在激活错误处理程序之前等待几秒钟才能再次联机。这可以防止由于临时传输问题导致设备脱机。

设备状态

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

1
$ cat /sys/block/device-name/device/state

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

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

命令计时器

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

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

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

在线存储配置故障排除

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

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

要解决此问题,请执行以下步骤:

在陈旧的逻辑单位工作

  1. 确定哪些mpath链接条目/etc/lvm/cache/.cache特定于陈旧的逻辑单元。为此,请运行以下命令:

    1
    $ ls -l / dev / mpath | grep stale-logical-unit

    确定特定的mpath链接条目

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

    1
    2
    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

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

删除相关的行

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

1
2
3
4
5
6
/ 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仅当您在所有目标上具有完全冗余的多路径配置时才启用。

设备映射器多路径和虚拟存储

虚拟存储

红帽企业版Linux 7支持以下用于虚拟存储的文件系统/在线存储方法:

  • 光纤通道
  • iSCSI的
  • NFS
  • GFS2

红帽企业版Linux 7中的虚拟化libvirt用于管理虚拟实例。该libvirt实用程序使用存储池的概念来管理虚拟客户的存储。存储池是可以分成更小卷或直接分配给来宾的存储。存储池的卷可以分配给虚拟客户端。有两类存储池可用:

本地存储池

本地存储涵盖直接连接到主机的存储设备,文件或目录。本地存储包括本地目录,直接连接的磁盘和LVM卷组。

联网(共享)存储池

网络存储涵盖了使用标准协议通过网络共享的存储设备。它包括使用光纤通道,iSCSI,NFS,GFS2和SCSI RDMA协议的共享存储设备,并且需要在主机之间迁移访客虚拟化来宾。

DM-多路径

设备映射器多路径(DM-Multipath)功能可让您将服务器节点和存储阵列之间的多个I / O路径配置到一个设备中。这些I / O路径是物理SAN连接,可以包含单独的电缆,交换机和控制器。多路径聚合I / O路径,创建一个由聚合路径组成的新设备。

DM-Multipath主要用于以下原因:

  • 冗余

    DM-Multipath可以在主动/被动配置中提供故障转移。在主动/被动配置中,只有一半的路径在任何时候用于I / O。如果I / O路径的任何元素(电缆,交换机或控制器)发生故障,DM-Multipath将切换到备用路径。

  • 改进的性能

    可以在主动/主动模式下配置DM-Multipath,其中I / O以循环方式分布在路径上。在一些配置中,DM-Multipath可以检测I / O路径上的负载并动态地重新平衡负载。