欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

马哥 41_01 _Linux集群系列之十九——iSCSI协议、架构及其安装配置 有大用

image.png

scsi是一种IO技术,

image.png

 computer architecture,计算机体系结构,整个计算机的核心是 CPU, 内存,

内存用于存储数据,我们的CPU从存储器中取得数据,处理数据,而后将数据重新放回内存

内存是易逝性存储器,速度快,但是断电后,数据丢失,

我们的CPU和RAM,在有一种体系结构中,是通过北桥芯片直接连起来的,在北桥上连的还有另外一个控制器 AGP,连往北桥还有南桥芯片,北桥与南桥之间有个总线叫PCI总线,,,连到南桥上的总线叫做 ISA bus,,,通过南桥芯片所连接的控制芯片(控制器)有USB,有IDE的等,,,,,,,其它通过PCI总线所连上的设备,很显然比ISA总线要快,因为南桥芯片(ISA总线)是一个慢速总线,PCI总线是高速总线,

PCI-E是另外一回事了?????

所以诸多只要不属于CPU或者RAM这个核心总线上的其它设备,我们都称为外围总线,这些总线当中,为了能够连接其它的设备,它们通常需要一个控制器连到这个总线上来,这些总线为了能够跟主机交互,我们把这些称为输入输出系统(I/O总线),,,它们跟我们的计算机的核心单元是没有关系的,它们只是提供辅助性功能的,,,,所以我们称为输入输出的工具

image.png

我们的USB,IDE这些设备,虽然能够提供持久性存储,但是跟CPU交互的时候,我们的cpu不会从我们这些外部的存储设备直接读数据进行处理的,要把它们首先加载到CPU所使用的存储器(内存吧)

在众多的这些总线里面,能够提供一个持久性存储的总线,我们称为存储总线(如IDE(所连的设备少,一个总线,一个控制器,最多只能连一主一从两个设备,而且一个计算机上,所能够使用的总线也不是特别的多,在一个有限的接口上,它所能够连接的设备非常的少,IDE的控制器在本身的设备上,它在数据传输上,所实现的协议封装单元,协议封装能力很差,所以在一定程度上,它们对实现数据报文最终以块的格式通过这个总线所传输到这个硬件设备上,需要大量周期的cpu时钟周期的参与,,我们的cpu会花很长时间完成数据的读入写出这样的操作,在比较繁忙的机器上,cpu资源尤为珍贵的场景当中,一般来讲,不是特别的适用,所以后来出现了scsi这样的工业总线),SCSI(scsi总线,除了硬盘在设计上转速比ide接口上(sata)的硬盘快,最重要的是总线的适配器Adapter,有时也称为主机适配器,叫HBA卡(host bus adapter 主机总线适配器)))

HBA卡自己本身,自己在主机上,在芯片上内置有一个控制芯片,这个芯片可以完成数据本身协议单元数据的封装,这样就大大降低了对CPU时间周期的占用,这就是scsi总线的好处,

image.png


scsi是一种IO设备,

scsi是一种IO技术,scsi本身是一种协议规范,它定义了一种并行的IO总线和相关的协议,

SCSI的数据传输是以块的方式进行的

它具有:

    设备无关性

    多设备并行

    高带宽

    低系统开销,(因为卡上有控制芯片)

image.png

image.png

image.png


体系结构: 主机首先要有一个适配器(HBA卡),HBA卡上可以接一根总线出来,这个线缆可以接到一个target上(scsi设备上),这个target可以把总线连出来,连到另外一个scsi总线上,



SCSI-2(FastSCSI)最多可接7个SCSI设备,WideSCSI-2以上可接15个SCSI设备。
当前最新的SCSI协议版本为:Ultra 640 SCSI,其最大传输速率可达640MB/s。


scsi分为

宽总线: 16个口,连15个设备,,,最后一个scsi总线需要一个终结器,实现数据真正存取的设备,称为scsi的initiator,,,每一个能够接设备的地方我们称为target,

窄总线: 8个口,连7个设备,,,最后一个scsi总线需要一个终结器,实现数据真正存取的设备,称为scsi的initiator,,,每一个能够接设备的地方我们称为target,


image.png


image.png


image.png

image.png


一个独立的SCSI总线按照规格不同可以支持

8或16个SCSI设备,设备的编号需要通过

SCSI  ID来进行控制( 我们也称为 target ID 吧)

(每个target上面可以连接多个逻辑单元,或者叫逻辑设备)

(一个逻辑单元对应于一个逻辑设备)

,系统中每个SCSI设备都必须有自己唯一的

SCSI ID, SCSI ID实际上就是这些设备的

地址

窄SCSI总线最多允许8个、宽SCSI总线最

多允许16个不同的SCSI设备和它进行连接

image.png


LUN (Logical Unit Number, 逻辑单元号)是为了

使用和描述更多设备及对象而引进的一个方法

每个SCSI ID上最多有32个LUN,一个LUN对应一

个逻辑设备

image.png


image.png


image.png



image.png


scsi有被sas取代的趋势,

SAS总线和scsi总线的区别

scsi总线是个并行口,多个设备共享同一个线缆     ULTRA320 scsi最大速度 320MB/秒

SAS总线,在我们的主机适配器上,有n个口,每一个口上在单独连接一个设备,(串行的),可以连额外的扩展Expander,再次扩展一下,有点像逻辑分区的概念,可以支持非常多的设备   SAS最大是6Gbps, 即达到近1GB/秒

image.png



iscsi,,,,SAN存储区域网络(Storage Area Network),它所实现的主要目的是

image.png


一个scsi卡片上可以通过多种方式连接多个scsi设备,线缆的长度是有限的,而且线缆本身很难为多个主机共享,就算能够实现共享,它也只能被有限的主机所使用,而在有些场景当中,我们可能需要一种存储设备,这种存储设备可能为多个主机所同时使用,并且能够支持更长的传输距离,所以scsi总线,scsi规范,这种存储协议本身所能够依赖的早期的线缆是不能满足这种需求的,,,,,于是人们期望开发一种机制,能够将scsi协议报文经过另外一种非scsi线缆传输,传输完成以后,将它能够保存至我们的目标存储设备上,这种能够实现传输scsi协议报文并且能够将其路由到目标存储设备并存储下来的网络,我们称为SAN(存储区域网络)


image.png

有个存储设备Disk Array,里面有大量的硬盘,在每一个scsi总线上有一个target,在每个target上有多个逻辑设备号,我们称为LUN,逻辑单元号,( 每一个LU有一个LUN),,每个target上也有个单元号,在整个网络上,在协议数据单元在传输的时候,我们每一个主机在本地,它知道,它所能访问的target是什么,每个target上一共有多少个存储设备,每一个存储设备(逻辑设备)所对应的单元号是什么,所以它会在本机通过scsi的协议单元,scsi在封装它要传输的数据单元的时候,





image.png


scsi的总线体系结构,一个 controller 可以连多个设备(逻辑设备),,,,,每个逻辑设备有一个逻辑单元号

image.png


scsi3总线的协议报文,scsi协议也是分层的,最底层的是物理层,能够实现将协议报文通过某一种线缆从源方发送到目的方的一个重要的传输介质上面所能够传输的报文格式,向上一层是共享命令集,(公共命令集)(scsi的命令,包括我们到底是一个存储还是读取等相关的命令),再向上一层是scsi特有的命令(特定设备的指令集),(不同的scsi设备类型,比如光盘(有些光盘可以通过scsi总线来连接),,,,,,,有些硬盘也是可以通过scsi总线来连接,,,,,,,,它们每一种实现数据的读取或者写入的方式不一样的,),,,再向上一层就是通用访问方法,再向上就是数据,,,,,假设我们有一个数据,有一个文件,需要存储到scsi相应的设备上,应该怎么存?首先,这个文件要逐一的封装为scsi的数据单元 (先被分成scsi数据块,然后封装scsi的各种首部,封装完成之后就是一个scsi报文了,,这个报文最终还要通过那个线缆进行传输,,,早期线缆有很多种,比如ATAPI,SPI-x,这种方式来传输的,,这就是它的物理传输方式,,,这种线缆其实就是我们的主板上的总线上,通过控制器直接连接每个target的,所以它的传输距离非常的短,,,,,,,,无非这底下就是一种物理协议和物理传输介质而已,,,,,我们把物理协议和物理传输介质调换一下,就可以基于别的方式来进行传输了,,,比如基于光网络来传输的,我们称为FC(基于分布式光通道来实现报文传输)),,,,,,,,,,,,,FC支持更长的传输距离,所以使用FC替代ATAPI之后,传输距离得到大大的扩展,

image.png

image.png

image.png


