SCSI-小型计算机系统接口(Small Computer System Interface):是一种计算机总线的接口,相较于IED的接口,有着磁盘转速快,性能高,稳定等优点,不过价钱也很贵,适用于企业级的存储.SCSI是一种DAS(Direct Attached Storage:直接附加存储)存储的设备,他的总线有两种类型:窄带:可以串行连接6个target设备和一个终结器,宽带:可以连接15个target设备和一个终结器.SCSI设备由一个initiator设备控制,initiator可以完成的工作很多,除了驱动由内核完成以外,其他所有的数据操作都可以有initiator完成,initiator后接多个target设备,每个target设备也有较弱的控制能力,而每个target设备上又可接多个lun设备,lun可以是任意的存储设备,如下图所示:

ISCSI_第1张图片

initiator和target的通信通过scsi协议,他的协议类似tcp/ip协议,分为4层,不过只是工作在SCSI的设备上,如下图所示:

ISCSI_第2张图片

ISCSI就是通过TCP/IP封装的ISCSI报文,通过网络传送ISCSI的报文,实现远程主机共享存储的协议,他的数据传输类似VSFTP,保持两条连接,一条会话连接,一条数据连接.


构建ISCSI

提示:

ISCSI是内核的驱动,构建ISCSI首先要有本地空闲的磁盘,并且基于TCP监听在3260端口上,输出块设备,在每个initiator看来,ISCSI输出的块设备(lun)都是一整块硬盘,由前面的经验可知,工作在内核模式下的应用程序都需要一个用户空间下的程序来帮助完成指令的输入,而ISCSI的管理工具为tgtadm.ISCSI作为一个共享存储,需要双向的IP认证或用户认证(用的少).

规划:

ISCSI_第3张图片

安装服务器端工具:

  1: yum install scsi-target-utils -y   #安装服务器端工具

创建新分区,创建完成后使用 partx -a /dev/sdb重读一下磁盘信息,并且不要格式化,这里就不演示创建磁盘了

查看服务器安装生成的scsi-target-utils文件

  1: rpm -ql scsi-target-utils
  2: /etc/rc.d/init.d/tgtd    #服务程序
  3: ...
  4: /etc/tgt/targets.conf    #配置文件
  5: /usr/sbin/tgt-admin      #这个命令是使用上面的配置文件的
  6: ...
  7: /usr/sbin/tgtadm         #命令行工具,重启就失效
  8: ...

查看服务器tgtadm的命令使用帮助

  1: man tgtadm      #常用选项
  2: tgtadm [OPTIONS]...  [-L --lld <driver>] [-o --op <operation>] [-m --mode <mode>]
  3:                      [-t --tid <id>] [-T --targetname <targetname>]  [-l --lun <lun>]
  4:                      [-b --backing-store <path>]  [-I --initiator-address <address>]                   
  5: -L --lld <driver> iscsi
  6: -m --mode <mode> ;<mode>: target, logical unit等
  7: -o --op <operation>;<operation>: new, show, delete, bind, unbind
  8: -t --tid <id>:指定target的ID;
  9: -T --targetname <targetname>:指定target的名称
 10: 	 target的命名机制:为了保证全局以唯一,命名要遵循iqn规范
 11: 	 iqn: iqn.yyyy-mm.reverse_domain.STRING[:substring]
 12: 	 iqn.2014-04.com.magedu.web:server1
 13: -l --lun <lun>:指定LUN的号码;
 14: -b --backing-store <path>:关联到某指定LUN上的后端存储设备,可以是分区,也可以是磁盘;建议使用磁盘;
 15: -I --initiator-address <address>:指定授权访问某target的IP地址来源;

启动服务器tgtd

  1: service tgtd start

创建一个服务器target

  1: tgtadm -L iscsi -o new -m target -t 1 -T iqn.2014-04.com.lidefu.test1 #
  2: tgtadm -L iscsi -o show -m target

删除一个target

  1: tgtadm -L iscsi -o delete -m target -t 1    #删除一个target
  2: tgtadm -L iscsi -o show -m target           #查看咯

创建一个服务器lun

  1: tgtadm -L iscsi -o new -m logicalunit -t 1 -l 1 -b /dev/sdb2 #lun要从1号开始,因为0号lun是控制器
  2: tgtadm -L iscsi -o show -m target

删除一个服务器的lun

  1: tgtadm -L iscsi -o delete -m logicalunit -t 1 -l 1

服务器设置IP认证,授权给172.16.21.0/24网段的IP访问

  1: tgtadm -L iscsi -o bind(unbind:解绑定) -m target -t 1 -I 172.16.21.0/24 #授权的是整个target,不是单个的lun
  2: tgtadm -L iscsi -o show -m target

 

