iSCSI(internet SCSI)技术由IBM公司研究开发,是一个供硬件设备使用的、可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够在诸如高速千兆以太网上进行路由选择。iSCSI技术是一种新储存技术,该技术是将现有SCSI接口与以太网络(Ethernet)技术结合,使服务器可与使用IP网络的储存装置互相交换资料。
iSCSI分为服务端和客户端,服务端需要安装scsi target用来共享存储设备,客户端需要安装iscsi initiator用来连接target端,将target端共享的设备挂载到initiator本地,可以对其进行分区,格式化等操作
一、iSCSI实现数据的访问需要的条件:
1、iSCSI客户端具有的特性:
iSCSI initiator是发起I/O操作的启动者;需要通过发现过程请求远端快设备;可以与target进行持久连接;在Linux系统中可以使用open-iscsi软件包来模拟实现;
2、iSCSI服务器端具有的特性:
iSCSI target是I/O操作的执行者;需要导出一个或多个块设备供启动者(initiator)使用;在Linux系统中可以使用两种target工具,分别为tgt,和targetcli,这里先介绍TGT的方法,TGT是Fujita Tomonori于2006年底将SCSI Target Framework (STGT/TGT) 引入Linux内核。它在内核中有一个库,可协助内核控制目标驱动程序,TGT是用户态实现的iscsi target,所有目标处理都在用户空间进行。在2010年底,LIO(Linux-IO)项目被选择来代替TGT作为内核态实现的iscsi target。当选择LIO替换TGT时,它的实现已经进行了调整,以允许TGT用户空态模块继续运行,因此TGT社区支持在内核中包含LIO。在Linux内核 2.6.38 之前都是TGT。
3、iSCSI 命名规则
iSCSI 使用全球唯一的名称标识 iSCSI 设备(目标或启动器)。此名称类似于与光纤通道设备相关联的全球名称 (WWN),可作为一种通用的设备识别方式使用。
iSCSI 名称有两种不同格式。第一种是通过iSCSI限定名以 iqn.开头通常称为“IQN 名称”。第二种是通过企业唯一标识符,以eui.开头也称为“EUI 名称”,此方法不常用。
有关 iSCSI 命名要求和字符串配置文件的更多详细信息,请参见 IETF 网站上的 RFC 3721 和 RFC 3722。
iSCSI 限定名
iSCSI 限定名采用 iqn.yyyy-mm.naming-authority:unique name 的形式,其中:
yyyy-mm :
表示“年份-月份“,是公司成立的年份和月份,这里的公司一般为安装软件的这个公司,当然了可以随意选个时间
naming-authority :
通常是公司的 Internet 域名的逆转格式。例如,pipci 公司的 iSCSI 限定名形式可能是 iqn.2018-01.cc.pipci.iscsi。此名称表示 pipci.cc域名于 2018 年 1 月注册,iscsi 是pipci.cc的子域,子域名可有可无。
unique name:
是希望使用的任何名称,如主机的名称或sn号。必须确保在冒号后面分配的任何名称都是唯一的,例如:
iqn.2018-01.cc.pipci.iscsi:host1
iqn.2018-01.cc.pipci.iscsi:name1
iqn.2018-01.cc.pipci.iscsi:sn1999
企业唯一标识符
企业唯一标识符采用 eui.<16 hex digits> 的形式。
例如,eui.0123456789ABCDEF。
16 位十六进制数字是 IEEE EUI(扩展唯一标识符)格式的 64 位数的文本表示形式。前 24 位是 IEEE 向特定公 司注册的公司 ID。后 40 位由持有该公司 ID 的实体分配,并且必须是唯一的。 在许多情况下,人们都会选择 IQN 格式,而不是 EUI 格式,因为 IQN 格式方便阅读,并且是一种更友好的名 称分配方式。
二、iSCSI initiator发现iSCSI target的过程:
ISCSI initiator按照配置文件/etc/iscsi/iscsid.conf中配置的相应项目利用iSCSI的发现机制在网络中收索目标设备target
ISCSI target将返回有效的iqn名称给iSCSI initiator
ISCSI target按照配置的验证方式接受initiator的登录并返回目标设备target标识
ISCSI initiator发生查询请求给target请求查询target的相关信息
target响应initiator的查询请求,并将设备的有关信息返回给initiator
initiator创建可以的目标设备target列表
三、iSCSI设备的特性:
支持ACL(访问控制列表)
支持两种挑战握手协议CHAP(ChallengeHandshake Authentication Protocol)的认证方式
支持多通道(multipath)
支持sendtargets发现机制
支持动态目标端发现
具备异步事件通知入口
支持即时数据更新
支持动态设备重配
支持自动挂接iSCSI技术
支持IPV6技术
四、iSCSI设备名称
iSCSI设备在iSCSI启动端(Initiator)导入的时候,其内核将按当前的设备情况给iSCSI设备分配一个本地SCSI设备名(例如/dev/sda或/dev/sdb等),如果导入的iSCSI设备已被分区,在导入iSCSI设备建立本地SCSI设备的同时也会建立相应的分区设备名(例如/dev/sda1、/dev/sda5等等),但要注意的是此SCSI设备名并不是每次导入是都是固定的,比如你的主机之前没有/dev/sda设备,你导入了iSCSI设备,其被内核命名为/dev/sda;之后你将其取消了导入,并重新挂接了一个热插拔设备(如U盘或移动硬盘),这个热插拔设备占据的/dev/sda设备;你又从新导入了iSCSI设备,此时其被内核分配的设备名就成了/dev/sdb。
五、为什么要搭建iSCSI共享存储,因为穷!!!,如果有钱最好的方法是买一台真正的存储,因为没钱还要做很多需要共享存储才能测试的功能,比如 Oracle RAC ,虚拟化的HA等都需要一台共享存储,下面将介绍通过Linux 软件来实现iscsi目标器,从而自己搭建一台iscsi存储,组建iscsi
六、Linux-IO简介
Linux-IO Target在Linux内核中(linux 2.6.38后),用软件实现各种SCSI Target,其支持的SAN技术中所有流行的存储协议包括Fibre Channel(Qlogic,linux3.5)、FCoE(linux3.0)、iSCSI(linux 3.1)、iSER (Mellanox InfiniBand,linux3.10), SRP (Mellanox InfiniBand,linux3.3), USB等,同时还能为本机生成模拟的SCSI设备,以及为虚拟机提供基于virtio的SCSI设备。Linux-IO Target使用户能够使用相对廉价的Linux系统实现SCSI、SAN的各种功能,而不用购买昂贵的专业设备。
1. 架构
上图显示了Linux-IO Target的各个组件。LIO模拟了通用的SCSI设备,并且实现了SPC-3和4。接着,通过各种各样的backstore对象,来导入真正的后端存储,最后连接上各种前端Fabric模块,来导出模拟的SCSI设备。无论是Fibre Channel、FCoE、iSCSI还是vhost(即virtio),都只是一种Fabric技术,我们可以将其理解成传输协议,而在这些传输协议中传输的SCSI命令则总是由核心的SCSI设备处理的。要支持新的Fabric技术,并不需要修改核心的SCSI设备和后端存储模块,只需要按照该Fabric技术的规范实现对SCSI命令的传输就可以了。iSCSI技术就是把SCSI命令放在TCP/IP中传输,vhost技术就是把SCSI命令放在virtio队列中传输。
Generic Target Engine:实现了SAM中规定的一个SCSI target的功能,主要是SCSI协议的解析。它通过Fabric模块和initiator通信,通过backstore和具体的存储设备通信。Fabric modules:实现了LIO的前端,即SCSI协议传输层的模块。可以通过Fabric Hardware Abstraction Layer(F-HAL)来为LIO增加新的fabric模块。
Backstores:实现了LIO的后端,即访问磁盘数据的方式。可以通过Storage Hardware Abstraction Layer(S-HAL)在LIO中增加新的存储硬件的支持。通常使用BLOCKIO和FILEIO。
2. 使用方法
Linux-IO Target则在内核态实现了对Target的模拟,配置管理则采用了更为“现代化”的基于sysfs的方式,提供了友好的用户态管理工具。从内核的2.6.38版起,Linux内核都包含Linux-IO Target的相关模块。在用户态,各大发行版都打包了targetcli和rtslib,其中targetcli程序用于配置、管理,rtslib则提供Python编程接口。
以iSCSI为例,Linux-IO Target的配置结构如图1所示。处于最后端的是各种各样的Linux的存储设备。Linux-IO Target支持的后端存储设备包括Ramdisk、通用块设备和文件,也可以直接映射本地SCSI设备。Linux-IO Target通过创建backstore存储对象来导入这些存储设备。它可以使用各种SAN传输技术来导出这些存储对象。首先,基于某种SAN技术(例如iSCSI)创建一个Target。接着,在Target里创建一个TPG(Target Portal Group)。每个Target下可以创建多个TPG,每个TPG包含了一组入口(Portal)。然后在TPG里创建LUN,并将特定的存储对象与特定的LUN关联起来。最后在TPG里创建一个或者多个入口,对iSCSI来说,每个Portal就是一个IP地址和端口的组合。为了更精确的控制对LUN的访问,还可以在TPG之下创建各种ACL规则。
targetcli
targetcli是Linux-IO Target的用户态的管理配置工具。用户可以使用yum或apt-get直接从各大发行版的官方仓库安装,对于较老的linux版本需要自己编译源码安装。targetcli提供一个类似shell的界面,各种Target、TPG、LUN、backstore对象则被组织成目录树的形式,用户可以用ls、cd命令来浏览目录树,用create、delete命令来创建和删除各种对象。浏览配置,就是浏览目录树,创建删除各种对象,就是在目录树的各级节点中创建新的节点。同时targetcli还提供了常见的shell命令辅助编辑功能,例如TAB智能补全、上下键切换命令历史、Ctrl + R搜索命令历史。凡是有不熟悉的命令,都可以用help命令查询使用说明。其实,对于我们来说,配置LIO主要就是使用targetcli
rtslib
rtslib是一个Python程序库,让用户可以以编程的方式配置Linux-IO Target的各项功能。rtslib中的对象也被组织成树状结构,并且与我们在targetcli中熟悉的各种对象也很相似。熟悉了targetcli的操作之后,用rtslib编程就变得十分容易
七、安装配置工具targetcli
targetcli工具包在Debian7时候为targetcli,Debian9中的软件包为targetcli-fb(“自由分支”)的新软件包。
--------------------------------------------------
root@debian:~# apt install targetcli-fb
--------------------------------------------------
安装完targetcli-fb将会生成/etc/rtslib-fb-target/saveconfig.json用于保存配置,补充一下 Linux-IO / LIO 和传统的 STGT / tgt 还有 SCST 是不同的,没有服务重启的概念。其配置是用targetcli命令行工具通过 ConfigFS (RAM-based 文件系统,类似于 sysfs 但用途不一样,两者是互补的)来和内核 API 交互。
八、关闭防火墙或开启TCP 3260 端口,LIO通过TCP的3260端口来进行数据的传输
九、使用targetcli创建后端存储对象
targetcli命令有两种模式,一种是交互式模式,一种是命令行模式。输入targetcli 回车就进入交互式模式,进入交互式模式可以使用ls,pwd,cd等命令
1. targetcli初始提示
--------------------------------------------------
root@debian:~# targetcli
targetcli shell version 2.1.fb43
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.
/> #在这里按2次TAB键可以查看所有可用的命令,在每个目录下都可以通过这种方式查看可用的命令
* / @last backstores/ iscsi/ loopback/ vhost/ bookmarks
cd clearconfig exit get help ls pwd refresh
restoreconfig saveconfig sessions set status version
/>
--------------------------------------------------
2. 在交互模式下列出初始目录树,输入ls命令,targetcli便将当前的目录树输出
--------------------------------------------------
/> 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]
o- vhost ...................................... [Targets: 0]
/>
--------------------------------------------------
命令行实现:
--------------------------------------------------
root@debian:~# targetcli ls
o- / ................................................... [...]
o- backstores ........................................ [...] #用户配置后端存储目录,下面有4个子目录分别创建不同类型的存储资源
| o- block ............................ [Storage Objects: 0] #配置块设备目录,可以是磁盘驱动器,分区,逻辑卷,多路径设备,只要块设备都可以
| o- fileio ........................... [Storage Objects: 0] #配置文件(镜像img)目录,根据一个事先准备的文件,提供存储功能
| o- pscsi ............................ [Storage Objects: 0] #配置物理scsi设备目录,不推荐使用
| o- ramdisk .......................... [Storage Objects: 0] #配置内存存储目录,利用内存当做存储。
o- iscsi ...................................... [Targets: 0] #配置iSCSI目标
o- loopback ................................... [Targets: 0]
o- vhost ...................................... [Targets: 0]
root@debian:~#
--------------------------------------------------
2、创建物理磁盘结构作为target后端的物理存储(事先已经准备好了一个5G的磁盘做备用)
--------------------------------------------------
root@debian:~# targetcli
targetcli shell version 2.1.fb43
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.
/> cd backstores/block #进入block子目录来通过块设备创建target后端存储资源
/backstores/block> create lun1 /dev/sdb #通过create命令创建名字为lun1的存储资源
Created block storage object lun1 using /dev/sdb.
/backstores/block> ls #查看创建的存储资源
o- block ................................ [Storage Objects: 1]
o- lun1 ......... [/dev/sdb (5.0GiB) write-thru deactivated] #新创建的
--------------------------------------------------
命令行的实现:
root@debian:~# targetcli /backstores/block create name=lun1 dev=/dev/sdb
3、创建文件和内存作为target后端的物理存储
--------------------------------------------------
/backstores> cd fileio/ #进入fileio子目录来通过文件创建target后端存储资源
/backstores/fileio> create lun1 /tmp/lun1.img #/tmp/lun1.img文件的大小是你想用资源的大小,可以通过dd命令创建空文件
Created fileio lun1 with size 1073741824 #这个文件的大小是1G
/backstores/fileio> cd ../ramdisk #进入ramdisk子目录来通过内存创建target后端存储资源
/backstores/ramdisk> create rd0 10MB #使用10MB的内存空间创建名称为rd0的存储资源
Created ramdisk rd0 with size 10MB.
/backstores/ramdisk>
--------------------------------------------------
命令行的实现:
root@debian:~# targetcli /backstores/fileio create name=lun1 file_or_dev=/tmp/lun1.img
root@debian:~# targetcli /backstores/ramdisk create name=rd0 size=10MB
4、查看创建的存储资源
--------------------------------------------------
/backstores> ls
o- backstores .......................................... [...]
o- block .............................. [Storage Objects: 1]
| o- lun1 ....... [/dev/sdb (5.0GiB) write-thru deactivated] #基于块的
o- fileio ............................. [Storage Objects: 1]
| o- lun1 .. [/tmp/lun1.img (1.0GiB) write-back deactivated] #基于文件的
o- pscsi .............................. [Storage Objects: 0]
o- ramdisk ............................ [Storage Objects: 1]
o- rd0 ........................... [(10.0MiB) deactivated] #基于内存的
/backstores>
--------------------------------------------------
5、删除刚才创建的存储资源以block/为例子,其他目录的一样
--------------------------------------------------
/backstores> cd block/ #进入创建的子目录删除
/backstores/block> delete #输入删除命令delete按两下TAB键,查看操作提示
lun1 name= #delete命令后可以接的参数
/backstores/block> delete lun1 #delete命令后输入资源名直接回车删除
Deleted storage object lun1.
/backstores/block> ls
o- block ................................ [Storage Objects: 0] #成功删除
/backstores/block>
--------------------------------------------------
命令行的实现:
root@debian:~# targetcli /backstores/block delete name=lun1
可以创建fileio和ramdisk类型的backstore对象,还可以创建block和pscsi对象。block对象可以用来导入一般的块设备,比如/dev/hdaX、/dev/sdX、/dev/vgX/lvX等。pscsi对象可以用来导入系统里已有的SCSI设备(即lsscsi列出的设备),所有SAN的前端收到的SCSI命令都会透传到pscsi导入的设备。需要注意,Linux-IO Target所模拟的SCSI设备实现了SPC-2、SCP-3和SPC-4规范,也就是说Persistent Reservations (PRs)、Asymmetric Logical Unit Assignment (ALUA)和vStorage APIs for Array Integration (VAAI)等高端SCSI特性都有实现。但是主机上的现有SCSI设备则未必实现了SPC-4,因此在需要高端SCSI特性的场合,最好通过block对象来导入/dev/sdX这样的设备,而不是通过pscsi。
十、 使用targetcli创建iSCSI目标
1、创建iSCSI目标
--------------------------------------------------
/iscsi> create #create命令后面如果不加任何参数会自动创建一个target同时iqn号也是随机的
Created target iqn.2003-01.org.linux-iscsi.debian.x8664:sn.aea77a8eef23.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
/iscsi> delete iqn.2003-01.org.linux-iscsi.debian.x8664:sn.aea77a8eef23 #删除这个随机的iqn
Deleted Target iqn.2003-01.org.linux-iscsi.debian.x8664:sn.aea77a8eef23.
/iscsi> create iqn.2019-10.cc.pipci.iscsi:debian.tgt1 #创建一个方便记忆的iqn,但是要保证唯一性
Created target iqn.2019-10.cc.pipci.iscsi:debian.tgt1.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
/iscsi> ls
o- iscsi ........................................ [Targets: 1]
o- iqn.2019-10.cc.pipci.iscsi:debian.tgt1 ........ [TPGs: 1] #创建的target,以iqn名字的目录形式存在
o- tpg1 ........................... [no-gen-acls, no-auth] #同时创建子目录TPG
o- acls ...................................... [ACLs: 0] #ACL(访问控制列表)控制子目录
o- luns ...................................... [LUNs: 0] #用于关联存储资源子目录
o- portals ................................ [Portals: 1] #监听的端口资源
o- 0.0.0.0:3260 ................................. [OK]
/iscsi>
--------------------------------------------------
命令行实现:
root@debian:~# targetcli /iscsi create iqn.2019-10.cc.pipci.iscsi:debian.tgt1 #创建
root@debian:~# targetcli /iscsi delete iqn.2019-10.cc.pipci.iscsi:debian.tgt1 #删除
--------------------------------------------------
2、关联后端存储资源
--------------------------------------------------
/iscsi> cd iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1/luns #进入到关联子目录
/iscsi/iqn.20...gt1/tpg1/luns> create /backstores/block/lun1 #通过命令create命令关联/backstores/block/lun1是上面创建的存储资源,要注意路径
Created LUN 0. #默认创建lUN0
/iscsi/iqn.20...gt1/tpg1/luns> ls #查看关联的存储资源
o- luns ............................................ [LUNs: 1]
o- lun0 ............................ [block/lun1 (/dev/sdb)] #已经关联的存储资源
/iscsi/iqn.20...gt1/tpg1/luns> delete 0 #解除关联,在delete后面直接输入LUN号就可以
Deleted LUN 0.
/iscsi/iqn.20...gt1/tpg1/luns>
--------------------------------------------------
命令实现:
关联
root@debian:~# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1/luns create /backstores/block/lun1
解除关联
root@debian:~# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1/luns delete 0
3、配置ACL(访问控制列表)
ACL的作用是允许那些initiator可以访问target,target使用initiator的iqn来标识initiator。在ACL配置目录执行 set attribute generate_node_acls=0使用自定义的acl实现访问控制,则需要设置访问权限控制列表acl(默认就是这种),acl参数目录用于存放能够访问target端共享存储资源的initiator的iqn。在客户端访问时,只要iscsi客户端的iqn名称与服务端设置的访问控制列表中的iqn名称一致即可访问。如果不想使用ACL可以在ACL配置目录执行 set attribute generate_node_acls=1使用自动生成acl节点,这样不添加initiator的iqn也允许initiator访问。
--------------------------------------------------
/iscsi/iqn.20...ian.tgt1/tpg1> cd acls #进入ACL配置目录
/iscsi/iqn.20...gt1/tpg1/acls> create iqn.2019-10.cc.pipci.iscsi:clinet.sn8888 #添加允许访问的iqn号
Created Node ACL for iqn.2019-10.cc.pipci.iscsi:clinet.sn8888
Created mapped LUN 0.
/iscsi/iqn.20...gt1/tpg1/acls> ls #查看
o- acls ............................................ [ACLs: 1]
o- iqn.2019-10.cc.pipci.iscsi:clinet.sn8888 [Mapped LUNs: 1] #允许访问的iqn
o- mapped_lun0 .................... [lun0 block/lun1 (rw)]
/iscsi/iqn.20...gt1/tpg1/acls> delete iqn.2019-10.cc.pipci.iscsi:clinet.sn8888 #删除iqn
Deleted Node ACL iqn.2019-10.cc.pipci.iscsi:clinet.sn8888.
--------------------------------------------------
配置自动生成acl节点
--------------------------------------------------
/iscsi> ls
o- iscsi ........................................ [Targets: 1]
o- iqn.2019-10.cc.pipci.iscsi:debian.tgt1 ........ [TPGs: 1]
o- tpg1 ........................... [no-gen-acls, no-auth] #no-gen-acls表示自定义的acl实现访问控制,默认值
o- acls ...................................... [ACLs: 0]
o- luns ...................................... [LUNs: 1]
| o- lun0 ...................... [block/lun1 (/dev/sdb)]
o- portals ................................ [Portals: 1]
o- 0.0.0.0:3260 ................................. [OK]
/iscsi>
/iscsi> cd iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1/ #必须进入TPG目录下才可以更改
/iscsi/iqn.20...ian.tgt1/tpg1> set attribute generate_node_acls=1 #配置成自动生成acl节点
Parameter generate_node_acls is now '1'.
/iscsi/iqn.20...ian.tgt1/tpg1> ls
o- tpg1 .................................. [gen-acls, no-auth] #修改成功
o- acls .......................................... [ACLs: 0]
o- luns .......................................... [LUNs: 1]
| o- lun0 .......................... [block/lun1 (/dev/sdb)]
o- portals .................................... [Portals: 1]
o- 0.0.0.0:3260 ..................................... [OK]
/iscsi/iqn.20...ian.tgt1/tpg1>
--------------------------------------------------
一旦配置成自动生成acl节点,当initiator认证成功后,再配置成自定义的acl实现访问控制是无效的 只有重启系统后恢复正常,我感觉这个是因为有认证记忆的功能
命令实现:
添加iqn:
root@debian:~# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1/acls create iqn.2019-10.cc.pipci.iscsi:clinet.sn8888
删除iqn
root@debian:~# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1/acls delete iqn.2019-10.cc.pipci.iscsi:clinet.sn8888
配置自动生成acl节点
root@debian:~# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1 set attribute generate_node_acls=1
4、设置target端的监听IP地址和端口号,以发现target
有的服务器可能有多块网卡,那么到底是那块网卡或IP地址对外提供共享资源哪,我们可以手动在portals参数目录里设置监听的IP地址和端口,默认是监听所有地址的。
先删除默认的0.0.0.0这样不太安全
--------------------------------------------------
/iscsi/iqn.20...ian.tgt1/tpg1> ls
o- tpg1 .................................. [gen-acls, no-auth]
o- acls .......................................... [ACLs: 0]
o- luns .......................................... [LUNs: 1]
| o- lun0 .......................... [block/lun1 (/dev/sdb)]
o- portals .................................... [Portals: 1]
o- 0.0.0.0:3260 ..................................... [OK] #默认监听0.0.0.0也就是所有的IP地址,端口3260
/iscsi/iqn.20...ian.tgt1/tpg1> cd portals/ #进入portals目录配置
/iscsi/iqn.20.../tpg1/portals> delete 0.0.0.0 3260 #先删除 0.0.0.0地址,地址后面必须有端口号
Deleted network portal 0.0.0.0:3260
/iscsi/iqn.20.../tpg1/portals>
--------------------------------------------------
创建默认监听的端口
--------------------------------------------------
/iscsi/iqn.20.../tpg1/portals> create 192.168.1.16
Using default IP port 3260 # 如果上面的IP地址后面不加端口号会加上默认的3260,如果加端口在IP地址后面空格端口号就可以
Created network portal 192.168.1.16:3260.
/iscsi/iqn.20.../tpg1/portals> ls
o- portals ...................................... [Portals: 1]
o- 192.168.1.16:3260 .................................. [OK] # 更改成功
/iscsi/iqn.20.../tpg1/portals>
--------------------------------------------------
命令实现:
删除监听的IP
root@debian:~# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1/portals delete 0.0.0.0 3260
添加监听的IP和端口号,不加端口号使用默认的3260
root@debian:~# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1/portals create 192.168.1.16 3260
十一、配置服务端 targetcli CHAP(质询握手身份验证协议) 认证
认证分为全局配置和局部配置
在 /iscsi 下为全局配置。
在 iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1/ 下为单个Target的配置,配置只对单个IQN生效为局部配置
全局配置下只能设置发现认证,局部配置只能设置登录认证,其中每种认证又分为单向认证和双向认证
发现认证和登录认证的意思就和名字一样
单向认证是指initiator端在发现target端的时候,要提供正确的认证才能发现在target端的iSCSI服务
双向认证是指在单向认证的基础上,target端需要正确设置initiator端设置的认证才能被initiator端发现
无论那种认证都是在target端配置的
十二、全局配置下的发现认证
1、单向认证(target服务器认证initiator)
查看默认配置
--------------------------------------------------
/> cd iscsi/ #进入到iscsi/目录进行全局配置
/iscsi> get discovery_auth #查看发现认证状态
DISCOVERY_AUTH CONFIG GROUP
===========================
enable=False #没有开启
-----------
The enable discovery_auth parameter.
mutual_password= #双向认真的密码
----------------
The mutual_password discovery_auth parameter.
mutual_userid= #双向认真的用户名
--------------
The mutual_userid discovery_auth parameter.
password= #单向认真的密码
---------------
The password discovery_auth parameter.
userid= #单向认真的用户名
------------
The userid discovery_auth parameter.
--------------------------------------------------
命令实现:
root@debian:~# targetcli /iscsi/ get discovery_auth #查看发现认证状态
配置用户名密码
--------------------------------------------------
/iscsi> set discovery_auth enable=1 #数字1表示开启0表示关闭
Parameter enable is now 'True'.
/iscsi> set discovery_auth userid=laopi #添加用户laopi
Parameter userid is now 'laopi'.
/iscsi> set discovery_auth password=pi1234 #设置认证密码pi1234
Parameter password is now 'pi1234'.
/iscsi> get discovery_auth enable userid password
enable=True
userid=laopi
password=pi1234
/iscsi>
--------------------------------------------------
命令实现:
root@debian:~# targetcli /iscsi/ set discovery_auth enable=1 #数字1表示开启0表示关闭
root@debian:~# targetcli /iscsi/ set discovery_auth userid=laopi #添加用户laopi
root@debian:~# targetcli /iscsi/ set discovery_auth password=pi1234 #设置认证密码pi1234
这时我们需要设置initiator端的配置文件/etc/iscsi/iscsid.conf,才能允许发现
--------------------------------------------------
# *************
# CHAP Settings
# *************
.............
discovery.sendtargets.auth.authmethod = CHAP #开启CHAP
# To set a discovery session CHAP username and password for the initiator
# authentication by the target(s), uncomment the following lines:
discovery.sendtargets.auth.username = laopi #添加用户名
discovery.sendtargets.auth.password = pi1234 #添加密码
--------------------------------------------------
2、设置双向认证(必须建立在单向认证的基础上,因为在initiator登录的时候要先进行单项认证)
配置mutual用户名密码
--------------------------------------------------
/iscsi> set discovery_auth mutual_userid=laopimal #添加mutual用户名
Parameter mutual_userid is now 'laopimal'.
/iscsi> set discovery_auth mutual_password=pi123456 #设置mutual用户名密码
Parameter mutual_password is now 'pi123456'.
/iscsi> get discovery_auth #查看发现认证状态
DISCOVERY_AUTH CONFIG GROUP
===========================
enable=True
-----------
The enable discovery_auth parameter.
mutual_password=pi123456
------------------------
The mutual_password discovery_auth parameter.
mutual_userid=laopimal #添加成功
----------------------
The mutual_userid discovery_auth parameter.
password=pi1234
---------------
The password discovery_auth parameter.
userid=laopi #双向认证单项认证用户必须已经存在
------------
The userid discovery_auth parameter.
--------------------------------------------------
命令实现:
root@debian:~# targetcli /iscsi/ set discovery_auth mutual_userid=laopimal #添加mutual用户名
root@debian:~# targetcli /iscsi/ set discovery_auth mutual_password=pi123456 #设置mutual用户名密码
root@debian:~# targetcli /iscsi/ get discovery_auth #查看发现认证状态
这时我们需要设置initiator端的配置文件/etc/iscsi/iscsid.conf,才能允许发现
--------------------------------------------------
# *************
# CHAP Settings
# *************
.............
discovery.sendtargets.auth.authmethod = CHAP #开启CHAP
discovery.sendtargets.auth.username = laopi #添加用户名
discovery.sendtargets.auth.password = pi1234 #添加密码
discovery.sendtargets.auth.username_in = laopimal #添加mutual用户名
discovery.sendtargets.auth.password_in = pi123456 #添加mutual用户名密码
--------------------------------------------------
十三、局部配置下的登录认证,这个我一直没实验成功,可能是没找到合适方法,待以后在深入研究吧
--------------------------------------------------
1、单向认证(target服务器认证initiator)
/iscsi> cd iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1/ #局部认证要在target对应的iqn下配置
/iscsi/iqn.20...ian.tgt1/tpg1>set attribute authentication=1 #开启账号密码验证访问控制,开启后无论initiator端是否成功设置都不能登录,默认是关闭,请不要开启,通过attribute authentication=0 关闭
/iscsi/iqn.20...ian.tgt1/tpg1> set auth userid=laopi #添加用户laopi
Parameter userid is now 'laopi'.
/iscsi/iqn.20...ian.tgt1/tpg1> set auth password=pi1234 #设置认证密码pi1234
Parameter password is now 'pi1234'.
/iscsi/iqn.20...ian.tgt1/tpg1> get auth #查看登录证状态
AUTH CONFIG GROUP
=================
mutual_password=
----------------
The mutual_password auth parameter.
mutual_userid=
--------------
The mutual_userid auth parameter.
password=pi1234
---------------
The password auth parameter.
userid=laopi
------------
The userid auth parameter.
--------------------------------------------------
命令实现:
添加用户laopi
root@debian:~# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1 set auth userid=laopi
设置认证密码pi1234
root@debian:~# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1 set auth password=pi1234
查看登录认证状态
root@debian:~# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1 get auth
这时我们需要设置initiator端的配置文件/etc/iscsi/iscsid.conf,才能允许登录
--------------------------------------------------
# *************
# CHAP Settings
# *************
.............
node.session.auth.authmethod = CHAP #开启CHAP
node.session.auth.username = laopi #添加用户名
node.session.auth.password = pi1234 #添加用户名密码
--------------------------------------------------
2、设置双向认证(必须建立在单向认证的基础上,因为在initiator登录的时候要先进行单项认证)
配置mutual用户名密码
--------------------------------------------------
/iscsi/iqn.20...ian.tgt1/tpg1> set auth mutual_userid=laopimal #添加mutual用户名
Parameter mutual_userid is now 'laopimal'.
/iscsi/iqn.20...ian.tgt1/tpg1> set auth mutual_password=pi123456 #设置mutual用户名密码
Parameter mutual_password is now 'pi123456'.
/iscsi/iqn.20...ian.tgt1/tpg1> get auth
AUTH CONFIG GROUP
=================
mutual_password=pi123456
------------------------
The mutual_password auth parameter.
mutual_userid=laopimal
----------------------
The mutual_userid auth parameter.
password=pi1234
-----------------
The password auth parameter.
userid=laopi #双向认证单项认证用户必须已经存在
--------------
The userid auth parameter.
--------------------------------------------------
命令实现:
添加用户laopimal
root@debian:~# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1 set auth mutual_userid=laopimal
设置认证密码pi123456
root@debian:~# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1 set auth mutual_password=pi123456
这时我们需要设置initiator端的配置文件/etc/iscsi/iscsid.conf,在能允许登录
--------------------------------------------------
# *************
# CHAP Settings
# *************
.............
node.session.auth.authmethod = CHAP #开启CHAP
node.session.auth.username = laopi #添加用户名
node.session.auth.password = pi1234 #添加用户名密码
node.session.auth.username_in = laopimal #添加mutual用户名
node.session.auth.password_in = pi123456 #添加mutual用户密码
--------------------------------------------------
十四、保持配置,重启生效
在交互模式下默认创建完配置exit退出时会主动将配置保存到配置文件/etc/rtslib-fb-target/saveconfig.json中,重启后生效
--------------------------------------------------
/> ls
o- / ................................................... [...]
o- backstores ........................................ [...]
| o- block ............................ [Storage Objects: 1]
| | o- lun1 ....... [/dev/sdb (5.0GiB) write-thru activated]
| o- fileio ........................... [Storage Objects: 0]
| o- pscsi ............................ [Storage Objects: 0]
| o- ramdisk .......................... [Storage Objects: 0]
o- iscsi ...................................... [Targets: 1]
| o- iqn.2019-10.cc.pipci.iscsi:debian.tgt1 ...... [TPGs: 1]
| o- tpg1 ......................... [no-gen-acls, no-auth]
| o- acls .................................... [ACLs: 0]
| o- luns .................................... [LUNs: 1]
| | o- lun0 .................... [block/lun1 (/dev/sdb)]
| o- portals .............................. [Portals: 1]
| o- 0.0.0.0:3260 ............................... [OK]
o- loopback ................................... [Targets: 0]
o- vhost ...................................... [Targets: 0]
/> exit
Global pref auto_save_on_exit=true #提示全局配置下是推出自动保持配置。
Last 10 configs saved in /etc/rtslib-fb-target/backup.
Configuration saved to /etc/rtslib-fb-target/saveconfig.json #提示已经保持配置
root@debian:~#
--------------------------------------------------
上面的操作如果不是exit退出,而是Ctrl+C组合键提出,这样不会保持到配置文件中
交互模式下手动保持配置和清楚配置
--------------------------------------------------
/> saveconfig #在交互模式的根目录下通过这个命令直接回车保持配置到默认配置文件
Last 10 configs saved in /etc/rtslib-fb-target/backup.
Configuration saved to /etc/rtslib-fb-target/saveconfig.json
/> saveconfig savefile=/tmp/lio.conf #我们也可以指定保存到其他文件,用于备份,这个文件不需要提前创建
Configuration saved to /tmp/lio.conf
/>
/> clearconfig confirm=true #当我们想清楚所以配置可以通过这个命令完成
All configuration cleared
/>
--------------------------------------------------
命令实现:
root@debian:~# targetcli saveconfig #保存到默认文件
root@debian:~# targetcli saveconfig savefile=/tmp/lio.conf #保存到制定文件
root@debian:~# targetcli clearconfig confirm=true #这个不会清除配置文件中的配置,如果想清楚配置文件中的配置需要执行完这个操作才保存一次
十五、initiator客户端配置
这里就不介绍了前面的Linux下搭建iSCSI共享存储的方法 TGT 方式 Debian9.5系统下里面有详细的使用方法
参考资料:
https://wiki.archlinux.org/index.php/ISCSI_Target_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
https://wiki.debian.org/SAN/iSCSI/LIO
http://manpages.ubuntu.com/manpages/xenial/man8/targetcli.8.html
http://linux-iscsi.org/wiki/Targetcli
http://www.mamicode.com/info-detail-2496160.html
https://blog.csdn.net/weixin_42179528/article/details/90311361
https://blog.51cto.com/zhuxu91313/2154819
http://www.udpwork.com/item/13114.html
http://scst.sourceforge.net/comparison.html
https://blog.csdn.net/u014106644/article/details/84565912