通过光缆,封装了SCSI报文以后,这个SCSI报文能够传输到我们的scsi的存储设备上,这个存储设备本地有每个target,target上面有对应的逻辑单元,这个target接收下来之后,它会解码,首先它解掉FC的报文,解掉之后,它能够看到scsi的控制指令(由scsi控制器得到这个控制指令),得到这个控制指令以后,根据解码它所存储的是哪个逻辑单元,逻辑单元的哪一个存储空间当中(第几个地址编号当中),最终完成存储的

它会借助于这样一个专门用于实现传递,数据存取协议的网络,就叫做存储专用网络,(存储区域网络)

这种存储区域网络,由于基于了FC协议来实现,FC本身是可以方便的实现在多主机之间共享的,因为我们可以使用FC的交换机,它有多个接口,其中一个接口连上存储设备上,另外一个接口连到各个主机上,各个主机就可以使用同一个共享存储设备了,,所以它方便的实现了设备的共享,

FC代价高昂,组建一个专用的FC网络,需要的设备不仅仅指线缆本身,还需要很多额外的其它资源,所以总体运用成本很高,并且不能互用当下已有的网络,得需要专门另建

大约2001年的时候,IBM,惠普,Sys几家公司,联合起来研发一种协议,能够利用现在的TCP/IP网络,传输scsi报文的,就诞生了iscsi规范,,,,,无非就是使用一种物理方式来传输scsi报文而已,,,,,,协议分成的主要好处在于,它可以随意替换一个层次,而不至于影响其它层次,所以我们把ATAPI能够替换成FC,也很容易替换成其它的方式,所以iscsi就利用了这种机制,将底层ATAPI或者FC的这种物理传输机制改为由TCP/IP网络进行传输

image.png

image.png



FC双方两个主机要互相通信,这两个主机上的光网卡(光卡的口)必须要能够绑定,(initiator与target要通过光口绑定起来进行通信)

绑定跟我们的某个光交换机能够关联起来,,,,, 终于必须要能够利用光交换机进行通信的, 

它用的不是IP地址这种方式,,,,它们本身是光网络的传输机制,也是光网络的报文传送机制,

这是完全的另外一套技术,,,需要管理光网络,还需要专门的管理人员,还需要学习相关的协议,以及设备的管理知识,,这很复杂,成本很高,,,,,,所以我们要尽可能的复用当下已有的网络

iscsi也有同样的需求,它也需要一个主机,跟目标主机(存储设备)之间要建立联系,服务器端必须要能够工作在某个接口(监听在某个端口),随时接受对方传递过来的报文,TCP/IP网络实现这种功能的方式在于(TCP/IP网络它是基于IP报文来实现分组传送的,所以IP报文不可能实时在线,随便绑定一个接口,这个接口随时供它使用,这是不可能的)(所以在TCP/IP网络上,我们必须要通过一种服务,监听在某个套接字上的方式来实现)(我们还需要客户端,客户端发起请求,服务器端随时接受请求,),,,,,,,,,,,,,,,,,,,iscsi的客户端(initiator)和服务端(target)

image.png

image.png

下图图一是iscsi与FC在基本结构上的不同之处,

FC的架构:当我们基于FC SAN来实现传输数据报文的时候,需要的是一个光网卡,(光卡,就是光的HBA,是FC的主机适配器)

存储设备后端,前端与后端要基于FC的交换机(或scsi线缆)连起来,,,HBA是FC/SCSI控制器,如果我们要理解存储区域网络的话,我们不考虑SCSI控制器的话,这就是一个FC设备(所以它通过FC光缆,或者FC的技术,跟后端存储相连),,HBA的上端是SCSI(或者主机适配器的FC)的适配器驱动。所以我们的某一个应用程序想存储数据的时候,向我们的内核发起请求,内核发现存储的设备有FC驱动,完成通过这个设备向对方的主机(我们的存储网络)发起请求,

iscsi的架构: 如果发送的是一个存储TCP报文的话,打算把数据存储在另外一个存储设备上,,,,,,首先这个报文要有scsi驱动进行封装(封装scsi协议报文,包括scsi的各种指令,设备特有指令和通用指令),封装后再由iscsi drvier进行封装(这个封装是为了联系iscsi服务器端的,iscsi服务器端要能够理解iscsi driver的请求,并且将它报文拆掉,并能够看到里面的scsi driver所封装的报文),,,,,,然后封装为TCP/IP的报文,向外进行传输的

图一

image.png


image.png



对于iscsi协议而言,在客户端上,首先上面是文件系统(这是一个块级别的设备),它是基于scsi协议报文封装的,最终要转化为iscsi协议,由TCP/IP网络,借助于网络,传输给对方的TCP/IP协议站,对方收到后,发现要访问的是iscsi server,所以交给iscsi服务器端,解码以后存储到本地,它们不需要到应用程序层,就能够在内核中完成数据存储了(在存储设备内部,只要能解码TCP/IP协议就成)

内部是scsi报文(也包括iscsi),然后是TCP/IP的报文,再往后是通过Ethernet Frame (以太网帧)进行传输


image.png


能够实现存储功能的协议有: FC,ISCSI,FCoE,SAS

FCoE: FC on Ethernet  基于以太网的FC,不是通过光缆传输的,而是基于以太网的方式进行传输的.以太网本身背后所依赖的有可能仍然是光缆,,,但是它的整个工作协议是以太网的工作方式,,而不是光网的工作方式,,,,所以简单来讲,你可以把它理解成只是通过双绞线连接的,(以太网通常都是双纹线),,,,两台主机通过以太网实现了连接,,,,但是在以太网上层,它所传输的是FC报文,而不是iscsi报文 好处是见下图图二,FC从scsi这个层次上,封装完成之后,只有FC的驱动封装了,基于FC网络的时候,将直接传送给FC设备,,,,,,,FCoE还要再一次经过另外一层封装,叫做FCoE的封装,FCoE将我们的数据存储报文转为以太网帧,所以它可以直接在以太网上发送的,因为它是以太网帧,所以它只能在局域网内部发送,所以它中间不会经过TCP/IP协议封装,而仅仅是FC协议封装以后,直接借由以太网发送,因此我们可以把FCoE看成是把FC转换为以太网中间设备(一个转换协议),这样子,它是不是也借助于现有的以太网来实现数据报文的传送了,但是FCoE有一个要求,FCoE是sysko公司的一个独有的协议,FCoE要求你的以太网最起码是10G的(万兆以太网),因为我们的存储网络实现的那个带宽占用是非常的大,事实上有人测试发现,就算使用FCoE,仍然是使用以太网传输,在同样的硬件条件下,基于iscsi TCP/IP协议进行封装,和FCoE的方式进行封装,性能上差别并不明显,但是FCoE有个好处,它可以让sysko可以卖更多的设备了,所以可以和sysko公司分分利润,,,,,,,,,使用iscsi,它是一种开放协议规范,任何公司都可以使用,任何人不用交专利费,,,,,,,,,,,,,,,,,,,,,越公开,越开放,通常大家齐心协办会做得越好,iscsi发展的非常迅猛,(2001年到现在,十多年)IP SAN (iscsi)的这种存储方式,迅猛发展,目前来讲,实现存储区域网络三种方式:FC,iscsi,SRP(基于IB的这种方式来进行传输,IB是另外一种专用网络,它是一种专用的高速网络,也是有商业授权的,比FC(还是FCoE)更贵?? 我们只需了解就行 )

对我们而言,最现实的就是FC 或者 ISCSI



SAS:


图一

image.png


图二

image.png

image.png


ISCSI是一种廉价的方式,给我们中小企业或者期望降低总体应用成本的场景当中进行使用

image.png

image.png


FCoE 不等于 iSCSI

image.png

NAS:文件级别的存储,主要实现文件管理的文件系统在服务器端,对于NAS来讲,元数据,数据信息等文件系统的直接相关信息在服务器端的内核当中,,,我们的应用程序是通过网络文件系统的客户端,(比如nfs或cifs的客户端)(cifs协议,cifs在linux上是与samble相关的),,,,,通过网络向服务器端发起请求的,服务器端接受以后,,,,由这么一个server解码用户的请求,并在本地文件系统上完成操作,,,,,所以它的I/O操作在服务器端完成的(服务器端 Block I/O)



SAN 块级别的存储  对于SAN来说,除了服务器端有 Block I/O之外,客户端也有IO封装,因为文件系统是本地的,所以I/O在内核中操作是在本地内核中完成的,最终由TCP/IP协议(或者FC协议,或者其它协议)传递给服务器端,服务器端接受以后,它所能看到的其实是PCle(Fibre Channel FCoC,iSCSI)的协议报文,协议报文拆开以后,所看到的就是存储在某个硬盘上的存储指令,所以它还要在远程服务器上产生块IO(Block I/O)


DAS 也是块级别的存储,文件系统在本地内核当中(在客户端的内核当中),内核启动起来一定是在内核当中的,


由于SAN或DAS的方式,文件系统在客户端本地,所以它可以实现对文件系统的创建(分区,格式化),,,,,NAS是不允许的


