1.了解SCSI:
SCSI(Small Computer System Interface) 小型计算机系统接口,一种用于计算机和智能设备之间(硬盘、软驱、光驱、打印机、扫描仪等)系统级接口的独立处理器标准。SCSI是一种智能的通用接口标准。
如下图所示是一张SCSI接口的卡:
SCSI接口具有应用范围广、多任务、带宽大、CPU占用率低,以及热插拔等优点。
2.了解ISCSI:
iSCSI(Internet Small Computer System Interface即Internet小型计算机系统接口),是一种在TCP/IP上进行数据块传输的标准,是由CiSCO和IBM两家公司发起的,并且得到了各大存储厂商的大力支持。iSCSI将SCSI命令封装于TCP/IP包之中,并且使用了一个SCSI帧头。iSCSI可以实现在IP网络上运行SCSI协议,使其能够在诸如高速千兆以太网上进行快速的数据存取备份操作,也就是基于网络的存储。
iSCSI又称为IP-SAN(基于IP网络的存储区域网),是一种基于因特网及SCSI-3协议下的存储技术,由IETF提出,并于2003年2月11日成为正式的标准。iSCSI是一种使用TCP/IP协议,在现有IP网络上传输SCSI块命令的工业标准,它是一种在现有的IP网络上无需安装单独的光纤网络即可同时传输消息和块数据的突破性技术。iSCSI基于应用非常广泛的TCP/IP协议,将SCSI命令/数据块封装为iSCSI包,再封装至TCP报文,然后封装到IP报文中。iSCSI通过TCP面向连接的协议来保护数据块的可靠交付。由于iSCSI基于IP协议栈,因此可以在标准以太网设备上通过路由器或交换机来传输。
本质上,iSCSI 让两台主机通过 IP 网络相互协商然后交换SCSI命令。这样一来,iSCSI 就是用广域网仿真了一个常用的高性能本地存储总线,从而创建了一个存储局域网(SAN)。不像某些 SAN 协议,iSCSI 不需要专用的电缆;它可以在已有的交换和 IP 基础架构上运行。然而,如果不使用专用的网络或者子网( LAN 或者 VLAN ),iSCSI SAN 的部署性能可能会严重下降。于是,iSCSI 常常被认为是光纤通道(Fiber Channel)的一个低成本替代方法,而光纤通道是需要专用的基础架构的。但是,基于了TCP/IP的port 860 和 3260 作为沟通的渠道。透过两台计算机之间利用iSCSI的协议来交换SCSI命令,让计算机可以透过高速的局域网集线来把SA以太网的光纤通道(FCoE)则不需要专用的基础架构。
虽然 iSCSI 可以与任意类型的 SCSI 设备进行通信,系统管理员几乎总是使用它来连接服务器计算机 (例如,数据库服务器) 和磁盘卷上存储阵列。 使用iSCSI SAN 的目的通常有以下两个:
1)存储集成公司希望将不同的存储资源从分散在网络上的服务器移动到统一的位置(常常是数据中心); 这可以让存储的分配变得更为有效。 SAN 环境中的服务器无需任何更改硬件或电缆连接就可以得到新分配的磁盘卷。
2)灾难恢复公司希望把存储资源从一个数据中心镜像到另一个远程的数据中心上,后者在出现长时间停电的情况下可以用作热备份。 特别是,iSCSI SAN 使我们只需要用最小的配置更改就可以在 WAN 上面迁移整个磁盘阵列,实质上就是,把存储变成了“可路由的”,就像普通的网络通信一样。
3.了解ISCSI SAN:
iSCSI SAN组件与FC SAN组件相类似。包括以下部件:
iSCSI Client/Host:系统中的iSCSI客户端或主机(也称为iSCSI initiator),诸如服务器,连接在IP网络并对iSCSI target发起请求以及接收响应。每一个iSCSI主机通过唯一的IQN来识别,类似于光纤通道的WWN。 要在IP网络上传递SCSI块命令,必须在iSCSI主机上安装iSCSI驱动。
iSCSI Target:iSCSI target是接收iSCSI命令的设备。此设备可以是终端节点,如存储设备,或是中间设备,如IP和光纤设备之间的连接桥。每一个iSCSI target通过唯一的IQN来标识,存储阵列控制器上(或桥接器上)的各端口通过一个或多个IP地址来标识。
本机与异构IP SAN:
iSCSI initiator与iSCSI target之间的关系所下图所示:
iSCSI initiator(或client)是主机服务器,而iSCSI target是存储阵列。此拓扑称为本机iSCSI SAN,它包含在TCP/IP上传输SCSI协议的整个组件。
与之相反,异构IP SAN,如下图所示,包含在TCP/IP与光纤交换结构传输SCSI的组件。
为了实现这一点,需要在IP与光纤通道之间安装连接桥或网关设备。连接桥用于TCP/IP与光纤通道之间的协议转换。因此iSCSI主机将连接桥看做iSCSI target。
4.ISCSI的工作流程:
第一步:iSCSI系统由SCSI适配器发送一个SCSI命令,命令封装到TCP/IP包中并送入到以太网络中进行传输。
第二步:接收方从TCP/IP包中提取SCSI命令并执行相关操作,执行完毕后,将返回的SCSI命令和数据封装到TCP/IP包中,把它们发回到发送方;
第三步:发送方的iSCSI系统从接收方发过来的TCP/IP包中提取出数据或命令,并把它们传回到SCSI子系统。
如上图所示,我们会发现使用ISCSI网络存储,客户端会和服务器之间通过SCSI端口建立一条SCSI通道,那么有的人就会有疑问,我的真实设备的接口并不是SCSI接口的,那么是不是不能应用ISCSI网络存储。当然不是的,无论你真实设备的接口是IDE接口或是SATA接口的都可以正常使用ISCSI网络存储,我们可以在这里简单的理解为,客户端与服务器上的SCSI端口是通过SCSI协议标准虚拟出来的用于建立连接的端口。
通过iSCSI实现存储共享,首先创建IQN用于识别启动器和目标,接着建立TPG共享存储组并设置相应的访问控制权限,然后在共享存储组添加lun逻辑单元(即存储设备),最后建立实现共享portals入口(ip port,就是通过IP进行访问的端口号)。
相关概念了解:
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命令。
5.ISCSI网路存储共享案例解析:
5.1创建ISCSI的存储空间,本案例中我是以磁盘上的一个分区来充当ISCSI存储空间的,实际应用中一般会添加新的磁盘或大容量存储的存储设备:
[root@localhost ~]# fdisk /dev/sda
[root@localhost ~]# partprobe //重新读取分区表
[root@localhost ~]# fdisk –l //查看新添加的分区是否成功
5.2安装服务端ISCSI服务对应的相关软件包:
[root@localhost ~]# yum install targetcli –y
5.3创建ISCSI Target目标服务器:
[root@localhost ~]# targetcli //进入服务端iscsi命令配置信息
/> ls //使用ls命令查看菜单结构
o- / ................................................... [...] //顶级目录
o- backstores ........................................ [...] //后备存储,主备存储空间,要共享的设备或分区得先加入到这里
| o- block ............................ [Storage Objects: 0] //块存储,o- backstores子目录
| o- fileio ........................... [Storage Objects: 0] //文件存储,o- backstores子目录
| o- pscsi ............................ [Storage Objects: 0] //真实物理scsi设备,o- backstores子目录
| o- ramdisk .......................... [Storage Objects: 0] //闪存,o- backstores子目录
o- iscsi ...................................... [Targets: 0] //以ISCSI的方式共享存储设备的目录
o- loopback ................................... [Targets: 0]
紧接着我们需要将我们准备的分区添加进来(注意我们准备的分区是块设备,所以应将其添加到块设备文件之中):
/> cd backstores/ block //切换到块设备文件目录
/backstores/block> ls
o- block ................................ [Storage Objects: 0]
/backstores/block> //这里是通过Tab键列出了相关命令
/ bookmarks cd create delete
exit get help ls pwd
refresh set status
/backstores/block> create dev=/dev/sda4 name=lun0 //通过create命令添加设备,dev用来指定要添加的设别是什么,nam为逻辑单元名,可以自定义
Created block storage object lun0 using /dev/sda4. //添加成功提示语句
/backstores/block> ls //通过ls命令查看所添加的设备
o- block ................................ [Storage Objects: 1]
o- lun0 ....... [/dev/sda4 (17.9GiB) write-thru deactivated]
5.4将添加上来的存储设备通过目标哦服务器共享出去:
/> cd iscsi //iscsi目录下实现共享
/iscsi> //这里是通过Tab键列出了相关命令
/ @last bookmarks cd create
delete exit get help info
ls pwd refresh set status
version
/iscsi> create //创建共享信息
Created target iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.d7b8241cf0b2.
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.2003-01.org.linux-iscsi.localhost.x8664:sn.d7b8241cf0b2 [TPGs: 1]
o- tpg1 ........................... [no-gen-acls, no-auth] //共享存储组
o- acls ...................................... [ACLs: 0] //访问控制信息
o- luns ...................................... [LUNs: 0] //逻辑单元设备
o- portals ................................ [Portals: 1] //入口
o- 0.0.0.0:3260 ................................. [OK]
/> cd iscsi/iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.d7b8241cf0b2/tpg1/ //设置共享存储组的属性
/iscsi/iqn.20...241cf0b2/tpg1> set attribute authentication=0 demo_mode_write_protect=0 generate_node_acls=1 cache_dynamic_acls=1 //属性认证关闭,演示模式写保护关闭,生成节点acl ,开启缓存动态acl
Parameter demo_mode_write_protect is now '0'.
Parameter authentication is now '0'.
Parameter generate_node_acls is now '1'.
Parameter cache_dynamic_acls is now '1'.
/iscsi/iqn.20...241cf0b2/tpg1> cd luns
/iscsi/iqn.20...0b2/tpg1/luns> create /backstores/block/lun0 lun=lun0 //添加共享指定存储设备
Created LUN 0.
/iscsi/iqn.20...0b2/tpg1/luns> ls
o- luns ............................................ [LUNs: 1]
o- lun0 ........................... [block/lun0 (/dev/sda4)]
/iscsi/iqn.20...0b2/tpg1/luns> cd ..
/iscsi/iqn.20...241cf0b2/tpg1> ls
o- tpg1 .................................. [gen-acls, no-auth]
o- acls .......................................... [ACLs: 0]
o- luns .......................................... [LUNs: 1]
| o- lun0 ......................... [block/lun0 (/dev/sda4)]
o- portals .................................... [Portals: 1] //默认对所有ip及3260端口进行监听
o- 0.0.0.0:3260 ..................................... [OK]
/iscsi> exit //退出,默认保存配置信息
Global pref auto_save_on_exit=true
Last 10 configs saved in /etc/target/backup.
Configuration saved to /etc/target/saveconfig.json
5.5启动服务:
[root@localhost ~]# systemctl restart target.service
5.6查看服务状态:
[root@localhost ~]# systemctl status target.service
6.测试:
6.1Windows客户端使用ISCSI发起程序进行测试:
完成之后选择计算机->管理->磁盘管理你就会发现一块新添加上来的磁盘,如下图所示,如果你需要使用这块新磁盘的话,进行格式化之后即可正常使用:
6.2Linux客户端下进行测试:
客户端安装起始工具:
[root@localhost ~]# yum install iscsi-initiator-utils
查看当前虚拟机的磁盘分区情况:
[root@localhost ~]# fdisk -l
发现iSCSI目标:
[root@localhost ~]# iscsiadm -m discovery -t sendtargets -p 192.168.10.206
完整命令(iscsi辅助工具 )--mode为模式,模式为发现—type为类型,发送目标,--portal为门户
iscsiadm --mode discovery --type sendtargets --portal 192.168.10.206
登录目标(登录服务器上的一个或多个iscsi目标):
挂载命令格式:
iscsiadm --mode node --targetnameiqn.2003-01.org.linux-iscsi.localhost.x8664:sn.d7b8241cf0b2 --portal 192.168.10.206 --login
如下所示:
[root@localhost ~]# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.mail.x8664:sn.d7b8241cf0b2 -p 192.168.10.206:3260 -l
查看:
[root@localhost ~]# fdisk -l
[root@localhost ~]# lsscsi
查看和区分:
[root@localhost ~]# ll /dev/disk/by-path/
查看日志:
[root@localhost ~]# grep sdb /var/log/messages
删除:
targetcli iscsi/ delete iqn.2003-01.org.linux-iscsi.mail.x8664:sn.d7b8241cf0b2
注意:
1.自动挂载时必须使用UUID,否则会出问题,同时在参数中添加_netdev,如下所示:
UUID=33899a29-9f9e-476f-b8e9-cc9ad0986dac /mnt xfs defaults,_netdev(启动后网络服务对应的信息,获取到IP地址再执行) 0 0
2.开机启动关闭防火墙,因为当计算机开机首先是bios自检查找硬盘中的操作系统引导启动,但是当系统没有完全启动时计算机就没有通过网络通讯,而iscsi是基于网络的共享存储,所以开机重启需要告诉内核这条开机挂在是基于网络的存储。