iSCSI网络存储服务
一、iSCSI网络存储概述
iSCSI( Internet Small Computer System Interface 互联网小型计算机系统接口)是由IBM 下属的两大研发机构一一加利福尼亚AImaden和以色列Haifa研究中心共同开发的,是一个供硬件设备使用的、可在IP协议上层运行的SCSI指令集,是一种开放的基于IP协议的工业技术标准。该协议可以用TCP/IP对SCSI指令进行封装,使得这些指令能够通过基于IP网络进行传输,从而实现SCSI 和TCP/IP协议的连接。对于局域网环境中的用户来说,采用该标准只需要不多的投资就可以方便、快捷地对信息和数据进行交互式传输及管理。
Iscsi 技术是一种比较成熟的存储技术,该技术是将现有的SCSI接口与以太网技术相结合,使服务器可与使用IP网络的存储设备互相交换数据。
IScsi 是基于客户端与服务器端模式,主要功能是在TCP/IP网络上的主机系统(启动器initlator)和存储设备(目标 target) 之间进行大量的数据封装和可靠传输过程,此外,iscsi 提供了在IP网络封装SCSI命令,且运行在TCP上。
实际生产环境中,一般都是使用集群搭建服务器,如果两台或多台服务器都是使用独立磁盘,使用ISCSI 技术,实现远程磁盘的使用,集群的服务器都挂在同一个远程存储设备到本地实现数据读写,这样也就减少了一个同步数据的任务,大大减轻了服务器的资源消耗
作为服务器的系统通常需要存储设备的,而存储设备除了可以使用系统內间的磁盘之外,如果本地设备的磁盘容量不够大,而且没有额外的磁盘插槽(SATA 或IDE)可用时,常见的解决方案是增加NAS(网络附加存储服务器)或外接式存储设备高档一点的,可能会用到SAN(存储局域网络)
1、NAS与SAN的区别
NAS (network attached storage,网络附加存储)
NAS采用普通以太网,对速率和冗余无特别要求,它使用NFS、CIFS共享协议进行文件级传输,采用共享文件夹的形式发布,数据以文件的形式传输,协议包括:微信的软件共享协议CIFS,Linux下的文件共享协议NFS和FTP协议等。
SAN (storage area networks,存储区域网络)
SAN可视为一个外接式的存储设备,可以透过某些特殊的接口或信道来提供给局域网内的所有主机进行存盘存储,SAN提供的是磁盘给主机,而不是想NAS提供的是文件系统,主机可针对SAN提供的磁盘进行分割和格式化操作,而NAS则不能。
SAN多采用高速光纤通道,对速率和冗余性要求高,它使用iSCSI存储协议,属于块级传输。
主机与存储间可建立多条传输通道保障数据传输的高可用性;SAN区域采用交换机的插接结构,无需终止服务即可对存储容量进行扩展;iSCSI设备可采用高性能的RAID阵列,磁盘柜等。
二、构建iSCSI服务
iSCSI的工作方式:
服务(设备)端--target负责定义存储对象,分配逻辑空间,需要安装scsi-target-utils软件包,对应的系统服务为tgtd,默认端口为3260,命令行管理工具tgtadm
客户(应用)端--initiator负责发现并登陆存储及配置存储使用,需要安装iscsi-initiator--utils软件包
1、服务端(target)
首先安装服务端软件包scsi-target-utils;可以使用yum安装或到官网下载源码安装,这里采用yum安装。
源码地址:https://sourceforge.net/projects/iscsitarget/files/latest/download
# yum install scsi-target-utils # rpm -ql scsi-target-utils #查看软件安装的文件 /etc/sysconfig/tgtd #指定配置文件 /etc/tgt/conf.d/sample.conf #模板配置文件 /etc/tgt/targets.conf #主配置文件 /etc/tgt/tgtd.conf #全局配置文件 /usr/lib/systemd/system/tgtd.service #系统启动脚本 /usr/sbin/tgt-admin #配置工具 /usr/sbin/tgtadm #管理target工具 /usr/sbin/tgtd #服务进程程序 /usr/sbin/tgtimg #共享的映射文件设备工具
服务器端管理配置工具tgtadm:
tgtadm是一个模式化的命令工具,其常见的模式有target、logicalunit、account
target模式:
tgtadm --lld <driver> --mode target --op new --tid <id> --targetname <name> #新建target对象,id不能为0 tgtadm --lld <driver> --mode target --op delete [--force] --tid <id> #删除target对象 tgtadm --lld <driver> --mode target --op show #显示target对象 tgtadm --lld <driver> --mode target --op show --tid <id> #显示指定id的target对象 tgtadm --lld <driver> --mode target --op update --tid <id> --name <param> --value <value> #更新target对象数据 tgtadm --lld <driver> --mode target --op bind --tid <id> --initiator-address <address> #绑定地址到target对象 tgtadm --lld <driver> --mode target --op bind --tid <id> --initiator-name <name> #指定target名来绑定到target对象 tgtadm --lld <driver> --mode target --op unbind --tid <id> --initiator-address <address> #解除绑定 tgtadm --lld <driver> --mode target --op unbind --tid <id> --initiator-name <name> #解除绑定
#选项对应的都有短格式:
-L,--lld 指定驱动类型,一般表示iSCSI存储:-L iscsi
-m,--mode 指定管理模式,'-m target'表示iscsi对象,'-m logicalunit'可简写为'-m lu'表示管理目标为LUN,'-m account'管理账号
-o,--op 指定操作类型,如:new(新建),delete删除,show查看,bind绑定,ubind解除绑定,update更新
-t,--tid 指定对象ID,但不能指定为0
-T,--targetname 指定iSCSI对象的名称,应符合iqn规范,命名格式为:iqn.YYYY-mm.反向域名:识别标记;其中YYYY-mm表示年月,反向域名为服务器FQDN的倒序,识别码可自定义。
-I,--initiator-address 指定需要绑定的网络地址段,如:-I 10.0.0.0/8
logicalunit模式:
tgtadm --lld <driver> --mode logicalunit --op new --tid <id> --lun <lun> --backing-store <path> #创建逻辑单元 tgtadm --lld <driver> --mode logicalunit --op delete --tid <id> --lun <lun> #删除逻辑单元
#选项对应的都有短格式:
-m,--mode 指定类型为logicalunit来创建逻辑单元Lun
-l,--lun 指定逻辑单元Lun的ID号
-b,--backing-store 指定块设备,如:-b /dev/md0
account模式:
tgtadm --lld <driver> --mode account --op new --user <name> --password <pass> #创建验证用户名及密码 tgtadm --lld <driver> --mode account --op delete --user <name> #删除用户 tgtadm --lld <driver> --mode account --op bind --tid <id> --user <name> [--outgoing] #绑定用户到target对象 tgtadm --lld <driver> --mode account --op unbind --tid <id> --user <name> [--outgoing] #解除绑定
#选项对应的都有格式:
-m,--mode 指定模式account来创建跟target绑定的用户名和密码
--user 指定用户名
--password 指定密码
#创建target对象实例:
#systemctl start tgtd.service #启动服务 # tgtadm --lld iscsi --mode target --op new --tid 1 --targetname iqn.2018-12.com.pjy:store.sdb #创建target对象,指定ID为1 # tgtadm --lld iscsi --mode target --op show Target 1: iqn.2018-12.com.pjy:store.sdb System information: Driver: iscsi State: ready I_T nexus information: LUN information: LUN: 0 Type: controller SCSI ID: IET 00010000 SCSI SN: beaf10 Size: 0 MB, Block size: 1 Online: Yes Removable media: No Prevent removal: No Readonly: No SWP: No Thin-provisioning: No Backing store type: null Backing store path: None Backing store flags: Account information: ACL information: # tgtadm --lld iscsi --mode logicalunit --op new --tid 1 --lun 1 --backing-store /dev/sdb #指定target ID创建并绑定逻辑单元设备 # tgtadm --lld iscsi --mode target --op show #查看逻辑磁盘 Target 1: iqn.2018-12.com.pjy:store.sdb System information: Driver: iscsi State: ready I_T nexus information: LUN information: LUN: 0 Type: controller SCSI ID: IET 00010000 SCSI SN: beaf10 Size: 0 MB, Block size: 1 Online: Yes Removable media: No Prevent removal: No Readonly: No SWP: No Thin-provisioning: No Backing store type: null Backing store path: None Backing store flags: LUN: 1 Type: disk SCSI ID: IET 00010001 SCSI SN: beaf11 Size: 21475 MB, Block size: 512 Online: Yes Removable media: No Prevent removal: No Readonly: No SWP: No Thin-provisioning: No Backing store type: rdwr Backing store path: /dev/sdb Backing store flags: Account information: ACL information: # tgtadm --lld iscsi --mode target --op bind --tid 1 --initiator-address 192.168.146.0/24 #绑定客户端网段ACL # tgtadm --lld iscsi --mode account --op new --user admin --password 123.com #创建绑定账户 # tgtadm --lld iscsi --mode account --op bind --tid 1 --user admin #绑定用户到target对象 # tgtadm --lld iscsi --mode target --op show #查看绑定 Target 1: iqn.2018-12.com.pjy:store.sdb System information: Driver: iscsi State: ready I_T nexus information: LUN information: LUN: 0 Type: controller SCSI ID: IET 00010000 SCSI SN: beaf10 Size: 0 MB, Block size: 1 Online: Yes Removable media: No Prevent removal: No Readonly: No SWP: No Thin-provisioning: No Backing store type: null Backing store path: None Backing store flags: LUN: 1 Type: disk SCSI ID: IET 00010001 SCSI SN: beaf11 Size: 21475 MB, Block size: 512 Online: Yes Removable media: No Prevent removal: No Readonly: No SWP: No Thin-provisioning: No Backing store type: rdwr Backing store path: /dev/sdb Backing store flags: Account information: admin #绑定用户,注意:只用先绑定网段后,绑定账号才能生效 ACL information: 192.168.146.0/24 #绑定网段
#到此命令工具配置target已完成
#下面我们用配置文件来配置target对象
vim /etc/tgt/targets.conf default-driver iscsi <target iqn.2018-12.com.pjy:store.disk> #定义target对象 <backing-store /dev/sdb1> #定义逻辑磁盘Lun对象 vendor_id sdb1 #定义厂商ID lun 8 #定义lun的ID号 </backing-store> <backing-store /dev/sdb2> vendor_id sdb2 lun 9 </backing-store> incominguser test 123.com #定义验证用户名和密码 initiator-address 192.168.146.0/24 #定义ACL绑定到target </target>
#重启服务
# systemctl restart tgtd
#查看创建的target对象和LUN
# tgtadm --lld iscsi --mode target --op show Target 1: iqn.2018-12.com.pjy:store.disk System information: Driver: iscsi State: ready I_T nexus information: LUN information: LUN: 0 Type: controller SCSI ID: IET 00010000 SCSI SN: beaf10 Size: 0 MB, Block size: 1 Online: Yes Removable media: No Prevent removal: No Readonly: No SWP: No Thin-provisioning: No Backing store type: null Backing store path: None Backing store flags: LUN: 8 Type: disk SCSI ID: IET 00010008 SCSI SN: beaf18 Size: 5369 MB, Block size: 512 Online: Yes Removable media: No Prevent removal: No Readonly: No SWP: No Thin-provisioning: No Backing store type: rdwr Backing store path: /dev/sdb1 Backing store flags: LUN: 9 Type: disk SCSI ID: IET 00010009 SCSI SN: beaf19 Size: 5369 MB, Block size: 512 Online: Yes Removable media: No Prevent removal: No Readonly: No SWP: No Thin-provisioning: No Backing store type: rdwr Backing store path: /dev/sdb2 Backing store flags: Account information: test ACL information: 192.168.146.0/24
2、客户端(initiator)
客户端主机需要安装iscsi-initiator-utils软件包:
#其主要配置文件:
/etc/iscsi/iscsid.conf:主配置文件,用于连接iSCSI target
/sbin/iscsid:启动iSCSI initiator的主要服务进程
/sbin/iscsiadm:用来管理iSCSI initiator的主要设置程序
/etc/init.d/iscsid:让本机模拟成为iSCSI initiator主要服务
/etc/init.d/iscsi:在本机成为iSCSI initiator后,启动服务,登录iSCSI target。
/sbin/iscsi-iname:自动生成initiatorName(-p:指定前缀,保存在/etc/iscsi/initiator.iscsi中)
/var/lib/iscsi目录
/var/lib/iscsi/ifaces:各网卡接口
/var/lib/iscsi/send_targets目录:生成一个或多个以iSCSI存储服务器的IP和端口命名的文件夹
/var/lib/iscsi/nodes目录:一个或多个以iSCSI服务器上的target名命名的文件夹,下有iSCSI protal IP,端口号的配置文件参数,登录target的参数,由/etc/iscsi/iscsi.conf继承
#yum install iscsi-initiator-utils
#rpm -ql iscsi-initiator-utils #查看安装的文件
#systemctl start iscsid.service #启动服务
#首先通过命令修改targetName的名称:
# /usr/sbin/iscsi-iname iqn.1994-05.com.redhat:aa865ee88273
#本地客户端的target名在/etc/iscsi/initiatorname.iscsi文件中
# echo "InitiatorName=`iscsi-iname -p iqn.2018-12.com.pjy:client.node1`" > /etc/iscsi/initiatorname.iscsi # cat /etc/iscsi/initiatorname.iscsi InitiatorName=iqn.2018-12.com.pjy:client.node1:9f668e87f34
#客户端主要管理工具iscsiadm:
#iscsiadm是个模式化的工具,其模式可通过-m或–mode选项指定,常见的模式有discovery、node、fw、session、host、iface几个。这些模式的主要功能如下:
discovery: 用于发现某服务器是否有target输出,以及输出了哪些target;
node: 管理跟某target的关联关系
session:用于显示所有的活动会话和连接
fw:显示所有的启动固件值
host:显示所有的iSCSI主机
iface:显示/var/lib/iscsi/ifaces目录中的所有ifaces设定
1)、discovery模式下的语法格式
iscsiadm -m discovery [ -d debug_level ] [ -I iface -t type -p ip:port [-l ] ]
discovery模式下可用选项:
-d, –debug 显示debug信息,级别为0-8;
-l, –login 表示登录target的意思
-t, –type 这里可以使用的类型为sendtargets(可简写为st)、slp、fw和 isns,此选项仅用于discovery模式,且目前仅支持st、fw和isns;其中st表示允许每个iSCSI target发送一个可用target列表给initiator;
-p, –portal 指定target服务的IP和端口;
-m, –mode 可用的mode有discovery, node, fw, host iface 和 session
2)、node模式下的语法格式
iscsiadm -m node [ -d debug_level ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ [ -T targetname -p ip:port -I iface ] [ -l | -u | -R | -s] ] [ [ -o operation ]
node模式下可用选项:
-L ,–loginall 表示登录到所有发现的target设备上。all表示登录到所有的target设备上;manual表示手动登录;automatic表示自动登录。
-T, –targetname 用于指定target的名字
-u, –logout 从target设备上登出
-s, –stats 显示session统计信息
-o, –op:指定针对discoverydb数据库操作,其仅能为new、delete、update、show和nonpersistent其中之一;
-I, –interface:指定执行操作的iSCSI接口,这些接口定义在/var/lib/iscsi/ifaces中;
3)、session模式下的语法结构
iscsiadm -m session -s:显示会话的相关信息
4)、客户端配置文件/etc/iscsi/iscsid.conf 的主要参数如下:
node.startup ##设置启动方式,可选的参数有auotmatic和manual
node.session.auth.authmethod ##设置使用CHAP认证方式,默认为NONE
node.session.auth.username target ##service端认证所需initiator提供的用户
node.session.auth.password target ##service端认证所需initiator提供的密码
node.session.auth.username_in initiator ##client端认证所需target提供的用户
node.session.auth.password_in initiator ##client端认证所需target提供的密码
discovery.sendtargets.auth.authmethod ##设置使用CHAP认证方式用以发现target端导出的设备,默认为NONE
discovery.sendtargets.auth.username ##发现操作时target端认证所需initiator提供的用户
discovery.sendtargets.auth.passwd ##发现操作时target端认证所需initiator提供的密码
discovery.sendtargets.auth.username_in ##发现操作时initiator端认证所需target提供的用户
discovery.sendtargets.auth.password_in ##发现操作时initiator端认证所需target提供的密码
5)客户端连接实例
# iscsiadm -m discovery -t st -p 192.168.146.145 #发现服务端的target输出 192.168.146.145:3260,1 iqn.2018-12.com.pjy:store.disk # tree /var/lib/iscsi/send_targets/ #在文件中查看发现的target #iscsiadm -m node #查看iscsi发现记录 # iscsiadm -m node -o delete -T iqn.2018-12.com.pjy:store.disk #删除iSCSI发现的记录 #iscsiadm -m node -T iqn.2018-12.com.pjy:store.disk -p 192.168.146.145 -l #登陆target,登出则用-u #如果target对象需要用户名和密码认证,则应该在/etc/iscsi/iscsid.conf文件中指定用户名和密码 # sed -i 's/#node.session.auth.authmethod = CHAP/node.session.auth.authmethod = CHAP/g' /etc/iscsi/iscsid.conf #开启认证功能 #sed -i 's/#node.session.auth.username = username/node.session.auth.username = test/g' /etc/iscsi/iscsid.conf #指定用户名 # sed -i 's/#node.session.auth.password = password/node.session.auth.password = 123.com/g' /etc/iscsi/iscsid.conf #指定密码 # systemctl restart iscsid #重启服务 # iscsiadm -m node -T iqn.2018-12.com.pjy:store.disk -p 192.168.146.145 -l #登陆就可以直接看到磁盘了
#查看发现的磁盘
# fdisk -l
#对磁盘进行parted分区操作:
# parted /dev/sdc GNU Parted 3.1 使用 /dev/sdc Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) mklabel gpt #指定gpt文件系统 (parted) mkpart p1 #创建文件系统并取名为p1 文件系统类型? [ext2]? ext4 起始点? 0% 结束点? 100% (parted) q 信息: You may need to update /etc/fstab.
#格式化分区
# mkfs.ext4 /dev/sdc1
#挂载分区磁盘
# mkdir /data1 # mount /dev/sdc1 /data1 # df -Th ... /dev/sdc1 ext4 4.8G 20M 4.6G 1% /data1
#通过UUID写入挂载文件到/etc/fstab开机自动挂载,必须指定_netdev参数
#blkid #查看磁盘UUID号 #vim /etc/fatab UUID=61dfb375-af2d-4ef7-afed-bcd7d23be2cd /data1 ext4 defaults,noatime,_netdev 0 0 #mount -a #检测磁盘挂载 #mount /dev/sdc1 on /data1 type ext4 (rw,relatime,seclabel,data=ordered,_netdev