尽管NAS没有SAN高级,但是经过优化的NAS,它的性能也不差,如果我们不打算在存储设备上装操作系统的话,仅仅是为了共享文件,NAS也不错,,,,NAS代价也高,差不多的便宜的设备也要十几万???

SAN 是模拟出来的传输更远距离的DAS

image.png


iscsi协议,下图是iscsi协议报文的封装,它是借助于TCP/IP网络封装了scsi的报文,scsi报文的外层又封装了iscsi报文,实现跟iscsi server 相联系的,

image.png


image.png


iscsi客户端到底如何与服务器端建立联系

iscsi客户端: initiator

iscsi服务器端: target,服务器端每一个共享出来的target(或者说存储控制芯片),称为一个target,一个target上可以连上多个逻辑设备,

我们的客户端如何完成单元协议的封装,(首先封装scsi命令,还要封装iscsi报文首部,还要封装TCP首部,还要封装IP首部,以太网帧),,,,,额外负载开销非常大,,,,,,,,,,,,,,,,,(我们只存了abc到一个文件里面,除了abc这个数据之外,多余的开销太大了,),,,,这些封装的操作,都需要有谁(scsi命令的封装应该由scsi驱动来完成,(如果scsi封装过程由一个软件来完成的话,,执行这个软件需要占据cpu时间,,,,,如果scsi封装由硬件来完成的,硬件的芯片里面直接就可以完成封装的,,,,,所以由软件完成的功能硬件都能完成,设计硬件的时候,直接完成这个硬件逻辑,因为它执行的就是一种执行逻辑而已,一般来讲大多数软件能完成的操作硬件都能完成,只不过,非常复杂的,很难用硬件实现而已但是要封装一个指令还是很简单的,,,,,,,,,)的参与,,,,,,,,,,,,,iscsi是既可用软件也可用硬件来实现,,,TCP是既可用软件也可用硬件来实现,,,IP是既可用软件也可用硬件来实现,,,,,,,,,,,,,,,在linux主机上,通常都是由软件来实现的,,,假如用硬件来实现就不占用cpu了)

image.png



iscsi的initiator有几种方式:

    第一种:采用内建scsi指令,以及TOE引擎的ASIC芯片的适配器,就种叫做iscsi的HBA卡,(TCP/IP的网卡),,这个网卡能够接入以太网,还有很多控制芯片,芯片级别就能够封装scsi指令(iscsi指令),,,,所以当我们需要传输一个报文的时候,这个报文请求直接交给这个芯片就可以了,不用交由cpu去执行,也就意味着我们不需要在内核中调用某一个内核模块在cpu上去运行了,而是我们的内核只需要将请求交给这个设备的驱动程序去执行就行了,,,,,,,,,,,,设备驱动与scsi驱动是两码事        它占用cpu 可能10%

(设备驱动可以称为scsi引擎,这样不会混淆),,,,,,,,,,,,,这种HBA卡非常贵的,动辄卖个1000块美元,

image.png


    第二种:iscsi的TOE卡,它也内置了TOE引擎,也内置了ASIC芯片,但是它的scsi指令仍以软件方式运作,只不过iscsi的某些封装在芯片上完成了,所以这是个折中方式,,,它占用cpu 可能40%,它便宜,大约200美元(或100多美元),性能比HBA差很多,

image.png

    

    第三种方式: 完全靠软件的方式来实现iscsi的initiator驱动程序,性能最差,最便宜,,,,,,linux内置的就有initiator的驱动程序,完全开源,可能会耗掉大量的cpu时钟周期,需要去封装各种协议报文,,,,,,,,,这种传输最终还要经过网卡传输,只需要借助于现有的以太网网卡就能传输的(几十块钱(十几块钱 当然是百兆)人民币就可以搞定了)

    image.png


iscsi的服务器怎么工作


    iscsi的服务器端到底是什么?它是纯硬件,还是?    

        我们的客户端与服务器端借助于以太网进行传输的,(如下图,客户端怎么知道右边是一个存储设备?),,以太网是IP报文,服务器端要监听在TCP/IP的某个套接字上,意味是一个服务,服务是用户空间的守护进程,它要监听在某个地址的某个端口上,UDP不靠谱,所以它们是基于TCP的,iscs协议监听在TCP协议的3260端口上,提供TCP/IP的服务的,

(我们的SSH如何工作的?连接是一直在线的,我们所有的命令借助于已经建立的通道就可以随时传输了,)

我们的iscsi报文传输应该是始终连接的(与web服务不一样),,,,这称为iscsi的会话,会话建立以后,这个通道就一直存在了,我们的报文就可以借助于这个通道,随时发送了,直到我们断开为止,

这两个会话之间首先建立的时候,应该是TCP/IP的会话,然后借助于TCP/IP会话,它里面采用的是iscsi报文,iscsi报文内部封装的又是scsi报文,

image.png


我们的服务器端,initiator,(虽然叫server,但事实上它是initiator,,因为server是用来存数据的server而已,)initiator端和我们的iscsi target端,两端之间建立会话了,(紫包的通道是个会话,里面的黄色部分叫iscsi connection连接,,我每发送一次数据,它就要在这个通道中传输一次数据,,所以说每发送一次数据,就需要建立一个连接,,而连接的外部是始终存在的iscsi会话),,,,可以有多个target,每个target需要一个initiator去连接,它们都可以使用软件的方式去模拟,,,如果使用硬件的话,很有可能(只是说很有可能,要看两个target是以什么方式连接起来的,)是两个iscsi设备

image.png


当会话建立以后,它里面的各个连接,就是每一次的数据传输,只需要在已有的会话当中就可以进行了,每一次的报文传过来的时候,都是封装好了的TCP/IP报文,这就意味着这个报文传输到右边(如下图)以后,首先得有一个机制,把这个TCP/IP报文接受下来,而且要看看目的主机是不是就是本机,,,如果是本机,它要拆掉IP首部,要看看它的TCP目标端口是什么,如果是TCP的 3260,,,,,,,那接下来,它要转给scsi服务,,,,监听在端口上的一定是个运行在用户空间的scsi服务,是一个守护进程,这个守护进程收下来之后,发现这是一个scsi存储请求,,,,,一旦发现这是个存储请求,就往本地进程存储了,,,,我们服务器本地有硬盘,就往硬盘上存数据,由此它调用本地的硬件设备驱动程序进行存储,,,, 事实上iscsi为了提高其工作性能,我们没把它工作在用户空间里,而是工作在内核内部的一个iscsi驱动,所以iscsi驱动收下来这个数据之后,最后解码出来是个scsi指令报文,最终它就存储在本地设备所对应的scsi设备上,

本地这个设备一定是scsi设备吗?不一定,虽然是个scsi指令,这个scsi指令只是由iscsi或者scsi完成数据存取控制机制的,当我发现这是一个数据存储指令以后,只需要转换成本地硬件设备的驱动程序存储在本地硬盘上就可以了,


我们的server端(scsi target端)需要不需要一个操作系统?需要,这个操作系统本身除了提供iscsi功能之外,还需要不需要让它提供别的功能? 不需要

很多公司提供的 scsi的服务器端 (target端)是一个极其简化的操作系统,它里面只具备了提供iscsi服务的基本功能和一些管理功能(管理命令,管理工具),,,这样一个设备,在TCP/IP网络和iscsi方面做了各种优化的,它的性能为了存储,专门做了优化,一般会比较好一点,,,,谁家公司生产的这样一个设备优化的好,性能佳,可能会卖得好一点,再便宜,会卖得更好

在服务器端的本地的存储上,很可能是个raid(raid,不会因为某个硬件的损坏而导致数据丢失的),raid上到底接的什么硬件设备(scsi,ide,sata,sas?都有可能),,,,,scsi整个报文的传输是在中间这个距离上的

image.png

image.png


如下图,iscsi的工作机制

服务器端: 右边服务器有一个程序处于工作状态,随时让我们的客户端连接进来的,(这就是iscsi的target),iscsi的target对应的设备很可能是一个简单的存储硬件,它要转交给服务器端本地的磁盘设备的驱动程序对应的硬件设备,对于本地而言,它很可能是本地的 /dev下的 sdb之类的(是我们的某个raid硬件),,,,对应在本地,很可能是一个存储设备,本地有很多磁盘,它很可能是一个硬件raid(好几个raid),比如我们做一个raid5,对于我们本地来讲,因为是硬件raid,所以可能会被识别成sdb,,,,,,,它是一个共享的存储设备,,所以sdb就连接到我们的raid5上了,,,,,同时,它可能还有其它的存储磁盘,比如 sda(有块硬盘,专门为本地提供操作系统的安装的空间),,,,

客户端: 我们的左边的客户端可能有多个,它主要是提供共享存储,所以可能有多个,每个客户端是怎么工作的呢?能够跟右边target联系的只能是initiator,initiator跟target建立联系,建立联系之后,每一个磁盘被识别成本地硬盘了,它会被输出为左边本地的sdb  (sdc),,跟远程可能不一定完全一致,它输出为一个硬件磁盘,我们本地可能有多个硬盘,自己有另外一个本地硬盘sda,接进了一个外来的就是sdb了,,,,左边下面的一个客户端有可能识别为 (sdc,sdd)都有可能,,,,,反正多台主机都可以关联进来进行使用的,,,,,每台主机上的scsi 可能表示方式不一定相同,但是,却可以使用同一种方式来跟我们的服务器端建立联系,,,,,这中间是我们的TCP/IP网络,


image.png

由此我们要想实现一个提供一个,iscsi存储,那该怎么办?(如果使用纯软件的方式来实现),,找一个主机,来扮演iscsi target,iscsi target本机上的连接有很大的存储空间,它有存储硬盘,把这个硬盘通过iscsi输出出去,,让我们的客户端找到这样一个硬件设备并在本地关联进来,登录进来使用,就可以了



如何安装iscsi 


服务端: iSCSI Target端: 需要安装一个服务程序 scsi-target-utils,叫utils,因为它只是一些工具,真正的服务是在内核中提供的,在我们的服务器端安装了 scsi-target-utils 之后,我们只需要配置一下我们哪个硬盘设备当作target,然后启动相关服务,监听在3260 端口上,就可以了,,,,,,,,,,,监听在3260端口上,谁能过来登录并访问呢?谁能访问我们的存储空间,并往里面存数据,,,我们又是可以共享的,,第一个主机存的数据,第二个主机是不是随时可以拿走并访问的,如果我们的数据私密性要求很高的话,别人会随意拿走恶意删除我们的数据的,,,所以我们不能简单的让别人随意访问我们的target,因此target需要验证客户端来源,

        客户端认证方式两种:

            1)基于IP,只开放给哪个IP网络中的主机访问,这个IP网络中的主机都能访问,也不太安全

            1)基于用户,基于chap的方式来认证, (CHAP: 挑战握手认证协议 (Challenge Handshake Authentication Protocol) ,它是双向认证.客户端能认证服务器端,服务器端能认证客户端.连接过去的时候,要存数据了,中间冒出一个假磁盘,你存吧,数据都放在我这儿了,拿走数据跑了,就麻烦了,,,我开了家银行,你存吧,,,,所以要双方认证,)


客户端: iSCSI Initiator端: iscsi-initiator-utils(一般在红帽系统上),它的源数据包是open-iscsi (开放的iscsi initiator)(它是开源的,不收费),iscsi驱动,让客户端能够连到 target 端,并使用 target 端所提供的硬件设备的



如何去配置使用iscsi,,,,,,,target端需要安装scsi-target-utils, iSCSI Initiator端需要安装iscsi-initiator-utils



三个节点当作 initiator

原来的steppingstone当作target,找设备(硬件raid设备,或软件raid设备,或一个分区),当作target的存储空间,输出给客户端


target机

[root@steppingstone ~]# fdisk -l        


Disk /dev/sda: 21.4 GB, 21474836480 bytes

255 heads, 63 sectors/track, 2610 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        2610    20860402+  8e  Linux LVM

[root@steppingstone ~]#

可以建一个分区,告诉别人是target,让别人用,别人来看,不是一个分区,而是一个硬盘


这是linux lvm,空间应该是分完了,,我自己重加个硬盘吧

image.png


# fdisk -l        看不到新加的硬盘,

# reboot         重启这个 target机看看吧


[root@steppingstone ~]# fdisk -l        #看到了sdb


Disk /dev/sda: 21.4 GB, 21474836480 bytes

255 heads, 63 sectors/track, 2610 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        2610    20860402+  8e  Linux LVM


Disk /dev/sdb: 107.3 GB, 107374182400 bytes

255 heads, 63 sectors/track, 13054 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


Disk /dev/sdb doesn't contain a valid partition table

[root@steppingstone ~]#

[root@steppingstone ~]# fdisk /dev/sdb

Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel

Building a new DOS disklabel. Changes will remain in memory only,

until you decide to write them. After that, of course, the previous

content won't be recoverable.



The number of cylinders for this disk is set to 13054.

There is nothing wrong with that, but this is larger than 1024,

and could in certain setups cause problems with:

1) software that runs at boot time (e.g., old versions of LILO)

2) booting and partitioning software from other OSs

   (e.g., DOS FDISK, OS/2 FDISK)

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)


Command (m for help): n

Command action

   e   extended

   p   primary partition (1-4)

e

Partition number (1-4): 4

First cylinder (1-13054, default 1):

Using default value 1

Last cylinder or +size or +sizeM or +sizeK (1-13054, default 13054):        #全部是扩展分区

Using default value 13054


Command (m for help): n         #创建第一个逻辑分区开始

Command action

   l   logical (5 or over)

   p   primary partition (1-4)

l

First cylinder (1-13054, default 1):

Using default value 1

Last cylinder or +size or +sizeM or +sizeK (1-13054, default 13054): +50G            #创建第一个逻辑分区结束


Command (m for help): p


Disk /dev/sdb: 107.3 GB, 107374182400 bytes

255 heads, 63 sectors/track, 13054 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


   Device Boot      Start         End      Blocks   Id  System

/dev/sdb4               1       13054   104856223+   5  Extended

/dev/sdb5               1        6080    48837537   83  Linux


Command (m for help): n           #创建第二个逻辑分区开始 

Command action

   l   logical (5 or over)

   p   primary partition (1-4)

l

First cylinder (6081-13054, default 6081):

Using default value 6081

Last cylinder or +size or +sizeM or +sizeK (6081-13054, default 13054): +20G        

   #创建第二个逻辑分区结束



Command (m for help): w    #保存退出

The partition table has been altered!


Calling ioctl() to re-read partition table.

Syncing disks.

[root@steppingstone ~]#

[root@steppingstone ~]# partprobe /dev/sdb

[root@steppingstone ~]#

不要对磁盘分区进行格式化



在跳板机 192.168.0.100 上安装服务器端

[root@steppingstone ~]# mount /dev/cdrom /media/cdrom/

mount: block device /dev/cdrom is write-protected, mounting read-only

[root@steppingstone ~]#

[root@steppingstone ~]# yum install scsi-target-utils        #安装 scsi-target-utils    

image.png


[root@steppingstone ~]# rpm -ql scsi-target-utils        #看生成了哪些文件

/etc/rc.d/init.d/tgtd            #服务器端,服务,监听在3260端口

/etc/sysconfig/tgtd

/etc/tgt/targets.conf

/usr/sbin/tgt-admin            #通过编辑文件targets.conf,配置一个target,几个LUN,然后一启动服务,它会自动读取targets.conf,并生成target和LUN的工具 

/usr/sbin/tgt-setup-lun            

/usr/sbin/tgtadm                #纯命令行方式下创建target,创建LUN的一个工具

/usr/sbin/tgtd                     

/usr/sbin/tgtimg

/usr/share/doc/scsi-target-utils-1.0.14

/usr/share/doc/scsi-target-utils-1.0.14/README

/usr/share/doc/scsi-target-utils-1.0.14/README.iscsi

/usr/share/doc/scsi-target-utils-1.0.14/README.iser

/usr/share/doc/scsi-target-utils-1.0.14/README.lu_configuration

/usr/share/doc/scsi-target-utils-1.0.14/README.mmc

/usr/share/man/man8/tgt-admin.8.gz

/usr/share/man/man8/tgt-setup-lun.8.gz

/usr/share/man/man8/tgtadm.8.gz

[root@steppingstone ~]#

启动 target 服务



[root@steppingstone ~]# service tgtd start        #启动 scsi target 服务

Starting SCSI target daemon: Starting target framework daemon


[root@steppingstone ~]# 

[root@steppingstone ~]# netstat -tnlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name

tcp        0      0 127.0.0.1:2208              0.0.0.0:*                   LISTEN      3821/./hpiod

tcp        0      0 0.0.0.0:2049                0.0.0.0:*                   LISTEN      -

tcp        0      0 0.0.0.0:712                 0.0.0.0:*                   LISTEN      3924/rpc.rquotad

tcp        0      0 0.0.0.0:687                 0.0.0.0:*                   LISTEN      3473/rpc.statd

tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      3423/portmap

tcp        0      0 0.0.0.0:753                 0.0.0.0:*                   LISTEN      3966/rpc.mountd

tcp        0      0 0.0.0.0:41428               0.0.0.0:*                   LISTEN      -

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      3844/sshd

tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      3858/cupsd

tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      4069/sendmail

tcp        0      0 0.0.0.0:3260                0.0.0.0:*                   LISTEN      4530/tgtd        # target 服务

