一 SCSI
硬盘从接口方面分:可分为IDE和SATA硬盘与SCSI硬盘
(1)SATA逐渐取代IDE硬盘的地位成为PC市场的主流,个人电脑上使用的硬盘绝大多数均为SATA接口硬盘!
(2)SCSI硬盘(即Small Computer System Interface小型计算机系统接口),由于其性能好,多在服务器上采用此类硬盘产品!
二 ISCSI
概念:iscsi(Internet Small Computer System Interface); iscsi是一个供硬件设备使用的、可在IP协议上层运行的SCSI指令集,是一种开放的基于IP协议的工业技术标准。该协议可以用TCP/IP对SCSI指令进行封装,使得这些指令能够通过基于P网络进行传输,从而实现SCSI 和TCP/IP协议的连接。对于局域网环境中的用户来说,采用该标准只需要不多的投资就可以方便、快捷地对信息和数据进行交互式传输及管理。
从协议层次的角度看,通常所说的SCSI通常是指一组包含块命令、控制器管理、系统命令和enclosure服务等内容的协议规范,对应于会话层;而其下的物理通道和链接方式就对应在数据链路层,SCSI命令可以通过串口、Fibre Channel、SAS、infiniband、Internet、USB、PCIE等进行传输。iSCSI就是一种把异地存储资源通过TCP/IP网络映射到本地逻辑存储设备的SCSI实现。不同于NFS向用户提供按文件为单位访问远程存储的方式,它向用户提供了以块方式访问远程存储资源的接口,也就是说用户可以在本地/dev/下看到iSCSI映射后的磁盘。通常所说的target端是指提供远端存储资源所在的主机,比如存储服务器;而initiator端是指链接到target端并会访问远端存储资源的节点(所在的位置是客户端)
(1) iSCSI target管理工具的特点
基于iSCSI的网络属性,很直观地我们能想到它基本上是基于server-client模型。提供存储资源的target相当于server,而使用远程存储资源的initiator端相当于client。基于现有的iSCSI协议规范,能够开发出target端和initiator端工具。在Linux系统上,initiator端工具可以用iscsiadm,目前大部分os都自带有这款工具;而target端的工具由于直接和性能和存储管理相关,数量更多,目前常见的有targetcli、targetadm、ietadm,它们各有所长,分别能适用不同的场合。
说明:ISCSI通常是设备共享;而samba(cifs)、nfs文件系统共享!
iSCSI继承了两大最传统技术:SCSI和TCP/IP协议,这为iSCSI的发展奠定了坚实的基础!
特点:iSCSI可以实现在IP网络上运行SCSI协议!
优点:基于iSCSI的存储系统只需要不多的投资便可实现SAN存储功能,甚至直接利用现有的TCP/IP网络,相对于以往的网络存储技术,它解决了开放性、容量、传输速度、兼容性、安全性等问题,其优越的性能使其备受始关注与青睐。
三 常用的基本概念
明白:文件系统、设备、分区的区别!
四 target端可作为共享磁盘的类型
(1)使用单一分区(partition)共享为磁盘
(2)使用完整的块设备(无须事先分区)
(3)使用磁盘阵列(RAID)共享或者软件磁盘阵列共享方式-->与单一磁盘相同
(4)使用LVM的LV设备共享为磁盘!
(5)使用dd命令所建立的大型文件来仿真成磁盘(无需事先格式化)
# 注意:共享的磁盘最好不要被使用,并且开机不要被挂载(/etc/fstab)!
四 实验
说明:RHEL6中是以配置文件的形式来进行配置,RHEL7提供了命令行接口(CLI)的管理工具 targetcli
角色:服务器(target);客户端(initiator)
(1)target(服务器)端准备好ISCSI共享的块设备--->以LVM的形式
过程省略:分区-->改变标识(用途)--->创建物理卷、卷组、逻辑卷
注意:不要格式化文件系统,因为文件系统不在target端,服务器端只是提供块设备!
补充:各节点Initiator和Target端需要做以下准备
1、配置IP、关闭防火墙/SELINUX;
2、配置各节点名称;
3、时间同步;
安装软件
yum install targetcli.noarch -y
# 用来将LInux系统仿真成为ISCSI target的功能(软件仿真)
(2)target端进行配置
backstores:后台存储是内核目标用来“备份”其导出的SCSI设备的不同类型的本地存储资源。每个后台创建的到本地存储资源的映射称为存储对象!
(1)可用于 iSCSI 的服务存储类型四种
(2)各部分的说明
(1)targetcli - administration shell for storage targets
管理存储targets的类似shell界面 LIO -->targetcli{查看、编辑、保存}
(2)核心步骤
####################BLOCK目录###################
BLOCK(目录) --->Allows a local disk block device to be shared.(重要!!!)
说明:block目标表示-->允许一个本地的块设备被共享
使用结构节点内的create命令创建目标-->映射关系
举例:
1)/backstores/block create wzj:storage1(虚拟的) /dev/vg1/lv1(真实)
PSCSI(目录)Allows a local SCSI device of any type to be shared.
FILEIO(目录) --->Allows files to be treated as disk images.
说明:允许一个文件被当作disk images
####################ISCSI目录########################
TPGS(目标门户组-->目录)允许iSCSI在一个目标内支持多个完整配置。这对于复杂的服务质量配置很有用。
说明:创建目标时,targetcli将自动创建一个tpg,几乎所有设置都只需要一个。
举例:
iscsi/ create iqn.2019-01.com.wzj:storange1
格式: iqn.yyyy-MM.域名反转:labels
#######LUNS目录##########
LUNS(将之前定义的存储对象--> /backstores/block/wzj:storage1)与目标联系起来
iscsi/iqn*/luns create /backstores/block/wzj:storage1
内核目标导出SCSI逻辑单元,也称为LUN。本节将先前定义的存储对象与目标链接起来,并定义设备将使用的编号(逻辑单元号)。
请注意,如果使用的是ACL,则必须在引用回TPG LUN的ACL下创建一个LUN映射
############ACLS##############
initiator-->发起者
create <wwn> in the acls node creates an ACL for an initiator, and cre‐
ate within the ACL creates a LUN mapping.
为每一个发起者(客户端)创建一个ACL访问控制权限--->持有这个密钥的客户端才能访问我!
############PORTALS###########
开放的端口--->IP(ISCSI服务器!!!) --->默认端口是3260
targetcli --> ls(可以看到端口)--->监听客户端的请求!
服务器配置的步骤
backstores/block create name=wzj:storage1 dev=/dev/vg1/lv1
# 默认前面是 name,后面是dev,如果指定的话(可以调整顺序)
# (1)添加已创建的磁盘分区到 Backstores下,使其成为一个ISCSI的存储对象
iscsi/ create iqn.2019-05.com.wzj:random
# (2)创建一个iqn标签,能被客户端唯一识别的!
# iqn标签的命名规范: iqn.yyyy-mm.[reverse domain]:label(随机字符串) -->遵守(规范)!
注意:默认会创建一个iscsi/iqn.2019-05.com.wzj:random/tpg1
iscsi/iqn.2019-05.com.wzj:random/tpg1/luns create /backstores/block/wzj:storage1
# 做的是:"绑定"iqn标签到存储设备,客户端通过检测iqn标签来使用设备!
# iqn标签创建完之后,会出现一个LUN(专门是做控制的,Type controlller),控制节点类型(iqn标签创建以后自动创建的LUN),并不是做存储的!
原因:因为你还没有"告诉"他你把"哪个设备"共享给它(它的理解)作为共享设备,提供给客户端使用!
# (3)进行关联
iscsi/iqn.2019-05.com.wzj:random/tpg1/acls create iqn.2019-05.com.wzj:randomkey
# (4)认证
iscsi/iqn.2019-05.com.wzj:random/tpg1/portals create 172.25.2.150
# 为了保证安全:指定"用户"(ACL)和"IP网段" -I(IP地址-->给谁使用)才可以使用
# (5)开启的IP:端口-->默认是3260
exit
LUN(Logic Unit逻辑单元)
理解为划分存储能力,ISCSI服务器端有1PB,但是客户端不一定全部要使用(1TB),可以通过分割,划分区域共享!
LUN(逻辑单元),每个逻辑单元都打上一个标签!
target端开启服务
systemctl start target
systemctl enable target
systemctl status target
补充:如果防火墙没有关闭,可以进行下面的配置
firewall-cmd --permanent --add-port=3260/tcp
firewall-cmd --reload
#########################
客户端测试
(0)安装 iscsi-initiator-utils 软件包
yum install -y iscsi-initiator-utils
# 作用:挂载来自target的磁盘到Linux本机上!
(1)客户端开启检测前准备工作
#(1)首先进行认证,修改配置文件
/etc/iscsi/initiatorname.iscsi #修改acl的认证!
# (2)开启服务
systemctl enable iscsid
systemctl start iscsid
systemctl status iscsid
注意:是iscsid而不是iscsi!
(2)开始检测
#(1)检测-->获取设备的iqn标签的名称
iscsiadm -m doscovery -t st -p 172.25.2.150
#(2)根据ip标签,登陆准备使用-->成功的标志(successful)
iscsiadm -m node -T iqn.2019-05.com.wzj:random -l
# 在服务器为一个客户端添加一个LUN,会在客户端显示为一个磁盘驱动器!
说明:客户端需要通过访问iqn标签的方式,来确定target端的存储设备有哪些!
-t st(scanner type)-->指定"扫描类型"!
-p IP(指定扫描的服务器地址) 结果-->扫描出一个标签
-l(login-->登陆操作) -m node() -T iqn标签 --->successful成功标示!
-T, --targetname(指定访问的iqn标签的名字)
-m, --mode op
# discovery(常用), discoverydb,node(常用), fw, host iface or session(常用)
测试
测试1:验证会话状态及相关的磁盘信息
iscsiadm -m session -P 3 |grep Attached
测试2:验证客户端是否存储已发现的服务端 Target
ll -R /var/lib/iscsi/nodes/
测试3:通过 fdisk -l 或者 cat /proc/partation 查看!
(3)准备使用
强调:不管target端到底提供的是一个分区还是一个文件或者是一个设备,initator端检测的就是一个完整的块设备!
(1)分区-->查看 lsblk
fdisk /dev/sda
# 注意:多出来的那块设备,是什么就写什么!
(2)格式化成文件系统-->使用
mkfs.xfs /dev/sda1
mount /dev/sda1 /mnt/
df #查看是否被挂载上
(3)开始在此分区上写文件等
需求1:开机自动挂载
#(1)查设备UUID -->blkid
/dev/sda1: UUID="549d1f04-6054-44b4-9f70-2e93976b9b2b" TYPE="xfs"
#(2)写入配置文件
UUID="549d1f04-6054-44b4-9f70-2e93976b9b2b" /mnt xfs defaults,_netdev 0 0
# 声明是一个网络设备(网络参数的时候)
#(3)先卸载,然后再测试看是否挂载上
mount -a
#(4)测试
reboot -->df
说明:永久挂载磁盘的时候必须声明这是一个网络设备了,而且挂载的时候最好使用UUID,防止发生设备名称的漂移!
原因:开机的时候会先挂载,不指定参数当作普通的设备会出错,而此设备是需要网络支持,所以必须声明是一个网络设备!
注意:第一次的话重启电脑可能会一直卡,需要force,真实环境通过掉电的策略进行!
需求2:客户端卸载 iSCSI Target
卸载的场景:磁盘扩容、客户端不再使用 iSCSI 进行数据存储、客户端布署其他应用而不再使用原应用等等,就需要将已经挂载的 iSCSI Target 进行卸载,并出于信息安全的目的,删除已经保存的服务端的相关信息,这时就需要进行相关的操作!
注意:要卸载已经挂载到客户端系统目录上的iSCSI Target,首先要确认当前分区没有被使用,避免出现数据丢失!
(1)在/etc/fstab中删除持久化挂载操作配置
(2)卸载 umount
umount /mnt/
(3)登出
tree /var/lib/iscsi #有相关的数据文件
iscsiadm -m node iqn.2019-05.com.wzj:random -p 172.25.2.150 -u #只是登出
tree /var/lib/iscsi #有相关的数据文件
iscsiadm -m node iqn.2019-05.com.wzj:random -p 172.25.2.150 -o delete
# 说明:删除已发现的 iSCSI 服务端信息并验证
tree /var/lib/iscsi #此时是否有相关的数据文件(没有)
(4)进一步检查
iscsiadm -m session -P 3|grep Attached #验证是否还存在 iSCSI Session
lsblk #查看是否还存在未挂载的磁盘
说明:到这里在客户端成功删除了 iSCSI Target
需求3:临时登出
iscsiadm -m node iqn.2019-05.com.wzj:random -p 172.25.2.150 -u #u(unlogin)
# 说明:临时登出 tree /var/lib/iscsi 可以看到数据文件还存在,此时df看不到此设备信息!
iscsiadm -m node iqn.2019-05.com.wzj:random -p 172.25.2.150 -l #l(login登陆)
说明:如果删除vim /etc/fstab,只u(停止),由于没有删除/var/lib/iscsi,所以systemctl restart iscsid --> fidsk -l 还会看到此硬盘信息
target端删除
targetcli 进入配置shell界面
clearconfig confirm=True
ls #查看下
saveconfig #最好保存下
exit #退出
注意:一定是没有客户端使用,才清理服务器端,否则会出现错误!
扩展
/etc/tgt/targets.conf配置文件
#############################
四 小思考
问题1:既然有文件存储又搞什么块存储有什么意义?
(1)有些数据库它需要的是,如果你要使用我的话,存储必须指定是一个单独的块,文件系统不行!
(2)我们块存储传输的ISCSI指令,而不是文件本身,它的效率更高!
问题2:为什么服务器使用LVM
补充:可以动态伸缩,弹性比较好,先在服务端的磁盘上新建 LVM , 然后将新建的 LV 加入到 Backstore 中,做为后备磁盘,供 Lun 使用。如果出现需要进行磁盘扩容的情况,只需要调整相应的 Backstore 中的 LV 分区即可!
五 工作原理
工作流程
(1)iSCSI系统由SCSI适配器发送一个SCSI命令。
(2)命令封装到TCP/IP包中并送入到以太网络。
(3)接收方从TCP/IP包中抽取SCSI命令并执行相关操作。
(4)把返回的SCSI命令和数据封装到TCP/IP包中,将它们发回到发送方。
(5)系统提取出数据或命令,并把它们传回SCSI子系统。
六 排错
(1)客户端查找不到服务端的ISCSI设备
iscsiadm -m discovery -t sendtargets -p 172.25.2.100
iscsiadm: cannot make connection to 172.25.2.100: Connectionrefused
iscsiadm: connection login retries (reopen_max) 5 exceeded
iscsiadm: Could not perform SendTargets discovery: encounteredconnection failure
原因: 服务端未指定ip和端口或者防火墙没有开启此端口(3260)!
(2)客户端查找不到服务端的ISCSI设备
iscsiadm: Could not perform SendTargets discovery: encounteredconnection login failure
解决思路:发现tgtd服务也启动了,这样与target服务共用了端口,把tgtd服务关掉并设置为开机不启动
停止:systemctl stop tgtd
开机不启动:systemctl disable tgtd
(3)Could not create NetworkPortal in configFS
原因:服务器已经存在了一个IP和端口,需要删除
场景:服务器target端口有多个LUN的时候!
解决
/>cd /iscsi/iqn.2019-05.com.wzj:iscsimwd1/tpg1/portals
/>/iscsi/iqn.20.../tpg1/portals> delete 0.0.0.0 3260
注:ip和端口之间有一个空格
(4)acl的密钥
原因:客户端在 /etc/iscsi/init* 写错,属于authorized授权问题,
解决策略:删除/var/lib/iscis/相应的 --> tree看干不干净,vim /etc/iscis/init* -->正确的信息!
(5)注意一定要安装正确的版本的yum源
python包的问题