Linux存储软件栈到底有多复杂,存储软件栈全景概览

从今天开始,我们将介绍一下Linux的存储软件栈,也称为IO栈。今天我们先从整体上了解一下Linux的整个IO栈,后续再深入介绍每个组件。我们很难说清楚Linux的存储软件栈到底有多复杂,但thomas-krenn的一张图可能可以给大家一个比较直观的印象。如下图是作者从thomas-krenn网站上下载的一张图,该图比较详细的描述了Linux的存储栈。

大家看到这张图的第一反应可能是无所适从,或者直接跳过本文。大家不要着急,我们这里会简化介绍一下,期望大家能够对Linux存储软件栈能够有一个比较全面,而又深入的理解。

我们这里将thomas-krenn图简化为下图的样子,简化后的样子就清晰的多了。本文就以这张图为大纲介绍一下Linux存储软件栈的主要功能模块的功能及一些实现细节。本文将从下往上进行介绍,依次为设备驱动、SCSI层、通用块驱动、硬盘冗余、逻辑映射、文件系统和数据库等。

需要说明的是,我们这里是一个简图,所以会缺失一些细节,或者不严谨的地方。比如本图中展示的SCSI协议层,其实并非所有存储设备都经过SCSI协议,可能是SATA或者NVMe协议。再比如LVM和RAID的关系,并非一定图中的关系,也可以反过来。本文只是为了让大家方便理解这些功能的关系。

我们自顶而下的分析一下这个存储软件栈,这个软件栈中除了数据库外都属于操作系统,数据库属于系统软件,而不是操作系统的一部分。之所以将数据库放在这里,是因为数据库是存储数据最常用的系统软件。

数据库有很多种类型,本文以关系型数据库为例介绍。关系型数据库是一种将线性存储空间抽象为表格空间的软件系统。这里所谓的线性存储空间可以是硬盘或者文件系统中的一个文件。表格空间则是指记录数据的格式,如下图所示的电商商品列表信息,可以通过一个二维表格进行存储。而存储数据的二维表在底层则是存储在一个文件中,或者直接存储在硬盘上。

关系型数据库系统核心是实现了线性空间到表空间的转换,但本身是非常复杂的。如下是开源关系型数据库MySQL的架构简图。MySQL分为两个核心层,一个是计算层,负责SQL语句的解析和优化;另外一个是存储层,负责数据的存取,也是实现空间映射的部件。

数据库继续往下则是文件系统层,文件系统实现了线性空间到树型空间的转换。这里的线性空间是指硬盘的存储空间,而树型空间则是指文件系统的目录结构。如下图所示,文件系统可以目录中嵌套目录和文件,形成开枝散叶的效果,类似一棵树。

Linux操作系统支持几十种文件系统,其原理如下图所示。在Linux操作系统中实现了一个虚拟文件系统层(Virtual File System,简称VFS),其它具体文件系统都位于VFS之下。VFS为应用层提供统一的访问接口(API),当请求经过VFS后会被转发到具体的文件系统来处理。关于文件系统IO处理的更多细节,我们在后文《Linux文件系统全析,架构与案例解析》一文中详细介绍,本文不再赘述。

文件系统系统往下是逻辑卷管理层(Logical Volume Manager),也即LVM层。对于文件系统来说,LVM层并非必需,文件系统可以直接构建在裸硬盘或者硬盘分区上。基于LVM构建文件系统的原因在于LVM可以提供弹性的逻辑空间(称为逻辑卷),当出现存储空间不够的情况下,可以实现动态扩容。所以,如果计算节点连接的不是本地硬盘,而是磁盘阵列的情况下,LVM就没有必要了。因为绝大多数的磁盘阵列系统是可以支持LUN的动态扩容的。

相关视频推荐

c/c++存储开发需要掌握哪些知识,自上而下介绍存储架构体系

存储开发,linux内核文件系统的实现

SPDK如何实现高性能,深入NVMe的工作原理

Linux C/C++开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)

需要C/C++ Linux服务器架构师学习资料加qun812855908获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享

如下图是LVM的逻辑关系图,基于物理硬盘可以构建物理卷(PV),多个物理卷可以构建为一个卷组(VG),在卷组之上可以创建逻辑卷。卷组的概念相当于企业级磁盘阵列中的存储池的概念,这个我们在后文会详细介绍。

物理卷并不一定要基于物理硬盘构建,也可以基于RAID构建。通常,如果基于本地硬盘构建LVM时也是要先构建RAID的,这是因为需要通过RAID来提高数据的可靠性。如果没有RAID,任何一块硬盘的故障就会导致整个数据的丢失。

RAID技术可以理解为一种存储虚拟化技术,他可以将多个物理硬盘抽象为一个虚拟硬盘。其关键点在于虚拟硬盘的可靠性和性能通常都可以得到提升。RAID采用一种校验码的技术,在写入数据的时候会同时计算出一个对应的校验数据,保证在出现硬盘故障的情况下可以重新计算出完整的数据。

如上图所示,可以通过3块100GB容量的硬盘抽象出一个200GB的虚拟硬盘。虽然总统有效容量损失了100GB,但是可以通过损失的空间存储校验数据保证数据的可靠性。RAID的另外一个特性是可以提高性能,因为IO可以被多个硬盘同时处理,这个还是比较容易理解的。

再往下是通用块层,通用块层为上层提供一个线性的存储空间。也就是说,对于一个块设备,无论底层是什么协议(SCSI、NVMe或者是ATA),也不管底层是什么物理设备,但通过通用块层后,用户看到的就是一个线性的地址空间。如下是通用块层的一个架构简图。需要再次强调的是,在Linux内核中各层并非严格遵循我们第一张图中的位置,比如RAID和逻辑卷管理,其实也用到了通用块层的功能。

通用块层往下就涉及到具体的协议了,本文以SCSI协议为例进行介绍。如下图所示,SCSI整个架构分为3层,分别为高层、通用服务层和设备驱动层。中间是通用服务层,用于实现SCSI的公共功能,比如错误处理等。而上面一层称谓高层,它代表各种SCSI设备类型的驱动,如SCSI磁盘驱动,SCSI磁带驱动,高层驱动认领低层驱动发现的SCSI设备,为这些设备分配名称,将对设备的IO转换为SCSI命令,交由低层驱动处理。

最下面的称谓低层,它代表与SCSI的物理接口的实际驱动器,主要为各个厂商为其特定的主机适配器(Host Bus Adapter, HBA)驱动,例如:FC卡驱动、SAS卡驱动和iSCSI(iSCSI可以使硬件HBA卡或者基于普通网卡的软件实现)等。

设备驱动层位于存储软件栈的最底层,该层包含很多不同类型的设备驱动。即使不是计算机背景的通信对设备驱动应该也有所了解。当我们为计算机添加一个硬件的时候,通常需要安装该设备对应的驱动程序。无论是Linux操作系统还是Windows操作系统都是这样。

存储设备其实有很多种类型,最常见的如机械硬盘、SSD硬盘等。除了上述基本的存储设备外,比如RAID卡、FC卡或者是iSCSI卡等都属于存储设备的范畴。对每一种设备的操作都是需要相应的软件的,这类软件称为驱动程序。

我们深入到Linux的内核代码,驱动程序相关的源代码都在drivers目录下面。比如块设备驱动、蓝牙驱动、网卡驱动和存储领域常见的光纤卡驱动等都在这里。以蓝牙驱动为例,这里有一个名称为bluetooth目录,所有蓝牙相关的驱动都在这里。因为各个厂商的蓝牙设备存在差异,所以每个厂商的蓝牙设备通常都有一个驱动程序。

至此,我们简要介绍了一下Linux存储软件栈的主要部件及基本的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/226427.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

堆的相关时间复杂度计算(C语言)

目录 前言 建堆的时间复杂度 向上调整建堆的时间复杂度 向下调整建堆的时间复杂度 维护堆的时间复杂度 top K问题的时间复杂度 前言 在前面的三篇文章中我们成功的实现了堆排序的升降序以及基于堆的top K问题,现在我们来解决它们的时间复杂度问题 建堆的时间…

查看Linux的Ubuntu的版本

我的Ubuntu版本是 Jammy x86_64,即 Ubuntu 22.04.3 LTS,代号为"Jammy Jellyfish",架构是 x86_64(64位)。

UEC++ 探索虚幻5笔记 day11

虚幻5.2.1探索 项目目录探索 C工程一定不能是中文路径,中文项目名,最好全部不要用中文,蓝图项目可以是中文浅浅创建一个空项目,讲解一下之前UE4没有讲解的项目目录文件的分布组成 .vs:文件夹一般是项目编译缓存文件夹…

linux安装mysql5.7(一遍过)

之前安装的时候遇到了很多问题,浪费了一些时间。整理出这份教程,照着做基本一遍过。 这是安装包: 链接:https://pan.baidu.com/s/1gBuQBjA4R5qRYZKPKN3uXw?pwd1nuz 1.下载安装包,上传到linux。我这里就放到downloads目录下面…

游戏盾的防御原理以及为什么程序类型更适合接入游戏盾。

游戏盾是一种专门用于游戏服务器的安全防护服务,旨在抵御各种网络攻击。它的原理主要包括以下几个方面: 流量清洗和过滤:游戏盾会对进入游戏服务器的流量进行实时监测、分析和过滤。它通过识别恶意流量和攻击流量,过滤掉其中的攻击…

多种混沌映射初始化种群MATLAB代码(开源代码)

五种混沌映射改进鲸鱼算法(自行切换): clc clear close allSearchAgents_no30; % Number of search agents %种群数量Function_nameF1; % Name of the test function that can be from F1 to F23 (Table 1,2,3 in the paper) %使用方程的名…

【java设计模式】——代理设计模式,两种举例说明

代理设计模式 1.介绍 Spring 框架中AOP底层使用动态代理设计模式。通过学习动态代理设计模式可以很好的理解Spring框架AOP底层 代理模式(Proxy)是GoF23种设计模式之一。所谓代理模式是指客户端并不直接调用实际的对象,而是通过调用代理&am…

浅谈https

1.网络传输的安全性 http 协议:不安全,未加密https 协议:安全,对请求报文和响应报文做加密 2.对称加密与非对称加密 2.1 对称加密 特点: 加解密使用 相同 秘钥 高效,适用于大量数据的加密场景 算法公开&a…

深入了解Java Duration类,对时间的精细操作

阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概6000多字,预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章&#x…

Linux安装mysq 8.0服务端和客户端(亲测保成功)

1. 查看当前是否有已经安装好的mysql,先卸载 # 命令 rpm -qa|grep -i mysql# 结果显示 mysql-community-libs-5.7.42-1.el7.x86_64 mysql-community-common-5.7.42-1.el7.x86_64 mysql-community-libs-compat-5.7.42-1.el7.x86_64 mysql57-community-release-el7-10.noarch my…

perl脚本获取Windows系统常用路径信息

windows系统常用的路径,比如临时目录、资源文件夹、字体保存目录、应用程序数据存放目录等等。在日常操作的时候寻找略有不便。这里用perl写一个脚本,并把这些目录信息格式化为json,方便查找。如下是perl代码: #! /usr/bin/perl use v5.14; …

中国科技巨头:集体变革中 /华为鸿蒙 4:功能、模型、生态三大升级 |魔法半周报

我有魔法✨为你劈开信息大海❗ 高效获取AIGC的热门事件🔥,更新AIGC的最新动态,生成相应的魔法简报,节省阅读时间👻 🔥资讯预览 中国科技巨头:集体变革中 华为鸿蒙 4:功能、模型、生…

2002-2021年全国各地级市环境规制18个相关指标数据

2002-2021年全国各地级市环境规制18个相关指标数据 1、时间:2002-2021年 2、来源:城市年鉴 3、指标:行政区划代码、地区、年份、工业二氧化硫排放量(吨)、工业烟粉尘排放量(吨)、工业废水排放量(万吨)、工业废水排放达标量(万吨)、工业二氧…

华为OD机试 - 攀登者1(Java JS Python C)

题目描述 攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。 地图表示为一维数组,数组的索引代表水平位置,数组的元素代表相对海拔高度。其中数组元素0代表地面。 例如:[0,1,2,4,3,1,0,0,1,2,3,1,2,1,0],代表如下图所示的地图,地图中有两个山脉位置分别为 1,2,3,4,5…

SpringSecurity6 | 修改默认用户

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Java从入门到精通 ✨特色专栏: MySQL学习 🥭本文内容:SpringSecurity6 | 修改默认用户 📚个人知识库 :知识库,欢迎大家访问 学习参考…

一款带键扫的LED驱动电路

一、基本概述 TM1628A是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用IC,内部集成有MCU数字接口、数据锁存器、LED 驱动、键盘扫描等电路。本产品质量可靠、稳定性好、抗干扰能力强。主要适用于家电设备(智能热水器、微波炉、洗衣机、空调、电…

ProEasy机器人案例:电池边包胶

如下图所示,对一个电池三边包边,因客户现场有很多规格电池的大小,所以就需要建立动态的工具坐标来实现适配所有种类的电池 程序如下:Ddome程序 function Speed(num) --速度设置 MaxSpdL(2000) --movl最大速度…

机器学习 sklearn 中的超参数搜索方法

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…

一个能让你涨薪5k的自动化测试小技巧项目流程优化

引言及概览 项目流程优化是一个持续过程,每个公司,每个团队情况不一样,总原则是:如果在项目过程中你感觉到某一点很别扭、很不爽、痛了,那么这就是优化点。 优化的手段是多样化的,如通过流程规范去约束、…

将图像增广应用于Mnist数据集

将图像增广应用于Mnist数据集 不用到cifar-10的原因是要下载好久。。我就直接用在Mnist上了,先学会用 首先我们得了解一下图像增广的基本内容,这是我的一张猫图片,以下为先导入需要的包和展示图片 import time import torch from torch im…