目前应用最为广泛的两种数据存储设备:NAS与SAN
NAS的全称是Network-attached storage,即网络附加存储,并不需要单独的网络用于存储IO,更适用于中小型的存储解决方案。
NAS设备通常是一个完整的服务器架构,包含了CPU、内存、网卡、磁盘,其上安装通用操作系统或者精简的专用操作系统,并通过扩展接口连接了大量存储阵列。NAS的访问形式是通过TCP/IP网络进行远程访问,NAS自身的操作系统上运行着相应的网络服务程序,比如Windows文件共享服务、Linux Samba文件共享服务、Linux/Unix的NFS文件系统等。需要访问NAS的设备,通过TCP/IP网络,在远程使用客户端软件来访问。Windows文件共享是操作系统自身已经包含,Linux则需要安装Samba客户端或者NFS客户端来访问NAS设备。
NAS主要用途是大容量存储,并带有一定的冗余功能,侧重点在于容量和相对较低的实施成本,对于吞吐量、并发数、冗余性能等通常要求不高。此外,由于NAS的访问形式是文件共享式的访问,操作系统只能将NAS设备挂载成一个网络共享设备,而一些操作系统原生特性是无法在网络共享文件系统上实现的,例如磁盘配额、格式化磁盘、组件磁盘阵列等都不能在远程上实现,这也给NAS的应用造成了一定的局限性。
在远程Windows服务器上,NAS被作为网络驱动器被映射后,通过磁盘管理器功能是无法获知NAS的任何信息的。对NAS系统的底层操作如磁盘配额、组建阵列、格式化等都需要在NAS服务器本地来实施,不能在远程访问的客户端上进行。
SAN的全称是Storage Area Network,需要单独一个网络用于网络存储,更适用于大型的存储解决方案。
对比于NAS,SAN存储更像是一个外置磁盘阵列,SAN设备本身通常只包含阵列、控制器、接口卡,不包含CPU、内存、通用操作系统。SAN通过标准外置SCSI接口或者光纤SCSI接口连接到服务器上。因此,使用SAN的时候,相应的服务器必须带有外置SCSI、光纤接口等扩展卡。连接到SAN以后,在操作系统上,可以将SAN提供的磁盘阵列直接读取为本地磁盘驱动器,操作系统不关心这些硬盘是安装在服务器内部的,还是装载SAN设备内的。
SAN的侧重点在于高性能、高可靠性,SAN通常容量不是很大,但是提供了光纤、SCSI接口用于同时连接到多个服务器上,SAN所提供的阵列带有RAID5以上的高级冗余功能,确保当部分磁盘故障时,系统性能下降的幅度尽可能的小。SAN的缺点是实施成本比较高,如果采用外置SCSI接口,则需要速度匹配的高性能SCSI接口卡。如果采用光纤接口,还需要光纤交换机等设备。
在客户端上使用SAN设备,无论其接口形式是何种,就像使用本地磁盘一样,从磁盘管理器中可以完全看到服务器挂载的SAN设备。
分布式存储是为了解决传统存储解决方案价格昂贵,难以横向扩容的问题。
我这里面说的扩容,并不是逻辑卷的扩容,而是存储pool resource的扩容。随着应用数据不断的增加,你所需的存储容量变得非常庞大,受硬件内部空间限制,无法实现scale out扩容(纵向扩容),所谓纵向扩容就是不断在的存储节点上加硬盘。我们希望能实现scale in扩容(横向扩容),所谓横向扩容,表示的意思是增加存储节点来增加存储容量。(存储集群)
存储集群的解决方案,厂商的商用方案价格过于昂贵,一般单位玩儿不起。开源的分布式存储解决方案最大的好处就是便宜。
分布式存储解决方案早期比较知名的就是glusterfs,现在就是ceph。
百度云网盘其实是应用层的一种存储方式(SaaS)。
SCSI(small computer system interface)小型计算机系统接口,SCSI以目前的定义来说就是一个硬盘的接口标准,你硬盘通过SCSI口插上,就可以使用SCSI的协议来对磁盘进行读写。
iSCSI(Internet SCSI),iSCSI可以让SCSI接口忽略地域限制,通过网络就能操控磁盘的读写。也就是说以前你在一个电脑上使用一块磁盘,需要将磁盘插到电脑上的磁盘接口,但是有了iSCSI之后你只要对某块磁盘的网络可达,你就可以使用这块磁盘。"
从前面的介绍我们可以看出,NAS和SAN分别有着不同的侧重点。SAN虽然有着很好的性能,但是受限于外置SCSI、光纤通道等连接设备,部署成本较高,且外置SCSI铜缆受到线缆长度的限制,不能远距离部署使用。
为了改善SAN的这一缺点,iSCSI协议和规范在2003年被正式确定下来。
iSCSI用于将SCSI数据块映射为以太网数据包。从根本上说,它是一种基于IP Storage理论的新型存储技术,该技术将存储行业广泛应用的SCSI接口技术与IP网络技术相结合,可以在IP网络上构建SAN。
简单地说,iSCSI就是基于以太网接口的外置SCSI存储设备。
对于中小企业的存储网络来说,iSCSI是个非常好的选择。首先,从技术实现上来讲,iSCSI是基于IP协议的技术标准,它允许网络在TCP/IP协议上传输SCSI命令,实现SCSI和TCP/IP协议的连接,这样用户就可以通过TCP/IP网络来构建SAN,只需要不多的投资,就可以方便、快捷地对信息和数据进行交互式传输和管理。但是,在iSCSI出现之前,构建SAN的唯一技术是利用光纤通道,这要花费很大的建设成本,一般中小企业无法承担。其次,iSCSI技术解决了传输效率、存储容量、兼容性、开放性、安全性等方面的诸多问题,在使用性能上绝对不输给商业的存储系统或光纤存储网络。
iSCSI的优势主要表现为:首先,iSCSI沿用TCP/IP协议,而TCP/IP是在网络方面最通用、最成熟的协议,且IP网络的基础建设非常完善,同时,SCSI技术是被磁盘和磁带等设备广泛采用的存储标准,这两点使iSCSI的建设费用和维护成本非常低廉;其次,iSCSI支持一般的以太网交换机而不是特殊的光纤通道交换机,从而减少了异构网络带来的麻烦;还有,iSCSI是通过IP封包传输存储命令,因此可以在整个Internet上传输数据,没有距离的限制。
在iSCSI技术出现后,通过IP技术搭建的存储网络也应运而生,SAN技术也就出现了两种不同的实现方式,即FC SAN与IP SAN。简单来说,以光纤搭建的存储网络就是FC SAN.以iSCSI技术搭建的存储网络叫做IP SAN。
作为SAN的两种实现方式,FC SAN与IP SAN各有优劣,下面从几个方面分别阐述。
在数据传输方式上,FC SAN与IP SAN都采用块协议方式来完成。这是它们的相同点。
在传输速度上,就目前的传输速率而言,FC SAN(2Gbit/s)最快,iSCSI(lGbit/s)次之
在传输距离上,FC SAN理论上可以达到100公里,而事实上,传输超过50公里后,就会出现瓶颈。而通过IP网络的iSCSI技术在理论上没有距离的限制,即iSCSI可以进行没有距离限制的数据传输。
管理及维护成本上,架设FC SAN网络需要投入很多硬件成本,并且需要特定的工具软件进行操作管理,而IP SAN构建成本低廉,由于iSCSI是通过IP网络来传输数据和分配存储资源的,因此只要在现有的网络上进行管理和使用即可,这样就可以省下大笔的管理费用及培训成本。
其实IP SAN也面临着一些不可回避的困扰:首先,基于IP SAN的网络存储还没有得到用户的充分肯定:其次,IP SAN存储需要专门的驱动和设备,幸运的是,一些传统的光纤适配器厂商都发布了iSCSI HBA设备,同时Inter也推出了专用的IP存储适配器,而Microsoft、HP、Novell、SUN、AIX、Linux也具有iSCSI IniTIator软件,并且免费供用户使
用:还有,在安全方面,IP SAN虽然有一套规范的安全机制,但是尚未得到用户的认可。
这些问题和困扰虽然会妨碍iSCSI的发展,但是相信在未来的网络存储世界里,IP SAN绝对金拥有一席之地。
一个简单的iSCSI系统大致由以下部分组成:iSCSI IniTIator或者iSCSI HBA iSCSI Target 以太网交换机 一台或者多台服务器。
一个完整的iSCSI系统的拓扑结构如图所示:
ISCSI是服务器端和客户端C/S机构,服务器端叫做iSCSI-target,在实际应用中就是支持iSCSI协议的SAN设备;客户端叫做iSCSI-initiator,在实际应用中就是要访问SAN的服务器。
在服务器端和客户端中间,数据的传输通道借助于TCP/IP协议完成,Storage Router可以是以太网交换机或者路由器;服务器端和客户端都有自己的IP地址,数据传输可通过交换机、路由器进行中继,进而达到在很远的距离上,各种客户端设备依然可以连接到SAN并进行工作。
iSCSI存储设备可以是iSCSI磁盘阵列,也可以是具有存储功能的PC服务器。
在基于外置SCSI铜缆和光纤SCSI通道的SAN上,SAN连接到的服务器是不需要进行任何特殊配置的,操作系统会将连接上来的SCSI设备视为一个物理磁盘设备。而iSCSI是通过以太网接口连接的,标准的操作系统仅仅将SAN视为一个网络节点,可以通过TCP/IP访问,但不能将其作为物理磁盘设备来使用。这就是为什么需要iSCSI-initiator客户端软件的原因。
为了进一步降低部署成本,可以在Windows服务器上和Linux服务器上安装iSCSI-target服务器端软件,让现有的服务器变成支持iSCSI协议的SAN存储设备。
存储资源所在的iSCSI服务器被称为“target”。iSCSI target通常是一个硬盘存储设备。当前大部分的主流操作系统都提供了配合iSCSI target使用的客户端软件initiator,iSCSI initiator(client) initiator就是iSCSI传输的服务端。典型的initiator都有共同的目的,就是作为一个SCSI总线的适配器,代替物理上的SCSI设备(类似硬盘或者磁带)。iSCSI initiator通过IP网络传输SCSI命令。
1. iSCSI Initiator
iSCSI Initiator是一个安装在计算机上的软件或硬件设备,它负责与iSCSI存储设备进行通信。
iSCSI服务器与iSCSI存储设备之间的连接方式有两种:
第二种是硬件iSCSI HBA (Host Bus Adapter)卡方式,即iSCSI Initiator硬件。这种方式需要先购买iSCSI HBA卡,然后将其安装在iSCSI服务器上,从而实现iSCSI服务器与交换机之间、iSCSI服务器与存储设备之间的高效数据传输。与第一种方式相比,硬件iSCSIHBA卡方式不需要消耗iSCSI服务器的CPU资源,同时硬件设备是专用的,所以基于硬件的iSCSI Initiator可以提供更好的数据传输和存储性能。但是,iSCSI HBA卡的价格比较昂贵,因此用户要在性能和成本之间进行权衡。
iSCSI Initiator软件一般都是免费的,Centos和RHEL对iSCSI Initiator的支持都非常不错,现在的Linux发行版本都默认自带了iSCSI Initiator。
2. iSCSI Target
一个可以用于存储数据的iSCSI磁盘阵列或者具有iSCSI功能的设备都可以被称为“iSCSI Target”,因为大多数操作系统都可以利用一些软件将系统转变为一个“iSCSI Target”。本章重点讲述如何构建一个PC构架的iSCSI存储系统。所谓PC构架就是选择一个普通的、性能优良的、可支持多块磁盘的PC(一般为PC服务器),再选择一款相对成熟稳定的iSCSI Target软件,将iSCSI Target软件安装在PC服务器上,使普通的PC服务器转变成一台iSCSI存储设备,并通过PC服务器的以太网卡对外提供iSCSI数据传输服务。
目前大多数iSCSI Target软件都是收费的,例如DataCorc Software的SANmelody,FalconStor Software的iSCSI Server for Windows等,这些都是Windows平台支持的。不过,也有一些Linux平台的开源iSCSI Target软件,例如iSCSI Enterprise Target,后面的内容会重点介绍这个软件。
利用iSCSI Target软件,可以将服务器的存储空间分配给客户机使用,客户机可以像使用本地硬盘一样使用iSCSI磁盘,包括对其进行分区、格式化及读写等。而且每个客户端都可以向iSCSI磁盘写数据,互不干扰,并且不会破坏存储到服务器中的数据。同时,iSCSITarget软件对用户权限控制非常灵活,支持配置文件。
我们知道,iSCSI是使用TCP/IP协议进行通信的,因此,将iSCSI两端连接起来,仅仅需要一个以太网络就可以了。由此可知,iSCSI的存储性能和这个以太网络有直接关系,所以最好在iSCSI网络中使用千兆以太网交换机,劣质的网络设备会严重影响存储系统的性能,也就是说,要为每个服务器配备高质量的千兆以太网交换机,并提供两个连接。对于iSCSI Target,应该为每个独立阵列中的两个独立端口配备交换机,最后将交换机连接起来,采用这种配置方式,即使两个交换机中的一个出现了故障,整个iSCSI存储系统仍然能够正常工作,这保证了存储系统的不间断运行。
要理解iSCSI的工作原理,就必须知道iSCSI的层次结构。
根据OSI模型,iSCSI的协议自顶向下一共可以分为三层,如图所示。
下面对每个分层进行简单介绍:
SCSI层:根据客户端发出的请求建立SCSI CDB(命令描述块),并传给iSCSI层。同时接收来自iSCSI层的CDB,并向应用返回数据。
iSCSI层:对SCSI CDB进行封装,以便能够在基于TCP/IP协议的网络上进行传输,完成SCSI到TCP/IP的协议映射。这一层是iSCSI协议的核心层。本章也主要针对这一层的配置和管理进行介绍。
TCP/IP层:对IP报文进行路由和转发,并且提供端到端的透明可靠的传输。
iSCSI协议定义了在TCP/IP网络发送、接收数据块存储数据的规则和方式。先发送端将SCSI命令和数据封装到TCP/IP包中,然后通过IP网络转发,接收端收到TCP/IP包之后,将其还原为SCSI命令和数据并执行,执行完成后,将返回的SCSI命令和数据再封装到TCP/IP包中,之后再传回发送端。这样就完成了数据传输的整个过程。
iSCSI的整个数据传输过程在用户看来是完全透明的,用户使用远端的存储设备就像使用本地的硬盘设备一样。不过,这只是理论状态,实际上iSCSI的数据传输速率并不能完全达到本地硬盘的数据传输速率,但差别并不明显。而且这种网络存储模式还有一个优点是安全性高,这对于数据集中存储的iSCSI来说显然非常重要。
安装iscsitarget软件是在Target主机上进行的,这里我们选择的target软件是iscsitarget,大家可以从 iSCSI Enterprise Target下载相应的版本,这里下载的是iscsitarget-1.4.20.1.tar.gz,接着开始进行编译安装:
iscsi]#tar -xzvf iscsitarget-1.4.20.1.tar.gz
iscsi]#cd iscsitarget-1.4.20.1
iscsitarget-1.4.20.1]#make
iscsitarget-1.4.20.1]#make install
Iscsitarget安装完毕后,会创建/etc/iet/目录,此目录下有Iscsitarget的相关配置文件,接着就可以启动Iscsitarget服务了,启动或关闭Iscsitarget服务的命令如下:
iscsi]# service iscsi-target
Usage: /etc/init.d/iscsi-target {start|stop|restart|condrestart|status}
如果要让iscsi-target服务开机自动运行,需执行如下操作:
iscsi]#chkconfig --level 35 iscsi-target on
到此为止,iscsitarget安装完成。
iSCSI Enterprise Target的主配置文件为/etc/iet/ietd.conf,此文件中的选项默认全部被注释掉了,有需要用到这些选项时,再将注释去掉即可。
打开ietd.conf文件,首先找到类似如下行:
#Target iqn.2001-04.com.example:storage.disk2.sys1.xyz
此选项表示该iSCSI Target的命名,先将前面的“#”号去掉, Target的命名在同一子网内应该是唯一的,标准命名方式为:
iqn.yyyy-mm.[:identifier]
其中:
接下来,就是要设定 LUN(Logical Unit Number),找到类似如下行:
#Lun 0 Path=/dev/sdb,Type=fileio,ScsiId=xyz,ScsiSN=xyz
将 前面的“#”号去掉,“Lun 0 Path=/dev/sdb”表示块设备号为0,映射的磁盘为/dev/sdb,“Type”值fileio是默认的,可以用于磁盘、file和LVM, 这里设定的是“fileio”,主要用来对一个磁盘进行存储共享。读者可以根据自己情况将Path改为需要共享的存储分区的设备标识。这里假定共享的设备 标识为/dev/sdb。
至此,一个简单的iSCSI Target已经配置完毕了,最后启动iscsi-target服务:
iscsi]# service iscsi-target start
微软对iSCSI Initiator的支持相当完备,大家可以免费从微软网站获得iSCSI Initiator软件,网址是http://www.microsoft.com/WindowsServer2003/technologies/storage/iscsi/default.mspx
实例下载的版本是Initiator-2.08-build3825-x86fre.exe,接下来开始说明如何让windows连接iSCSI Target。
安装完成iSCSI Initiator后,在桌面上会发现启动图标,启动Microsoft iSCSI Initiator后,选择第二个分页标签“Discovery”,然后在“Target Portals”部分点击“Add”按钮,跳出“Add Target Portal”窗口,如图所示:
在此窗口下填写iSCSI Target的ip地址和端口,iSCSI Target地址就是上面设定的Target主机的地址,iSCSI Target的端口默认是3260,除非有特殊设定,填写完成,点击OK按钮。
接下来,选择第三个分页标签“Targets”,如图3所示,可以看到,iSCSI Initiator已经检测到了iSCSI Target的名称,但是此时的iSCSI Target还处于“inactive”状态,点击下方“Log On”按钮,然后弹出“Log On to Target”窗口,接着按下“OK”按钮来**Target,此时iSCSI Target已经从“inactive”状态变为“Connected”状态。
如图所示:
到此为止,windows系统已经识别了iSCSI Target提供的共享磁盘分区,通过windows的磁盘管理器可以看到新增加的磁盘分区,如图所示:
现在就可以使用windows的磁盘管理功能对这块共享磁盘进行分区、格式化以及挂载等操作了。
现在的主流Linux发行版本默认都自带了iSCSI Initiator,即Open-iSCSI,如果系统没有安装,只需通过光盘找到iscsi-initiator-utils- 6.2.0.871-0.16.el5.i386.rpm包,通过rpm方式安装即可,当然也可以通过yum进行自动安装,操作如下:
iscsi]#yum install iscsi*
安装完成后,会生成/etc/iscsi主程序配置目录,其它相关文件的安装位置为:
/etc/iscsi/iscsid.conf
/etc/rc.d/init.d/iscsi
/etc/rc.d/init.d/iscsid
/sbin/iscsi-iname
/sbin/iscsiadm
/sbin/iscsid
/sbin/iscsistart
/var/lib/iscsi
/var/lib/iscsi/ifaces
/var/lib/iscsi/isns
/var/lib/iscsi/nodes
/var/lib/iscsi/send_targets
/var/lib/iscsi/slp
/var/lib/iscsi/static
/var/lock/iscsi
接下来需要启动Initiator服务,操作如下:
iscsi]# service iscsi start
/sbin/iscsiadm命令:在iSCSI Initiator安装完成后,会生成/sbin/iscsiadm命令,此命令是用来管理(更新、删除、插入、查询)iSCSI配置数据库文件的命令行 工具,用户能够用它对iSCSI nodes、sessions、connections和discovery records进行一系列的操作。
/var/lib/iscsi/send_targets目录:在此目录下,会生成一个或多个以iSCSI存储服务器IP和端口命名的文件夹,文件名为“iSCSI Target IP,端口号”(例如“192.168.12.246,3260”)。
/var/lib/iscsi/nodes目录:在此目录下,会生成一个或多个以iSCSI存储服务器上的Target名命名的文件夹,在该文件夹下有一个文件名为“iSCSI portal IP,端口号” (例如“192.168.12.246,3260”)的配置参数文件,该文件是iSCSI initiator登录iSCSI target时要使用的参数,而这些参数的设置是从/etc/iscsi/iscsi.conf中的参数继承而来的,可以通过iscsiadm命令对某一个参数文件进行更改。
可以使用如下指令向 iSCSI Target 主机查询划分了哪些lun:
iscsiadm -m discovery --type sendtargets --portal IP
或者:
iscsiadm -m discovery -t sendtargets -p IP
例如:
iscsi ]# iscsiadm -m discovery -t sendtargets -p 192.168.12.246:3260
192.168.12.246:3260,1 iqn.2001-04.com.example:storage.disk2.sys1.xyz
可以看出,“iqn.2001-04.com.example:storage.disk2.sys1.xyz”就是iSCSI Target的名称。由于在配置iSCSI Target时,没有做任何限制,因此所有的客户端主机都允许连接iSCSI Target共享出来的磁盘。需要说明的是:当成功执行一次Target发现后,iSCSI Initiator就会将查询纪录写到/var/lib/iscsi/send_targets对应目录下。因此,对于Target发现只需执行一次即可。
接着通过iscsiadm指令与iSCSI Target 主机建立连接,也就是登录iSCSI Target:
iscsiadm -m node -T -p : --login
或者:
iscsiadm -m node -T [target-name] -p [ip-address] -l
这里的“-T”后面跟target名称,“ip-address”是target主机的IP地址,“port”是target主机的端口号,默认是3260。
例如:
iscsi ]#iscsiadm -m node -T iqn.2001-04.com.example:storage.disk2.sys1.xyz -p 192.168.12.246 -l
Logging in to [iface: default, target: iqn.2001-04.com.example:storage.disk2.sys1.xyz, portal: 192.168.12.246,3260]
Login to [iface: default, target: iqn.2001-04.com.example:storage.disk2.sys1.xyz, portal: 192.168.12.246,3260]: successful
如果有多个Target主机时,可以通过如下命令一次登录所有的targets:
iscsi ]#iscsiadm -m node --loginall=all
这 里需要说明的是,通过执行Target发现操作,其实已经与iSCSI Target 主机建立了连接,此时如果再次执行iscsiadm命令与Target主机建立连接的话,会提示“iscsiadm: initiator reported error (15 - already exists)”错误,所以需要先断开与iSCSI Target 主机的连接,执行如下指令,断开Initiator 与iSCSI Target 主机的连接:
iscsiadm -m node -T [target-name] -p [ip-address] -u
例如:
iscsi ]#iscsiadm -m node -T iqn.2001-04.com.example:storage.disk2.sys1.xyz -p 192.168.12.246 -u
Logging out of session [sid: 2, target: iqn.2001-04.com.example:storage.disk2.sys1.xyz, portal: 192.168.12.246,3260]
Logout of [sid: 2, target: iqn.2001-04.com.example:storage.disk2.sys1.xyz, portal: 192.168.12.246,3260]: successful
当iSCSI Initiator与iSCSI Target连接成功后,还可以通过如下命令查看iSCSI session信息:
iscsi ]#iscsiadm -m session –i
例如:
iscsi ]#iscsiadm -m session –i
iSCSI Transport Class version 2.0-871
version 2.0-871
Target: iqn.2001-04.com.example:storage.disk2.sys1.xyz
Current Portal: 192.168.12.246:3260,1
Persistent Portal: 192.168.12.246:3260,1
**********
Interface:
**********
Iface Name: default
Iface Transport: tcp
Iface Initiatorname: iqn.1994-05.com.RedHat :fd37f211e3a
Iface IPaddress: 192.168.12.26
Iface HWaddress:
Iface Netdev:
SID: 1
iSCSI Connection State: LOGGED IN
iSCSI Session State: LOGGED_IN
Internal iscsid Session State: NO CHANGE
************************
Negotiated iSCSI params:
************************
HeaderDigest: None
DataDigest: None
MaxRecvDataSegmentLength: 262144
MaxXmitDataSegmentLength: 8192
FirstBurstLength: 65536
MaxBurstLength: 262144
ImmediateData: Yes
InitialR2T: Yes
MaxOutstandingR2T: 1
************************
Attached SCSI devices:
************************
Host Number: 32 State: running
scsi32 Channel 00 Id 0 Lun: 0
Attached scsi disk sdb State: running
首先通过fdisk命令查看共享过来的磁盘标识,也可以通过dmesg命令查看系统是否认到了共享的iSCSI磁盘,操作如下:
iscsi ]#fdisk -l
Disk /dev/sda: 320.0 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 38913 312464250 8e Linux LVM
Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 609 4891761 83 Linux
/dev/sdb2 610 1305 5590620 83 Linux
从fdisk输出可知,iscsi共享磁盘标识为/dev/sdb,大小10.7G,下面就可以通过fdisk命令对这个磁盘进行重新分区、格式化、创建文件系统等操作了。
iSCSI架构:
拓扑结构:
1. 需求
iscsi-server和centos-stream1的linux操作系统版本为CentOS-Stream;
ubuntu20的操作系统版本为ubuntu20.04;
Windows10的操作系统版本为Windows10企业版;
esxi的操作系统版本为esxi6.7;
iscsi-server除了操作系统所在的硬盘还有一块500G的磁盘vdb:
2. iscsi-server上基础配置和软件安装
[root@localhost ~]# hostnamectl set-hostname iscsi-server
[root@iscsi-server ~]# sed -i 's/SELINUX=enforcing/SELINUX=permissive/'
/etc/selinux/config
[root@iscsi-server ~]# setenforce 0
[root@iscsi-server ~]# systemctl disable firewalld --now
[root@iscsi-server ~]# yum -y install targetcli
#启动target服务,代表着启动iscsi-server
[root@iscsi-server ~]# systemctl enable target --now
3. iscsi-server上划逻辑卷
[root@iscsi-server ~]# pvcreate /dev/vdb
Physical volume "/dev/vdb" successfully created.
[root@iscsi-server ~]# vgcreate iscsi /dev/vdb
Volume group "iscsi" successfully created
[root@iscsi-server ~]# lvcreate -n ubuntu -L 100G iscsi
Logical volume "ubuntu" created.
[root@iscsi-server ~]# lvcreate -n stream -L 100G iscsi
Logical volume "stream" created.
[root@iscsi-server ~]# lvcreate -n windows -L 100G iscsi
Logical volume "windows" created.
[root@iscsi-server ~]# lvcreate -n esxi -L 100G iscsi
Logical volume "esxi" created.
[root@iscsi-server ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home cs -wi-a----- 421.09g
root cs -wi-ao---- 70.00g
swap cs -wi-ao---- 7.90g
esxi iscsi -wi-a----- 100.00g
stream iscsi -wi-a----- 100.00g
ubuntu iscsi -wi-a----- 100.00g
windows iscsi -wi-a----- 100.00g
4. target端创建backstore
[root@iscsi-server ~]# targetcli
Warning: Could not load preferences file /root/.targetcli/prefs.bin.
targetcli shell version 2.1.53
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.
/>
5. 创建IQN
IQN的格式是IQN.YYYY-MM.域名的反写。
我们可以看到IQN创建完毕之后,下面会带上一个默认TPG1,TPG就是改IQN的默认策略。TPG下面有ACL,LUN,portals。
IQN属于名字,名字是自己创建的,这种不支持补全,但是其他的都支持补全。
6. 针对IQN设置ACL,LUN,Portals
默认当IQN创建之后默认的portal就是监听所有地址的3260端口,你可以不用更改。
iqn.2021-01.com.example:ubuntuserver使用了ubuntu的backstore,只允许iqn.2021-01.com.example:ubuntu使用这个target存储。
iqn.2021-01.com.example:stream使用了stream的backstore,只允许iqn.2021-01.com.example:stream使用这个target存储
其他的两个类似。
saveconfig就是保存配置,保存完之后就可以exit退出了。
/> exit
Global pref auto_save_on_exit=true
Last 10 configs saved in /etc/target/backup/.
Configuration saved to /etc/target/saveconfig.json
[root@iscsi-server ~]# netstat -tunlp
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:22 0.0.0.0:* LISTEN 959/sshd
tcp 0 0 0.0.0.0:3260 0.0.0.0:* LISTEN -
tcp6 0 0 :::22 :::* LISTEN 959/sshd
没有使用iscsi存储之前,有一块系统盘和一块100G的未使用的磁盘。
必须要保证windows上的iscsi发起程序是开机启动的,才能在重启windows之后,自动挂载iscsi的磁盘。
1. centos-stream访问
需要修改iscsi发起程序的IQN:
[root@stream ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:eaac1e599195
如果没有/etc/iscsi/目录,那么说明你没有安装iscsi发起程序,只需要:
yum -y install iscsiinitiator-utils
[root@stream ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2021-01.com.example:stream
启动iscsi服务和iscsid服务并设置下次开机启动:
[root@stream ~]# systemctl enable iscsi iscsid
[root@stream ~]# systemctl restart iscsi iscsid
你可能会发现iscsi服务没有正常启动,原因是默认没有任何的iscsi-server的节点被记录,有记录了,服务就会正常。
发现target:
[root@stream ~]# iscsiadm -m discovery -t st -p 10.163.1.110
10.163.1.110:3260,1 iqn.2021-01.com.example:ubuntuserver
10.163.1.110:3260,1 iqn.2021-01.com.example:streamserver
10.163.1.110:3260,1 iqn.2021-01.com.example:windowsserver
10.163.1.110:3260,1 iqn.2021-01.com.example:esxiserver
iscsiadm是iscsi发起程序的命令行,-m参数表示模式,discovery表示发现模式,-t st表示
sendtarget,表示发现之后要发送自己的IQN。
-p参数表示portal,默认portal的端口是3260,所以-p 10.163.1.110相当于-p 10.163.1.110:3260
[root@stream ~]# ls /var/lib/iscsi/nodes
iqn.2021-01.com.example:esxiserver iqn.2021-01.com.example:ubuntuserver
iqn.2021-01.com.example:streamserver iqn.2021-01.com.example:windowsserver
当发现了target之后,再重启iscsi发起程序,你就会发现iscsi服务正常了。
[root@stream ~]# systemctl restart iscsi
登陆target:
#如果ACL不匹配就会出现"iSCSI login failed due to authorization failure"
[root@stream ~]# iscsiadm -m node -T iqn.2021-01.com.example:ubuntuserver -l
Logging in to [iface: default, target: iqn.2021-01.com.example:ubuntuserver,portal: 10.163.1.110,3260]
iscsiadm: Could not login to [iface: default, target: iqn.2021-01.com.example:ubuntuserver, portal: 10.163.1.110,3260].
iscsiadm: initiator reported error (24 - iSCSI login failed due to authorization failure)
iscsiadm: Could not log into all portals
[root@stream ~]#
[root@stream ~]# iscsiadm -m node -T iqn.2021-01.com.example:streamserver -l
#node表示节点操作模式,-T表示Target,-l表示登陆
[root@stream ~]# ls /dev/sd*
/dev/sda
[root@stream ~]# ls /dev/vd*
/dev/vda /dev/vda1 /dev/vda2 /dev/vdb
[root@stream ~]# fdisk -l /dev/sda
Disk /dev/sda: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
[root@stream ~]# iscsiadm -m node -T iqn.2021-01.com.example:streamserver -u
Logging out of session [sid: 2, target: iqn.2021-01.com.example:streamserver,portal:10.163.1.110,3260]
Logout of [sid: 2, target: iqn.2021-01.com.example:streamserver,portal:10.163.1.110,3260] successful.
#-u参数表示登出
[root@stream ~]# iscsiadm -m node -T iqn.2021-01.com.example:streamserver -u
Logging out of session [sid: 2, target: iqn.2021-01.com.example:streamserver,portal: 10.163.1.110,3260]
Logout of [sid: 2, target: iqn.2021-01.com.example:streamserver, portal:10.163.1.110,3260] successful.
[root@stream ~]# ls /dev/sd*
ls: cannot access '/dev/sd*': No such file or directory
[root@stream ~]#
[root@stream ~]# iscsiadm -m node -T iqn.2021-01.com.example:streamserver -l
Logging in to [iface: default, target: iqn.2021-01.com.example:streamserver,portal: 10.163.1.110,3260]
Login to [iface: default, target: iqn.2021-01.com.example:streamserver, portal:10.163.1.110,3260] successful.
[root@stream ~]# ls /dev/sd*
/dev/sda
[root@stream ~]# iscsiadm -m node -T iqn.2021-01.com.example:streamserver -u
Logging out of session [sid: 6, target: iqn.2021-01.com.example:streamserver,portal: 10.163.1.110,3260]
Logout of [sid: 6, target: iqn.2021-01.com.example:streamserver, portal:10.163.1.110,3260] successful.
[root@stream ~]# ls /dev/sd*
ls: cannot access '/dev/sd*': No such file or directory
[root@stream ~]# iscsiadm -m node -T iqn.2021-01.com.example:streamserver -l
Logging in to [iface: default, target: iqn.2021-01.com.example:streamserver,portal: 10.163.1.110,3260]
Login to [iface: default, target: iqn.2021-01.com.example:streamserver, portal:10.163.1.110,3260] successful.
[root@stream ~]# ls /dev/sd*
/dev/sda
#重启之后查看磁盘是否还在
[root@stream ~]# ls /dev/sd*
/dev/sda
2. ubuntu访问
root@yyds:~# cat /etc/iscsi/initiatorname.iscsi
## DO NOT EDIT OR REMOVE THIS FILE!
## If you remove this file, the iSCSI daemon will not start.
## If you change the InitiatorName, existing access control lists
## may reject this initiator. The InitiatorName must be unique
## for each iSCSI initiator. Do NOT duplicate iSCSI InitiatorNames.
InitiatorName=iqn.2021-01.com.example:ubuntu
root@yyds:~# systemctl enable iscsi iscsid
root@yyds:~#
systemctl restart iscsi iscsid
root@yyds:~# iscsiadm -m discovery -t st -p 10.163.1.110
10.163.1.110:3260,1 iqn.2021-01.com.example:ubuntuserver
10.163.1.110:3260,1 iqn.2021-01.com.example:streamserver
10.163.1.110:3260,1 iqn.2021-01.com.example:windowsserver
10.163.1.110:3260,1 iqn.2021-01.com.example:esxiserver
root@yyds:~# iscsiadm -m node -T iqn.2021-01.com.example:ubuntuserver -l
Logging in to [iface: default, target: iqn.2021-01.com.example:ubuntuserver,
portal: 10.163.1.110,3260] (multiple)
Login to [iface: default, target: iqn.2021-01.com.example:ubuntuserver, portal:
10.163.1.110,3260] successful.
root@yyds:~# ls /dev/sd*
/dev/sda
root@yyds:~# iscsiadm -m node -T iqn.2021-01.com.example:ubuntuserver -u
Logging out of session [sid: 1, target: iqn.2021-01.com.example:ubuntuserver,portal: 10.163.1.110,3260]
Logout of [sid: 1, target: iqn.2021-01.com.example:ubuntuserver, portal:10.163.1.110,3260] successful.
root@yyds:~# ls /dev/sd*
ls: cannot access '/dev/sd*': No such file or directory
root@yyds:~# iscsiadm -m node -T iqn.2021-01.com.example:ubuntuserver -l
Logging in to [iface: default, target: iqn.2021-01.com.example:ubuntuserver,portal: 10.163.1.110,3260] (multiple)
Login to [iface: default, target: iqn.2021-01.com.example:ubuntuserver, portal:10.163.1.110,3260] successful.
root@yyds:~# systemctl restart iscsi
root@yyds:~# systemctl status iscsi
● open-iscsi.service - Login to default iSCSI targets
Loaded: loaded (/lib/systemd/system/open-iscsi.service; enabled; vendor preset: enabled)
Active: active (exited) since Wed 2021-01-27 14:40:05 UTC; 2s ago
Docs: man:iscsiadm(8)
man:iscsid(8)
Process: 31245 ExecStart=/sbin/iscsiadm -m node --loginall=automatic
(code=exited, status=21)
Process: 31258 ExecStart=/lib/open-iscsi/activate-storage.sh (code=exited,status=0/SUCCESS)
Main PID: 31258 (code=exited, status=0/SUCCESS)
Jan 27 14:40:05 yyds systemd[1]: Starting Login to default iSCSI targets
...Jan 27 14:40:05 yyds iscsiadm[31245]: iscsiadm: No records found
Jan 27 14:40:05 yyds systemd[1]: Finished Login to default iSCSI targets.
root@yyds:~# reboot
root@yyds:~# ls /dev/sd*
ls: cannot access '/dev/sd*': No such file or directory
root@yyds:~# sed -i 's/node.startup = manual/node.startup = automatic
/'/etc/iscsi/iscsid.conf
root@yyds:~# systemctl restart iscsid
root@yyds:~# iscsiadm -m discovery -t st -p 10.163.1.110
10.163.1.110:3260,1 iqn.2021-01.com.example:ubuntuserver
10.163.1.110:3260,1 iqn.2021-01.com.example:streamserver
10.163.1.110:3260,1 iqn.2021-01.com.example:windowsserver
10.163.1.110:3260,1 iqn.2021-01.com.example:esxiserver
root@yyds:~# iscsiadm -m node -T iqn.2021-01.com.example:ubuntuserver -l
root@yyds:~# reboot
root@yyds:~# ls /dev/
sd*/dev/sda
在iSCSI target端上增加acl使esxi可以使用target端的存储:
/> /iscsi/iqn.2021-01.com.example:esxiserver/tpg1/acls/ create iqn.1998-01.com.vmware:6011518d-b255-a641-8345-500000060000-096ec182
Created Node ACL for iqn.1998-01.com.vmware:6011518d-b255-a641-8345-500000060000-096ec182
Created mapped LUN 0.
也可以在esxi的命令行界面修改:
[root@localhost:~] vi /etc/vmware/vmkiscsid/initiatorname.iscsi
[root@stream ~]# fdisk -l /dev/sda
Disk /dev/sda: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
[root@stream ~]# fdisk -l /dev/sda
Disk /dev/sda: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x6fb0ddcc
Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 20973567 20971520 10G 83 Linux
/dev/sda2 20973568 62916607 41943040 20G 83 Linux
让streamserver也能被ubuntu访问:
/> /iscsi/iqn.2021-01.com.example:streamserver/tpg1/acls/ create iqn.2021-01.com.example:ubuntu
Created Node ACL for iqn.2021-01.com.example:ubuntu
Created mapped LUN 0.
/> saveconfig
ubuntu上挂在streamserver target的存储:
root@yyds:~# iscsiadm -m discovery -t st -p 10.163.1.110
10.163.1.110:3260,1 iqn.2021-01.com.example:ubuntuserver
10.163.1.110:3260,1 iqn.2021-01.com.example:streamserver
10.163.1.110:3260,1 iqn.2021-01.com.example:windowsserver
10.163.1.110:3260,1 iqn.2021-01.com.example:esxiserver
root@yyds:~# iscsiadm -m node -T iqn.2021-01.com.example:streamserver -l
Logging in to [iface: default, target: iqn.2021-01.com.example:streamserver,portal:10.163.1.110,3260] (multiple)
Login to [iface: default, target: iqn.2021-01.com.example:streamserver,portal:10.163.1.110,3260] successful.
root@yyds:~# ls /dev/sd*
/dev/sda /dev/sdb /dev/sdb1 /dev/sdb2
也就是说,如果你针对iscsi存储做了分区,那么如果别的节点也挂了这个存储,也能使用这个分区。
[root@stream ~]# mkfs.ext4 /dev/sda1
mke2fs 1.45.6 (20-Mar-2020)
Creating filesystem with 2621440 4k blocks and 655360 inodes
Filesystem UUID: 16ac77c3-e728-42d4-8e21-0f534b27ea6c
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
[root@stream ~]# mkfs.ext4 /dev/sda2
mke2fs 1.45.6 (20-Mar-2020)
Creating filesystem with 5242880 4k blocks and 1310720 inodes
Filesystem UUID: 29d87675-3844-48f2-add9-8ec2b99e0113
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,4096000
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
[root@stream ~]# mkdir /mnt/iscsi-sda{1,2}
#iscsi网络存储在持久性挂载的时候必须加上_netdev参数来标识这是一个网络存储。否则如果系统在引导的时候如果还没有启动iscsi服务,就开始找/dev/sda1这块磁盘,如果找不到,系统就无法正常启动,导致进入紧急救援模式。
[root@stream ~]# cat /etc/fstab
/dev/sda1 /mnt/iscsi-sda1 ext4 defaults,_netdev 0 0
[root@stream ~]# mount -a
[root@stream ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs tmpfs 3.8G 0 3.8G 0% /dev/shm
tmpfs tmpfs 3.8G 8.5M 3.8G 1% /run
tmpfs tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup
/dev/mapper/cs-root xfs 70G 2.4G 68G 4% /
/dev/vda1 xfs 1014M 199M 816M 20% /boot
tmpfs tmpfs 777M 0 777M 0% /run/user/0
/dev/sda1 ext4 9.8G 37M 9.3G 1% /mnt/iscsi-sda1
#ubuntu
root@yyds:~# mkdir /mnt/iscsi-storage1
root@yyds:~# mount /dev/sdb1 /mnt/iscsi-storage1
/root@yyds:~# df -Th
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 394M 1.1M 393M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv ext4 196G 6.4G 180G 4% /
tmpfs tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/vda2 ext4 976M 104M 806M 12% /boot
root@yyds:~# touch /mnt/iscsi-storage1/ubunt-file
root@stream ~]# ls /mnt/iscsi-sda1/
lost+found
[root@stream ~]# umount /mnt/iscsi-sda1
[root@stream ~]# mount -a
[root@stream ~]# ls /mnt/iscsi-sda1/
[root@stream ~]# ls /mnt/iscsi-sda1/ -l
ls: cannot access '/mnt/iscsi-sda1/ubuntu-file': Bad message
total 16
drwx------. 2 root root 16384 Jan 27 23:08 lost+found
-?????????? ? ? ? ? ? ubuntu-file