ISCSI客户端工具的命令使用

  1: iscsiadm是个模式化的工具,其模式可通过-m或--mode选项指定,常见的模式有discovery、node、fw、session、host、iface几个,如果没有额外指定其它选项,则discovery和node会显示其相关的所有记录;session用于显示所有的活动会话和连接,fw显示所有的启动固件值,host显示所有的iSCSI主机,iface显示/var/lib/iscsi/ifaces目录中的所有ifaces设定。
  2: 
  3: iscsiadm -m discovery [ -d debug_level ] [ -P printlevel ] [ -I iface -t type -p ip:port [ -l ] ] 
  4: iscsiadm -m node [ -d debug_level ] [ -P printlevel ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ [ -T tar-getname -p ip:port -I iface ] [ -l | -u | -R | -s] ] [ [ -o operation ] 
  5: 
  6: -d, --debug=debug_level   显示debug信息,级别为0-8;
  7: -l, --login
  8: -t, --type=type  这里可以使用的类型为sendtargets(可简写为st)、slp、fw和 isns,此选项仅用于discovery模式,且目前仅支持st、fw和isns;其中st表示允许每个iSCSI target发送一个可用target列表给initiator;
  9: -p, --portal=ip[:port]  指定target服务的IP和端口;
 10: -m, --mode op  可用的mode有discovery, node, fw, host iface 和 session
 11: -T, --targetname=targetname  用于指定target的名字
 12: -u, --logout 
 13: -o, --op=OPEARTION:指定针对discoverydb数据库的操作,其仅能为new、delete、update、show和nonpersistent其中之一;
 14: -I, --interface=[iface]:指定执行操作的iSCSI接口,这些接口定义在/var/lib/iscsi/ifaces中;

安装客户端工具,客户端工具并不是监听套接字的,他是初始化内核模块的,以及让内核识别存储空间的

  1: yum install iscsi-initiator-utils
  2: rpm -ql iscsi-initiator-utils
  3: ...
  4: /etc/iscsi/iscsid.conf   #配置文件,是下面iscsid所要用到的配置信息
  5: /etc/rc.d/init.d/iscsi   #服务脚本1,这两个服务脚本都得运行
  6: /etc/rc.d/init.d/iscsid  #服务脚本2
  7: /etc/rc.d/init.d/iscsid  #上面的iscsid.conf使用到的配置信息
  8: /sbin/iscsi-iname        #每一个initiator为了让服务器端识别,都需要有自己的名字,保存在/etc/iscsi/initiatorname.iscsi下
  9: /sbin/iscsiadm           #可以查看有哪些lun或target可以使用,客户端工具
 10: /sbin/iscsid             #
 11: ...

为客户端的Initiator命名和取别名,两个节点别名分别是lidefu1和lidefu2

  1: echo "InitiatorName=`iscsi-iname -p iqn.2014-04.com.lidefu`" > /etc/iscsi/initiatorname.iscsi 
  2: cat /etc/iscsi/initiatorname.iscsi 
  3: echo "InitiatorAlias=lidefu1" >> /etc/iscsi/initiatorname.iscsi 
  4: cat /etc/iscsi/initiatorname.iscsi 

启动客户端的iscsi和iscsid并且设置开机自动启动,两个节点都需要设置

  1: service iscsi start
  2: service iscsid start
  3: chkconfig iscsi on
  4: chkconfig iscsid on

发现共享主机,在客户端上执行命令

  1: iscsiadm -m discovery -t st -p 172.16.21.1

登录主机格式化挂载使用

  1: iscsiadm -m node -T iqn.2014-04.com.lidefu.test1 -p 172.16.21.1 -l
  2: fdisk -l /dev/sd[a-z]    #查看是否有新的磁盘
  3: fdisk /dev/sdc           #对该磁盘分区
  4: mke2fs -t ext4 /dev/sdc1 #对该磁盘进行格式化
  5: 注:在服务器上看该磁盘没有任何区别,还是未格式化的状态

注:这时候如果两个客户端同时挂载使用服务器端共享出来的磁盘,并写数据,会导致数据不一致问题.严重时会崩溃.共享存储不能同时被两个主机挂载使用,因为他们修改的数据都是保存在内存中的,所以共享存储使用单机文件系统时,绝不允许两者同时挂载,同时写同一个文件的,不然会导致崩溃.

客户端登录过服务器端,以后的重启都可以自动挂载是应为,客户端发现过的信息都保存了,如下:

  1: ls /var/lib/iscsi/              #所有的信息都保存在这个目录下
  2: ls /var/lib/iscsi/send_targets/ #此前发现过的服务器
  3: ls /var/lib/iscsi/ifaces/       #显示连接是锁使用的本地接口,
  4: ls /var/lib/iscsi/nodes/        #节点登录信息
  5: 必要时可以删除这些信息,就不会自动挂载了

接上,如果手动删会有影响,因为他已经生成了一些元数据,所以,需执行以下命令

  1: iscsiadm -m node -T iqn.2010-8.com.example.ts:disk1 -p 192.168.0.11:3260 –u  #先登出        #先登出
  2: iscsiadm -m node -T iqn.2010-8.com.example.ts:disk1 -p 192.168.0.11:3260 -o delete  #删除元数据 
  3: rm -rf /var/lib/iscsi/*   #删除系统保存的信息


基于配置文件配置iscsi, /etc/tgt/target.conf

  1: cd /etc/tgt/                       #进入配置文件目录
  2: cp targets.conf targets.conf.bak   #备份文件,没什么好说的,请养成良好的习惯
  3: vim targets.conf                   #配置咯
  4: 
  5: default-driver iscsi    #默认驱动
  6:  #target的名字,会自动根据这个名字绑定设备,和lun
  7:         backing-store /dev/sdb1       #后端设备
  8:         initiator-address 172.16.21.0/16  #授权给这个网段的设备访问
  9: