太网光纤通道(FCoE)将FC帧映射并封装到以太网帧中,从而使得光纤通道存储流量能在太网上传输,加上FCoE交换机的支持,将以太网上IP数据和FC数据等其它数据流整合到统一网络链路,构成一个融合网络。
FCoE技术的背景:海量数据存储
本地存储:直接连接存储(Direct Attached Storage,DAS),直接与主机服务器相连接,不足是:I/O操作需要占据服务器大量的CPU时间来处理SCSI指令和数据块,扩展性差。
网络存储:包括网络附加存储(Network Attached Storage,NAS)和存储区域网(Storage Area Network,SAN)。
NAS是以太网上利用NFS(Network File System),CIFS(Common Internet File System)等网络文件系统对外提供访问其文件系统接口的文件共享服务器。
SAN采用集中式存储策略,在服务器与存储设备之间通过交换机进行连接,将多级存储器合并成一个集中管理的网络存储基础设备。扩展性好,并且易于管理。
所以,为了实现海量数据存储,SAN是较好的存储技术。现在主要SAN架构有FC-SAN和IP-SAN,其中FC-SAN采用光纤通道协议,部署于高性能的数据中心。
光纤通道FC作为SAN的一项连接技术已经取得了成功。
FC是一种双向、点到点、串行的数据通道,而FC协议定义了数据在网络上传输规则。FC协议分层,由物理接口层、编码层、网络层、通用服务层和上层协议(Upper Layer Protocol,ULP)映射层共五层构成。
如在FC-SAN中,将目标端系统的存储设备挂载到发起端系统中,作为一个块设备进行访问。
大方向:实现以太网融合,减少数据中心的网络复杂度。
技术目标:融合传统局域网和SAN,在高速以太网链路上传输IP帧和FC帧。
SCSI是一组标准集,定义了与大量设备通信所需的接口和协议。
SCSI上层接收来自上层(比如通用块层,文件系统)的请求并将其转换成SCSI请求,及负责完成SCSI命令并将状态信息通知上层。
中间层是上层和底层的公共服务层。
底层是一组驱动器,称为SCSI底层驱动,可以与物理设备通信。
块设备(Block Device)将信息存储在固定大小的块中,每个块都有自己的地址,且每个块都能独立于其它块进行读写,即具有随机读写能力。
一个块设备驱动只有一个请求队列(关于请求队列,和应用程序的socket队列或者Qdisc是否可以对比?点击这里,应该是和Qdisc更加有比较性),用于完成I/O请求的合并、调度和处理。请求队列跟踪未完成的块设备I/O请求,保存了描述设备所能处理的请求的参数,比如最大I/O大小,段数目,硬件扇区大小和对齐需求。请求队列具有I/O调度功能,通过I/O调度程序来实现。
FCoE模块是实现FCoE协议功能的总体模块,包括:
模块加载/卸载
接口创建/销毁
FCoE登陆
I/O通信
FCoE模块作为LINUX内核中SCSI系统的底层驱动模块,连接SCSI系统和以太网系统,主要实现SCSI命令到FCoE帧的转化、数据传输任务控制、协议注册、FCoE模块和以太网系统的通信。
总体结构如下,
如上图,FCoE接口的创建成功,还需要完成FCoE登陆,远程目标端SCSI设备的发现和在发起端创建目标端设备的设备文件(/dev/sdb)。
FCoE模块具有用户接口和内部接口。
用户接口控制模块加载/卸载,接口创建/销毁,接口开启/关闭等功能。
内部接口实现FCoE模块和LINUX内核各系统或模块交互。
如下,
FCoE模块的协议处理依赖scsi_transport_fc模块、libfc模块和libfcoe模块。
scsi_transport_fc模块提供了SCSI系统与FC之间的接口。
libfc模块提供了FC协议处理接口。
Libfcoe模块提供了FCoE协议处理接口,也为FCoE模块提供用户接口。
FCoE模块的加载主要完成向FCoE Transport和FC Tranport的添加,申请资源,创建内核线程,注册通知链等。FCoE模块的卸载主要完成运行期间建立资源的释放(比如接口创建)和模块加载资源的释放。
加载/卸载模块的实现比较简单。
FCoE接口创建主要是完成FCoE接口结构(struct hust_interface)分配和初始化,及FIP和FCoE协议注册,接口创建成功后,会继续完成登陆和设备发现等工作,通过调用用户接口create来创建FCoE接口。FCoE接口创建的同时,需要创建对应的FC接口,FC接口是实现FC协议处理的关键。
hust_fcoe_create是实现FCoE接口创建的函数(如图)。hust_interface_lookup函数完成接口查询,判断某网卡接口是否已经创建FCoE接口,如果没有创建则创建接口,否则返回。hust_inteface_create完成接口的实际创建工作,调用fcoe_ctlr_init完成FIP和FCoE协议初始化和注册,调用hust_interface_setup完成FCoE接口配置(如图)。hust_fcoe_hardware_setup函数完成硬件配置工作,该函数开启网卡的硬件卸载功能,可以更具不同的网卡类型配置不同的运行环境,比如开启Intel网卡的DDP(Direct Data Placement)功能。
接口销毁是接口创建的逆过程,但在接口销毁前需要关闭接口和清除队列中未完成的请求。网卡接口上已经创建对应的FCoE接口,可以调用用户接口destroy来销毁FCoE接口。hust_fcoe_destory是FCoE接口的销毁函数,调用hust_if_destory_work完成FC接口销毁。
FCoE登陆主要完成发起端发现FCF,向FCF注册和DNS注册。
发起端可能与FCoE网络的交换机连接或与目标端设备直连,发送FLOGI,根据ACC(FLOGI)选择方式建立和目标设备的连接。
如果发起端连接FCoE交换机,需要PLOGI登陆FCF的DNS,在DNS注册自己的端口信息,并获得其它端口信息,完成DNS过程后,就可以向其它设备发送PLOGI请求。
如果是目标端设备,还会建立进程通信和在发起端建立目标端设备文件。如果发起端直连目标端设备,则直接进行目标端的PLOGI和后续操作。如下,
IO模块完成FCoE协议处理,其中包含了SCSI命令(或数据)生成FC帧、FC帧到FCoE帧的映射、FCoE帧封装到以太网帧和发送到以太网核心。
FCoE模块需要结合SCSI系统,libFC模块和以太网系统完成IO请求。发起端主要IO请求类型为读请求和写请求。读请求是发起端向目标端发送读命令,目标端接收到命令后将数据发送给发起端。写请求是发起端向目标端发送写命令,目标端接收到命令后分配接收数据所需的内存并通知发起端,然后发起端将数据发送到目标端。
fc_queuecommand为SCSI系统的接口函数,将SCSI请求发送到底层处理。
在发起端看来,访问存储区域网的设备就像访问本地的块设备一样简单高效!
以传输的角度看,光纤通道(FC)帧映射并封装到以太网帧中,从而使得光纤通道存储流量能在太网上传输。使得能在高速以太网链路上同时传输IP帧和FC帧。
从数据中心角度,FCoE可以和数据中心现有的以太网及FC基础设施无缝互通,将以太网上IP数据和FC数据等其它数据流整合到统一网络链路,构成一个融合网络。
在IT业界看来,FCoE为存储网络流量提供统一交换网络,更有效地利用资源、减少交换基础设施、服务器的IO适配器和线缆的数量,从而大幅减少电力和冷却成本。同时,简化的基础设施也能降低管理和运营开支。