tcp        0      0 127.0.0.1:2207              0.0.0.0:*                   LISTEN      3826/python

tcp        0      0 :::22                       :::*                        LISTEN      3844/sshd

tcp        0      0 :::3260                     :::*                        LISTEN      4530/tgtd

[root@steppingstone ~]#

[root@steppingstone ~]# chkconfig --list tgtd

tgtd            0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

[root@steppingstone ~]# chkconfig tgtd on    #开机自动启动

[root@steppingstone ~]# chkconfig --list tgtd

tgtd            0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

[root@steppingstone ~]#


[root@steppingstone ~]# tgtadm -h    #这是一个纯命令行工具  这是一个模式化的命令

        # --mode 指定模式

Usage: tgtadm [OPTION]

Linux SCSI Target Framework Administration Utility, version


  --lld <driver> --mode target --op new --tid <id> --targetname <name>

                        add a new target with <id> and <name>. <id> must not be zero.

                     # 操作 target 的    --op 就是operation 操作  new 新建一个target,,, delete 删除一个target,,,, show显示所有target ,,,, update 更新一个target ,,,bind 绑定一个target

  --lld <driver> --mode target --op delete --tid <id>

                        delete the specific target with <id>. The target must

                        have no activity.

  --lld <driver> --mode target --op show                       

                        show all the targets.

  --lld <driver> --mode target --op show --tid <id>

                        show the specific target's parameters.

  --lld <driver> --mode target --op update --tid <id> --name <param> --value <value>

                        change the target parameters of the specific  

                        target with <id>.

  --lld <driver> --mode target --op bind --tid <id> --initiator-address <src>    #将某个initiator的ip地址跟target绑定, 是做ip地址授权的;;;;能够让基于哪个ip地址的initiator来访问这个target

                        enable the target to accept the specific initiators.

  --lld <driver> --mode target --op unbind --tid <id> --initiator-address <src>        #解除绑定

                        disable the specific permitted initiators.

  --lld <driver> --mode logicalunit --op new --tid <id> --lun <lun> \        #逻辑单元  logicalunit 一定是某个target上的logicalunit,,,,,new创建的时候,一定要在某个已经有的 target上面进行new,每一个logicalunit 上面有个逻辑单元号 lun,对应的既然叫logicalunit,它的后端存储设备是 --backing-store? 每一个logicalunit对应的是有个逻辑设备,这个逻辑设备可能对应的是实实在在的某个物理硬盘,也可能是一个物理硬盘分区,也可能是一个lvm  

                        --backing-store <path> --bstype <type> --bsoflags <options>

                        add a new logical unit with <lun> to the specific

                        target with <id>. The logical unit is offered

                        to the initiators. <path> must be block device files

                        (including LVM and RAID devices) or regular files.

                        bstype option is optional.

                        bsoflags supported options are sync and direct

                        (sync:direct for both).

  --lld <driver> --mode logicalunit --op delete --tid <id> --lun <lun>    #    --lld <driver>  指的是驱动??  delete 一个logicalunit逻辑单元         --lld <driver>参数指定驱动类型

                        delete the specific logical unit with <lun> that

                        the target with <id> has.

  --lld <driver> --mode account --op new --user <name> --password <pass>    #基于用户的认证,绑定帐号的,关联用户的   new一个帐号

                        add a new account with <name> and <pass>.

  --lld <driver> --mode account --op delete --user <name>    #delete一个帐号

                        delete the specific account having <name>.

  --lld <driver> --mode account --op bind --tid <id> --user <name> [--outgoing]

                        add the specific account having <name> to    # new一个帐号之后要绑定

                        the specific target with <id>.

                        <user> could be <IncomingUser> or <OutgoingUser>.

                        If you use --outgoing option, the account will

                        be added as an outgoing account.

  --lld <driver> --mode account --op unbind --tid <id> --user <name>    #解绑一个帐号

                        delete the specific account having <name> from specific

                        target.

  --control-port <port> use control port <port>

  --help                display this help and exit


Report bugs to <stgt@vger.kernel.org>.

[root@steppingstone ~]#


tgtadm 模式化的命令

      常用的三个

            1) target  --op

                        new,delete,show,update,bind,unbind

            2) logicalunit    --op 

                        new 和 delete,                        

            3) account    --op

                        new,delete,bind,unbind

 

    通常额外的选项

            1) --tid,指定tid号

            2) --lun,指定逻辑单元号

            3) --back-store,指定后端存储设备

            4) --user,指定用户名

            5) --password,指定密码的

    targetname: 如何命名,因为将来我们真正的在存储区域网络里面,存储设备(target)很多,为了识别,才起个名称,要做到见名知义,一看名称就知道哪个机器上的存储设备,还要做到与其它主机上的target不重复

        起名规范,iqn,target iscsi 的唯一标识名

        iqn: (iscsi qualified name) 全局唯一的标识名,iscsi的合格名称(限定名称)

        规范一般这样 iqn.yyyy-mm.<reversed domain name>[:identifier] 哪一年哪一月创建的,公司域名反过来写,,,(比如 .com.magedu),,,,,,[:identifier]这个唯一的身份标识,可以省略的                            例子 iqn.2013-05.com.magedu:tstore.disk1


[root@steppingstone ~]# man tgtadm        # 好多选项有短格式  这个帮助文档里面有一大堆示例,可以搜到Example看看

-t --tid    tid,指定target的id?  

-l --lun    逻辑单元号

-b --backing-store <path>        #存储路径

-L --lld     指的是驱动??

-I --initiator-address <address> 指定某target时,使用哪个ip绑定,就是哪个initiator的ip能够访问这个target吧

-T --targetname <targetname>    # 创建target的时候,它可以有个名称

image.png



在跳板机 192.168.100 上

[root@steppingstone ~]# fdisk -l


Disk /dev/sda: 21.4 GB, 21474836480 bytes

255 heads, 63 sectors/track, 2610 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        2610    20860402+  8e  Linux LVM


Disk /dev/sdb: 107.3 GB, 107374182400 bytes

255 heads, 63 sectors/track, 13054 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


   Device Boot      Start         End      Blocks   Id  System

/dev/sdb4               1       13054   104856223+   5  Extended

/dev/sdb5               1        6080    48837537   83  Linux    #这个分区我们输出出去,我们平时在公司里的时候,最好是用一个硬盘,不用做分区,直接输出出去;;;;我们这里因为没有加虚拟硬盘,所以用一个分区来替代了

/dev/sdb6            6081        8513    19543041   83  Linux


在跳板机 192.168.100 上

[root@steppingstone ~]#


在跳板机 192.168.100 上

[root@steppingstone ~]# tgtadm --lld iscsi --mode target --op new --targetname iqn.2013-05.com.magedu:teststore.disk1 --tid 1

#--lld (-L) 后面跟的是驱动;可能是isns??,我们一般用iscsi,;;--mode 指定模式为target,,--op 指定操作 new 表示新建一个 target, ,--target-name 指定target名称,,,,,,,,,,;;;--tid指定唯一的编号,不要使用tid 为 0,,,0是保留数字,保留给当前主机自己使用的

[root@steppingstone ~]#

[root@steppingstone ~]# tgtadm --lld iscsi --mode target --op show

Target 1: iqn.2013-05.com.magedu:teststore.disk1        #这是target 1 ,另外一个分区sdb6也输出出去,再建一个target就可以了

    System information:

        Driver: iscsi

        State: ready        #state 己经 ready了

    I_T nexus information:

    LUN information:

        LUN: 0    #这里逻辑单元号是0,,是我们模拟的target的target自己所占据的lun号码,,一个target上最多只能有32个(16个)LUN        #这个LUN 0,,,,0为target自己所占用

            Type: controller

            SCSI ID: IET     00010000

            SCSI SN: beaf10

            Size: 0 MB, Block size: 1

            Online: Yes

            Removable media: No

            Readonly: No

            Backing store type: null

            Backing store path: None

            Backing store flags:

    Account information:    # 没有绑定任何帐户

    ACL information:    # 没有绑定任何 initiator 的IP地址

[root@steppingstone ~]#

新建一个target的时候,并没有关联到哪个设备,target只是模拟了一个控制芯片,

我们当前这个target如果能够被别人使用,它应该关联到一个存储设备上去,所以我们应该关联一个存储设备到一个target上,关联到它的LUN上,LUN 0 己经被占用了,所以我们要从 1 开始,,,,所以我们要new 一个LUN ( logicalunit )


[root@steppingstone ~]# tgtadm --lld iscsi --mode logicalunit --op new --tid 1 --lun 1 --backing-store /dev/sdb5

[root@steppingstone ~]#

# --lld 后面跟驱动 iscsi ,,--mode 后面跟模式 logicalunit    --op 后面跟操作  new ,,,,,,--tid 1 指定在哪个target上面new ,,,任何一个逻辑单元,应该是属于某个target的逻辑单元,--lun 1,指定自己这个逻辑单元的单元号(因为0已经被占用了),,,现在新建的lun 1 是这个target上的第一个lun,    这个lun应该有个真正的存储设备挂载进来,因为每个lun就是一个存储设备 --backing-store /dev/sdb5


在跳板机 192.168.100 上

[root@steppingstone ~]# tgtadm --lld iscsi --mode target --op show               #再看下target 

  Target 1: iqn.2013-05.com.magedu:teststore.disk1

    System information:

        Driver: iscsi

        State: ready

    I_T nexus information:

    LUN information:

        LUN: 0            #这说明 LUN 0,说明 LUN 0 , 我们自己用的是一个控制器

            Type: controller    #类型为controller

            SCSI ID: IET     00010000

            SCSI SN: beaf10

            Size: 0 MB, Block size: 1

            Online: Yes

            Removable media: No

            Readonly: No

            Backing store type: null    #后备存储器类型 为 null,因为它不是存储空间

            Backing store path: None

            Backing store flags:

        LUN: 1        #这个 LUN 1 是我们自己建的,,,,,,,LUN 1 就是磁盘

            Type: disk    #类型为disk

            SCSI ID: IET     00010001

            SCSI SN: beaf11

            Size: 50010 MB, Block size: 512        #大小是50G,块大小是 512字节

            Online: Yes    #在线,能够被访问

            Removable media: No    #可以直接拔掉这个设备,否,,,,,不可热插拔

            Readonly: No        #只读的,否

            Backing store type: rdwr        #Backing store type: 后备存储器类型 rdwr,就是读read 和写 write 都可以

            Backing store path: /dev/sdb5        #真正的对应的存储设备路径, /dev/sdb5     

            Backing store flags:        #没有任何额外的标志

    Account information:    #没有绑定任何帐户

    ACL information:    #没有绑定任何ACL

[root@steppingstone ~]#

要授权给某个initiator使用的话,就是绑定ACL了,


实现基于IP的认证,如何使用?得先基于绑定模式,将某个initiator address  跟某个target绑定起来



[root@steppingstone ~]# tgtadm --lld iscsi --mode target --op bind --tid 1 --initiator-address 192.168.0.0/24

# --lld iscsi 指定驱动为iscsi --mode target 指定模式为target ,--op bind 指定操作为bind, 后面 --tid 1 就是表示绑定的target 为1,--initiator-address 192.168.0.0/24 表示绑定的客户端(initiator)的IP地址,让这个网段(或IP)的机器来使用



[root@steppingstone ~]# tgtadm --lld iscsi --mode target --op show    #再看下show

Target 1: iqn.2013-05.com.magedu:teststore.disk1

    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

            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: 50010 MB, Block size: 512

            Online: Yes

            Removable media: No

            Readonly: No

            Backing store type: rdwr

            Backing store path: /dev/sdb5

            Backing store flags:

    Account information:

    ACL information:        #由此可见,可供这个网段内的所有主机访问,,,,,想不让它访问了,就unbind吧

        192.168.0.0/24

[root@steppingstone ~]#


在第一个客户端 192.168.0.45 上  ( 第二个客户端  192.168.0.55 上,第三个客户端 192.168.0.65 上也要安装吧 )

[root@node1 ~]# yum -y install iscsi-initiator-utils

Loaded plugins: product-id, security, subscription-manager

This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.

Cluster                                                  | 1.5 kB     00:00

ClusterStorage                                           | 1.5 kB     00:00

VT                                                       | 1.3 kB     00:00

cdrom                                                    | 1.5 kB     00:00

Setting up Install Process

Package iscsi-initiator-utils-6.2.0.872-16.el5.i386 already installed and latest version    #已经装过了iscsi-initiator-utils

Nothing to do

[root@node1 ~]#


[root@node1 ~]# rpm -ql iscsi-initiator-utils

/etc/iscsi

/etc/iscsi/iscsid.conf                       # 配置文件

/etc/logrotate.d/iscsiuiolog           # 

/etc/rc.d/init.d/iscsi                   # 服务脚本,只需启动它,会自动启动 iscsid 

/etc/rc.d/init.d/iscsid                 # 服务脚本

/sbin/iscsi-iname                       # 

/sbin/iscsiadm                           # 客户端管理工具

/sbin/iscsid                           # 启动iscsi功能的      客户端发现服务器端以后要始终与服务器端建立一个连接,所以它也需要一个服务???????                                            

/sbin/iscsistart                      # 也是启动iscsi功能的               

/sbin/iscsiuio

/usr/include/fw_context.h            #头文件

/usr/include/iscsi_list.h           #头文件

/usr/include/libiscsi.h           #头文件

/usr/lib/libfwparam.a            #库

/usr/lib/libiscsi.so           #库

/usr/lib/libiscsi.so.0           #库

/usr/lib/python2.4/site-packages/libiscsimodule.so

/usr/share/doc/iscsi-initiator-utils-6.2.0.872

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/README

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/annotated.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/doxygen.css

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/doxygen.png

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/files.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/functions.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/functions_vars.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/globals.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/globals_defs.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/globals_enum.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/globals_eval.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/globals_func.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/globals_vars.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/index.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/libiscsi_8c.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/libiscsi_8h-source.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/libiscsi_8h.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/namespaces.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/namespacesetup.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/pylibiscsi_8c.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/setup_8py.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/structPyIscsiChapAuthInfo.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/structPyIscsiNode.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/structlibiscsi__auth__info.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/structlibiscsi__chap__auth__info.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/structlibiscsi__context.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/structlibiscsi__network__config.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/structlibiscsi__node.html

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/tab_b.gif

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/tab_l.gif

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/tab_r.gif

/usr/share/doc/iscsi-initiator-utils-6.2.0.872/html/tabs.css

/usr/share/man/man8/iscsi-iname.8.gz

/usr/share/man/man8/iscsiadm.8.gz

/usr/share/man/man8/iscsid.8.gz

/usr/share/man/man8/iscsistart.8.gz

/usr/share/man/man8/iscsiuio.8.gz

/var/lib/iscsi

/var/lib/iscsi/ifaces            #ifaces: interfaces 的简写,表示各网卡接口,你要跟target端建立联系,假如说有5块网卡,到底应用用哪一块呢,,,,,,,,用通过哪些网卡去联系target

/var/lib/iscsi/isns              # 统一命名方式,暂时不管它了,           

/var/lib/iscsi/nodes            #节点,本地节点

/var/lib/iscsi/send_targets            #向target发送指令的,发送命令,告诉我,你要在的话,跟我说一声,等等

/var/lib/iscsi/slp

/var/lib/iscsi/static

/var/lock/iscsi

[root@node1 ~]#

[root@node1 ~]# iscsi-iname    # initiator的名字,与target一样,也是唯一性的标识吧

iqn.1994-05.com.redhat:598d4dcc3964

[root@node1 ~]#

[root@node1 ~]#  iscsi-iname        # 会自动帮我们生成一个随机的名称

iqn.1994-05.com.redhat:e2bb23c2b6

[root@node1 ~]#  iscsi-iname

iqn.1994-05.com.redhat:6afc490a18

[root@node1 ~]#

[root@node1 ~]#  iscsi-iname -p iqn.2013-05.com.magedu            # 指定前缀的随机 -p 就是 prefix的意思吧,,,,,这个 -p 前缀的名称需要保留在配置文件当中的

iqn.2013-05.com.magedu:a57c24ef1a

[root@node1 ~]# 

[root@node1 ~]# vim /etc/iscsi/initiatorname.iscsi

InitiatorName=iqn.1994-05.com.redhat:c8a48d0f435


[root@node1 ~]# echo "InitiatorName=`iscsi-iname -p iqn.2013-05.com.magedu`" > /etc/iscsi/initiatorname.iscsi        #编辑这个配置文件吧

[root@node1 ~]#

[root@node1 ~]# cat /etc/iscsi/initiatorname.iscsi

InitiatorName=iqn.2013-05.com.magedu:ebf32f4b5bb

[root@node1 ~]#


在第二个节点 192.168.0.55 上 

[root@node2 ~]# cd /etc/iscsi/

[root@node2 iscsi]# 

[root@node2 iscsi]# ls

initiatorname.iscsi  iscsid.conf

[root@node2 iscsi]#

[root@node2 iscsi]# cat initiatorname.iscsi        #也要改一下吧

InitiatorName=iqn.1994-05.com.redhat:c8a48d0f435

[root@node2 iscsi]#



在第一个客户端 192.168.0.45 上

[root@node1 ~]# vim /etc/iscsi/initiatorname.iscsi

InitiatorName=iqn.2013-05.com.magedu:ebf32f4b5bb

InitiatorAlias=node1.magedu.com        #取个别名




在第一个节点 192.168.0.45 上 

[root@node1 ~]# iscsiadm -h

