如何在CentOS/RHEL 7/8 Linux上配置iSCSI目标和启动器

时间:2020-01-09 10:37:44  来源:igfitidea点击:

在" RHEL/CentOS 7和8 Linux"节点上配置iSCSI目标和启动器的步骤。

" iscsi"是" I"nternet," S"mall," C"omputer," S"ystem," I"nterface的缩写。

我们可以将iscsi视为块存储,因为存储是在块层访问的。因此,基本上," iSCSI是用于通过IP网络共享RAW存储设备的块级协议"。

我们也将其称为SAN技术,即iSCSI SAN。由于它是通过IP网络运行的,因此,请勿将其与NFS或者SMB之类的NAS技术混用或者混淆。它们也可以在IP网络上工作,但是它们在文件系统层上工作。但是在iSCSI中,我们在RAW块上工作。在本文中,我将分享在RHEL/CentOS 7和8上配置iscsi目标和启动器的步骤。

iSCSI SAN架构

设置iSCSI SAN时,将一台服务器配置为iSCSI目标。这是提供对共享存储设备的访问权的服务器。当我们将RHEL或者CentOS 7配置为iSCSI目标时,共享存储设备通常是LVM逻辑卷,但它们也可以是完整的磁盘或者分区。

另一台服务器将用作" iSCSI启动器"。这是连接到SAN的服务器。连接到SAN后,iSCSI启动器会看到其他磁盘设备。

现在,iSCSI启动器将经历发现网络上的目标,进行身份验证和登录的过程。最终访问本地主机上的这些iSCSI LUN。

重要说明:使用冗余网络连接时,iSCSI启动器将在两次访问SAN的不同路径上两次访问SAN设备。这可能会导致同一共享磁盘设备也出现两次的情况。为确保在可用冗余路径的设置中正确寻址SAN设备,应将iSCSI启动器配置为运行多路径驱动程序。

iSCSI SAN术语

项目描述
IQN
后端存储
目标
启动器
ACl
LUN
Portal
TPG
发现
登录

我的设置详细信息

属性节点1(启动器)存储1(目标)
系统CentOS 7CentOS 7
vCPU22
内存4 GB4 GB
磁盘20GB20GB
主机名node1storage1
FQDNnode1.example.comstorage1.example.com
IP地址10.0.2.2010.0.2.13

在RHEL/CentOS 7/8上设置iSCSI Target

在Linux的不同版本中,已使用了不同的iSCSI目标软件包。在Red Hat Enterprise Linux 7和8中,使用了LIO(Linux I/O)目标。自Linux内核2.6.38起,LIO已成为标准的iSCSI目标解决方案,它已成为一种有吸引力的存储解决方案,已迅速取代了许多Linux发行版中的替代iSCSI目标解决方案。管理LIO目标的默认接口是targetcli命令。该命令使用熟悉的Linux命令,例如cdlspwd,并设置为配置目标。

设置iSCSI目标的步骤

  • 创建后备存储设备。

  • 创建IQN和默认目标门户组(TPG)。

  • 为TPG配置一个或者多个ACL。

  • 创建LUN以提供对后备存储设备的访问。

  • 创建门户以提供iSCSI启动器可以连接的网络接口。

  • 验证并提交配置。

1.创建后备存储设备

在开始致力于iSCSI目标之前,我们需要一个后端存储。在我的节点上,我添加了另一个映射到/dev/sdc的磁盘。在下面的" fdisk"下面,我将创建一个大小为" 1GB"的新分区"/dev/sdc1",它将用于创建我的iSCSI目标。

[root@storage1 ~]# fdisk /dev/sdc
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-8388607, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-8388607, default 8388607): +1G
Partition 1 of type Linux and of size 1 GiB is set
Command (m for help): p
Disk /dev/sdc: 4294 MB, 4294967296 bytes, 8388608 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes/512 bytes
I/O size (minimum/optimal): 512 bytes/512 bytes
Disk label type: dos
Disk identifier: 0x243b95e3
   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1            2048     2099199     1048576   83  Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
reload the partition table

更新分区表

[root@storage1 ~]# partprobe

验证新分区

