存储子系统剖析——从存储子系统角度看FCoE模块

        note:在之前的一篇FCoE模块设计和实现的文章,大致讲到了FCoE模块的设计。虽然很清楚地讲了FcoE模块的组成,可是没有站在整个存储子系统的角度来看FCoE,总是有点局限的感觉,然后存储子系统和网络子系统是怎么交互的也没有说清楚,希望在这里这些疑问都能得到解答。

我们知道linux内核是层次设计的设计模式,存储子系统也不例外。下面这张图(来自网络)表示了linux下面存储子系统的层次化模块。

e.g.Application 访问文件

根据上图,如果一个用户空间中的应用程序(假设是用c语言编写的)要读取存放在remote scsi磁盘上面的某个文件,那么这个应用程序就需要使用c库的程序,然后调用内核提供的系统调用read(),系统调用会访问VFS,也就是虚拟文件系统,那么虚拟文件系统是什么呢?虚拟文件系统其实是文件系统的抽象层(复用代码的设计思想?),然后由VFS 选择那个正确的文件系统,因为甚至有的文件系统就是网络文件系统呢。然后到了真正的文件系统,文件系统是一个组织文件在磁盘上面存放的管理系统,由文件系统找到文件对应的块。再然后到了块设备层。文件系统和块设备驱动层会有一个叫做buffer
cache的层次,那是将磁盘上面的数据缓存的一段内存和相关的数据结构。

块设备驱动需要要和下面的接口打交道,对于scsi子系统来说,或者对于更加具体的fcoe接口,这个交互过程是怎样的?那么首先看一下块设备的作用吧

块设备

当unix系统刚写出来的时候,它有一个大胆的设计,那就是把所有的物理设备也都看做是文件。但是不同的设备是有区别的,有的是随机存取,有的是按顺序存取方式。但是为什么还要用同样的接口(文件系统)来和一个打印机或一个磁盘设备通信呢?因为即使他们不一样,但是都抽象为文件还是可以的,并且这样可以让整个系统变得很简单。

字符设备又称为rawdevices,比如打印机和终端机,文件系统根据这个文件,然后使用字符设备驱动提供的API就可以往字符设备读写数据。块设备在文件系统里面为/dev/dsk,块设备是随机存取的,文件系统可以挂(mount)在块设备上面,而不可以挂在字符设备上面。

块设备驱动

块设备驱动是为磁盘块设备和文件系统之间通信的一个桥。系统可以将文件系统加载在块设备上面,块设备驱动大概就是提供了这样的一个加载的功能,然后使得文件系统可以读写块设备。

块设备驱动下面可能是scsi子系统或者别的磁盘设备驱动,直接连接磁盘。至于scsi子系统,下面将单独介绍。

scsi子系统

SCSI是一组标准集,定义了与大量设备通信所需的接口和协议。linux提供了一个SCSI子系统用于和SCSI设备通信。SCSI适合于可靠高性能远距离存储。

SCSI是客户机/服务器模型,客户机发出SCSI命令,然后由服务器接收和处理SCSI命令,SCSI目标通常为启动程序提供一个或者多个逻辑单元号(LUN),SCSI实际的I/O操作也只处理这种实体。在存储区域中,LUN通常表示一个主机能够执行读写操作的磁盘。

关于SCSI,我在FCoE模块设计和实现介绍的比较详细。总之,SCSI上层接收来自上层(比如通用块层,文件系统)的请求并将其转换成SCSI请求,及负责完成SCSI命令并将状态信息通知上层。中间层是上层和底层的公共服务层。底层是一组驱动器,称为SCSI底层驱动,可以与物理设备通信。

note:学习块设备编程和scsi块设备编程?参考http://www.tldp.org/LDP/khg/HyperNews/get/devices/scsi/1.html

FCoE模块

        从上面的分析中,我们发现FCoE模块是作为linux内核中SCSI子系统的底层驱动, 用来连接SCSI子系统和以太网系统,主要完成SCSI命令到FCoE帧的转化。

FCoE模块的协议处理依赖scsi_transport_fc模块、libfc模块和libfcoe模块。

 note:因为FCoE模块设计和实现介绍的比较详细了,关于FCoE模块的相关component不再重复,主要说一下I/O component。

I/O模块完成FCoE协议处理,其中包含了SCSI命令(或数据)生成FC帧、FC帧到FCoE帧的映射、FCoE帧封装到以太网帧和发送到以太网核心。FCoE模块需要结合SCSI系统,libFC模块和以太网系统完成IO请求。发起端主要IO请求类型为读请求和写请求。

Ethernet模块是Linux内核网络处理的模块,工作在网络的l2层,负责将数据包发送到物理层(然后经过FCoE交换机达到storageserevr),或者将从link过来的层次转发到别的层次,比如说网络的上层,这里是指的l3,又或者根据头部的内容转发到FCoE模块,再由FCoE模块处理后,交给SCSI子系统和存储子系统进行处理。

#########存储虚拟化

在虚拟化环境中,存储子系统又有着怎样怎样的layout?或许下面的简单分析值得参考。

相对于host中的存储子系统,虚拟机中的存储子系统则有更多的层次(既包括VM由包括hypervisor和host),还可以由于部署的不同,有更大的弹性(flex?)。

比如说对于基于fcoe的存储虚拟化,主要包括virtual disk, raw disk 和vm based storage。

Virtual disk是SCSI层的虚拟化,虚拟机通过SCSI层直接访问存储设备。虚拟机不需要考虑其存储设备是网络存储还是本地存储。Virtual disk是比较通用的模型,在不修改虚拟化平台和内核代码的情况下,可以在主流虚拟化平台上运行。在论文[IOFlow]中的存储方式就是这种Virtual
disk的。

Raw disk的实现层次是FCoE协议栈,和FCoE的机制原理(FCoE的虚拟化)关系比较大。

NAS(Network Attached Storage)和iSCSI可以通过虚拟机的网络设备访问存储设备,不需要VMM(VirtualMachine Monitor)将存储设备映射给虚拟机。上述访问存储设备的模式,被称为VM-based storage,这种方式我在试验中部署过。

p.s.这里只是大概的讲了一下存储子系统,如果要精通存储子系统最好看看linux内核源码相关部分,顺带把网络子系统的源码看看~~

时间: 2024-10-26 22:49:47

存储子系统剖析——从存储子系统角度看FCoE模块的相关文章

【转】从应用角度看块/文件/对象三种存储

http://www.talkwithtrend.com/Article/178247 产品和市场需求有各种相互影响的关系,但不管是哪一种,最终呈现都是产品和应用需求需要对应匹配.应用需求越多样化,市场也就划分得更加细,产品种类也就更加丰富.在存储行业,我们也可以从“应用适配”这个角度来聊聊各类存储. 传统认知上来说,IT设备分为计算/存储/网络三大类,相互之间是有明显的楚河汉界的.计算大家都清楚,服务器,小型机,大型机:网络也就是路由器交换机:存储有内置存储和外置存储,最常见的就是磁盘阵列.在

SQL Server 存储引擎-剖析Forwarded Records

原文:SQL Server 存储引擎-剖析Forwarded Records 我们都知道数据在存储引擎中是以页的形式组织的,但数据页在不同的组织形式中其中对应的数据行存储是不尽相同的,这里通过实例为大家介绍下堆表的中特有的一种情形Forwared Records及处理方式. 概念 堆表中,当对其中的记录进行更新时,如果当前数据页无法满足更新行的容量,此时这行记录将会转移到新的数据页中,而原数据页中将会留下指针(文件号,页号,槽号)链接到新的数据页中. Code 创建测试数据 create dat

如何剖析一个内核子系统

1.前言 本文档主要讲述如何去剖析一个内核子系统的常规方法 一般来讲比较全面的分析一个内核子系统,大概包含如下几个部分: 1)framework的整体介绍,包括基础知识.软件框架: 2)软件框架中涉及的组件的属性和API; 3) 分析主要流程,在分析流程的过程中加深对各个组件属性及API的理解 2.包含的主要部分 2.1 framework整体介绍 基础知识 阐述要理解本模块,需要具备的背景知识,如需要理解i2c子系统,则需要对i2c协议有相关的了解. 此部分可以专门单独列为一章阐述 硬件框架

INDEX--从数据存放的角度看索引2

在上次<INDEX--从数据存放的角度看索引>中,我们说到"唯一非聚集索引"和“非唯一非聚集索引”在存储上有一个明显的差别:唯一非聚集索引的非叶子节点上不会包含RID的数据,让我们继续来深挖一下. 准备测试数据: CREATE TABLE TB1 ( C1 INT, C2 INT, C3 INT ) GO CREATE UNIQUE CLUSTERED INDEX IDX_C1 ON TB1(C1) GO CREATE UNIQUE INDEX IDX_C2 ON TB1(

从节能角度看数据中心软硬件设计(一)

从节能角度看数据中心软硬件设计(一) -PMC公司资深顾问.前Facebook存储架构设计师. OCP创始人之一Per Brasher于CCCC演讲实录- 此次演讲流程如下.首先讨论关注数据中心效率的原因及其提升效率的原始动力所在.第二步讨论影响效率的主要构成部件,这些部件对效率的贡献大概有多少,以及怎样对每个部件的效率进行优化和提高.第三个方面是展望如何进一步降低TCO成本,其中将涉及更先进的数据保护机制.接着会对存储的各种新模式进行一定展望,最后做一个总结. 下表总结了OCP的设计理念,其中

内存角度看c#中值类型和引用类型的区别(转)

1.    值类型的数据存储在内存的栈中:引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址. 2.     值类型存取速度快,引用类型存取速度慢. 3.     值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用 4.     值类型继承自System.ValueType,引用类型继承自System.Object 5.     栈的内存分配是自动释放:而堆在.NET中会有GC来释放 6.      值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的

从源码角度看Android系统SystemServer进程启动过程

copy frome :https://blog.csdn.net/salmon_zhang/article/details/93208135 SystemServer进程是由Zygote进程fork生成,进程名为system_server,主要用于创建系统服务. 备注:本文将结合Android8.0的源码看SystemServer进程的启动过程以及SystemServer进程做了哪些重要工作. 1. SystemServer进程启动的起点从<从源码角度看Android系统Zygote进程启动过

王概凯-架构漫谈之从架构的角度看如何写好代码

本文是漫谈架构专栏的第八篇,作者 Kevin 举例介绍了如何写好代码.当我们有了好的架构,那就需要考虑如何将架构落地,而这个时候,代码就显得无比重要了!千万不要让代码成为架构扩展的瓶颈.文中作者提到了代码架构,细细品味吧. 在第六章中,我们得出一个结论,软件架构实际上包括了:代码架构,以及承载代码运行的硬件部署架构.实际上,硬件部署架构最终还是由代码的架构来决定.因为代码架构不合理,是无法把一个运行单元分拆出多个来的,那么硬件架构能分拆的就非常的有限,整个系统最终很难长的更大. 所以我们经常会听

不玩高大上 戴尔入门级存储SCv2000重新诠释存储价值

今年的五月可能是存储界最为热闹的一个月,EMC.华为.浪潮一轮轮的高端存储新品纷纷亮相,点燃了人们对存储的关注度.而在大家都聚焦于高端存储又突破了多项性能指标时,戴尔却在其2015存储新品发布会上,携带着其全新入门级存储阵列SCv2000系列重新诠释了存储价值. 智存高远耀世新生2015戴尔存储新品发布会 戴尔入门级存储阵列SCv2000系列 戴尔对市场中所谓的低端.中端.高端存储有着不同的看法,他们认为传统的高端存储是与小型机Unix Server相对应的,而IDC报告显示自从2010年以后,