[TOC]

0x00 简述

描述:前面我们正针对于iSCSI与SCSI做了一个简单的介绍, 并且在网络共享中使用过 nfs 以及 smb而iSCSI同样有该功能, 本文记录在学习与工作中搭建与使用iSCSI网络存储案例;

问:什么是iSCSI?
iSCSI(Internet Small Computer System Interface)即Internet小型计算机系统接口;
iSCSI又称为IP-SAN(基于IP网络的存储区域网),是一种基于因特网及SCSI-3协议下的存储技术由IETF提出,并于2003年2月11日成为正式的标准。iSCSI可以实现在IP网络上运行SCSI协议,使其能够在诸如高速千兆以太网上进行快速的数据存取备份操作,也就是基于网络的存储。
在现有IP网络上传输SCSI块命令的工业标准,它是一种在现有的IP网络上无需安装单独的光纤网络即可同时传输消息和块数据的突破性技术;

  • iSCSI基于应用非常广泛的TCP/IP协议,将SCSI命令/数据块封装为iSCSI包,再封装至TCP报文,然后封装到IP报文中。
    WeiyiGeek.

    WeiyiGeek.

  • iSCSI通过TCP面向连接的协议来保护数据块的可靠交付。
  • 由于iSCSI基于IP协议栈,因此可以在标准以太网设备上通过路由器或交换机来传输。

本质上iSCSI 基于TCP/IPX协议让两台主机通过 IP 网络相互协商(基于了TCP/IP的port 860 和 3260)然后交换SCSI命令,您可以将它看做是一个高性能本地存储总线,从而创建了一个存储局域网(SAN)。但与SAN协议存储解决方案不同的是iSCSI 不需要专用的电缆,它可以在已有的交换和 IP 基础架构上运行;同时也体现出如果不使用专用的网络或者子网( LAN 或者 VLAN ),iSCSI SAN 的部署性能可能会严重下降。

而iSCSI 服务提供数据集中化存取,且以区块为单位的数据存储空间,不仅简化存储空间管理的步骤、优化存储空间的使用,同时也增添了存储空间的弹性。它将SCSI指令通过网络分享出去,让价格低廉且操作简易的网络存储空间在iSCSI上运行。

对客户端而言,会让你感觉计算机彷佛连接一个本地硬盘,可通过本地端计算机操作系统来管理。事实上,新增的磁盘是NAS上的虚拟硬盘。因为硬盘是虚拟的,因此不必再为计算机添加额外硬件,通过一般网络基础架构就可管理此虚拟硬盘。

总的来说 ,iSCSI 常常被认为是光纤通道(Fiber Channel)的一个低成本替代方法,让计算机可以透过高速的局域网集线来把SAN以太网的光纤通道(FCoE)则不需要专用的基础架构。由于 iSCSI 服务提供了一个高扩充性和低组建与低维护成本的整合型存储方式,这正是大部份有预算考虑的中小企业和办公室所需求的。

ISCSI SAN基础服务组件介绍
iSCSI SAN组件与FC SAN组件相类似,组成部分包括以下部件:

WeiyiGeek.

WeiyiGeek.

  • 1.iSCSI Target:它概念类似于一种联机接口,当iSCSI启动器联机至iSCSI Target时,iSCSI Target上连结的所有LUN也会联机至客户端的操作系统。每一个iSCSI target通过唯一的IQN来标识,存储阵列控制器上(或桥接器上)的各端口通过一个或多个IP地址来标识本机与异构IP SAN
  • 2.iSCSI initiator:在计算机与存储装置关连中,你的计算机被称为“iSCSI initiator”(iSCSI启动器)客户端或主机,因为它开启链接至存储装置。诸如服务器连接在IP网络并对iSCSI target发起请求以及接收响应。每一个iSCSI主机通过唯一的IQN来识别,类似于光纤通道的WWN;要在IP网络上传递SCSI块命令,必须在iSCSI主机上安装iSCSI驱动。 
  • 3.iSCSI LUN:在iSCSI环境中的LUN实际上就是经过编号的硬盘或是实体硬盘所建立的一个储存空间,它是真正的存储实体。用户可以在这些iSCSI LUN上建立并管理文件,就像管理本地硬盘一样。

本机iSCSI SAN与异构IP SAN的区别:

  • 本机iSCSI SAN:它包含在TCP/IP上传输SCSI协议的整个组件,包括iSCSI initiator(或client)是主机服务器,而iSCSI target是存储阵列;
  • 异构IP SAN:包含在TCP/IP与光纤交换结构传输SCSI的组件。为了实现这一点需要在IP与光纤通道之间安装连接桥或网关设备,连接桥用于TCP/IP与光纤通道之间的协议转换;因此iSCSI主机将连接桥看做iSCSI target。
WeiyiGeek.

WeiyiGeek.

ISCSI的工作流程:

  • 第一步:iSCSI系统由SCSI适配器发送一个SCSI命令,命令封装到TCP/IP包中并送入到以太网络中进行传输。
  • 第二步:接收方从TCP/IP包中提取SCSI命令并执行相关操作,执行完毕后,将返回的SCSI命令和数据封装到TCP/IP包中,把它们发回到发送方;
  • 第三步:发送方的iSCSI系统从接收方发过来的TCP/IP包中提取出数据或命令,并把它们传回到SCSI子系统。
WeiyiGeek.

WeiyiGeek.

解析:我们可以在这里简单的理解为客户端与服务器上的SCSI端口是通过SCSI协议标准虚拟出来的用于建立连接的端口。
通过iSCSI实现存储共享,首先创建IQN用于识别启动器和目标,接着建立TPG共享存储组并设置相应的访问控制权限,然后在共享存储组添加lun逻辑单元(即存储设备),最后建立实现共享portals入口(ip port,就是通过IP进行访问的端口号)。

概念解释:

1
2
3
4
5
6
7
8
TPG:共享存储组,某个特定iSCSI目标要侦听的接口IP地址和TCP端口的集合。可以将目标配置添加到TPG以协调多个LUN的设置。
ACL:访问权限控制列表,一种使用节点IQN(通常是启动器名称)来验证启动器的访问权限的访问限制。
IQN:iSCSI限定名称,全球唯一名称,用于以强制命名格式来识别启动器和目标。 IQN格式如下:
iqn.YYYY-MM.com.reversed.domain[:optional_string] iqn:表示此名称使用域为标识符;
YYYY-MM:表示拥有域名的年月时间; com.reversed.domain:拥有此iSCSI组织的逆向域名;
:optional_string:以冒号为前缀的可选字符串,全球唯一由域所有者分配,其中可包含冒号为分割符的组织边界;
LUN:逻辑单元号,带有编号的块设备,连接到目标且通过目标来使用。可以有一个或多个LUN连接到单个目标,但通常一个目标提供一个LUN;
portals入口:目标或启动器上用于建立连接的IP地址和端口号端口号一般为`3260`;目标端的portals入口配置使用targetcli命令。

IQN格式说明:

1
2
3
4
5
#为了方便记忆与认证配置建议按照以下设置域为标识符
iqn.YYYY-MM.com.reversed.domain[:optional_string]
iqu.YYYY-MM.com.域名反向书写:计算机名称
#示例
iqn.2020-01.top.weiyigeek:weiyigeek.pc

iSCSI SAN 应用场景:

  • (1) 存储集成公司希望将不同的存储资源从分散在网络上的服务器移动到统一的位置(常常是数据中心),这可以让存储的分配变得更为有效。 SAN 环境中的服务器无需任何更改硬件或电缆连接就可以得到新分配的磁盘卷。
  • (2) 灾难恢复公司希望把存储资源从一个数据中心镜像到另一个远程的数据中心上,后者在出现长时间停电的情况下可以用作热备份。 特别是iSCSI SAN 使我们只需要用最小的配置更改就可以在 WAN 上面迁移整个磁盘阵列,实质上就是把存储变成了“可路由的”,就像普通的网络通信一样。

注意事项:

  • 通常情况下不要使用多个iSCSI启动器连接相同的Target,以免硬盘数据损毁,除非使用的是丛集感应文件系统,如Vmware虚拟机或Oracle Clustering文件系统。

0x01 基础实操

实操实现说明:

  • Linux 安装 Target 作为iSCSI 服务端,分别采用Windows / Linux 作为 Initiator来访问iSCSI target并挂载iSCSI网络存储(配置ACLS与CHAP认证);
  • Windows Server 安装 Target 作为iSCSI 服务端,然后仍然分别采用Windows / Linux 作为 Initiator [ 英 /ɪˈnɪʃieɪtə(r)/ ] 来访问iSCSI target并挂载置iSCSI网络存储(配置ACLS与CHAP认证);
Linux-iSCSI-Target

环境准备:

1
2
3
4
5
6
7
Linux OS(Target): CentOS Linux release 7.6.1810 (Core) 3.10.0-957.12.2.el7.x86_64
#- IQN: iqn.2020-01.top.weiyigeek:target
Windows PC: iqn.2020-01.top.weiyigeek:weiyigeek.top
Windows Server(Clint): Microsoft Windows Server 2012 R2 Standard
#- IQN: iqn.2020-01.top.weiyigeek:server2012
Linux OS(Client):CentOS Linux release 7.7.1908 (Core) 3.10.0-1062.1.1.el7.x86_64
#- IQN: iqn.2020-01.top.weiyigeek:initiator


操作流程:

iSCSI Target 端配置:

Step1.本案例中我采用ESXI建立虚拟机并添加两块硬盘,并分别以磁盘上的一个分区来充当ISCSI存储空间的,实际应用中一般会添加新的磁盘或大容量存储的存储设备:

WeiyiGeek.

WeiyiGeek.

Step2.开启并进入Linux OS(Target)系统中查看做iscsi网络存储的磁盘,并进行格式化;

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
34
35
36
37
38
39
40
41
42
43
44
45
#1.系统中存储块设备查看
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 10G 0 disk
sdb 8:16 0 10G 0 disk
sdc 8:32 0 40G 0 disk
├─sdc1 8:33 0 1G 0 part /boot
└─sdc2 8:34 0 39G 0 part
├─centos-root 253:0 0 37G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sr0 11:0 1 1024M 0 rom


#2.分别对/dev/sda 与 /dev/sdb 建立分区
$ fdisk /dev/sda # /dev/sdb 是相同的操作这里不重复
欢迎使用 fdisk (util-linux 2.23.2)
使用磁盘标识符 0x48305faa 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n #创建分区
Select Partition type (default p): p #主分区
分区号 (1-4,默认 1):
起始 扇区 (2048-20971519,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-20971519,默认为 20971519):
将使用默认值 20971519
分区 1 已设置为 Linux 类型,大小设为 10 GiB
命令(输入 m 获取帮助):w #将配置写入磁盘


#3.查看分区后的分区信息
$ fdisk -l
fdisk /dev/sdb
磁盘 /dev/sda:10.7 GB, 10737418240 字节,20971520 个扇区
设备 Boot Start End Blocks Id System
/dev/sda1 2048 20971519 10484736 83 Linux

磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 20971519 10484736 83 Linux

$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 10G 0 disk
└─sda1 8:1 0 10G 0 part
sdb 8:16 0 10G 0 disk
└─sdb1 8:17 0 10G 0 part

Step3.安装服务端ISCSI服务对应的相关软件包;

1
2
#targetcli命令有两种模式`一种是交互式模式,一种是命令行模式`;
yum install targetcli net-tools –y

Step4.设置target开机自动启动和防火墙设置放行target 监听端口(默认为3260/tcp)

1
2
3
$systemctl enable target.service
$firewall-cmd --permanent -add-port=3260/tcp
$firewall0cmd --reload

Step5.运行targetcli进入交互模式创建服务端的iSCSI服务以及其基本配置;

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#(1)采用tragetclit进入交互模式服务端iscsi命令配置信息
$ targetcli
/> ls #使用ls命令查看菜单结构
o- / ..... [...] #顶级目录
o- backstores ........................... [...] #后备存储,主备存储空间要共享的设备或分区需要添加到此处
| o- block ............... [Storage Objects: 0] #块存储,backstores子目录
| o- fileio .............. [Storage Objects: 0] #文件存储镜像img根据一个事先准备的文件提供存储功能,backstores子目录
| o- pscsi ............... [Storage Objects: 0] #真实物理scsi设备不推荐使用,backstores子目录
| o- ramdisk ............. [Storage Objects: 0] #闪存利用内存当做存储,backstores子目录
o- iscsi ......................... [Targets: 0] #以ISCSI的方式共享存储设备的目录
o- loopback ...................... [Targets: 0] #回路

#(2)我们需要将我们准备的分区添加进来(注意我们准备的分区是块设备,所以应将其添加到块设备文件之中)
/> cd backstores/block #切换到块设备文件目录

/backstores/block> ls #可以通过Tab键列出了相关命令(命令如名很好理解)
o- block ................... [Storage Objects: 0]

/backstores/block> create dev=/dev/sda name=lun0 #通过create命令添加设备dev用来指定要添加的设备磁盘,nam为逻辑单元名(可以自定义)
Created block storage object lun0 using /dev/sda.

/backstores/block> create dev=/dev/sdb name=lun1
Created block storage object lun1 using /dev/sdb.

/backstores/block> ls #通过ls命令查看所添加的设备
o- block ................... [Storage Objects: 2]
o- lun0 ............ [/dev/sda (10.0GiB) write-thru deactivated]
| o- alua .................... [ALUA Groups: 1]
| o- default_tg_pt_gp ......... [ALUA state: Active/optimized]
o- lun1 ............ [/dev/sdb (10.0GiB) write-thru deactivated]
o- alua .................... [ALUA Groups: 1]
o- default_tg_pt_gp ......... [ALUA state: Active/optimized]

#(3)将添加上来的存储设备通过iSCSI目标服务器共享出去
/backstores/block> cd /iscsi #iscsi目录下实现共享
/iscsi> create iqn.2020-01.top.weiyigeek:target #设置IQN(发起程序服务)
Created target iqn.2020-01.top.weiyigeek:target.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260. #默认是任意IP均可访问(为了安全我们必须对其进行修改)

#(4)为target server portal创建一个网络监听信息 {portal} 以发现target
/iscsi> cd iqn.2020-01.top.weiyigeek:target/tpg1/portals/
/iscsi/iqn.20.../tpg1/portals> delete 0.0.0.0 3260 #删除默认监听地址
/iscsi/iqn.20.../tpg1/portals> create 192.168.10.222 3260 #创建监听本机地址,端口可以进行自定义修改;
/iscsi/iqn.20.../tpg1/portals> cd ../../
/iscsi/iqn.20...yigeek:target> ls
o- iqn.2020-01.top.weiyigeek:target ........................................... [TPGs: 1]
o- tpg1 ........................................................ [no-gen-acls, no-auth] #共享存储组
o- acls ................................................................... [ACLs: 0] #访问控制信息
o- luns ................................................................... [LUNs: 0] #逻辑单元设备
o- portals ............................................................. [Portals: 1] #入口
o- 192.168.10.222:3260 ......................................................... [OK] #网络绑定


/iscsi/iqn.20...yigeek:target> cd tpg1/ #设置共享存储组的属性
/iscsi/iqn.20...k:target/tpg1> set attribute authentication=0 demo_mode_write_protect=0 generate_node_acls=1 cache_dynamic_acls=1
Parameter demo_mode_write_protect is now '0'.
Parameter authentication is now '1'.
Parameter generate_node_acls is now '1'.
Parameter cache_dynamic_acls is now '1'.


#(5)创建LUM代表设备(LUN 逻辑单元关联后端存储)
/iscsi/iqn.20.../tpg1/portals> cd ../luns
/iscsi/iqn.20...get/tpg1/luns> create /backstores/block/lun0 lun=lun0 #链接后端存储,lun可以自定义默认死lun0
/iscsi/iqn.20...get/tpg1/luns> create /backstores/block/lun1 lun=lun1 #添加共享指定存储设备
/iscsi/iqn.20...get/tpg1/luns> ls
o- luns ............... [LUNs: 2]
o- lun0 ............. [block/lun0 (/dev/sda) (default_tg_pt_gp)]
o- lun1 ............. [block/lun1 (/dev/sdb) (default_tg_pt_gp)]


#(6)配置ACL按照需求进行配置(需要得到initiator端的发起名称)
/iscsi/iqn.20...get/tpg1/acls> create iqn.2020-01.top.weiyigeek:weiyigeek.top
/iscsi/iqn.20...get/tpg1/acls> create iqn.2020-01.top.weiyigeek:initiator
/iscsi/iqn.20...get/tpg1/acls> ls
o- acls ...........initiatorinitiator........... [ACLs: 2]
o- iqn.2020-01.top.weiyigeek:initiator initiator...... [Mapped LUNs: 2]
| o- mapped_lun0 initiator...................... [lun0 block/lun0 (rw)]
| o- mapped_lun1 initiator...................... [lun1 block/lun1 (rw)]
o- iqn.2020-01.top.weiyigeek:weiyigeek.top initiator.. [Mapped LUNs: 2]
o- mapped_lun0 initiator...................... [lun0 block/lun0 (rw)]
o- mapped_lun1 initiator...................... [lun1 block/lun1 (rw)]
/iscsi/iqn.20...get/tpg1/> set attribute generate_node_acls=1 #开启ACL由于ACL默认是关闭的


#(7) 配置发现认证discovery authentication:单项认证(注意有密码复杂度要求以及不大于16位否则Windows iscsi发起程序不能成功链接)
/iscsi> set discovery_auth enable=1 userid=target password=WeiyiGeekiSCSI


#(8)退出默认保存配置信息
/iscsi/iqn.20...get/tpg1/luns> exit
Global pref auto_save_on_exit=true
Configuration saved to /etc/target/saveconfig.json

Step6.命令行模式进行设置

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
#1.创建需要给iSCSI网络共享的磁盘设备并建立逻辑单元
targetcli /backstores/block create dev=/dev/sda name=lun0
targetcli /backstores/block create dev=/dev/sdb name=lun1
targetcli /backstores/block create name=datastore dev=/dev/iscsi_vg/iscsi_lv #可以创建一个逻辑卷

#2.查看创建添加的设备
targetcli /backstores/block ls

#3.将存储设备通过iSCSI目标服务器共享
targetcli /iscsi create iqn.2020-01.top.weiyigeek:target
targetcli /iscsi/iqn.2020-01.top.weiyigeek:target/tpg1/portals/ delete 0.0.0.0 3260
targetcli /iscsi/iqn.2020-01.top.weiyigeek:target/tpg1/portals/ create 192.168.10.22 3260

#4.设置共享存储组的属性(#属性认证关闭,写保护关闭,生成节点acl ,开启缓存动态acl)
targetcli /iscsi/iqn.2020-01.top.weiyigeek:target/tpg1/ set attribute authentication=0 demo_mode_write_protect=0 generate_node_acls=1 cache_dynamic_acls=1

#5.创建LUM代表设备(LUN关联后端存储)
targetcli /iscsi/iqn.2020-01.top.weiyigeek:target/tpg1/luns create /backstores/block/lun0 lun=lun0
targetcli /iscsi/iqn.2020-01.top.weiyigeek:target/tpg1/luns create /backstores/block/lun1 lun=lun1

#6.配置ACL并开启ACL
targetcli /iscsi/iqn.2020-01.top.weiyigeek:target/tpg1/acls create iqn.2020-01.top.weiyigeek:weiyigeek.top
targetcli /iscsi/iqn.2020-01.top.weiyigeek:target/tpg1 set attribute generate_node_acls=1

#7.配置`发现服务单项`认证
targetcli /iscsi set discovery_auth enable=1 userid=target password=WeiyiGeekiSCSI

Step7.systemd启动 target.service 到此 target服务器端配置完成;

1
2
[[email protected] ~]# systemctl restart target.service
[[email protected] ~]# systemctl status target.service

补充操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#(1)删除iSCSI共享磁盘存储
$ targetcli
/iscsi> ls
o- iscsi .......... [1-way disc auth, Targets: 1]
o- iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ac4d1254d4da ........................ [TPGs: 1]
o- tpg1 ................. [gen-acls, no-auth]
o- luns ......................... [LUNs: 2]
| o- lun0 ....... [block/lun0 (/dev/sda) (default_tg_pt_gp)]
| o- lun1 ....... [block/lun1 (/dev/sdb) (default_tg_pt_gp)]
o- portals ................... [Portals: 1]
o- 0.0.0.0:3260 .................... [OK]
/iscsi> delete iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ac4d1254d4da #删除主机发起程序名称(IQN)
Deleted Target iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ac4d1254d4da.

#(2) 移除iSCSI块存储
/iscsi> cd /backstores/block
/backstores/block> delete lun0 #删除磁盘块设备上设置的逻辑单元(有几块就删除几块)
/backstores/block> delete lun1

#(3) 移除所有配置
/> clearconfig confirm=True #输入此命令删除之前所做的所有设备共享配置。

补充说明:

  • 1.ACL(访问控制列表)必须要和initiator端/etc/iscsi/initiatorname.iscsi里iqn名字保持一致以及iscsi发起程序名称一致,否则拒绝访问。
    WeiyiGeek.

    WeiyiGeek.

  • 2.记录配置iSCSI文件路径/etc/target/saveconfig.json
  • 3.非常注意服务认证有两种(坑啊): 发现认证discovery authentication 、 normal 认证


iSCSI initiator 端配置:
(1) windows 连接例子

  • 1.运行iSCSI发起程序,如果是第一次运行需要开启iSCSI服务(个人PC)点击是即可;
    C:\Windows\system32\iscsicpl.exe
WeiyiGeek.

WeiyiGeek.

  • 2.由于我们配置了单项认证需要进行认证配置;
WeiyiGeek.

WeiyiGeek.

  • 3.将发现的iSCSI Target添加到当前计算机会话中(直接连接或者通过属性–添加会话);
WeiyiGeek.

WeiyiGeek.

  • 4.此时运行diskmgmt.msc发现本地多个两块10g的磁盘,右键磁盘删除卷然后新建卷,按照提示进行设置盘符,我们测试在iSCSI网络存储里面存放数据;
WeiyiGeek.

WeiyiGeek.

  • 5.采用Windows Server 2012 进行链接同一个iqn并连接到iSCSI磁盘存储,如果我们没有设置ACLS并且没认证的时候则只有read only权限;
WeiyiGeek.

WeiyiGeek.

  • 6.Server 2012 连接到iSCSI后我们可以看到我们在iSCCI网络存储中存放的数据;
WeiyiGeek.

WeiyiGeek.


(2) Linux 连接例子

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#1.Linux客户端配置,实际环境中建议修改主机名
hostnamectl set-hostname initiator

#2.安装iscsi-initiator-utils软件包
yum install -y iscsi-initiator-utils

#3.开启iscsi服务并设置开启开机自启动。
systemctl start iscsi
systemctl enable iscsi

#4.设置initiator发起名称IQN
cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2020-01.top.weiyigeek:initiator

#5.单向认证配置
grep -nE "node.session.auth|discovery.sendtargets.auth" /etc/iscsi/iscsid.conf
# 57:node.session.auth.authmethod = CHAP
# 61:node.session.auth.username = target
# 62:node.session.auth.password = WeiyiGeekiSCSI
71:discovery.sendtargets.auth.authmethod = CHAP
75:discovery.sendtargets.auth.username = target
76:discovery.sendtargets.auth.password = WeiyiGeekiSCSI


