对磁盘的深度解析,从操作系统层面来讲解

电子说

1.3w人已加入

描述

(文章来源:itworld123)

企业级存储系统通常也是运行在常规操作系统之上的,比如早期的EMC的中端存储是运行在Windows XP平台上的,而国内的存储厂商的产品通常是基于Linux平台。分布式存储更是不例外,目前分布式存储通常都是运行在Linux操作系统之上。

为了更好地理解存储技术,从操作系统层面理解磁盘就显得尤为重要了。为了便于学习,本文以Linux操作系统作为参考,介绍磁盘在Linux操作系统层面的相关内容。我们通常看到的磁盘是在/dev目录下的文件(设备)。在Linux操作系统中一切皆文件,因此磁盘设备本身也是以文件的形态呈现的。比如某个操作系统下面我们可能会看到如下内容。

上述设备中形似sdX的设备为SCSI磁盘设备。无论是基于SAS、iSCSI还是FC的磁盘设备,大概都是这个样子。形似dm-X的是Device Map块设备,也就是通过LVM进行管理的设备,这种设备是一种逻辑设备。在Linux操作系统中块设备的种类很多,有本地磁盘设备、有SAN设备还有基于网络的块设备。在虚拟机中块设备又呈现为另外一种文件名,比如在Xen虚拟机中伪xvdX。

虽然名称差异很大,但是在Linux操作系统内核中的实现确实非常简单。在内核中任何磁盘块设备都是通过调用add_disk函数完成的。在《Linux设备驱动程序》这本书对块设备进行了详细的介绍,并且可以通过非常简单的代码实现一个自己的块设备。

SAN的全称是存储区域网络,也就是通过网络的形式实现计算节点(客户端)对存储系统的访问。在存储系统中可以划分若干个LUN,这些LUN通过网络的方式连接,在客户端呈现为一个磁盘。如图所示,存储系统的资源在计算节点以磁盘的形式呈现。

对于Linux操作系统来说,块设备就好像一个文件一样。任何读写数据都是以偏移和长度为基本信息下发到磁盘块设备进行处理。因此,对于块设备来说,它并不关系这些数据在底层是如何存储。对于SAN存储来说,当块设备接收到请求后,会调用底层协议层的接口将请求转发出去。SAN存储使用的是SCSI协议,因此,块设备的请求都会转换为SCSI协议进行处理。

Linux内核实现了一个SCSI子系统,所有SCSI设备及驱动都基于该子系统实现。该SCSI子系统分为3层,SCSI上层、SCSI中层和SCSI下层。其中上层是设备层,实现比如磁盘驱动、磁带驱动或者光盘等所有的块设备。中层是通用层,实现SCSI的公共功能,比如错误处理等内容。下层是硬件驱动层,比如FC-HBA驱动和SAS-HBA卡驱动等等。

针对Linux磁盘设备来说,其发送的请求经过SCSI层后会封装为SCSI协议包,然后通过底层的协议发送出去。对于块设备,底层协议对用户来时是透明的,用户在使用块设备的时候也不用关心块设备底层所使用的通信协议。但是对于SCSI子系统来说是需要关系底层通信协议的,因为它要调用底层驱动的接口将数据通过该驱动发送出去。对底层驱动的调用是通过其回调函数完成的,回调函数的注册发生在设备初始化的时候。

至此,我们了解到SAN存储磁盘与本地磁盘并无本质的差别,核心差异在与其数据需要通过某种协议与比较远的设备进行数据的交换。SAN存储最早只支持FC协议。后来随着以太网技术的飞速发展,IBM发明了iSCSI协议,该协议是基于TCP/IP协议实现的存储协议。iSCSI协议可以简单地理解为一个应用层的协议,类似HTTP协议。只不过HTTP协议用于传输Web内容,而iSCSI协议则用于传输磁盘内容。

可以看出,iSCSI其实就是对SCSI协议的封装,然后通过以太网进行传输。说白了,iSCSI就是以以太网作为传输媒介的SCSI协议。iSCSI协议分为客户端和服务端两部分,在iSCSI协议中称为启动器和目标器。其中启动器就是计算端,而目标器就是存储端。

(责任编辑:fqj)

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分