简介
iSCSI 称为IP-SAN,是一种基于因特网及SCSI-3协议下的存储技术,由IETF提出,并于2003年2月11日成为正式的标准。与传统的SCSI技术比较起来,iSCSI技术有以下三个革命性的变化:
- 把原来只用于本机的SCSI协议透过TCP/IP网络发送,使连接距离可作无限的地域延伸;
- 连接的服务器数量无限(原来的SCSI-3的上限是15);
- 由于是服务器架构,因此也可以实现在线扩容以至动态部署
功能
ISCSI利用了TCP/IP的port 860 和 3260 作为沟通的渠道。透过两部计算机之间利用iSCSI的协议来交换SCSI命令,让计算机可以透过高速的局域网集线来把SAN模拟成为本地的储存装置。
iSCSI使用 TCP/IP 协议(一般使用TCP端口860和3260)。 本质上,iSCSI 让两个主机通过 IP 网络相互协商然后交换SCSI命令。这样一来,iSCSI 就是用广域网仿真了一个常用的高性能本地存储总线,从而创建了一个存储局域网(SAN)。不像某些 SAN 协议如FC-SAN,iSCSI 不需要专用的电缆;它可以在已有的交换和 IP 基础架构上运行这就是IP-SAN。然而,如果不使用专用的网络或者子网( LAN 或者 VLAN ),iSCSI SAN 的部署性能可能会严重下降。于是,iSCSI 【IP-SAN】常常被认为是光纤通道(Fiber Channel)【FC-SAN】的一个低成本替代方法,而光纤通道是需要专用的基础架构的。但是,基于以太网的光纤通道(FCoE)则不需要专用的基础架构。
虽然 iSCSI 可以与任意类型的 SCSI 设备进行通信,系统管理员几乎总是使用它来连接服务器计算机 (例如,数据库服务器) 和磁盘卷上存储阵列。 使用iSCSI SAN 的目的通常有以下两个:
存储集成公司希望将不同的存储资源从分散在网络上的服务器移动到统一的位置(常常是数据中心); 这可以让存储的分配变得更为有效。 SAN 环境中的服务器无需任何更改硬件或电缆连接就可以得到新分配的磁盘卷。
灾难恢复公司希望把存储资源从一个数据中心镜像到另一个远程的数据中心上,后者在出现长时间停电的情况下可以用作热备份。 特别是,iSCSI SAN 使我们只需要用最小的配置更改就可以在 WAN 上面迁移整个磁盘阵列,实质上就是,把存储变成了“可路由的”,就像普通的网络通信一样
1、认识iSCSI
iSCSI(Internet Small Computer System Interface,Internet 小型计算机系统接口)是一种由IBM公司研究开发的IP SAN技术,该技术是将现有SCSI接口与以太网络(Ethernet)技术结合,基于 TCP/IP的协议连接iSCSI服务端(Target)和客户端(Initiator),使得封装后的SCSI数据包可以在通用互联网传输,最终实现iSCSI服务端映射为一个存储空间(磁盘)提供给已连接认证后的客户端。
1.1 ISCSI
SCSI的数据传输是以块的方式进行的。
如上图,SCSI总线通过SCSI控制器来和硬盘之类的设备进行通信, SCSI控制器称为Target,访问的客户端应用称为Initiator。窄SCSI总线最多允许8个、宽SCSI总线最多允许16个不同的SCSI设备和它进行连接,每个SCSI设备都必须有自己唯一的SCSI ID(设备的地址)。 LUN(Logical Unit Number,逻辑单元号)是为了使用和描述更多设备及对象而引进的一个方法,每个SCSI ID上最多有32个LUN,一个LUN对应一个逻辑设备。
广泛应用于小型机上,正在成为PC 服务器的标准接口,实现高速数据传输(可达320MB/s),常见的SCSI设备:硬盘、磁盘阵列、打印机、光盘刻录机等。
1.2、iSCSI实现 C客户端 S服务端
1)iSCSI Initiator
iSCSI 启动器,从本质上说,iSCSI 启动器是一个客户端设备,用于将请求连接并启动到服务器(iSCSI 目标)。
如上图,iSCSI 启动器有三种实现方式:
(1)可以完全基于硬件实现,比如 iSCSI HBA 卡;
(2)硬件TOE卡与软件结合的方式;
(3)完全基于软件实现,而软件 iSCSI 启动器适用于大部分主流操作系统平台,下面就是用软件方式来配置。
2) iSCSI Target
即 iSCSI 目标,它是 iSCSI 网络的服务器组件,通常是一个存储设备,用于包含所需的数据并回应来自 iSCSI 启动器的请求。
3)工作过程
Initiator【客户端】发出请求后,会在本地的操作系统会生成了相应的SCSI命令和数据I/O请求,然后这些命令和请求被封装加密成IP信息包,通过以太网(TCP/IP)传输到Targer【服务端】。
当Targer接收到信息包时,将进行解密和解析,将SCSI命令和I/O请求分开。SCSI命令被发送到SCSI控制器,再传送到SCSI存储设备。
设备执行SCSI命令后的响应,经过Target封装成iSCSI响应PDU,再通过已连接的TCP/IP网络传送给Initiator。
Initiator会从iSCSI响应PDU里解析出SCSI响应并传送给操作系统,操作系统再响应给应用程序
1.3 、iSCSI与FC SAN
FC(FiberChannel,光纤通道)是利用光纤信道结合光纤通道交换机实现高速的数据存储网络。FC性能很好,但价格却贵得惊人,管理起来也非常困难。
所以iSCSI利用现有的以太网络,用户只需要少量的投入,就可以方便、快捷地对信息和数据进行交互式传输和管理。当然iSCSI与FC相比也存在明显的不足,如速度性能、安全可靠性。
1.4、SAN与NAS / iSCSI与NFS
通过前面文章知道,SAN与NAS是完全不同架构的存储方案,前者支持Block协议,后者则支持File协议;SAN结构中,文件管理系统(FS)还是分别在每一个应用服务器上,会产生I/O操作,而NAS则是每个应用服务器通过网络共享协议(如:NFS、CIFS)使用同一个文件管理系统,所以CPU密集型应用可以选用NAS。SAN是将目光集中在磁盘、磁带以及联接它们的可靠的基础结构,而NAS是将目光集中在应用、用户和文件以及它们共享的数据上,显得更"高级"。将来从桌面系统到数据集中管理到存储设备的全面解决方案将是NAS加SAN。
以上区别具体到iSCSI和NFS:iSCSI可优化空间更大,性能稍好,但技术难度更高;而NFS在系统层面的支持更多,像一些备份、恢复等操作较简单。
2、相关准备配置
2.1)从协议层次的角度看,通常所说的SCSI通常是指一组包含块命令、控制器管理、系统命令和enclosure服务等内容的协议规范,对应于回话层;而其下的物理通道和链接方式就对应在数据链路层,SCSI命令可以通过串口、Fibre Channel[FC]、SAS、infiniband、Internet、USB、PCIE等进行传输。iSCSI就是一种把异地存储资源通过TCP/IP网络映射到本地逻辑存储设备的SCSI实现。不同于NFS向用户提供按文件为单位访问远程存储的方式,它向用户提供了以块方式访问远程存储资源的接口,也就是说用户可以在本地/dev/下看到iSCSI映射后的磁盘。通常所说的target端是指远端存储资源所在的主机,比如存储服务器;而initiator端是指链接到target端并会访问远端存储资源的节点。
2.2.) iSCSI target管理工具的特点,基于iSCSI的网络属性,很直观地我们能想到它基本上是基于server-client模型。提供存储资源的target相当于server,而使用远程存储资源的initiator端相当于client。基于现有的iSCSI协议规范,能够开发出target端和initiator端工具。在Linux系统上,initiator端工具可以用iscsiadm,目前大部分os都自带有这款工具;而target端的工具由于直接和性能和存储管理相关,数量更多,目前常见的有targetcli、targetadm、ietadm,它们各有所长,分别能适用不同的场合。
2.3 )工具介绍
IET(iSCSI Enterprise Target 【iscsitarget-1.4.20.2.tar.gz】)是内核态实现的iscsi target,相比于用户态实现的target(比如tgt【scsi-target-utils或targetcli】),IET比较稳定,并且也算是历史悠久,io都直接经过内核态,性能比较好。tgt为用户态实现,方便调试,新加入一些功能等,不过性能相比iet来说要稍差一点
2.4) tgt程序架构:
2.4.1 )target之精巧的LIO targetcli.rpm 服务端
相对而言,targetcli是最新的target管理工具,内核态基于Linux 2.6.38开始引入的Linux IO Target,用户态提供了targetcli命令和python开发库rtslib,为用户提供了友好的操作界面。为此,现在大部分Linux OS发现版本默认都自带了LIO targetcli
2.4.2 )target之功能完备tgtadm----->scsi-target-utils.rpm 服务端
在LIO targetcli出现之前,tgtadm是首选的target管理工具,被用到企业存储解决方案当中。除了LUN管理、ACL控制等功能之外,它还提供了对已连接上的initiator的检测和iSNS服务的支持。虽然界面没法和LIO的targetcli相比,但是不乏功能强大的命令来完成各种操作。
2.5) IET架构 iscsitarget-1.4.20.2
iSCSI Enterprise Target download
iSCSI Enterprise Target
3. 操作试验
3.1 环境
iscsi-server:工具 scsi-target-utils.rpm或targetcli.rpm
centos 7.5 主机,IP地址:172.16.10.21 , 主机名:iscsi-server.cclinux.com
iscsi-client: 工具iscsi-initiator-utils.rpm
centos 7.5 主机, IP地址:172.16.10.15 , 主机名:iscsi-client.cclinux.com
实验一:使用targetcli配置单个启动器作为iscsi客户端的存储
3.1.1.1)iscsi-Server配置过程 。实验环境全部准备完毕后,首先在服务器端安装targetcli工具,并设置target服务开机自启
[root@jettoloader iscsi]# yum install -y targetcli
启动服务
[root@jettoloader targetcli]# systemctl enable targetclid --now
[root@jettoloader iscsi]# systemctl enable target --now
3.1.1.2) 添加硬盘,LVM操作
我们将新添加的一块大小为28G的虚拟磁盘/dev/sdb作为iscis卷组来使用
将/dev/sdb创建成一个分区,设置磁盘格式为逻辑卷格式。
备注:我们这里也可以不用分区直接使用整块磁盘来,这里分区是为了将磁盘创建成逻辑卷让它支持动态扩展
[root@jettoloader iscsi]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 99G 0 part
├─centos-root 253:0 0 50G 0 lvm /
├─centos-swap 253:1 0 7.8G 0 lvm [SWAP]
└─centos-home 253:2 0 41.2G 0 lvm /home
sdb 8:16 0 16G 0 disk
sdc 8:32 0 16G 0 disk
sdd 8:48 0 16G 0 disk
sr0 11:0 1 1024M 0 rom
[root@jettoloader iscsi]# fdisk /dev/sdb
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.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xb62538e8.
Command (m for help): p
Disk /dev/sdb: 17.2 GB, 17179869184 bytes, 33554432 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: 0xb62538e8
Device Boot Start End Blocks Id System
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): 1
First sector (2048-33554431, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-33554431, default 33554431):
Using default value 33554431
Partition 1 of type Linux and of size 16 GiB is set
Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@jettoloader iscsi]# partprobe /dev/sdb
3.1.1.3)将新的分区创建成LVM格式
[root@jettoloader iscsi]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
[root@jettoloader iscsi]# vgcreate ISCSI /dev/sdb1
Volume group "ISCSI" successfully created
[root@jettoloader iscsi]# lvcreate -l 100%VG -n wubo_iscsi ISCSI
Logical volume "wubo_iscsi" created.
3.1.1.4)使用targetcli配置命令进行服务端配置
[root@jettoloader iscsi]# targetcli
targetcli shell version 2.1.53
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.
/> 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]
o- loopback ......................................................................................................... [Targets: 0]
/>
此时初始状态没有任何卷组及其它配置信息
接下来我们进行ISCSI服务端的配置
3.1.1.5)创建一个块存储
/> /backstores/block create iscsi_vol /dev/ISCSI/wubo_iscsi
Created block storage object iscsi_vol using /dev/ISCSI/wubo_iscsi.
3.1.1.6)为ISCSI-Target【服务端】命名
备注:命名格式为:iqn.yyyy-mm.<主机名反写>:自定义主机名
/> /iscsi create iqn.2022-02.com.cclinux.iscsi-server:server
Created target iqn.2022-02.com.cclinux.iscsi-server:server.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
3.1.1.7)创建ACL允许ISCSI客户机连接
/> cd iscsi/iqn.2022-02.com.cclinux.iscsi-server:server/tpg1/
/iscsi/iqn.20...r:server/tpg1> ls
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]
/iscsi/iqn.20...r:server/tpg1> acls/ create iqn.2022-02.com.cclinux.iscsi-server:server:initiator01
Created Node ACL for iqn.2022-02.com.cclinux.iscsi-server:server:initiator01
3.1.1.8)创建LUN并且和存储设备相关联(target块设备的逻辑单元)
/iscsi/iqn.20...r:server/tpg1> luns/ create /backstores/block/iscsi_vol
Created LUN 0.
Created LUN 0->0 mapping in node ACL iqn.2022-02.com.cclinux.iscsi-server:server:initiator01
3.1.1.9)创建ip与端口,
#删除默认规则
#172.16.10.21是iscsi服务器ip
/iscsi/iqn.20...r:server/tpg1> portals/ delete 0.0.0.0 3260
Deleted network portal 0.0.0.0:3260
/iscsi/iqn.20...r:server/tpg1> portals/ create 172.16.10.21 3260
Using default IP port 3260
Created network portal 172.16.10.21:3260.
/iscsi/iqn.20...r:server/tpg1> portals/ ls
o- portals ............................................................................................................ [Portals: 1]
o- 172.16.10.21:3260 ........................................................................................................ [OK]
3.1.1.10)保存配置和查看配置信息
/> ls
o- / ......................................................................................................................... [...]
o- backstores .............................................................................................................. [...]
| o- block .................................................................................................. [Storage Objects: 1]
| | o- iscsi_vol .......................................................... [/dev/ISCSI/wubo_iscsi (16.0GiB) write-thru activated]
| | 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: 1]
| o- iqn.2022-02.com.cclinux.iscsi-server:server ....................................................................... [TPGs: 1]
| o- tpg1 ............................................................................................... [no-gen-acls, no-auth]
| o- acls .......................................................................................................... [ACLs: 1]
| | o- iqn.2022-02.com.cclinux.iscsi-server:server:initiator01 .............................................. [Mapped LUNs: 1]
| | o- mapped_lun0 ............................................................................. [lun0 block/iscsi_vol (rw)]
| o- luns .......................................................................................................... [LUNs: 1]
| | o- lun0 ..................................................... [block/iscsi_vol (/dev/ISCSI/wubo_iscsi) (default_tg_pt_gp)]
| o- portals .................................................................................................... [Portals: 1]
| o- 172.16.10.21:3260 ................................................................................................ [OK]
o- loopback ......................................................................................................... [Targets: 0]
/> ls /iscsi/iqn.2022-02.com.cclinux.iscsi-server:server/tpg1/
o- tpg1 ..................................................................................................... [no-gen-acls, no-auth]
o- acls ................................................................................................................ [ACLs: 1]
| o- iqn.2022-02.com.cclinux.iscsi-server:server:initiator01 .................................................... [Mapped LUNs: 1]
| o- mapped_lun0 ................................................................................... [lun0 block/iscsi_vol (rw)]
o- luns ................................................................................................................ [LUNs: 1]
| o- lun0 ........................................................... [block/iscsi_vol (/dev/ISCSI/wubo_iscsi) (default_tg_pt_gp)]
o- portals .......................................................................................................... [Portals: 1]
o- 172.16.10.21:3260 ...................................................................................................... [OK]
/>
/> saveconfig
Configuration saved to /etc/target/saveconfig.json
/> exit
Global pref auto_save_on_exit=true
Configuration saved to /etc/target/saveconfig.jso
当设置完毕后,查看配置信息会出现上图所示信息。
[root@jettoloader iscsi]# netstat -napt | grep 3260
tcp 0 0 172.16.10.21:3260 0.0.0.0:* LISTEN -
设置防火墙规则放行IP及端口号,如果有防火墙
firewall-cmd --add-rich-rule 'rule family="ipv4" sorurce address="172.16.10.0/24" port port="3260" protocol="tcp" accept'
firewall-cmd --add-rich-rule ' rule family="ipv4" sorurce address="172.16.10.0/24" port port="3260" protocol="tcp" accept' --permanent
firewall-cmd --list-all (查看当前防火墙的规则信息)
firewall-cmd --add-port=3260/tcp --permanent (永久添加3260端口)
firewall-cmd --reload(加载)
3.1.2.1)iscsi Initiator【客户端】配置过程
在iscis-client主机上安装ISCSIInitiator,并设置开机自启
[root@jettoloader ~]# yum install iscsi-initiator-utils
[root@jettoloader ~]# systemctl enable iscsid --now
Created symlink from /etc/systemd/system/multi-user.target.wants/iscsid.service to /usr/lib/systemd/system/iscsid.service.
3.1.2.2)配置ISCSI Initiator名称
[root@jettoloader ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2022-02.com.cclinux.iscsi-server:server:initiator01
3.1.2.3)重启一下iscsi服务
[root@jettoloader ~]# systemctl restart iscsid
3.1.2.4)查找ISCIS设备
在查找之前先看一下系统的磁盘设备
[root@jettoloader ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sda 8:0 0 30G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 29.5G 0 part
├─centos-root 253:0 0 28.5G 0 lvm /
└─centos-swap 253:1 0 1G 0 lvm [SWAP]
sr0 11:0 1 1024M 0 rom
注意要将IP与对应的主机名写到/etc/hosts中
[root@jettoloader ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.10.21 iscsi-server.cclinux.com
172.16.10.15 iscsi-client.cclinux.com
发现只有sda以及sr0两个存储设备
实验二:使用targetcli为多个启动器配置ISCSI访问控制
[root@jettoloader targetcli]# yum install scsi-target-utils.x86_64
启动服务
[root@jettoloader tgtadm]# systemctl enable tgtd --now