#6.连接发现Target的iSCSI设备(发现的target 信息会保存在/var/lib/iscsi/node 目录下)
iscsiadm -m discovery -t sendtargets -p 192.168.10.222 -d2 #debug 可以看见连接过程
192.168.10.222:3260,1 iqn.2020-01.top.weiyigeek:target

#7.连接iSCSI Target
iscsiadm -m node -T iqn.2020-01.top.weiyigeek:target -p 192.168.10.222 -l
Logging in to [iface: default, target: iqn.2020-01.top.weiyigeek:target, portal: 192.168.10.222,3260] (multiple)
Login to [iface: default, target: iqn.2020-01.top.weiyigeek:target, portal: 192.168.10.222,3260] successful. #表示连接成功


#8.查看iSCSI存储挂载到本机的磁盘并对其进行磁盘分区与格式化操作(首次需要设置,后期链接则不需要)
$lsscsi #或者ll /dev/disk/by-path/
[0:0:0:0] disk VMware Virtual disk 1.0 /dev/sda
[3:0:0:0] cd/dvd NECVMWar VMware SATA CD00 1.00 /dev/sr0
[40:0:0:0] disk LIO-ORG lun0 4.0 /dev/sdb # Windows 使用 iSCSI
[40:0:0:1] disk LIO-ORG lun1 4.0 /dev/sdc # Linux 使用 iSCSI
$mkfs.xfs /dev/sdc1 #格式化
$mkdir /mnt/iscsi #创建挂载目录
$mount /dev/sdc1 /mnt/iscsi #挂载 iSCSI 设备
$mount -l
/dev/sdc1 on /mnt/iscsi type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
$df -h
/dev/sdc1 10G 33M 10G 1% /mnt/iscsi

#9.设置开机自动挂载iSCSI设备(第一中方式未成功建议采用第二种)
$ ll /dev/disk/by-uuid/
0e879666-c926-427d-a69b-59004556fe22 -> ../../sdc1
cat >> /etc/fstab <<END
UUID=0e879666-c926-427d-a69b-59004556fe22 /mnt/iscsi xfs defaults 0 0
END
#方式2
cat >> /etc/rc.d/rc.local<<END
mount /dev/sdc1 /mnt/iscsi/
END

#10.退出连接iSCSI Target(临时取消对target的iscsi的访问,如果重启服务依然能发现有一块磁盘)
$umount /mnt/iscsi/
$iscsiadm -m node -T iqn.2020-01.top.weiyigeek:target -p 192.168.10.222 -u
Logging out of session [sid: 7, target: iqn.2020-01.top.weiyigeek:target, portal: 192.168.10.222,3260]
Logout of [sid: 7, target: iqn.2020-01.top.weiyigeek:target, portal: 192.168.10.222,3260] successful.

#11.卸载 iSCSI Target 的设备重启不会自动连接到iSCSI共享磁盘中(实际上这条命令就是删除/var/lib/iscsi/nodes/目录下对应的信息);
$tree /var/lib/iscsi/
/var/lib/iscsi/
├── ifaces
├── isns
├── nodes
│   └── iqn.2020-01.top.weiyigeek:target
│   └── 192.168.10.222,3260,1
│   └── default
├── send_targets
│   └── 192.168.10.222,3260
│   ├── iqn.2020-01.top.weiyigeek:target,192.168.10.222,3260,1,default -> /var/lib/iscsi/nodes/iqn.2020-01.top.weiyigeek:target/192.168.10.222,3260,1
│   └── st_config
├── slp
└── static

$iscsiadm -m node -T iqn.2020-01.top.weiyigeek:target -p 192.168.10.222 -o delete

注意事项:

  • 1.注意一定要添加写操作保护,如果两个initiator连接到同一磁盘并对其操作,操作的数据会缓存等待断开时候写入磁盘,同时其它成员也可以进行读取,这样会导致读写不一致的情况;但是有了写操作主initiator必须等待另一个client对文件写完才能断开,且如果修改同一个文件则以最后断开的为主:set demo_mode_write_protect=1;
WeiyiGeek.

WeiyiGeek.


Windows-iSCSI-Target

描述:通过Windows Server 搭建iscsi网络共享磁盘;

1
2
3
4
5
#Target:Windows Server 2012 R2
192.168.1.2:iqn.2020-03.top.weiyigeek:server

#Initiator:Windows 10
192.168.1.3:iqn.2020-03.top.weiyigeek:pc

实际流程:
Step1.在Server 2012 R2上安装iSCSI服务:打开服务器管理器>>添加角色和功能>基于角色或基于功能的安装>基于角色或基于功能的安装>选择iSCSI开头的两个选项和文件服务器