[root@storage1 ~]# ls -l /dev/sd*
brw-rw----. 1 root disk 8, 0 Dec 29 10:13 /dev/sda
brw-rw----. 1 root disk 8, 1 Dec 29 10:13 /dev/sda1
brw-rw----. 1 root disk 8, 2 Dec 29 10:13 /dev/sda2
brw-rw----. 1 root disk 8, 16 Dec 29 10:13 /dev/sdb
brw-rw----. 1 root disk 8, 17 Dec 29 10:13 /dev/sdb1
brw-rw----. 1 root disk 8, 32 Dec 29 10:13 /dev/sdc
brw-rw----. 1 root disk 8, 33 Dec 29 10:13 /dev/sdc1

2.安装targetcli rpm

要在RHEL/CentOS 7/8上管理基于内核的iSCSI Target服务,我们需要安装targetcli软件包,如以下命令所示:

说明:

在RHEL系统上,我们必须具有RHN的有效订阅,或者我们可以配置本地脱机存储库,通过该本地脱机存储库,yum软件包管理器可以安装提供的rpm及其依赖项。

[root@storage1 ~]# yum -y install targetcli

成功安装后,请继续执行以下步骤以在RHEL或者CentOS 7 Linux节点上配置iSCSI目标。

3.使用targetcli管理iSCSI目标

targetcli命令是用于查看,编辑,保存和加载iSCSI目标配置的shell。当我们查看配置时,我们将看到targetcli以类似于文件系统的方式提供了一种层次结构。

为了调用targetcli shell,我们将以root身份运行此命令。我们将看到在该命令的第一次运行中,创建了一个首选项文件。以下代码段对此进行了说明

[root@storage1 ~]# targetcli
targetcli shell version 2.1.fb46
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.

从前面的输出中可以看到,我们可以输入help来显示可以输入的命令列表。要查看可用的配置对象,我们可以使用ls命令。输出显示在以下屏幕截图中:

 ls
o-/...................................................................................................................... [...]
  o- backstores ........................................................................................................... [...]
  | o- block ............................................................................................... [Storage Objects: 0]
  | o- fileio .............................................................................................. [Storage Objects: 0]
  | o- pscsi ............................................................................................... [Storage Objects: 0]
  | o- ramdisk ............................................................................................. [Storage Objects: 0]
  o- iscsi ......................................................................................................... [Targets: 0]

我们将使用backstore对象开始,以便除了fileio backstore之外,还可以将其添加到配置中的LVM块设备中。

顾名思义,这将是文件系统中的一个文件。我们可以将其作为虚拟磁盘共享到网络。

4.创建块后备存储

我们将从" targetcli"配置的根源开始工作;这应该是我们的确切位置,但是我们总是可以使用pwd命令来显示我们的工作目录。如果需要,我们可以使用cd /将其更改为配置的根目录。

提示:在使用targetcli命令时,我们可以像在Bash中一样使用CTRL + L来清除屏幕,但是最重要的是,Tab键完成功能可以正常工作,因此我们不需要键入完整的名称或者对象和属性的路径。

要创建一个新块,请将其存储在我们在本节前面创建的分区上。

[root@storage1 ~]# targetcli
targetcli shell version 2.1.fb46
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.
/backstores/block> create dev=/dev/sdc1 name=sdc1
Created block storage object sdc1 using /dev/sdc1.

这将创建名为" sdc1"的" block backstore"。再次使用ls命令将列出层次结构中的其他对象。在以下屏幕截图中,我们看到了Backstore的创建和后续列表:

/backstores/block> ls
o- block ...................................................................................................... [Storage Objects: 1]
  o- sdc1 ............................................................................. [/dev/sdc1 (0 bytes) write-thru deactivated]
    o- alua ....................................................................................................... [ALUA Groups: 1]
      o- default_tg_pt_gp ........................................................................... [ALUA state: Active/optimized]

返回主目录

/backstores/block> cd /

5.创建iSCSI目标

我们在主列表中看到的iSCSI对象代表iSCSI目标及其属性。首先,我们将使用默认名称创建一个简单的iSCSI目标。

 cd iscsi

