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可以是任意的存储设备,如下图所示:
initiator和target的通信通过scsi协议,他的协议类似tcp/ip协议,分为4层,不过只是工作在SCSI的设备上,如下图所示:
ISCSI就是通过TCP/IP封装的ISCSI报文,通过网络传送ISCSI的报文,实现远程主机共享存储的协议,他的数据传输类似VSFTP,保持两条连接,一条会话连接,一条数据连接.
构建ISCSI
提示:
ISCSI是内核的驱动,构建ISCSI首先要有本地空闲的磁盘,并且基于TCP监听在3260端口上,输出块设备,在每个initiator看来,ISCSI输出的块设备(lun)都是一整块硬盘,由前面的经验可知,工作在内核模式下的应用程序都需要一个用户空间下的程序来帮助完成指令的输入,而ISCSI的管理工具为tgtadm.ISCSI作为一个共享存储,需要双向的IP认证或用户认证(用的少).
规划:
安装服务器端工具:
1: yum install scsi-target-utils -y #安装服务器端工具
创建新分区,创建完成后使用 partx -a /dev/sdb重读一下磁盘信息,并且不要格式化,这里就不演示创建磁盘了
查看服务器安装生成的scsi-target-utils文件
1: rpm -ql scsi-target-utils2: /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> iscsi6: -m --mode <mode> ;<mode>: target, logical unit等7: -o --op <operation>;<operation>: new, show, delete, bind, unbind8: -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:server113: -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 #删除一个target2: 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,不是单个的lun2: 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, --login8: -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 和 session11: -T, --targetname=targetname 用于指定target的名字12: -u, --logout13: -o, --op=OPEARTION:指定针对discoverydb数据库的操作,其仅能为new、delete、update、show和nonpersistent其中之一;14: -I, --interface=[iface]:指定执行操作的iSCSI接口,这些接口定义在/var/lib/iscsi/ifaces中;
安装客户端工具,客户端工具并不是监听套接字的,他是初始化内核模块的,以及让内核识别存储空间的
1: yum install iscsi-initiator-utils2: rpm -ql iscsi-initiator-utils3: ...4: /etc/iscsi/iscsid.conf #配置文件,是下面iscsid所要用到的配置信息5: /etc/rc.d/init.d/iscsi #服务脚本1,这两个服务脚本都得运行6: /etc/rc.d/init.d/iscsid #服务脚本27: /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.iscsi2: cat /etc/iscsi/initiatorname.iscsi3: echo "InitiatorAlias=lidefu1" >> /etc/iscsi/initiatorname.iscsi4: cat /etc/iscsi/initiatorname.iscsi
启动客户端的iscsi和iscsid并且设置开机自动启动,两个节点都需要设置
1: service iscsi start2: service iscsid start3: chkconfig iscsi on4: 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 -l2: 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: