FCoE模块设计与实现


FCOE协议介绍

    太网光纤通道(FCoE)将FC帧映射并封装到以太网帧中,从而使得光纤通道存储流量能在太网上传输,加上FCoE交换机的支持,将以太网上IP数据和FC数据等其它数据流整合到统一网络链路,构成一个融合网络。


1背景

FCoE技术的背景:海量数据存储


1.1存储技术与海量数据存储

本地存储:直接连接存储(Direct Attached StorageDAS),直接与主机服务器相连接,不足是:I/O操作需要占据服务器大量的CPU时间来处理SCSI指令和数据块,扩展性差。

网络存储:包括网络附加存储(Network Attached StorageNAS)和存储区域网(Storage Area NetworkSAN

NAS是以太网上利用NFSNetwork File System),CIFSCommon Internet File System)等网络文件系统对外提供访问其文件系统接口的文件共享服务器

SAN采用集中式存储策略,在服务器与存储设备之间通过交换机进行连接,将多级存储器合并成一个集中管理的网络存储基础设备。扩展性好,并且易于管理。

所以,为了实现海量数据存储,SAN是较好的存储技术。现在主要SAN架构有FC-SANIP-SAN,其中FC-SAN采用光纤通道协议,部署于高性能的数据中心。


1.2 FC协议


光纤通道FC作为SAN的一项连接技术已经取得了成功。

FC是一种双向、点到点、串行的数据通道,而FC协议定义了数据在网络上传输规则。FC协议分层,由物理接口层、编码层、网络层、通用服务层和上层协议(Upper Layer ProtocolULP)映射层共五层构成。

如在FC-SAN中,将目标端系统的存储设备挂载到发起端系统中,作为一个块设备进行访问


2 FCoE目的

大方向:实现以太网融合,减少数据中心的网络复杂度。

技术目标:融合传统局域网和SAN,在高速以太网链路上传输IP帧和FC


3相关知识


3.1 SCSI系统

    SCSI是一组标准集,定义了与大量设备通信所需的接口和协议

SCSI上层接收来自上层(比如通用块层,文件系统)的请求并将其转换成SCSI请求,及负责完成SCSI命令并将状态信息通知上层。

中间层是上层和底层的公共服务层。

底层是一组驱动器,称为SCSI底层驱动,可以与物理设备通信。


3.2块设备和请求队列

块设备(Block Device)将信息存储在固定大小的块中,每个块都有自己的地址,且每个块都能独立于其它块进行读写,即具有随机读写能力

一个块设备驱动只有一个请求队列(关于请求队列,和应用程序的socket队列或者Qdisc是否可以对比?点击这里,应该是和Qdisc更加有比较性),用于完成I/O请求的合并、调度和处理。请求队列跟踪未完成的块设备I/O请求,保存了描述设备所能处理的请求的参数,比如最大I/O大小,段数目,硬件扇区大小和对齐需求。请求队列具有I/O调度功能,通过I/O调度程序来实现


4 FCoE设计与实现


4.1总体功能设计

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模块提供用户接口


4.2功能模块设计与实现


加载/卸载模块

FCoE模块的加载主要完成向FCoE TransportFC Tranport的添加,申请资源,创建内核线程,注册通知链等。FCoE模块的卸载主要完成运行期间建立资源的释放(比如接口创建)和模块加载资源的释放

加载/卸载模块的实现比较简单。

接口创建

FCoE接口创建主要是完成FCoE接口结构(struct hust_interface)分配和初始化,及FIPFCoE协议注册,接口创建成功后,会继续完成登陆和设备发现等工作,通过调用用户接口create来创建FCoE接口。FCoE接口创建的同时,需要创建对应的FC接口,FC接口是实现FC协议处理的关键

hust_fcoe_create是实现FCoE接口创建的函数(如图)。hust_interface_lookup函数完成接口查询,判断某网卡接口是否已经创建FCoE接口,如果没有创建则创建接口,否则返回。hust_inteface_create完成接口的实际创建工作,调用fcoe_ctlr_init完成FIPFCoE协议初始化和注册,调用hust_interface_setup完成FCoE接口配置(如图)。hust_fcoe_hardware_setup函数完成硬件配置工作,该函数开启网卡的硬件卸载功能,可以更具不同的网卡类型配置不同的运行环境,比如开启Intel网卡的DDPDirect Data Placement)功能。

接口销毁

接口销毁是接口创建的逆过程,但在接口销毁前需要关闭接口和清除队列中未完成的请求。网卡接口上已经创建对应的FCoE接口,可以调用用户接口destroy来销毁FCoE接口。hust_fcoe_destoryFCoE接口的销毁函数,调用hust_if_destory_work完成FC接口销毁

登陆

FCoE登陆主要完成发起端发现FCF,向FCF注册和DNS注册。

发起端可能与FCoE网络的交换机连接或与目标端设备直连,发送FLOGI,根据ACCFLOGI)选择方式建立和目标设备的连接。

如果发起端连接FCoE交换机,需要PLOGI登陆FCFDNS,在DNS注册自己的端口信息,并获得其它端口信息,完成DNS过程后,就可以向其它设备发送PLOGI请求

如果是目标端设备,还会建立进程通信和在发起端建立目标端设备文件。如果发起端直连目标端设备,则直接进行目标端的PLOGI和后续操作。如下,

IO模块

    IO模块完成FCoE协议处理,其中包含了SCSI命令(或数据)生成FC帧、FC帧到FCoE帧的映射、FCoE帧封装到以太网帧和发送到以太网核心。

FCoE模块需要结合SCSI系统,libFC模块和以太网系统完成IO请求。发起端主要IO请求类型为读请求和写请求。读请求是发起端向目标端发送读命令,目标端接收到命令后将数据发送给发起端。写请求是发起端向目标端发送写命令,目标端接收到命令后分配接收数据所需的内存并通知发起端,然后发起端将数据发送到目标端。

fc_queuecommandSCSI系统的接口函数,将SCSI请求发送到底层处理。



5效果

在发起端看来,访问存储区域网的设备就像访问本地的块设备一样简单高效!

以传输的角度看,光纤通道(FC)帧映射并封装到以太网帧中,从而使得光纤通道存储流量能在太网上传输。使得能在高速以太网链路上同时传输IP帧和FC

从数据中心角度,FCoE可以和数据中心现有的以太网及FC基础设施无缝互通,将以太网上IP数据和FC数据等其它数据流整合到统一网络链路,构成一个融合网络

IT业界看来,FCoE为存储网络流量提供统一交换网络,更有效地利用资源、减少交换基础设施、服务器的IO适配器和线缆的数量,从而大幅减少电力和冷却成本。同时,简化的基础设施也能降低管理和运营开支。

你可能感兴趣的:(框架,通信,存储,FCoE)