# -m 是模式化命令 -m 表地 mode 模式吧

iscsiadm -m discoverydb [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type -p ip:port -I ifaceN ... [ -Dl ] ] | [ [ -p ip:port -t type] [ -o operation ] [ -n name ] [ -v value ] [ -lD ] ]        #模式 discoverydb

iscsiadm -m discovery [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type -p ip:port -I ifaceN ... [ -l ] ] | [ [ -p ip:port ] [ -l | -D ] ]    #模式 discovery

iiscsiadm -m node [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ -S ] [ [ -T targetname -p ip:port -I ifaceN ] [ -l | -u | -R | -s] ] [ [ -o  operation  ] [ -n name ] [ -v value ] ]        #模式 node

iscsiadm -m session [ -hV ] [ -d debug_level ] [ -P  printlevel] [ -r sessionid | sysfsdir [ -R | -u | -s ] [ -o operation ] [ -n name ] [ -v value ] ]    #模式 session

iscsiadm -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename | -H hostno|MAC ] [ [ -o  operation  ] [ -n name ] [ -v value ] ]    #模式 iface

iscsiadm -m fw [ -l ]    #模式 fw firewall 现在好像不支持了

iscsiadm -m host [ -P printlevel ] [ -H hostno|MAC ]    # 模式 host

iscsiadm -k priority

[root@node1 ~]#


iscsiadm 也是一个模式化的命令

    -m  {discover|node|session|iface}        #模式常用这4个,  -m 指的是 mode 模式的简写

                discover: (最常用)发现,找找某服务器上有没有target输出,以及输出了哪些target (访问target,首先得发现)

                node: (最常用)管理跟某target的关联关系,自己作为一个节点,跟我们的服务器端建立关联关系的(也包括解除关联关系,删除此前关联的时候生成的数据库文件等等)

                session: 会话管理,通常是指会话查看

                iface: 接口管理,.接口查看




[root@node1 ~]# man iscsiadm

 iscsiadm -m discovery [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I

       iface -t type -p ip:port [ -l ] ]         |             [ [ -p ip:port ] [ -l | -D ] ](可以直接用后面这一组)

 # [ -hV ]用得不多 -h是帮助的

# -d debug_level  指定调试级别 一般0-8,就是你在discovery的时候,它给你输出多少信息的

 #  -P printlevel 显示出来多少信息的,在node模式下,它是显示树状格式结构的信息,       

             -P,  --print=printlevel

              If  in  node mode print nodes in tree format. If in session mode

              print sessions in tree format. If in discovery  mode  print  the

              nodes in tree format.

 # -I  iface 表示通过哪个接口向外输出的

 #  -t type 类型,去发现的时候的方式(找人,可电话,可敲门,这叫type)

        对于iscsi常用三种 SendTargets(对我们而言,只有它,而且可以简写为st), SLP, and iSNS.

        DISCOVERY TYPES

               iSCSI defines 3 discovery types: SendTargets, SLP, and iSNS.

 # -p ip:port  服务器的ip地址是什么,端口是什么(不指定的话,默认3260)

# [ [ -p ip:port ] [ -l | -D ] ](可以直接用后面这一组,,,但这一组用得不多)   -D 表示 -m discovery?????又好像不是 


例子: iscsiadm -m discovery -d 2 -t st -p 192.168.0.100  #发现target端的例子


image.png


在第一个客户端 192.168.0.45 上  

[root@node1 ~]# service iscsi restart        #先启动服务

iscsiadm: No matching sessions found

Stopping iSCSI daemon:

iscsid 已停                                                [确定]

Starting iSCSI daemon:                                     [确定]

                                                           [确定]

设置 iSCSI 目标:iscsiadm: No records found

                                                           [确定]

[root@node1 ~]#

[root@node1 ~]# iscsiadm -m discovery -t sendtargets -p 192.168.0.100        # 我为什么没有发现target 

image.png

#马哥发现了

image.png

我为什么没有发现target呢,,在 target所在的主机上执行下面的三个命令就可以了

# tgtadm --lld iscsi --mode target --op new --targetname iqn.2013-05.com.magedu:teststore.disk1 --tid 1

# tgtadm --lld iscsi --mode logicalunit --op new --tid 1 --lun 1 --backing-store /dev/sdb5

# tgtadm --lld iscsi --mode target --op bind --tid 1 --initiator-address 192.168.0.0/24

当然target所在的服务器同时应当

# service tgtd start      




在第一个客户端 192.168.0.45 上  

[root@node1 ~]# iscsiadm -m discovery -t sendtargets -p 192.168.0.100:3260

192.168.0.100:3260,1 iqn.2013-05.com.magedu:teststore.disk1

[root@node1 ~]# 

[root@node1 ~]# ls /var/lib/iscsi/

ifaces  isns  nodes  send_targets  slp  static

[root@node1 ~]#

[root@node1 ~]# ls /var/lib/iscsi/send_targets/        # 有数据了,子目录    发现的服务器的ip地址和端口

192.168.0.100,3260

[root@node1 ~]#

[root@node1 ~]# ls /var/lib/iscsi/send_targets/192.168.0.100,3260/        #目录下的内容  iqn 有了, 这就是discovery数据库(发现数据库)

iqn.2013-05.com.magedu:teststore.disk1,192.168.0.100,3260,1,default  st_config

[root@node1 ~]#

所以说一旦 discovery 发现之后,,,数据就会记录下来了,将来不想用了,想重新发现,得清掉相关的数据


登录到这个服务器上,并使用其存储设备

[root@node1 ~]# iscsiadm -h

iscsiadm -m discoverydb [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type -p ip:port -I ifaceN ... [ -Dl ] ] | [ [ -p ip:port -t type] [ -o operation ] [ -n name ] [ -v value ] [ -lD ] ]

iscsiadm -m discovery [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type -p ip:port -I ifaceN ... [ -l ] ] | [ [ -p ip:port ] [ -l | -D ] ]

iiscsiadm -m node [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ -S ] [ [ -T targetname -p ip:port -I ifaceN ] [ -l | -u | -R | -s] ] [ [ -o  operation  ] [ -n name ] [ -v value ] ]

iscsiadm -m session [ -hV ] [ -d debug_level ] [ -P  printlevel] [ -r sessionid | sysfsdir [ -R | -u | -s ] [ -o operation ] [ -n name ] [ -v value ] ]

iscsiadm -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename | -H hostno|MAC ] [ [ -o  operation  ] [ -n name ] [ -v value ] ]

iscsiadm -m fw [ -l ]

iscsiadm -m host [ -P printlevel ] [ -H hostno|MAC ]

iscsiadm -k priority

[root@node1 ~]#


iiscsiadm -m node [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -L all,manual,automatic ] | [ -U all,manual,automatic ] 

iiscsiadm -m node [ [ -T targetname -p ip:port -I ifaceN ] [ -l | -u ] ] [ [ -o  operation  ] [ -n name ] [ -v value ] ]

 # -L all,manual,automatic 表示登录,all表示登录所有target?manual是手动登录,automatic是自动登录

#  -U 表示登出

#  -S  表示 show

# -T targetname   表示登录到哪个target上

#  -p ip:port 表示哪个服务器上的target

# -I ifaceN 哪个网卡去登录????

# -l 表示登录 login

# -u 表示 登出 unlogin,logout

# -R 表示 rescan 

# -s  表示stats, 显示session的统计数据的,与登录是没有关系的

[root@node1 ~]# man iscsciadm

#  -L, --loginall==[all|manual|automatic]        #登录到所有的target上,登录到target上表示识别为本机存储设备,直接可以使用了, iscsci的initiator,登录表示把远程服务器上的target对应的LUN关联到本机,以后它就会识别成本机的一个存储设备了,

# -U, --logoutall==[all,manual,automatic]        #与-L相对应的,登出所有,与-L不能同时使用吧

# -S, --show 显示

# -o,  表示操作,看帮助文档,与数据库相关的,(比如登录了也登出了,发现这东西对我没有用,我不打算登录它了,数据库里面发现的条目应该删除,)

            -o, --op=op 

                    Specifies a database operator op. op must be one of new, delete,

                      update, show or nonpersistent.

                    # delete (用得比较多)删除此前发现的对应的那个target的数据库的,

                    # update 更新

                    # show  显示

                    # new 表示自己为数据库创建一个条目的

# -n name     #发现每一个target之后,要有一大堆条目,等一会儿新建的时候(new一个相关数据库条目的时候,要使用-n 指定条目的名字的,,,比如指定iface网卡接口是什么,?????指定发现的target是什么?????,)        

       -n, --name=name

              Specify a field name in a record. For use with the update opera-

              tor.

# -v value         #op为update更新时(应该还有new时)指定某个参数的某个值

            

            -v, --value=value

                 Specify a value for use with the update operator.


                  This option is only valid for node mode.


image.png



在第一个客户端 192.168.0.45 上

