linux系统上IP SAN的实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux系统上IP SAN的实现相关的知识,希望对你有一定的参考价值。
一、几种流行的存储技术
1、NAS(Network Attached Storage,网络附加存储)基于标准网络协议实现数据传输,为网络中的各种不同操作系统的计算机提供文件共享和数据备份,NAS采用的是File Protocal存取方式;实现方案如nfs;
2、DAS(Direct Attached Storage,直接附加存储)是指将存储设备通过总线(SCSI、PCI、IDE等)接口直接连接到一台服务器上使用,是最流行的存储方式。
缺点:
服务器本身容易成为系统瓶颈;
服务器发生故障,数据不可访问;
对于多个服务器或多台PC的环境,每台PC或服务器单独拥有自己的存储设备,设备分散,不便管理;且存储空间不能在服务器之间动态分配,可能造成相当的资源浪费
3、SAN(Storage Area Network,存储区域网络)是一种将存储设备、连接设备和接口集成在一个高速网络中的技术。在SAN网络中,所有的数据传输在高速、高带宽的网络中进行,SAN存储实现的是直接对物理硬件的块级存储访问。
早期的SAN采用的是光纤通道(FC,Fiber Channel)技术,iSCSI协议出现以后,可以直接利用现有的TCP/IP网络传输,因此SAN分为FC SAN和IP SAN。
优点:
相比DAS,SAN使存储设备从服务器中独立了出来,实现了服务器层次上的存储资源共享,服务器和存储设备之间可以相隔更远的距离;
集中的存储设备替代多个独立的存储设备,支持存储容量共享,提高了空间利用率;
可以通过软件集中管理和控制SAN上的存储设备;
◆NAS和SAN的区别:
DAS和SAN输出的是存储设备接口,前端各节点的内核分别维护文件锁,若前端节点之间要求同时读写而又不能共享锁信息,则可能产生资源争用问题,而NAS输出是的文件系统接口,文件锁由提供NAS的主机维护,所以不会产生资源争用问题
二、IP SAN原理解析
SCSI协议是在主机和存储设备之间传送命令、状态和块数据的一种接口标准。类似的接口标准还有IDE,SATA等
iSCSI可以实现在IP网络上运行SCSI协议,进行SCSI指令和数据块的传输。
具体的工作流程如下:
①iSCSI系统由SCSI适配器发送一个SCSI命令。
②SCSI指令被封装到TCP/IP包中并送入以太网络。
③接收方从TCP/IP包中提取SCSI指令并执行相关操作。
④把返回的SCSI指令和数据封装到TCP/IP包中,将它们发回到发送方。
⑤系统提取出数据或SCSI指令,并把它们传回SCSI子系统。
target的存储设备并非必须为支持SCSI协议的块设备,target的内核在解码SCSI指令后完全可以以其它的接口标准如IDE、SATA等与本地的块设备交互,只是反馈给initiator时再采用SCSI协议和ISCSI封装即可。
三、使用iscsi构建IP SAN存储网络
说明:
iscsi服务端主机上可配置多个target,一个target内可配置多个LUN。LUN的全称是Logical Unit Number,即逻辑单元号,LUN ID用来标记存储设备,一个存储设备可加入多个target,在各个target内的LUN ID可能不同。
每个target及initiator都要有一个名字,其格式为:
iqn.yyyy-mm.reverse-domain-name:string[.substring]
例:iqn.2014-09.com.magedu:ttarget
1、配置target
⑴准备要共享的设备,这里使用本地磁盘上的新分区
# fdisk /dev/sda
# partprobe
[[email protected] ~]# fdisk /dev/sda ... [[email protected] ~]# partx -a /dev/sda ... [[email protected] ~]# partx -a /dev/sda ... [[email protected] ~]# fdisk -l Disk /dev/sda: 32.2 GB, 32212254720 bytes 255 heads, 63 sectors/track, 3916 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000f3804 Device Boot Start End Blocks Id System /dev/sda1 * 1 26 204800 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 26 1332 10485760 83 Linux /dev/sda3 1332 1593 2097152 82 Linux swap / Solaris /dev/sda4 1593 3916 18666534 5 Extended /dev/sda5 1593 2246 5252227+ 83 Linux /dev/sda6 2247 2900 5253223+ 83 Linux
⑵安装iscsi服务端程序
# yum -y install scsi-target-utils
# service tgtd start
# chkconfig tgtd on
# netstat -tnlp | grep 3260 #监听在3260端口上
[[email protected] ~]# yum -y install scsi-target-utils ... [[email protected] ~]# rpm -ql scsi-target-utils /etc/rc.d/init.d/tgtd #服务脚本 /etc/sysconfig/tgtd /etc/tgt/targets.conf #配置文件 /usr/sbin/tgt-admin /usr/sbin/tgt-setup-lun /usr/sbin/tgtadm #配置命令 /usr/sbin/tgtd /usr/sbin/tgtimg /usr/share/doc/scsi-target-utils-1.0.24 ... [[email protected] ~]# chkconfig tgtd on [[email protected] ~]# service tgtd start Starting SCSI target daemon: [ OK ] [[email protected] ~]# netstat -tlnp | grep tgtd tcp 0 0 0.0.0.0:3260 0.0.0.0:* LISTEN 61228/tgtd tcp 0 0 :::3260 :::* LISTEN 61228/tgtd
⑶scsi-target-utils有两种配置方式:
◆命令行配置方式:tgtadm
注意:使用tgtadm配置的target信息在tdtd服务重启后会消失
用法:tgtadm --lld [driver] --op [operation] --mode [mode] [OPTION]...
①添加一个新的 target,且其ID为 [id],名字为 [name];target0已被系统预留
--lld [driver] --op new --mode target --tid [id] --targetname [name]
例:tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.2013-05.com.magedu:tsan
②显示所有或某个特定的target
--lld [driver] --op show --mode target [--tid [id]]
例:tgtadm --lld iscsi --op show --mode target
③向某ID为[id]的设备上添加一个新的LUN,其号码为[lun],且此设备提供给initiator使用。[path]是某“块设备”的路径,此块设备也可以是raid或lvm设备。lun0已被系统预留。
--lld [driver] --op new --mode logicalunit --tid [id] --lun [lun] --backing-store [path]
例:tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /dev/sda5
④删除ID为[id]的target
--lld [driver] --op delete --mode target --tid [id]
⑤删除target [id]中的LUN [lun]:
-lld [driver] --op delete --mode logicalunit --tid [id] --lun [lun]
⑥定义某target的基于主机的访问控制列表,其中,[address]表示允许访问此target的initiator客户端的列表:
--lld [driver] --op bind --mode target --tid [id] --initiator-address [address]
例:tgtadm --lld iscsi --op bind --mode target --tid 1 -I 192.168.30.0/24
⑦解除target [id]的访问控制列表中[address]的访问控制权限:
--lld [driver] --op unbind --mode target --tid [id] --initiator-address [address]
[[email protected] ~]# tgtadm --lld iscsi --op new --mode target --tid 1 --targetname iqn.2016-05.com.magedu:target1 [[email protected] ~]# tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /dev/sda5 [[email protected] ~]# tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 2 -b /dev/sda6 [[email protected] ~]# tgtadm --lld iscsi --op show --mode target Target 1: iqn.2016-05.com.magedu:target1 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 Backing store type: null Backing store path: None Backing store flags: LUN: 1 Type: disk SCSI ID: IET 00010001 SCSI SN: beaf11 Size: 5378 MB, Block size: 512 Online: Yes Removable media: No Prevent removal: No Readonly: No Backing store type: rdwr Backing store path: /dev/sda5 Backing store flags: LUN: 2 Type: disk SCSI ID: IET 00010002 SCSI SN: beaf12 Size: 5379 MB, Block size: 512 Online: Yes Removable media: No Prevent removal: No Readonly: No Backing store type: rdwr Backing store path: /dev/sda6 Backing store flags: Account information: ACL information: [[email protected] ~]# tgtadm --lld iscsi --op bind --mode target --tid 1 -I 192.168.30.0/24
◆基于配置文件的配置方式:编辑配置文件/etc/tgt/targets.conf,定义target和lun等
<target iqn.2016-05.com.magedu:target1>
backing-store /dev/sda5
backing-store /dev/sda6
initiator-address 192.168.30.0/24
</target>
[[email protected] ~]# tgtadm --lld iscsi --op delete --mode target --tid 1 #删除指定的target [[email protected] ~]# tgtadm --lld iscsi --op show --mode target [[email protected] ~]# vim /etc/tgt/targets.conf ... <target iqn.2016-05.com.magedu:target1> backing-store /dev/sda5 backing-store /dev/sda6 initiator-address 192.168.30.0/24 </target> ... [[email protected] ~]# service tgtd reload #重读配置文件 Updating SCSI target daemon configuration: [ OK ] [[email protected] ~]# tgtadm --lld iscsi --op show --mode target Target 1: iqn.2016-05.com.magedu:target1 System information: Driver: iscsi State: ready I_T nexus information: LUN information: LUN: 0 Type: controller ...... LUN: 1 ...... Backing store type: rdwr Backing store path: /dev/sda5 Backing store flags: LUN: 2 ...... Backing store type: rdwr Backing store path: /dev/sda6 Backing store flags: Account information: ACL information: 192.168.30.0/24
2、initiator配置
⑴安装iscsi客户端程序包
# yum install iscsi-initiator-utils
# echo "InitiatorName=`iscsi-iname -p iqn.2016-05.com.magedu`" > /etc/iscsi/initiatorname.iscsi
#给initiator一个名称,可用iscsi-iname命令生成,也可自定义。安装程序包时默认已在initiatorname.iscsi生成了一个名称。
# echo "InitiatorAlias=initiator1" >> /etc/iscsi/initiatorname.iscsi
# service iscsi start
# chkconfig iscsi on
[[email protected] ~]# yum -y install iscsi-initiator-utils ... [[email protected] ~]# rpm -ql iscsi-initiator-utils /etc/NetworkManager /etc/NetworkManager/dispatcher.d /etc/NetworkManager/dispatcher.d/04-iscsi /etc/iscsi /etc/iscsi/iscsid.conf #配置文件 /etc/logrotate.d/iscsiuiolog /etc/rc.d/init.d/iscsi /etc/rc.d/init.d/iscsid /sbin/brcm_iscsiuio /sbin/iscsi-iname #用于给initiator生成一个名称 /sbin/iscsiadm /sbin/iscsid /sbin/iscsistart /sbin/iscsiuio ... /var/lib/iscsi/ifaces /var/lib/iscsi/isns /var/lib/iscsi/nodes /var/lib/iscsi/send_targets #inititor会将发现的target信息保存于该目录中 /var/lib/iscsi/slp /var/lib/iscsi/static /var/lock/iscsi [[email protected] ~]# vim /etc/iscsi/initiatorname.iscsi InitiatorName=iqn.2016-05.com.magedu:node2 [[email protected] ~]# service iscsi start [[email protected] ~]# lsmod | grep scsi mptscsih 36700 1 mptspi mptbase 93615 2 mptspi,mptscsih scsi_transport_spi 25863 1 mptspi
⑵iscsiadm工具的使用:
iscsiadm是个模式化的工具,其模式可通过-m或--mode选项指定,常见的模式有discovery、node、fw、session、host、iface几个,如果没有额外指定其它选项,则discovery和node会显示其相关的所有记录;session用于显示所有的活动会话和连接,fw显示所有的启动固件值,host显示所有的iSCSI主机,iface显示/var/lib/iscsi/ifaces目录中的所有ifaces设定。
iscsiadm -m discovery [ -d debug_level ] [ -P printlevel ] [ -I iface -t type -p ip:port [ -l ] ]
例:iscsiadm -m discovery -t st -p 192.168.30.10
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 ]
例:iscsiadm -m node -T iqn.2016-05.com.magedu:target1 -p 192.168.30.10 -l
选项:
-d, --debug=debug_level 显示debug信息,级别为0-8;
-l, --login
-t, --type=type 这里可以使用的类型为sendtargets(可简写为st)、slp、fw和 isns,此选项仅用于discovery模式,且目前仅支持st、fw和isns;其中st表示允许每个iSCSI target发送一个可用target列表给initiator;
-p, --portal=ip[:port] 指定target服务的IP和端口;
-m, --mode op 可用的mode有discovery, node, fw, host iface 和 session
-T, --targetname=targetname 用于指定target的名字
-u, --logout
-o, --op=OPEARTION:指定针对discoverydb数据库的操作,其仅能为new、delete、update、show和nonpersistent其中之一;
-I, --interface=[iface]:指定执行操作的iSCSI接口,这些接口定义在/var/lib/iscsi/ifaces中;
查看会话信息:iscsiadm -m session -s
[[email protected] ~]# iscsiadm -m discovery -t st -p 192.168.30.10 #发现target Starting iscsid: [ OK ] 192.168.30.10:3260,1 iqn.2016-05.com.magedu:target1 [[email protected] ~]# ls /var/lib/iscsi/send_targets/ #initiator会给发现的target保存一份记录 192.168.30.10,3260 [[email protected] ~]# iscsiadm -m node -T iqn.2016-05.com.magedu:target1 -p 192.168.30.10 -l #登录指定target Logging in to [iface: default, target: iqn.2016-05.com.magedu:target1, portal: 192.168.30.10,3260] (multiple) Login to [iface: default, target: iqn.2016-05.com.magedu:target1, portal: 192.168.30.10,3260] successful. [[email protected] ~]# iscsiadm -m session -s Stats for session [sid: 4, target: iqn.2016-05.com.magedu:target1, portal: 192.168.30.10,3260] iSCSI SNMP: txdata_octets: 38068 rxdata_octets: 1177772 noptx_pdus: 0 scsicmd_pdus: 341 tmfcmd_pdus: 0 login_pdus: 0 ...... [[email protected] ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 30G 0 disk ├─sda1 8:1 0 200M 0 part /boot ├─sda2 8:2 0 10G 0 part / └─sda3 8:3 0 2G 0 part [SWAP] sr0 11:0 1 4.2G 0 rom sdb 8:16 0 5G 0 disk sdc 8:32 0 5G 0 disk [[email protected] ~]# fdisk -l /dev/sd[b-c] Disk /dev/sdb: 5378 MB, 5378280960 bytes 166 heads, 62 sectors/track, 1020 cylinders Units = cylinders of 10292 * 512 = 5269504 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/sdc: 5379 MB, 5379300864 bytes 166 heads, 62 sectors/track, 1020 cylinders Units = cylinders of 10292 * 512 = 5269504 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 [[email protected] ~]# fdisk /dev/sdb #可对iscsi存储设备进行分区格式化 ... Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-1020, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-1020, default 1020): 2G Command (m for help): p Disk /dev/sdb: 5378 MB, 5378280960 bytes 166 heads, 62 sectors/track, 1020 cylinders Units = cylinders of 10292 * 512 = 5269504 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x1aca869b Device Boot Start End Blocks Id System /dev/sdb1 1 2 10261 83 Linux Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. [[email protected] ~]# partx -a /dev/sdb BLKPG: Device or resource busy error adding partition 1 [[email protected] ~]# mke2fs -t ext4 /dev/sdb1 ... Writing inode tables: done Creating journal (1024 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 20 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. [[email protected] ~]# mount /dev/sdb1 /mnt [[email protected] ~]# cp /etc/fstab /mnt/ [[email protected] ~]# umount /mnt
配置另一个initiator:
[[email protected] ~]# yum -y install iscsi-initiator-utils ... [[email protected] ~]# vim /etc/iscsi/initiatorname.iscsi InitiatorName=iqn.2016-05.com.magedu:node3 [[email protected] ~]# service iscsi start [[email protected] ~]# iscsiadm -m discovery -t st -p 192.168.30.10 Starting iscsid: [ OK ] 192.168.30.10:3260,1 iqn.2016-05.com.magedu:target1 [[email protected] ~]# iscsiadm -m node -T iqn.2016-05.com.magedu:target1 -p 192.168.30.10 -l Logging in to [iface: default, target: iqn.2016-05.com.magedu:target1, portal: 192.168.30.10,3260] (multiple) Login to [iface: default, target: iqn.2016-05.com.magedu:target1, portal: 192.168.30.10,3260] successful. [[email protected] ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 30G 0 disk ├─sda1 8:1 0 200M 0 part /boot ├─sda2 8:2 0 10G 0 part / └─sda3 8:3 0 2G 0 part [SWAP] sr0 11:0 1 4.2G 0 rom sdb 8:16 0 5G 0 disk └─sdb1 8:17 0 10M 0 part sdc 8:32 0 5G 0 disk [[email protected] ~]# mount /dev/sdb1 /mnt [[email protected]ode3 ~]# ls /mnt #可以看到上一个initiator存入的文件 fstab lost+found #若想结束会话并将该target的发现记录删除,可这样做: [[email protected] ~]# umount /mnt [[email protected] ~]# iscsiadm -m node -T iqn.2016-05.com.magedu:target1 -p 192.168.30.10 -u #使出会话 Logging out of session [sid: 2, target: iqn.2016-05.com.magedu:target1, portal: 192.168.30.10,3260] Logout of [sid: 2, target: iqn.2016-05.com.magedu:target1, portal: 192.168.30.10,3260] successful. [[email protected] ~]# iscsiadm -m node -T iqn.2016-05.com.magedu:target1 -p 192.168.30.10 -o delete [[email protected] ~]# ls /var/lib/iscsi/send_targets/ 192.168.30.10,3260 [[email protected] ~]# rm -rf /var/lib/iscsi/send_targets/192.168.30.10,3260
注意:target不宜被多个initiator同时挂载使用,否则会产生资源争用。
3、target的认证机制
⑴方式一:基于IP认证
例如:tgtadm --lld iscsi --op bind --mode target --tid 1 -I 192.168.30.0/24
实际环境中建议在VPN的基础上做基于IP的认证
⑵方式二:基于用户认证,CHAP,单方向认证;
initiator端不能验证target端,不建议使用这种方式。
①在target端创建帐号christina,并为其授予访问某tid的权限:
# tgtadm --lld iscsi --op new --mode account --user magedu --password 123456
接下来还要将用户与某target进行绑定:
# tgtadm --lld iscsi --op bind --mode account --tid 1 --user magedu
# tgtadm --lld iscsi --op show --mode account
②编辑initiator端主配置文件,配置客户端登录target时使用此帐号和密码:
# vim /etc/iscsi/iscsid.conf
取消如下项的注释:
# node.session.auth.authmethod = CHAP
# node.session.auth.username = username
# node.session.auth.password = password
而后,将后两项的用户名密码设置为target端设置的用户名和密码:
node.session.auth.username = magedu
node.session.auth.password = 123456
如果此前尚未登录过此target,接下来直接发现并登入即可。否则,则需要按照下面的第三步实现认证的启用。
③如果initiator端已经登录过此target,此时还需要先注销登录后重启iscsid服务,并在删除此前生成的database后重新发现target,并重新登入,过程如下:
# iscsiadm -m session -r sid -u
# iscsiadm -m node -T iqn.2010-8.com.example.ts:disk1 -p 192.168.0.11:3260 -u
# iscsiadm -m node -T iqn.2010-8.com.example.ts:disk1 -p 192.168.0.11:3260 -o delete
# rm -rf -rf /var/lib/iscsi/send_targets/192.168.0.11,3260
# service iscsid restart
# iscsiadm -m discovery -t sendtargets -p 192.168.0.11
# iscsiadm -m node -T iqn.2010-8.com.example.ts:disk1 -p 192.168.0.11:3260 -l
说明:其中的target名称和target主机地址可按实际情况修改
以上是关于linux系统上IP SAN的实现的主要内容,如果未能解决你的问题,请参考以下文章