如何在CentOS/RHEL 7/8 Linux上配置iSCSI目标和启动器
在" 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 7 | CentOS 7 |
vCPU | 2 | 2 |
内存 | 4 GB | 4 GB |
磁盘 | 20GB | 20GB |
主机名 | node1 | storage1 |
FQDN | node1.example.com | storage1.example.com |
IP地址 | 10.0.2.20 | 10.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命令,例如cd
,ls
,pwd
,并设置为配置目标。
设置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