其中我们现在将通过提供自定义IQN来创建iSCSI目标。为此,我们创建对象并指定通常写为包含日期和反向DNS名称的名称。其中我们使用了一个示例IQN

/iscsi> create wwn=iqn.2016-12.com.example:servers
Created target iqn.2016-12.com.example:servers.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.

注意:IQN以iqn开头,后跟创建它的年份和月份以及反向DNS名称。例如,如果我们将月份指定为一位而不是两位,则会收到" WWN无效"消息,并且创建将失败。

我们可以在目标末尾添加:servers的描述,表明这是服务器的目标。

通过添加要列出的对象层次结构,我们可以使用ls命令过滤显示的内容。例如,要列出目标,我们将使用ls iscsi命令。以下屏幕截图显示了此命令的输出:

/iscsi> ls
o- iscsi .............................................................................................................. [Targets: 2]
  o- iqn.2016-12.com.example:servers ..................................................................................... [TPGs: 1]
    o- tpg1 ................................................................................................. [no-gen-acls, no-auth]
      o- acls ............................................................................................................ [ACLs: 0]
      o- luns ............................................................................................................ [LUNs: 0]
      o- portals ...................................................................................................... [Portals: 1]
        o- 0.0.0.0:3260 ....................................................................................................... [OK]

现在我们有了目标的自定义名称,但是我们仍然必须添加LUNS或者逻辑单元以使SAN(存储区域网络)生效。

6.添加ACL

为了创建ACL,我们将对LUN的访问限制为给定的启动器名称或者在"访问控制列表(ACL)"中提到的名称。启动器是iSCSI客户端,将在/etc/iscsi/initiatorname.iscsi文件中的启动器上配置一个唯一的客户端IQN。

注意:如果此文件不存在,则需要在启动程序节点上安装" iscsi-initiator-utils"软件包。

用于配置启动器名称的文件名对于Linux客户端将是一致的,但对于其他操作系统将是不同的。要添加一个ACL,我们将保留当前的配置层次结构:/iscsi/iqn…。:servers/tpg1并发出以下命令,再次写成一行:

/iscsi> cd iqn.2016-12.com.example:servers/tpg1/acls
/iscsi/iqn.20...ers/tpg1/acls> create wwn=iqn.2016-12.com.example:node1
Created Node ACL for iqn.2016-12.com.example:node1
/iscsi/iqn.20...ers/tpg1/acls> cd /

使用配置层次结构中此位置的ls命令,我们将看到类似于以下屏幕截图的输出,其中还包括用于创建ACL的命令:

 ls
o-/......................................................................................................................... [...]
  o- backstores .............................................................................................................. [...]
  | o- block .................................................................................................. [Storage Objects: 1]
  | | o- sdc1 ......................................................................... [/dev/sdc1 (0 bytes) write-thru deactivated]
  | |   o- alua ................................................................................................... [ALUA Groups: 1]
  | |     o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]
  | o- fileio ................................................................................................. [Storage Objects: 0]
  | o- pscsi .................................................................................................. [Storage Objects: 0]
  | o- ramdisk ................................................................................................ [Storage Objects: 0]
  o- iscsi ............................................................................................................ [Targets: 2]
  | o- iqn.2016-12.com.example:servers ................................................................................... [TPGs: 1]
  |   o- tpg1 ............................................................................................... [no-gen-acls, no-auth]
  |     o- acls .......................................................................................................... [ACLs: 1]
  |     | o- iqn.2016-12.com.example:node1 ........................................................................ [Mapped LUNs: 0]
  |     o- luns .......................................................................................................... [LUNs: 0]
  |     o- portals .................................................................................................... [Portals: 1]
  |       o- 0.0.0.0:3260 ..................................................................................................... [OK]
  o- loopback ......................................................................................................... [Targets: 0]

重要说明:此ACL限制对ACL中列出的启动器的访问。如果更改启动器名称,请务必小心,因为ACL也需要更新。启动器是iSCSI客户端。

7.将LUN添加到iSCSI目标

继续使用targetclishell程序,我们现在将继续进行目标和TPG(Target Portal Group)对象。与文件系统类似,这可以通过使用cd命令来实现,如以下命令所示:

 cd iscsi/iqn.2016-12.com.example:servers/tpg1/luns

我们有一个门户可以侦听TCP端口3260上的所有IPv4接口。目前,我们没有ACL或者lun。要添加LUN,我们将使用以下命令,该命令将利用LVM块备份存储:

/iscsi/iqn.20...ers/tpg1/luns> create /backstores/block/sdc1
Created LUN 0.
Created LUN 0->0 mapping in node ACL iqn.2016-12.com.example:node1

现在已配置iSCSI目标。一旦退出,配置将被保存到/etc/target/saveconfig.json中,或者我们也可以选择在终端上运行saveconfig

/iscsi/iqn.20...ers/tpg1/luns> exit
Global pref auto_save_on_exit=true
Configuration saved to /etc/target/saveconfig.json
[root@storage1 ~]#

8.更新防火墙

现在已经配置了iSCSI目标,我们需要确保可以通过防火墙访问它,并且该服务会自动启动。要在防火墙中打开端口" 3260",请执行以下命令

[root@storage1 ~]# firewall-cmd --add-port=3260/tcp --permanent
[root@storage1 ~]# firewall-cmd --reload

9.启动并启用目标服务

现在已经配置了iSCSI目标,我们需要启动并启用目标服务

[root@storage1 ~]# systemctl start target
[root@storage1 ~]# systemctl enable target

设置iSCSI启动器

RHEL/CentOS 7/8上的iSCSI Initiator或者客户端是通过iscsi-initiator-utils软件包安装的;我们可以使用yum命令验证此文件是否已安装在系统上,如以下示例所示:

[root@node1 ~]# rpm -q iscsi-initiator-utils
iscsi-initiator-utils-6.2.0.874-7.el7.x86_64

如果不可用,我们可以使用yum进行安装

说明:

在RHEL系统上,我们必须具有RHN的有效订阅,或者我们可以配置本地脱机存储库,通过该本地脱机存储库,yum软件包管理器可以安装提供的rpm及其依赖项。

[root@node1 ~]# yum -y install iscsi-initiator-utils

1.设置iSCSI发起方名称

在本练习中,我们将使用单独的RHEL 7和8系统作为启动器,并将其连接到现有目标。我们将需要在新的RHEL 7和8系统上编辑/etc/iscsi/initiatorname.iscsi文件,以确保该名称设置为与我们在本文前面部分中添加到ACL的名称匹配。

[root@node1 ~]# vi /etc/iscsi/initiatorname.iscsi
[root@node1 ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2016-12.com.example:node1

因此,这里我们已使用在iSCSI目标上使用的ACL名称手动更新了文件。

接下来重启iscsid守护进程

[root@node1 ~]# systemctl restart iscsid

2.发现LUN

使用iSCSI发现时,需要三个不同的参数:

  • --type sendtargets:告诉发现模式如何找到iSCSI目标。

  • --portal:这个参数告诉iscsiadm命令要执行发现的目标IP地址和端口。我们可以使用IP地址或者节点名称作为参数,也可以选择指定端口。如果未指定端口,则使用默认端口3260。

  • --discover:这个参数告诉iscsid服务执行发现。

我们将使用主要客户端工具" iscsiadm"在目标上发现iSCSI LUN。

[root@node1 ~]# iscsiadm --mode discovery --type sendtargets --portal 10.0.2.13 --discover
10.0.2.13:3260,1 iqn.2016-12.com.example:servers

发现以下数据库更新后

[root@node1 ~]# ls -l  /var/lib/iscsi/nodes
total 8
drw------- 3 root root 4096 Dec 29 19:56 iqn.2016-12.com.example:servers
[root@node1 ~]# ls -l /var/lib/iscsi/send_targets/10.0.2.13,3260/
total 12
lrwxrwxrwx 1 root root  69 Dec 29 19:56 iqn.2016-12.com.example:servers,10.0.2.13,3260,1,default -> /var/lib/iscsi/nodes/iqn.2016-12.com.example:servers/10.0.2.13,3260,1
-rw------- 1 root root 547 Dec 29 19:56 st_config

3.建立连接

现在,我们已经看到可以连接到iSCSI目标并将其发送给我们已配置的LUNS。现在,我们应该连接到该LUN,并使用具有以下选项的相同命令:

[root@node1 ~]# iscsiadm --mode node --targetname iqn.2016-12.com.example:servers  --login
Logging in to [iface: default, target: iqn.2016-12.com.example:servers, portal: 10.0.2.13,3260] (multiple)
Login to [iface: default, target: iqn.2016-12.com.example:servers, portal: 10.0.2.13,3260] successful.

在此命令中,使用了一些选项:

  • --mode节点:这指定iscsiadm进入" node"模式。这是可以与目标建立实际连接的模式。

  • --targetname:指定使用iSCSI发现过程发现的目标名称。

  • --portal:这是目标正在侦听的IP地址和端口。

  • --login:这将对目标进行身份验证,还将存储凭据,以确保重新启动后可以重新建立连接。

登录后,将建立与iSCSI目标的会话。会话和节点连接都可以使用-P选项进行监视

[root@node1 ~]# iscsiadm --mode node -P 1
Target: iqn.2016-12.com.example:servers
        Portal: 10.0.2.13:3260,1
                Iface Name: default

与iSCSI目标建立连接后,我们将看到目标提供的新SCSI设备。列出这些命令的便捷命令是lsscsi。

[root@node1 ~]# lsscsi
[1:0:0:0]    cd/dvd  VBOX     CD-ROM           1.0   /dev/sr0
[2:0:0:0]    disk    ATA      VBOX HARDDISK    1.0   /dev/sda
[3:0:0:0]    disk    ATA      VBOX HARDDISK    1.0   /dev/sdb
[11:0:0:0]   disk    LIO-ORG  sdc1             4.0   /dev/sdc

4.管理iSCSI连接持久性

登录到iSCSI目标服务器后,连接将自动保持不变。这意味着在重新启动时,iscsid和iscsi服务在iSCSI客户端上启动,并且这些服务将读取本地存储的iSCSI配置以自动重新连接。

"因此,如果我们已成功连接到iSCSI服务器一次,则无需在配置文件中放入任何内容。"

5.卸下iSCSI连接

如果我们需要在重新启动后不恢复iSCSI连接,则首先必须注销以使用以下命令断开实际会话的连接

[root@node1 ~]# iscsiadm --mode node --targetname iqn.2016-12.com.example:servers  --portal 10.0.2.13 -u
Logging out of session [sid: 1, target: iqn.2016-12.com.example:servers, portal: 10.0.2.13,3260]
Logout of [sid: 1, target: iqn.2016-12.com.example:servers, portal: 10.0.2.13,3260] successful.

接下来,我们需要删除相应的IQN子目录及其所有内容。我们可以使用以下命令执行此操作

[root@node1 ~]# iscsiadm --mode node --targetname iqn.2016-12.com.example:servers --portal 10.0.2.13 -o delete

提示:停止" iscsi" .service并删除"/var/lib/iscsi/nodes"下的所有文件以清理所有当前配置。完成之后,重新启动iscsi.service并开始发现并再次登录。

6.挂载iSCSI设备

要挂载iSCSI设备,我们需要注意一些事项。首先,由于SAN配置中的拓扑更改,现在显示为/dev/sdc的iSCSI磁盘在下次连接时可能会显示为其他设备名称。因此,在/etc/fstab文件中引用/dev/sdc不是一个明智的主意。我们应该改为使用文件系统UUID。每个文件系统都会自动获取一个UUID。

要请求该UUID的值,可以使用blkid命令

[root@node1 ~]# blkid /dev/sdc
/dev/sdc: UUID="f87DLO-DXDO-jjJ5-3vgO-RfCE-oOCA-VGploa" TYPE="LVM2_member"

重要说明:进行永久性iSCSI挂载时的第二个问题是,通常在网络可用之前处理/etc/fstab文件。

为了确保可以挂载iSCSI磁盘,我们需要在/etc/fstab中使用_netdev挂载选项。

因此,为确保持久配置iSCSI挂载,请在"/etc/fstab"中放置一个如下所示的条目:

UUID-XXXXXXXX-XXXX-XXXX-XXXXXXXX    /iscsi       ext4     _netdev   0 2