WeiyiGeek.

WeiyiGeek.

Step2.安装功能如下:文件服务器 、 iSCSI目标存储提供程序 、iSCSI目标服务器

WeiyiGeek.

WeiyiGeek.

Step3.创建iSCSI虚拟磁盘:打开服务器管理器>>文件和存储服务>>iSCSI>>任务>>新建iSCSI虚拟磁盘或者导入

WeiyiGeek.

WeiyiGeek.

Step4.指定iSCSI虚拟磁盘大小并新建立iSCSI目标,并分别设置目标名称(如不设置则自动生成),以及发起程序ID

1
2
iSCSI Target: iqn.2020-03.top.weiyigeek:server
iSCSI Initiator: iqn.2020-03.top.weiyigeek:pc

WeiyiGeek.

WeiyiGeek.

Step5.设置iSCSI的CHAP身份验证:target / WeiyiGeekTop

WeiyiGeek.

WeiyiGeek.

Step6.查看创建iSCSI的配置情况以及创建iSCSI Target 服务

WeiyiGeek.

WeiyiGeek.

Step7.访问服务器配置打开服务器管理器>>文件和存储服务>>iSCSI,右键iSCSI目标,点击属性

WeiyiGeek.

WeiyiGeek.


Windows 客户端|Initiator

WeiyiGeek.

WeiyiGeek.


Windows Linux |Initiator
Step 8.选择iSCSI进行分配发起服务>分配iSCSI虚拟磁盘;

WeiyiGeek.

WeiyiGeek.

Linux Initiator 配置连接iSCSI存储结果:

1
2
3
4
5
6
7
8
#创建分区以及格式化
fdisk /dev/sdb
mkfs.xfs /dev/sdb1
#然后挂载即可
$mount /dev/sdb1 /mnt/iscsi/
$ifconfig > /mnt/iscsi/ip.conf
$mount -l | grep "iscsi"
/dev/sdb1 on /mnt/iscsi type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

WeiyiGeek.

WeiyiGeek.


0x02 进阶实操

1.配置chap认证

配置CHAP认证有两种认证类型:

  • 发现认证(discovery authentication)
  • 常规认证 normal

(1) 配置发现认证 discovery authentication
target服务器端:systemctl restart target

1
2
3
4
5
#1.1.1单向认证(target服务器认证initiator)
targetcli /iscsi set discovery_auth enable=1 userid=target password=WeiyiGeekiSCSI
targetcli /iscsi get discovery_auth
#2.1.1双向认证(target服务器端和inititor客户端互相认证)
targetcli /iscsi set discovery_auth enable=1 userid=target password=WeiyiGeekiSCSI mutual_userid=initiator mutual_password=WeiyiGeekTop

initiator客户端(Linux):/etc/iscsi/iscsid.conf

1
2
3
4
5
6
7
8
9
10
11
#1.1.1单向认证配置
discovery.sendtargets.auth.authmethod = CHAP
discovery.sendtargets.auth.username = target
discovery.sendtargets.auth.password = WeiyiGeekiSCSI

#1.1.2双向认证配置
discovery.sendtargets.auth.authmethod = CHAP
discovery.sendtargets.auth.username = target
discovery.sendtargets.auth.password = WeiyiGeekiSCSI
discovery.sendtargets.auth.username_in = target
discovery.sendtargets.auth.password_in = WeiyiGeekTop

WeiyiGeek.Linux双向认证

WeiyiGeek.Linux双向认证


initiator客户端(Windows):

WeiyiGeek.Windows双向认证

WeiyiGeek.Windows双向认证

注意事项:

  • Windows中发起程序CHAP机密无效,CHAP 密码长度最大16字节,如果未使用IPSec则最小为12字节;
  • 如果设置CHAP双向验证后认证失败iscsiadm: Login authentication failed with target的解决方法:
    • 1.核验initiator客户端配置的discovery.sendtargets.auth认证
    • 2.删除链接缓存rm -rf /var/lib/iscsi/*
    • 3.重启initiator端systemctl restart iscsi


(2) 常规配置认证 normal
描述:normal(tpg)认证和discovery认证类似都分为单向认证和双向认证(在连接IQN的时候使用),且normal是基于discovery认证基础之上的认证。

1
2
3
4
5
6
7
8
#开启Target IQN 连接认证
targetcli /iscsi/iqn.2020-01.top.weiyigeek:target/tpg1 set attribute authentication=1

#1.1.1单向认证(target服务器认证initiator)
targetcli /iscsi/iqn.2020-01.top.weiyigeek:target/tpg1 set auth userid=target password=WeiyiGeekiSCSI

#2.1.1双向认证(target服务器端和inititor客户端互相认证)
targetcli /iscsi/iqn.2020-01.top.weiyigeek:target/tpg1 set auth userid=target password=WeiyiGeekiSCSI mutual_userid=target mutual_password=WeiyiGeekTop

WeiyiGeek.常规认证配置结果

WeiyiGeek.常规认证配置结果

initiator客户端(Linux):/etc/iscsi/iscsid.conf

1
2
3
4
5
6
7
8
9
10
11
#1.1.1单向认证配置(在discovery认证基础之上)
node.session.auth.authmethod = CHAP
node.session.auth.username = target
node.session.auth.password = WeiyiGeekiSCSI

#1.1.2双向认证配置
node.session.auth.authmethod = CHAP
node.session.auth.username = target
node.session.auth.password = WeiyiGeekiSCSI
node.session.auth.username_in = target
node.session.auth.password_in = WeiyiGeekTop

WeiyiGeek.Linux认证

WeiyiGeek.Linux认证

initiator客户端配置常规认证(Windows):

WeiyiGeek.Windows双向认证

WeiyiGeek.Windows双向认证

注意事项:

  • 采用认证后启动不成功iscsiadm: Could not login to [iface: default, target: iqn.2020-01.top.weiyigeek:target,解决方案:
    1
    2
    3
    4
    5
    6
    7
    8
    #1.核验initiatorname是否是ACLS中有权限的用户(否则挂载只读)
    /etc/iscsi/initiatorname.iscsi
    InitiatorName=iqn.2020-01.top.weiyigeek:initiator #实际测试是在ACLS中有权限的反而登陆不上

    #2.核验/etc/iscsi/iscsid.conf配置的账号密码是否正确

    #3.重启iscsi服务以及IQN名称服务
    systemctl restart iscsi && systemctl restart iscsid

0x03 知识补充

1.iscsiadm 命令

描述:iscsiadm是iscsi的管理程序,通常用在initiator端连接iSCSI Target;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
iscsiadm -m discoverydb [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type -p ip:port -I ifaceN ... [ -Dl ] ] | [ [ -p ip:port -t type] [ -o operation ] [ -n name ] [ -v value ] [ -lD ] ]

iscsiadm -m discovery [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type -p ip:port -I ifaceN ... [ -l ] ] | [ [ -p ip:port ] [ -l | -D ] ]

iscsiadm -m node [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ -S ] [ [ -T targetname -p ip:port -I ifaceN ] [ -l | -u | -R | -s] ] [ [ -o operation ] [ -n name ] [ -v value ] ]

iscsiadm -m session [ -hV ] [ -d debug_level ] [ -P printlevel] [ -r sessionid | sysfsdir [ -R | -u | -s ] [ -o operation ] [ -n name ] [ -v value ] ]

iscsiadm -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename | -H hostno|MAC ] [ [ -o operation ] [ -n name ] [ -v value ] ] [ -C ping [ -a ip ] [ -b packetsize ] [ -c count ] [ -i interval ] ]

iscsiadm -m fw [ -d debug_level ] [ -l ]

iscsiadm -m host [ -P printlevel ] [ -H hostno|MAC ] [ [ -C chap [ -x chap_tbl_idx ] ] | [ -C flashnode [ -A portal_type ] [ -x flashnode_idx ] ] | [ -C stats ] ] [ [ -o operation ] [ -n name ] [ -v value ] ]

iscsiadm -k priority
#参数说明
-m,--mode : 指定模式发现为discovery,登陆为node节点模式,会话模式session
-l,--login : 登陆
-t,--type : 一般为 sendtargets 简写为st
-T --targetname=IQN: 指定要使用的服务器端的target名称,有时候服务器端创建了多个target,iqn.2015-10.com.example:
-o,--op=op:指定选项:`new delete update show nonpersistent`,可以用-o delete 对已存在的node进行删除
-p,--portal:指定入口 可以为IP地址或者域名
-P,n:指定输出详细信息,[0|1|2|3],有四种格式可选
-u,--logout:登出

命令实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#(1) iSCSI 发现服务iSCSI存储
iscsiadm -m discovery -t sendtargets -p 192.168.10.222 -d2

#(2) 登陆iSCSI存储
iscsiadm -m node -T iqn.2020-01.top.weiyigeek:target -p 192.168.10.222 -l

#(3) 登出iSCSI存储
iscsiadm -m node -T iqn.2020-01.top.weiyigeek:target -p 192.168.10.222 -u

#(4)删除iSCSI发现记录
iscsiadm -m node -T iqn.2020-01.top.weiyigeek:target -p 192.168.10.222 -o delete

#(5) 查看iSCSI发现记录
iscsiadm -m node

#(6)查看会话情况
iscsiadm -m session
iscsiadm -m session -P 3 | grep -i attached # 验证会话状态