iSCSI
iSCSI详解及配置
1、认识iSCSI
iSCSI(Internet Small Computer System Interface,Internet 小型计算机系统接口)是一种由IBM公司研究开发的IP SAN技术,该技术是将现有SCSI接口与以太网络(Ethernet)技术结合,基于 TCP/IP的协议连接iSCSI服务端(Target)和客户端(Initiator),使得封装后的SCSI数据包可以在通用互联网传输,最终实现iSCSI服务端映射为一个存储空间(磁盘)提供给已连接认证后的客户端。
1.1、SCSI
SCSI(Small Computer System Interface)是一种I/O技术,规范了一种并行的I/O总线和相关的协议,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实现
- iSCSI Initiator
iSCSI 启动器,从本质上说,iSCSI 启动器是一个客户端设备,用于将请求连接并启动到服务器(iSCSI 目标)。
如上图,iSCSI 启动器有三种实现方式:可以完全基于硬件实现,比如 iSCSI HBA 卡;硬件TOE卡与软件结合的方式;完全基于软件实现,而软件 iSCSI 启动器适用于大部分主流操作系统平台,下面就是用软件方式来配置。
-
iSCSI Target
即 iSCSI 目标,它是 iSCSI 网络的服务器组件,通常是一个存储设备,用于包含所需的数据并回应来自 iSCSI 启动器的请求。
-
工作过程
Initiator发出请求后,会在本地的操作系统会生成了相应的SCSI命令和数据I/O请求,然后这些命令和请求被封装加密成IP信息包,通过以太网(TCP/IP)传输到Targer。
当Targer接收到信息包时,将进行解密和解析,将SCSI命令和I/O请求分开。SCSI命令被发送到SCSI控制器,再传送到SCSI存储设备。
设备执行SCSI命令后的响应,经过Target封装成iSCSI响应PDU,再通过已连接的TCP/IP网络传送给Initiator。
nitiator会从iSCSI响应PDU里解析出SCSI响应并传送给操作系统,操作系统再响应给应用程序。
1.3、iSCSI与FC SAN
FC(FiberChannel,光纤通道)是利用光纤信道结合光纤通道交换机实现高速的数据存储网络。FC性能很好,但价格却贵得惊人,管理起来也非常困难。
所以iSCSI利用现有的以太网络,用户只需要少量的投入,就可以方便、快捷地对信息和数据进行交互式传输和管理。当然iSCSI与FC相比也存在明显的不足,如速度性能、安全可靠性。
2、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.1、相关准备配置
给服务器加上硬盘,用于共享:
关闭防火墙和selinux:
[root@ISCSI_Server ~]# systemctl stop firewalld && systemctl disable firewalld
[root@ISCSI_Server ~]# setenforce 0
[root@ISCSI_Server ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
安装服务并设置开机自启动:
[root@ISCSI_Server ~]# yum install -y targetd targetcli
[root@ISCSI_Server ~]# systemctl start targetd && systemctl enable targetd
2.2、创建IPSAN
命令行输入targetcli进入交互界面,在交互界面可以使用ls,cd等命令灵活简单的操作,如图所示,最上层目录包括backstores、iscsi等,如果有FC或Infiniband的话,还会有其余的一些子模块如qla2xxx等。
创建卷资源
使用cd进入/backstores/block目录,
/> cd backstores/block
然后创建卷资源,使用块设备/dev/sdb
/backstores/block> create dev=/dev/sdb name=sdb #名字是随意的
如果提示sdb设备正在被使用,则需要先卸载该磁盘分区。提示创建成功(readonly属性表示读写权限,wwn号为卷资源的唯一标号)
2.3、创建iSCSI
快速创建一个iSCSI服务的步骤如下:
a.首先创建一个iqn
b.在iqn下添加提供服务的IP以及需要映射的卷
c.设置认证
操作如下:
这里介绍一个技巧,在交互界面输入cd,可以进入下图界面,可以灵活快速地跳到指定目录
2.4、在iscsi目录下创建iqn
/iscsi> create
然后在iqn的对应目录下添加服务IP,映射卷和权限设置(默认应该是有0.0.0.0,就是允许所有IP访问):
设置服务IP:
/iscsi> cd iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.9520be3109ac/tpg1/portals/
这里可以使用delete删除,create创建如下:
/iscsi> cd iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.9520be3109ac/tpg1/portals/
/iscsi/iqn.20.../tpg1/portals> delete 0.0.0.0 ip_port=3260 # 删除/iscsi/iqn.20.../tpg1/portals> create 0.0.0.0 #创建
设置ACLS:
/iscsi> cd /iscsi/iqn.2003-01.org.linux-iscsi.iscsiserver.x8664:sn.2d5a4bb56c28/tpg1/acls
/iscsi/iqn.20...c28/tpg1/acls> create iqn.2003-01.org.linux-iscsi.iscsiserver.x8664:sn.2d5a4bb56c28:client
到这里客户端已经可以连接服务端,但是还需要将磁盘组绑定后端存储,不然客户端无法访问:
/iscsi/iqn.20...95939114/tpg1> cd /iscsi/iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.c1da95939114/tpg1/luns
/iscsi/iqn.20...114/tpg1/luns> create /backstores/block/sdb
退出并重启:
/iscsi/iqn.20...be3109ac/tpg1> exit
[root@ISCSI_Server ~]# systemctl restart targetd
2.5、linux使用ISCSI发起连接
2.5.1、和服务端一样初始化
[root@ISCSI_Client ~]# systemctl stop firewalld && systemctl disable firewalld
[root@ISCSI_Client ~]# setenforce 0
[root@ISCSI_Client ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
2.5.2、安装客户端软件
[root@ISCSI_Client yum.repos.d]# yum -y install iscsi-initiator-utils
2.5.3、发现服务端网络磁盘并连接
[root@ISCSI_Client ~]# iscsiadm --mode discoverydb --type sendtargets --portal 10.1.1.2 --discover
这里10.1.1.2是服务端IP
修改客户端iqn,这里要改成服务端acls里面那个,后面加了个“:client“:
重启并设置开机自启:
[root@ISCSI_Client ~]# systemctl restart iscsid
[root@ISCSI_Client ~]# systemctl enable iscsid
登录:
[root@ISCSI_Client ~]# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.iscsiserver.x8664:sn.2d5a4bb56c28 -p 10.1.1.2 --login
IP要换成自己服务端IP,iqn也要换成自己服务端的iqn
查看磁盘就可以看到挂载成功。
到这里就可以正常对它格式化使用,注意生产可能要写入/etc/fstab,开机自动挂载。
3、linux使用multipath实现多链路挂载实现负载
操作系统 | 角色 | ip |
---|---|---|
centos7.9 | 存储端 | 192.168.126.101 & 192.168.126.102 |
Ubuntu 22.04 | 挂载端 | 192.168.126.100 |
3.1 存储端
配置两张网卡和准备好存储磁盘(这里是sdb):
[root@localhost ~]# ip a
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:56:44:61 brd ff:ff:ff:ff:ff:ff
inet 192.168.126.101/24 brd 192.168.126.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::d00d:7855:42d:698e/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: ens36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:56:44:6b brd ff:ff:ff:ff:ff:ff
inet 192.168.126.102/24 brd 192.168.126.255 scope global noprefixroute ens36
valid_lft forever preferred_lft forever
inet6 fe80::30db:c281:174e:9a75/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 39G 0 part
├─centos-root 253:0 0 35G 0 lvm /
└─centos-swap 253:1 0 4G 0 lvm [SWAP]
sdb 8:16 0 80G 0 disk
服务端环境初始化以及安装软件:
[root@localhost ~]# systemctl stop firewalld && systemctl disable firewalld
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install -y targetd targetcli
[root@localhost ~]# systemctl start targetd && systemctl enable targetd
创建相关存储资源:
[root@localhost ~]# targetcli
/> cd backstores/block
/backstores/block> create dev=/dev/sdb name=sdb
/backstores/block> cd /iscsi
/iscsi> create
/iscsi> cd iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ca29c0f85866/tpg1/portals/
/iscsi/iqn.20.../tpg1/portals> delete 0.0.0.0 ip_port=3260
/iscsi/iqn.20.../tpg1/portals> create 0.0.0.0
/iscsi/iqn.20.../tpg1/portals> cd /iscsi/iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ca29c0f85866/tpg1/acls
/iscsi/iqn.20...866/tpg1/acls> create iqn.2003-01.org.linux-iscsi.iscsiserver.x8664:sn.2d5a4bb56c28:client
/iscsi/iqn.20...866/tpg1/acls> cd /iscsi/iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ca29c0f85866/tpg1/luns
/iscsi/iqn.20...866/tpg1/luns> create /backstores/block/sdb
/iscsi/iqn.20...866/tpg1/luns> exit
[root@localhost ~]# systemctl restart targetd
3.2 客户端
配置挂载存储,首先要把自己的InitiatorName改成存储端在acls中定义的名字,否则无法挂载
root@guojie:~# egrep -v '^#|^$' /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2003-01.org.linux-iscsi.iscsiserver.x8664:sn.2d5a4bb56c28:client
再把连接方式改成自动,默认是手动,如果设置了认证之类的还要额外配置其他项:
root@guojie:~# cat /etc/iscsi/iscsid.conf | grep "^node.startup"
node.startup = automatic
连接存储:
存储发现,这里由于是同一个所以iqn都是一样的:
iscsiadm -m discovery -t sendtargets -p <储存ip>
root@guojie:~# iscsiadm -m discovery -t sendtargets -p 192.168.126.101
192.168.126.101:3260,1 iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ca29c0f85866
root@guojie:~# iscsiadm -m discovery -t sendtargets -p 192.168.126.102
192.168.126.102:3260,1 iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ca29c0f85866
连接luns,有多少链路就连多少次,我这里只有两条:
iscsiadm -m node -T <TARGET_IQN> -p <储存ip> --login
root@guojie:~# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ca29c0f85866 -p 192.168.126.101 --login
root@guojie:~# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ca29c0f85866 -p 192.168.126.102 --login
拓展:
取消连接的命令是:
iscsiadm -m node -T <TARGET_IQN> -p <储存ip> --logout
配置多链路工具multipath连接规则:
defaults {
user_friendly_names yes # 启用友好名称功能如果为no,那么wwid必须全网唯一
find_multipaths no # 所有符合条件的设备都会被配置为多路径设备
}
blacklist {
devnode "^sd[a][0-9]*" # 该部分定义了不应该被multipath管理的设备,即排除本地磁盘,支持正则。
} # 如果本地还有sdb,那么就写成"^sd[a-b][0-9]*"
blacklist_exceptions { # 定义了应该被multipath管理的设备,它们即使在黑名单中也会被作为例外处理
device {
vendor ".*" # 表示所有供应商的设备都应该作为例外被多路径管理。
product ".*" # 表示所有供应商的产品都应该作为例外被多路径管理。
}
}
multipaths {
multipath {
wwid 36001405c282bc2caba14175a7384f2bb # 如果你已经挂载全部链路的磁盘,可以使用multipath -ll命令查看
alias mpath0 # wwid会显示在第一行别名在后面的括号中
}
}
devices {
device {
vendor ".*"
product ".*"
path_selector "round-robin 0" # 设置路径选择策略为 round-robin。这意味着 I/O 会在每个路径之间轮流分配负载。
path_grouping_policy multibus # 设置路径分组策略为 multibus。这意味着所有路径将被视为一个路径组。
path_checker directio #设置路径检查器为 directio。这将通过直接 I/O 操作检查路径的可用性。
rr_min_io 100 #策略下每个路径至少处理的 I/O 请求数为 100。
}
}
上面的配置当中一般只用修改wwid、alias、path_selector前一个是硬盘uuid,后一个则是取得别名,挂载之后需要用别名挂载硬盘到客户端上,最后一个是策略,"round-robin 0"是轮询即负载均衡模式,"queue-length 0"是最少连接,"service-time 0"是根据未完成的IO数量选择下一组IO的路径
配置完成之后
root@guojie:~# systemctl reload multipathd
root@guojie:~# systemctl start multipathd
root@guojie:~# systemctl enable multipathd
root@guojie:~# systemctl restart multipath-tools
看见两个磁盘状态都为runing即可:
root@guojie:~# multipath -ll
mpath0 (36001405caffe1f1c1b542088f5cfa11a) dm-1 LIO-ORG,sdb
size=80G features='0' hwhandler='1 alua' wp=rw
`-+- policy='round-robin 0' prio=50 status=active
|- 33:0:0:0 sdb 8:16 active ready running
`- 34:0:0:0 sdc 8:32 active ready running
磁盘格式化分区挂载—》fdisk /dev/mapper/mpath0 -> g -> 回车-> 回车-> 回车 ->w
root@guojie:~# mkfs.ext4 /dev/mapper/mpath0-part1
root@guojie:~# mount /dev/mapper/mpath0-part1 /data
可以测验一下是否正常:
如下,在存储端编辑一个脚本分别监控两个网卡流量:
[root@localhost ~]# cat monitor_traffic.sh
#!/bin/bash
eth0=$1
echo -e "流量进入--流量传出 "
while true; do
old_in=$(cat /proc/net/dev |grep $eth0 |awk '{print $2}')
old_out=$(cat /proc/net/dev |grep $eth0 |awk '{print $10}')
sleep 1
new_in=$(cat /proc/net/dev |grep $eth0 |awk '{print $2}')
new_out=$(cat /proc/net/dev |grep $eth0 |awk '{print $10}')
in=$(printf "%.1f%s" "$((($new_in-$old_in)/1024))" "KB/s")
out=$(printf "%.1f%s" "$((($new_out-$old_out)/1024))" "KB/s")
echo "$in $out"
done
[root@localhost ~]# chmod +x monitor_traffic.sh
分别打开两个窗口一个监控ens33,一个监控ens36网卡:
[root@localhost ~]# sh monitor_traffic.sh ens33
[root@localhost ~]# sh monitor_traffic.sh ens36
然后在终端上复制较大文件到/data中之后查看两块网卡流量:
root@guojie:~# cp /home/guojie/CentOS-7-x86_64-Everything-2009.iso /data
观察流量可以看见只是走了一跳链路,但是那条链路异常他会迁移到另一条。
4、使用windows ISCSI发起连接
使用ISSCSI发起程序连接服务端:
先把配置发起程序的名称,改成之前服务器端设置的哪个acl:
4.1、链路冗余
当客户端到达服务器端有多链路可达时,可以配置该方式,达到链路可靠的特点:
如下:
服务端有四个IP,客户端均能访问这四个地址,我们就可以配置冗余链路。
客户端配置:
发现门户这里发现所有的服务端IP:
按照如下步骤,依次把所有IP加入:
这里就可以看见四个设备:
点解MPIO还可以选择负载策略:
配置完成之后可以测试链路是否达到冗余效果。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY