一、常见的存储类型和iSCSI 概念及介绍
1 、 常见的三种存储类型
DAS(Direct-AttachedStorage)直接附加存储,存储设备一般通过scsi/ide总线直接连接到主机上,常见的如SATA硬盘,SAS硬盘等,直接通过准线连接到计算机主板上面。该方式显著的优点就是传输速度快,但传输距离受总线长度限制,且只能供本地使用。
NAS(Network AttachedStorage)网络附加存储,将存储设备与服务器分离,集中管理数据,从而提升并发存储能力、降低维护成本。典型的应用示例有NFS服务器,SAMBA服务器,NFS服务器等文件服务器,通过向外提供文件系统的方式向外提供存储
SAN(Storage Area Network)存储区域网络,采用FC(Fibre Channel)光纤通道或者Ethernet进行远距离传输,区别于Fiber Channel光纤通道技术,通过FC交换机连接存储阵列和服务器主机,建立专用于数据存储的区域网络。SAN架构图如下所示:
2、 三种存储类型的区别
DAS与SAN都是块级别(Block-level)的存储,而NAS是文件系统(File System level)级的存储。因为文件系统是操作系统对磁盘数据的一次封装。每次对数据访问时提供文件服务的服务器都要对数据进行数据封装,和解封装,然后再对块设备磁盘进行读写。而DAS是直接对块设备进行读写,因此NAS的存储速度不如前面两者。
SAN(Storage Area Network)相当于模拟了远距离传输的DAS,特点是速度快。支持的并发服务主机数量多。大家都知道远距离传输是需要跨越Internet,而广域网的带宽是远不能和局域网相比的,缺点便是网络速度瓶颈问题。
二、iSCSI简介
1、 iSCSI(Internet SmallComputer System Interface)基于Internet的小型计算机系统接口,由IBM公司研究开发的,是一个可以让硬件设备在IP协议的上层运行的SCSI指令集存储技术,可以实现在IP网络上运行SCSI协议,使其能够在诸如高速千兆以太网上进行路由选择。
2、 iSCSI技术是一种新储存技术,该技术是将现有SCSI接口与以太网络(Ethernet)技术结合,使服务器可通过IP网络进行远距离SCSI类型的数据存储设备由 SCSI 总线连接。
3、iSCSI 的主要功能是在 TCP/IP 网络上的主机系统(启动器 initiator)和存储设备(目标器 target)之间进行大量数据的封装和可靠传输过程。此外,iSCSI 提供了在 IP 网络封装 SCSI 命令,且以TCP/IP协议传输。iSCSI服务端程序监听端口为明文的TCP/3260。
4、iSCSI的工作过程
当iSCSI主机应用程序发出数据读写请求后,操作系统会生成一个相应的SCSI命令,该SCSI命令在iSCSI initiator层被封装成ISCSI消息包并通过TCP/IP传送到物理存储控制器, 物理存储控制器的iSCSI target层会解开iSCSI消息包,得到SCSI命令的内容,然后执行scsi指令;设备执行SCSI命令后的响应,在经过设备侧iSCSI target层时被封装成ISCSI响应PDU,通过TCP/IP网络传送给主机的ISCSI initiator层, iSCSI initiator会从ISCSI响应PDU里解析出iSCSI响应并传送给操作系统,操作系统再响应给应用程序。
5、 iSCSI组成
目标器 target用于存放硬盘存储资源的服务器,作为RAID磁盘阵列组的存储端,能够为用户提供可用的存储资源。
启动器 initiator则是用户使用的iSCSI客户端,用于获取远程服务端的存储资源,通常以软件提供,但是也可以作为iSCSI HBA来实施。必须为启动器initiator授予全球唯一名称IQN用于识别。
IQN:iSCSI限定名称,全球唯一名称,用于以强制命名格式来识别启动器和目标。
IQN格式如下:iqn.[YYYY-MM].[com.reversed.domain]:[optional_string]
iqn:表示此名称使用域为标识符。
YYYY-MM:表示拥有域名的年月时间。
com.reversed.domain:拥有此iSCSI组织的逆向域名
optional_string:以冒号为前缀的可选字符串,全球唯一,由域所有者分配,其中可包含冒号为分割符的组织边界
LUN:Logical Unit Number的缩写,指逻辑单元号,带有编号的块设备,连接到目标器且通过目标器来使用。可以有一个或多个LUN连接到单个目标器,但通常一个目标器提供一个LUN。
节点:任何一个iSCSI启动器或iSCSI目标器,由其IQN来标识。
TPG:目标门户组,某个特定iSCSI目标要侦听的接口IP地址和TCP端口的集合。可以将目标配置添加到TPG以协调多个LUN的设置。
ACL:访问权限控制列表,一种使用节点IQN(通常是启动器名称)来验证启动器的访问权限的访问限制。
门户:目标或启动器上用于建立的IP地址和端口。
发现:查询目标服务器以列出配置的目标。
6、iSCSI存储系统四大架构:PC系统架构 PC+NIC系统架构 连接桥系统架构 控制器系统架构
PC系统架构:即选择一个普通的、性能优良的、可支持多块磁盘的PC(一般为PC服务器和工控服务器),选择一款相对成熟稳定的iSCSI target软件,将iSCSI target软件安装在PC服务器上,使普通的PC服务器转变成一台iSCSI存储设备,并通过PC服务器的以太网卡对外提供iSCSI数据传输协议。在PC架构的iSCSI存储设备上,所有的RAID组校验、逻辑卷管理、iSCSI 运算、TCP/IP 运算等都是以纯软件方式实现,因此对PC的CPU和内存的性能要求较高。另外iSCSI存储设备的性能极容易收PC服务器运行状态的影响。
7、iSCSI协议
iSCSI协议是让SCSI在TCP协议之上工作的传输协议,是一种SCSI远程过程调用模型到TCP协议的映射。SCSI命令加载在iSCSI请求之上,同时SCSI状态和响应也由iSCSI来承载。iSCSI同样使用请求响应机制。
每个启动器和目标都指定了一个唯一的iSCSI 名称,如 iSCSI 限定名 (IQN) 或扩展的唯一标识(EUI)。 IQN 是 223 字节的 ASCII 名称。EUI 是 64 位标识。iSCSI 名称代表全球唯一命名方案,该方用于标识各启动器或目标,其方式与使用全球节点名(WWNN) 来标识光纤通道光纤网中设备的方式相同。
iSCSI 目标是响应 iSCSI 命令的设备。iSCSI 设备可以是诸如存储设备的结束节点,或者可以是诸如IP 与光纤通道设备之间的网桥的中间设备。每个iSCSI 目标由唯一的iSCSI 名称标识。
要通过 IP 网络传输 SCSI 命令,iSCSI 驱动程序必须安装到iSCSI 主机和目标中。驱动程序用于通过主机或目标硬件中的网络接口控制器(NIC) 或 iSCSI HBA 来发送iSCSI 命令和响应。为实现最佳性能,请使用传输速度为每秒 1000 兆位 (Mbps) 的千兆以太网适配器在iSCSI 主机和 iSCSI 目标间进行连接。
iSCSI 命令封装:
发起端和目标端之间以消息的形式进行通信。PDU(Protocal Data Unit)就是用来传输这些消息的。
iSCSI 协议就是一个在网络上封包和解包的过程,在网络的一端,数据包被封装成包括TCP/IP头、iSCSI识别包和SCSI数据三部分内容,传输到网络另一端时,这三部分内容分别被顺序地解开。iSCSI 系统由一块 SCSI 卡发出一个 SCSI 命令,命令被封装到第四层的信息包中并发送。
接收方从信息包中抽取SCSI 命令并执行,然后把返回的SCSI命令和数据封装到IP信息包中,并将它们发回到发送方。系统抽取数据或命令,并把它们传回SCSI子系统。所有这一切的完成都无需用户干预,而且对终端用户是完全透明的。 为了保证安全,iSCSI 有自己的上网登录操作。在它们首次运行的时候,启动器(initiator)设备将登录到目标设备中。
8、iscsi会话过程:
iSCSI 会话建立于一个initiator与一个target之间,一个会话允许多个TCP连接,并且支持跨连接的错误恢复。大多数通信还是建立在SCSI基础之上的,例如,使用R2T进行流量控制。
iSCSI添加于SCSI之上的有:立即和主动的数据传输以避免往返通信;连接建立阶段添加登录环节,这是基于文本的参数协商。
建立一个iSCSI会话,包括:
命名阶段:确定需要访问的存储,以及initiator,与FC不同,命名与位置无关;
发现阶段:找到需要访问的存储;
登录阶段:建立于存储的连接,读写之前首先进行参数协商,按照TCP连接登录。
9、iSCSI客户端和服务器端命令介绍
9. 1 服务器端的设定需要的软件:scsi-target-utils:用来将 Linux 系统仿真成为 iSCSI target 的功能;
9. 2 scsi-target-utils 主要配置文件:
/etc/tgt/targets.conf:主要配置文件,设定要分享的磁盘格式与哪几颗;
/usr/sbin/tgt-admin:在线查询、删除 target 等功能的设定工具;
/usr/sbin/tgt-setup-lun:建立 target 以及设定分享的磁盘与可使用的客户端等工具软件。
/usr/sbin/tgtadm:手动直接管理的管理员工具 (可使用配置文件取代);
/usr/sbin/tgtd:主要提供 iSCSI target 服务的主程序;
/usr/sbin/tgtimg:建置预计分享的映像文件装置的工具 (以映像文件仿真磁盘);
CentOS 已经将很多功能都设定好了,因此我们只要修订配置文件,然后启动 tgtd 这个服务就可以。
9.3 iSCSI可以共享的磁盘类型 :
a.使用 dd 指令所建立的大型档案可供仿真为磁盘 (无须预先格式化);
b.使用单一分割槽 (partition) 分享为磁盘;
c.使用单一完整的磁盘 (无须预先分割);
d.使用磁盘阵列分享 (其实与单一磁盘相同方式);
e.使用软件磁盘阵列 (software raid) 分享成单一磁盘;
f.使用 LVM 的 LV 装置分享为磁盘。
9.4建立共享分区过程如下:
# 1. 建立大型档案: [root@www ~]# mkdir /srv/iscsi [root@www ~]# dd if=/dev/zero of=/srv/iscsi/disk1.img bs=1M count=500 [root@www ~]# chcon -Rv -t tgtd_var_lib_t /srv/iscsi/ [root@www ~]# ls -lh /srv/iscsi/disk1.img -rw-r--r--. 1 root root 500M Aug 2 16:22 /srv/iscsi/disk1.img <==容量对的! # 2. 建立实际的 partition 分割: [root@www ~]# fdisk /dev/sda <==实际的分割方式自己处理吧! [root@www ~]# partprobe <==某些情况下得 reboot 喔! [root@www ~]# fdisk -l Device Boot Start End Blocks Id System /dev/sda10 2202 2463 2104483+ 83 Linux /dev/sda11 2464 3117 5253223+ 8e Linux LVM # 只有输出 /dev/sda{10,11} 信息,其他的都省略了。注意看容量,上述容量单位 KB [root@www ~]# swapon -s; mount | grep 'sda1' # 自己测试一下 /dev/sda{10,11} 不能够被使用喔!若有被使用,请 umount 或 swapoff # 3. 建立 LV 装置 : [root@www ~]# pvcreate /dev/sda11 [root@www ~]# vgextend server /dev/sda11 [root@www ~]# lvcreate -L 2G -n iscsi01 server [root@www ~]# lvscan ACTIVE '/dev/server/myhome' [6.88 GiB] inherit ACTIVE '/dev/server/iscsi01' [2.00 GB] inherit
9.5 规划分享的 iSCSI target 档名: iqn.[YYYY-MM].[com.reversed.domain]:[optional_string]
9.6设定 tgt 的配置文件 /etc/tgt/targets.conf
如同一般外接式储存装置 (target 名称) 可以具有多个磁盘一样,我们的 target 也能够拥有数个磁盘装置的。 每个在同一个 target 上头的磁盘我们可以将它定义为逻辑单位编号 (Logical Unit Number, LUN)。我们的 iSCSI initiator 就是跟 target 协调后才取得 LUN 的存取权就是了。
[root@www ~]# vim /etc/tgt/targets.conf # 此档案的语法如下:配置文件的参数:backing-store /你的/虚拟设备/完整檔名-1 backing-store /你的/虚拟设备/完整檔名-2 backing-store /srv/iscsi/disk1.img <==LUN 1 (LUN 的编号通常照顺序) backing-store /dev/sda10 <==LUN 2 backing-store /dev/server/iscsi01 <==LUN 3 initiator-address 192.168.100.0/24 incominguser vbirduser vbirdpasswd write-cache off
backing-store (虚拟的装置), direct-store (实际的装置): 设定装置时,如果你的整颗磁盘是全部被拿来当 iSCSI 分享之用,那么才能够使用 direct-store 。不过,根据网络上的其他文件, 似乎说明这个设定值有点危险的样子。所以,基本上还是建议单纯使用模拟的 backing-store 较佳。例如鸟哥的简单案例中,就通通使用 backing-store 而已
initiator-address (用户端地址): 如果你想要限制能够使用这个 target 的客户端来源,才需要填写这个设定值。基本上,不用设定它 (代表所有人都能使用的意思), 因为我们后来会使用 iptables 来规范可以联机的客户端嘛!
incominguser (用户账号密码设定): 如果除了来源 IP 的限制之外,你还想要让使用者输入账密才能使用你的 iSCSI target 的话,那么就加用这个设定项目。 此设定后面接两个参数,分别是账号与密码啰。
write-cache [off|on] (是否使用快取): 在预设的情况下,tgtd 会使用快取来增快速度。不过,这样可能会有遗失数据的风险。所以,如果你的数据比较重要的话, 或许不要使用快取,直接存取装置会比较妥当一些。
9.7 启动 iSCSI target 以及观察相关端口口与磁盘信息
[root@www ~]# /etc/init.d/tgtd start [root@www ~]# chkconfig tgtd on [root@www ~]# netstat -tlunp | grep tgt Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:3260 0.0.0.0:* LISTEN 26944/tgtd tcp 0 0 :::3260 :::* LISTEN 26944/tgtd # 重点就是那个 3260 TCP 封包啦!等一下的防火墙务必要开放这个埠口。 # 观察一下我们 target 相关信息,以及提供的 LUN 数据内容: [root@www ~]# tgt-admin --show Target 1: iqn.2011-08.vbird.centos:vbirddisk <==就是我们的 target System information: Driver: iscsi State: ready I_T nexus information: LUN information: LUN: 0 Type: controller <==这是个控制器,并非可以用的 LUN 喔! ....(中间省略).... LUN: 1 Type: disk <==第一个 LUN,是磁盘 (disk) 喔! SCSI ID: IET 00010001 SCSI SN: beaf11 Size: 2155 MB <==容量有这么大! Online: Yes Removable media: No Backing store type: rdwr Backing store path: /dev/sda10 <==磁盘所在的实际文件名 LUN: 2 Type: disk SCSI ID: IET 00010002 SCSI SN: beaf12 Size: 2147 MB Online: Yes Removable media: No Backing store type: rdwr Backing store path: /dev/server/iscsi01 LUN: 3 Type: disk SCSI ID: IET 00010003 SCSI SN: beaf13 Size: 524 MB Online: Yes Removable media: No Backing store type: rdwr Backing store path: /srv/iscsi/disk1.img Account information: vuser <==额外的帐户信息 ACL information: 192.168.100.0/24 <==额外的来源 IP 限制9.8设定防火墙:
[root@www ~]# vi /etc/sysconfig/iptables iptables -A INPUT -p tcp -s 192.168.100.0/24 --dport 3260 -j ACCEPT
9.9 客户端 initiator 的设定需要的软件有:iscsi-initiator-utils:挂载来自 target 的磁盘到 Linux 本机上。
9.10 iscsi-initiator-utils主要配置文件:
/etc/iscsi/iscsid.conf:主要的配置文件,用来连结到 iSCSI target 的设定;
/sbin/iscsid:启动 iSCSI initiator 的主要服务程序;
/sbin/iscsiadm:用来管理 iSCSI initiator 的主要设定程序;
/etc/init.d/iscsid:让本机模拟成为 iSCSI initiater 的主要服务;
/etc/init.d/iscsi:在本机成为 iSCSI initiator 之后,启动此脚本,让我们可以登入 iSCSI target。所以 iscsid 先启动后,才能启动这个服务。因为 /etc/init.d/iscsi 脚本已经包含了启动 /etc/init.d/iscsid 的步骤在里面,所以,理论上, 只要启动 iscsi 就好。此外,那个 iscsid.conf 里面大概只要设定好登入 target 时的帐密即可, 其他的 target 搜寻、设定、取得的方法都直接使用 iscsiadm 这个指令来完成。由于 iscsiadm 侦测到的结果会直接写入 /var/lib/iscsi/nodes/ 当中,因此只要启动 /etc/init.d/iscsi 就能够在下次开机时,自动的连结到正确的 target 啰。 那么就让我们来处理处理整个过程吧
9.11 initiator 的设定
修改 /etc/iscsi/iscsid.conf 内容,并启动 iscsi:这个档案的修改很简单,因为里面的参数大多已经预设做的不错了,只要填写 target 登入时所需要的帐密即可。 修改的地方有两个,一个是侦测时 (discovery) 可能会用到的帐密,一个是联机时 (node) 会用到的帐密:
[root@clientlinux ~]# vim /etc/iscsi/iscsid.conf node.session.auth.username = vbirduser <==在 target 时设定的 node.session.auth.password = vbirdpasswd <==约在 53, 54 行 discovery.sendtargets.auth.username = vbirduser <==约在 67, 68 行 discovery.sendtargets.auth.password = vbirdpasswd [root@clientlinux ~]# chkconfig iscsid on [root@clientlinux ~]# chkconfig iscsi on
侦测 192.168.100.254 这部 target 的相关数据:
[root@clientlinux ~]# iscsiadm -m discovery -t sendtargets -p IP:port 选项与参数: -m discovery :使用侦测的方式进行 iscsiadmin 指令功能; -t sendtargets :透过 iscsi 的协议,侦测后面的设备所拥有的 target 数据 -p IP:port :就是那部 iscsi 设备的 IP 与埠口,不写埠口预设是 3260 啰! 范例:侦测 192.168.100.254 这部 iSCSI 设备的相关数据 [root@clientlinux ~]# iscsiadm -m discovery -t sendtargets -p 192.168.100.254 192.168.100.254:3260,1 iqn.2014-10.net.vbnl:vdisk # 192.168.100.254:3260,1 :在此 IP, 端口口上面的 target 号码,本例中为 target1 #iqn.2014-10.net.vbnl:vdisk :就是我们的 target 名称啊! [root@clientlinux ~]# ll -R /var/lib/iscsi/nodes/ /var/lib/iscsi/nodes/iqn.2014-10.net.vbnl:vdisk /var/lib/iscsi/nodes/iqn.2014-10.net.vbnl:vdisk/192.168.100.254,3260,1 # 上面的特殊字体部分,就是我们利用 iscsiadm 侦测到的 target 结果!
现在我们知道了 target 的名称,同时将所有侦测到的信息通通写入/var/lib/iscsi/nodes/iqn.201410.net.vbnl:vbirddisk/192.168.100.254,3260,1 目录内的 default 档案中, 若信息有修订过的话,那你可以到这个档案内修改,也可以透过 iscsiadm 的 update 功能处理相关参数的。
开始进行联机 iSCSI target,因为我们的 initiator 可能会连接多部的 target 设备,因此,我们得先要瞧瞧目前系统上面侦测到的 target 有几部, 然后再找到我们要的那部 target 来进行登入的作业。
范例:根据前一个步骤侦测到的资料,启动全部的 target [root@clientlinux ~]# /etc/init.d/iscsi restart 正在停止 iscsi: [ 确定 ] 正在激活 iscsi: [ 确定 ] # 将系统里面全部的 target 通通以 /var/lib/iscs/nodes/ 内的设定登入 # 上面的特殊字体比较需要注意啦!你只要做到这里即可,底下的瞧瞧就好。 范例:显示出目前系统上面所有的 target 数据: [root@clientlinux ~]# iscsiadm -m node 192.168.100.254:3260,1 iqn.2014-10.net.vbnl:vdisk 选项与参数: -m node:找出目前本机上面所有侦测到的 target 信息,可能并未登入喔 范例:仅登入某部 target ,不要重新启动 iscsi 服务 [root@clientlinux ~]# iscsiadm -m node -T target名称 --login 选项与参数: -T target名称:仅使用后面接的那部 target ,target 名称可用上个指令查到! --login :就是登入啊! [root@clientlinux ~]# iscsiadm -m node -T iqn.iqn.2014-10.net.vbnl:vdisk \ > --login # 这次进行会出现错误,是因为我们已经登入了,不可重复登入喔! 接下来呢,我们要来开始处理这个 iSCSI 的磁盘: [root@clientlinux ~]# fdisk -l Disk /dev/sda: 8589 MB, 8589934592 bytes <==这是原有的那颗磁盘 ....(中间省略).... Disk /dev/sdc: 2147 MB, 2147483648 bytes heads, 62 sectors/track, 1009 cylinders Units = cylinders of 4154 * 512 = 2126848 bytes Sector size (logical/physical): 512 bytes / 512 bytes Disk /dev/sdb: 2154 MB, 2154991104 bytes heads, 62 sectors/track, 1013 cylinders Units = cylinders of 4154 * 512 = 2126848 bytes Sector size (logical/physical): 512 bytes / 512 bytes Disk /dev/sdd: 524 MB, 524288000 bytes heads, 59 sectors/track, 1020 cylinders Units = cylinders of 1003 * 512 = 513536 bytes Sector size (logical/physical): 512 bytes / 512 bytes
9.12更新/删除/新增 target 数据的方法
[root@clientlinux ~]# iscsiadm -m node -T targetname --logout [root@clientlinux ~]# iscsiadm -m node -o [delete|new|update] -T targetname 选项与参数: --logout :就是注销 target,但是并没有删除 /var/lib/iscsi/nodes/ 内的数据 -o delete:删除后面接的那部 target 链接信息 (/var/lib/iscsi/nodes/*) -o update:更新相关的信息 -o new :增加一个新的 target 信息。 范例:关闭来自鸟哥的 iSCSI target 的数据,并且移除链接 [root@clientlinux ~]# iscsiadm -m node <==还是先秀出相关的 target iqn 名称 192.168.100.254:3260,1 iqn.2014-10.net.vbnl:vdisk [root@clientlinux ~]# iscsiadm -m node -T iqn.2014-10.net.vbnl:vdisk \ > --logout Logging out of session [sid: 1, target: iqn.2011-08.vbird.centos:vbirddisk, portal: 192.168.100.254,3260] Logout of [sid: 1, target: iqn.2014-10.net.vbnl:vdisk, portal: 192.168.100.254,3260] successful. # 这个时候的 target 连结还是存在的,虽然注销你还是看的到! [root@clientlinux ~]# iscsiadm -m node -o delete \ > -T iqn.iqn.2014-10.net.vbnl:vdisk [root@clientlinux ~]# iscsiadm -m node iscsiadm: no records found! <==嘿嘿!不存在这个 target 了~ [root@clientlinux ~]# /etc/init.d/iscsi restart # 你会发现唔!怎么 target 的信息不见了!这样瞭了乎
-m {discovery|node|session|iface}
discovery:发现某个server是否有target输出及有哪些输出
node:自己作为节点与server端建立连接
session:查看会话
iface:进行接口管理的
-d:debug_lebel 等级为0—8越高输出的debug信息越详细。
-I:指定使用哪个网络接口,如果只有一块网卡则不用指定
-t:sendtarget,slp,iSNS三种形式,一般用的是sendtarget简写为st
-p:IP:port IP为server的IP,port可以省略,默认为3260
发现输出target后与登录target有关的
-U 登出
-R 重新登入
-l 登入
-T 指定targetname
-p 指定server的IP/port
-s 显示session的统计数据