[root@node1 ~]# iscsiadm -m node -T iqn.2013-05.com.magedu:teststore.disk1 -p 192.168.0.100 -l        #进行登录,由下面提示 successful

Logging in to [iface: default, target: iqn.2013-05.com.magedu:teststore.disk1, portal: 192.168.0.100,3260] (multiple)

Login to [iface: default, target: iqn.2013-05.com.magedu:teststore.disk1, portal: 192.168.0.100,3260] successful.

[root@node1 ~]#

[root@node1 ~]# fdisk -l


Disk /dev/sda: 21.4 GB, 21474836480 bytes

255 heads, 63 sectors/track, 2610 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        2610    20860402+  8e  Linux LVM


Disk /dev/sdb: 21.4 GB, 21474836480 bytes

255 heads, 63 sectors/track, 2610 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


   Device Boot      Start         End      Blocks   Id  System

/dev/sdb1               1        2610    20964793+   5  Extended

/dev/sdb5               1         200     1606437   8e  Linux LVM

/dev/sdb6             201         323      987966   83  Linux


Disk /dev/sdc: 50.0 GB, 50009637888 bytes        # 看到了50G的硬盘,,在服务器上是一个分区,这里客户端识别为一个硬盘,完全可以分区格式化

64 heads, 32 sectors/track, 47692 cylinders

Units = cylinders of 2048 * 512 = 1048576 bytes


Disk /dev/sdc doesn't contain a valid partition table

[root@node1 ~]# 


[root@node1 ~]# fdisk /dev/sdc

Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel

Building a new DOS disklabel. Changes will remain in memory only,

until you decide to write them. After that, of course, the previous

content won't be recoverable.



The number of cylinders for this disk is set to 47692.

There is nothing wrong with that, but this is larger than 1024,

and could in certain setups cause problems with:

1) software that runs at boot time (e.g., old versions of LILO)

2) booting and partitioning software from other OSs

   (e.g., DOS FDISK, OS/2 FDISK)

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)


Command (m for help): n

Command action

   e   extended

   p   primary partition (1-4)

p

Partition number (1-4): 1

First cylinder (1-47692, default 1):

Using default value 1

Last cylinder or +size or +sizeM or +sizeK (1-47692, default 47692): +2G


Command (m for help): w        #保存退出

The partition table has been altered!


Calling ioctl() to re-read partition table.

Syncing disks.

[root@node1 ~]#


[root@node1 ~]# partprobe /dev/sdc    #重读分区表

[root@node1 ~]#

[root@node1 ~]# fdisk -l


Disk /dev/sda: 21.4 GB, 21474836480 bytes

255 heads, 63 sectors/track, 2610 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        2610    20860402+  8e  Linux LVM


Disk /dev/sdb: 21.4 GB, 21474836480 bytes

255 heads, 63 sectors/track, 2610 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


   Device Boot      Start         End      Blocks   Id  System

/dev/sdb1               1        2610    20964793+   5  Extended

/dev/sdb5               1         200     1606437   8e  Linux LVM

/dev/sdb6             201         323      987966   83  Linux


Disk /dev/sdc: 50.0 GB, 50009637888 bytes

64 heads, 32 sectors/track, 47692 cylinders

Units = cylinders of 2048 * 512 = 1048576 bytes


   Device Boot      Start         End      Blocks   Id  System

/dev/sdc1               1        1908     1953776   83  Linux

[root@node1 ~]#


[root@node1 ~]# mkfs.ext3 /dev/sdc1            #格式化

mke2fs 1.39 (29-May-2006)

Filesystem label=

OS type: Linux

Block size=4096 (log=2)

Fragment size=4096 (log=2)

244320 inodes, 488444 blocks

24422 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=503316480

15 block groups

32768 blocks per group, 32768 fragments per group

16288 inodes per group

Superblock backups stored on blocks:

        32768, 98304, 163840, 229376, 294912


Writing inode tables: done

Creating journal (8192 blocks): done

Writing superblocks and filesystem accounting information: done


This filesystem will be automatically checked every 27 mounts or

180 days, whichever comes first.  Use tune2fs -c or -i to override.

[root@node1 ~]#


[root@node1 ~]# mount /dev/sdc1 /mnt

[root@node1 ~]#

[root@node1 ~]# cp /etc/issue /mnt

[root@node1 ~]#

[root@node1 ~]# ls /mnt

issue  lost+found

[root@node1 ~]#

[root@node1 ~]# umount /mnt        #卸载

[root@node1 ~]#



在第二个节点 192.168.0.55 上,

[root@node2 ~]# cd /etc/iscsi/

[root@node2 iscsi]# ls

initiatorname.iscsi  iscsid.conf

[root@node2 iscsi]# 

[root@node2 iscsi]# vim initiatorname.iscsi        #编辑initiatorname.iscsi    

InitiatorName=iqn.2013-05.com.magedu.com:node2

[root@node2 iscsi]# service iscsi restart              #启动 iscsi

iscsiadm: No matching sessions found

Stopping iSCSI daemon:

iscsid 已停                                                [确定]

Starting iSCSI daemon:                                     [确定]

                                                           [确定]

设置 iSCSI 目标:iscsiadm: No records found

                                                           [确定]

[root@node2 iscsi]#

[root@node2 iscsi]# iscsiadm -m discovery -t st -p 192.168.0.100    #发现了 target

192.168.0.100:3260,1 iqn.2013-05.com.magedu:teststore.disk1


[root@node2 iscsi]# iscsiadm -m node -T iqn.2013-05.com.magedu:teststore.disk1 -p 192.168.0.100 -l  #登录吧

Logging in to [iface: default, target: iqn.2013-05.com.magedu:teststore.disk1, portal: 192.168.0.100,3260] (multiple)

Login to [iface: default, target: iqn.2013-05.com.magedu:teststore.disk1, portal: 192.168.0.100,3260] successful.

[root@node2 iscsi]# fdisk -l


Disk /dev/sda: 21.4 GB, 21474836480 bytes

255 heads, 63 sectors/track, 2610 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        2610    20860402+  8e  Linux LVM


Disk /dev/sdb: 21.4 GB, 21474836480 bytes

255 heads, 63 sectors/track, 2610 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes


   Device Boot      Start         End      Blocks   Id  System

/dev/sdb1               1        2610    20964793+   5  Extended

/dev/sdb5               1         200     1606437   8e  Linux LVM

/dev/sdb6             201         323      987966   83  Linux


Disk /dev/sdc: 50.0 GB, 50009637888 bytes

64 heads, 32 sectors/track, 47692 cylinders

Units = cylinders of 2048 * 512 = 1048576 bytes


   Device Boot      Start         End      Blocks   Id  System

/dev/sdc1               1        1908     1953776   83  Linux        #看到了

[root@node2 iscsi]#

[root@node2 iscsi]# mount /dev/sdc1 /mnt        # 挂载

[root@node2 iscsi]# ls /mnt        #看到了issue

issue  lost+found

[root@node2 iscsi]#

[root@node2 iscsi]# cp /etc/inittab /mnt

[root@node2 iscsi]# ls /mnt            #这里有inittab

inittab  issue  lost+found

[root@node2 iscsi]#



在第一个节点 192.168.0.45 上,

[root@node1 ~]# mount /dev/sdc1 /mnt

[root@node1 ~]# ls /mnt        #这里看到了 inittab  

inittab  issue  lost+found

[root@node1 ~]#

[root@node1 ~]# cp /etc/fstab /mnt

[root@node1 ~]# ls /mnt        #有fstab   

fstab  inittab  issue  lost+found

[root@node1 ~]#


在第二个节点 192.168.0.55 上,

[root@node2 iscsi]# ls /mnt             #没看到fstab   

inittab  issue  lost+found

[root@node2 iscsi]#

[root@node2 iscsi]# umount /mnt

[root@node2 iscsi]# mount /dev/sdc1 /mnt

[root@node2 iscsi]# ls -la /mnt        #卸载后再挂,发觉到 fstab 好像这个文件有问题,,

马哥那边根本没看到fstab(马哥说刚才的操作在内存中,可能没有同步到磁盘上去,所以看不到,,,这就是单机文件系统的坏处,所以两个节点编辑同一个文件的结果,然后内存写入的时候会文件系统崩溃)

(如果使用集群文件系统,一个节点创建一个文件,会立即通知给其它节点,所以其它节点会立即看到的,)

总计 44

drwxr-xr-x  3 root root  4096 01-31 10:56 .

drwxr-xr-x 32 root root  4096 01-30 10:29 ..

?---------  ? ?    ?        ?          ? fstab

-rw-r--r--  1 root root  1666 01-31 10:56 inittab

-rw-r--r--  1 root root    75 01-31 10:39 issue

drwx------  2 root root 16384 01-31 10:36 lost+found

[root@node2 iscsi]#






普通分类: