当前位置: 首页 > news >正文

存储进阶笔记(二):Linux 存储栈:从 Device Mapper、LVM 到文件系统(2024)

记录一些平时接触到的存储知识。由于是笔记而非教程,因此内容不求连贯,有基础的同学可作查漏补缺之用。

  • 存储进阶笔记(一):硬件基础:HDD/SDD、JBOD、RAID 等(2024)
  • 存储进阶笔记(二):Linux 存储栈:从 Device Mapper、LVM 到文件系统(2024)

  • 1 Device Mapper:内核存储基础设施
    • 1.1 内核框架:物理块设备 -> 虚拟块设备
    • 1.2 在内核存储栈中的位置
    • 1.3 使用场景及典型应用
  • 2 LVM:基于 Device Mapper 创建逻辑卷(设备)
    • 2.1 功能
    • 2.2 LVM 中的概念/术语图解
    • 2.3 使用场景
    • 2.4 使用教程
  • 3 文件系统:基于物理或逻辑卷(块设备),创建和管理文件层级
    • 3.1 常规文件系统:不能跨 device
    • 3.2 Cross-device 文件系统
  • 4 云计算:块存储是如何工作的
    • 4.1 典型块存储产品
    • 4.2 工作层次:块级别
    • 4.3 使用场景和使用方式
    • 4.4 基本设计
    • 4.5 Ceph 块存储(RBD)的设计
      • 4.5.1 概念
      • 4.5.2 RBD 的后端存储:Ceph 对象存储
      • 4.5.3 读写流程
      • 4.5.4 客户端代码实现
  • 参考资料

1 Device Mapper:内核存储基础设施

1.1 内核框架:物理块设备 -> 虚拟块设备

Device mapper(设备映射器) 是 Linux 内核提供的一个框架,用于将物理块设备(physical block devices) 映射到更上层的虚拟块设备(virtual block devices)。

  • 是逻辑卷管理器(LVM)、software RAID 和 dm-crypt 磁盘加密技术的基础
  • 还提供了诸如文件系统快照等功能,
  • 还可以在传递数据的同时进行修改,例如,在提供磁盘加密,或者模拟不可靠的硬件行为。

1.2 在内核存储栈中的位置

Fig. Device Mapper 在 Linux 存储栈中的位置(图中间部分)

1.3 使用场景及典型应用

  • dm-cache:组合使用 SSD 和 HDD 的混合卷(hybrid volume)

    A hybrid volume is any volume that intentionally and opaquely makes use of two separate physical volumes. For instance, a workload may consist of random seeks so an SSD may be used to permanently store frequently used or recently written data, while using higher-capacity rotational magnetic media for long-term storage of rarely needed data. On Linux, bcache or dm-cache may be used for this purpose.

  • Docker – 基于 device mapper 给容器创建 copy-on-write 存储;
  • LVM2 – 内核最常用的一种逻辑卷管理器(logical volume manager)

2 LVM:基于 Device Mapper 创建逻辑卷(设备)

2.1 功能

Logical Volume Manager (LVM,逻辑卷管理器)1998 年引入内核,是一个基于 device mapper 的框架, 为内核提供逻辑卷管理能力

LVM 可以认为是物理磁盘和分区之上的一个很薄的软件层, 能方便换盘、重新分区和备份等等管理工作。

2.2 LVM 中的概念/术语图解

Fig. LVM concepts, and how userspace file operations traverse the Linux storage stack.

2.3 使用场景

LVM 使用场景:

  • 将多个物理卷(physical volumes)或物理盘创建为一个逻辑卷(logical volume),有点类似于 RAID0,但更像 JBOD,好处是方便动态调整卷大小。
  • 热插拔,能在不停服的情况下添加或替换磁盘,管理非常方便。

2.4 使用教程

  1. What is LVM2 in Linux?, medium.com, 2023

3 文件系统:基于物理或逻辑卷(块设备),创建和管理文件层级

3.1 常规文件系统:不能跨 device

常规的文件系统,例如 XFS、EXT4 等等,都不能跨多个块设备(device)。 也就是说,创建一个文件系统时,只能指定一个特定的 device,比如 /dev/sda

要跨多个盘,只能通过 RAID、JBOD、LVM 等等技术将这些块设备合并成一个逻辑卷, 然后在这个逻辑卷上初始化文件系统。

3.2 Cross-device 文件系统

更高级一些的文件系统,是能够跨多个块设备的,包括,

  • ZFS
  • BTRFS

4 云计算:块存储是如何工作的

上一节已经介绍到,在块设备上初始化文件系统,就可以创建文件和目录了。 这里所说的块设备 —— 不管是物理设备,还是逻辑设备 —— 穿透之后终归是一个插在本机上硬件设备

有了虚拟化之后,情况就不一样了。 比如有一类特殊的 Linux 设备,它们对操作系统呈现的确实是一个块设备, 但其实底层对接的远端存储系统,而不是本机硬件设备。

在云计算中,这种存储类型称为“块存储”。

4.1 典型块存储产品

块存储(Block Storage),也称为 block-level storage,是公有云和私有云上都非常常见的一种存储。 各家的叫法或产品名字可能不同,例如,

  • AWS EBS(Elastic Block Store)
  • 阿里云的 SSD
  • Ceph RBD

4.2 工作层次:块级别

块存储工作在块级别(device-level),可以直接访问数据并实现高性能I/O。 因此它提供高性能、低延迟和快速数据传输

4.3 使用场景和使用方式

使用场景:

  • 虚拟机系统盘
  • 数据库磁盘

使用方式:

  1. 在块存储系统(例如 AWS EBS)中创建一个块设备,
  2. 将这个块挂载到想使用的机器上,这时呈现给这台机器的操作系统的是一个块设备(/dev/xxx),

    Storage Decision. Image Source

  3. 在这个块设备上初始化文件系统(例如初始化一个 ext4 文件系统),然后就可以像普通硬盘一样使用了。

4.4 基本设计

AWS 对文件存储、对象存储和块存储有一个不错的介绍文档。 其中提到的块存储的设计:

  • 块存储将数据划分为固定大小的 block进行存储。Block 的大小在初始化块设备时指定,可以是几 KB 到几 MB
  • 操作系统为每个 block 分配一个唯一的地址/序号,记录在一个表中。寻址使用这个序号,因此非常快;
  • 每个 Block 独立,可以直接访问或修改某个 block,不影响其他 blocks;
  • 存储元数据的设计非常紧凑,以保持高效
    • 非常基本的元数据结构,确保了在数据传输过程中的最小开销。
    • 搜索、查找和检索数据时,使用每个 block 的唯一标识符。
  • 块存储不依赖文件系统,也不需要独立的进程(例如,区别于 JuiceFS [4]),由操作系统直接管理

4.5 Ceph 块存储(RBD)的设计

4.5.1 概念

  • Pool:存储对象的逻辑分区(logical partitions used to store objects),有独立的 resilience/placement-groups/CRUSH-rules/snaphots 管理能力;
  • Image: 一个块,类似 LVM 中的一个 logical volume
  • PG (placement group): 存储 objects 的副本的基本单位,一个 PG 包含很多 objects,例如 3 副本的话就会有 3 个 PG,存放在三个 OSD 上;

创建一个 RBD 块设备的大致步骤:

$ ceph osd pool create {pool-name} [{pg-num} [{pgp-num}]] [replicated] \[crush-rule-name] [expected-num-objects]
$ rbd pool init {pool-name}
$ rbd create --size {size MB} {pool-name}/{image-name}

4.5.2 RBD 的后端存储:Ceph 对象存储

Ceph 的设计比较特殊,同时支持三种存储类型:

  1. 对象存储(object storage),类似 AWS S3;
  2. 文件存储(file storage),类似 JuiceFS [4];
  3. 块存储(block storage),类似 AWS EBS。

    背后,每个块存储中的 “block”(4.4 节中介绍的 block 概念), 实际上最后是一个 Ceph 对象存储中的 object。 也就是 Ceph 的块存储是基于 Ceph 的对象存储

4.5.3 读写流程

Fig. Ceph RBD IO. Each object is fix-sized, e.g. 4MB by default. Image Source

4.5.4 客户端代码实现

两种使用方式,二选一:

Fig. Ceph RBD workflow. Image Source

  1. 用户态库:librbd,这会直接通过 librados 去访问 Ceph 集群;
  2. 内核态库:将 RBD 挂载到主机之后,在系统中就可以看到一个 /dev/rbd{N} 的设备,
    • 可以像使用本地盘一样,在这个设备上初始化一个文件系统,然后就能在这个文件系统里面读写文件了;
    • RBD 驱动会将这些文件操作转换为对 Ceph 集群的操作,比如满 4MB 的文件作为一个 object 写到 Ceph 对象存储中;
    • 内核驱动源码:drivers/block/brd.c。
    • 源码解读:[2,3]

参考资料

  1. What’s the Difference Between Block, Object, and File Storage?, aws.amazon.com, 2024
  2. Ceph-RBD 源码阅读, blog.shunzi.tech, 2019
  3. Deep Dive Into Ceph’s Kernel Client, engineering.salesforce.com, 2024
  4. JuiceFS 元数据引擎初探:高层架构、引擎选型、读写工作流(2024)

相关文章:

存储进阶笔记(二):Linux 存储栈:从 Device Mapper、LVM 到文件系统(2024)

记录一些平时接触到的存储知识。由于是笔记而非教程,因此内容不求连贯,有基础的同学可作查漏补缺之用。 存储进阶笔记(一):硬件基础:HDD/SDD、JBOD、RAID 等(2024) 存储进阶笔记&am…...

Linux(Centos 7.6)基础命令/常用命令说明

1.目录相关命令 命令命令说明pwd用于显示/打印当前目录位置。ls/ll 列出当前目录下的文件或者目录,ll是ls -l的别名,ls仅显示名称,ll会显示详细的目录文件信息。 cd目录切换,常见用法有,cd /切换到根目录,…...

超详细!一文搞定PID!嵌入式STM32-PID位置环和速度环

本文目录 一、知识点1. PID是什么?2. 积分限幅--用于限制无限累加的积分项3. 输出值限幅--用于任何pid的输出4. PID工程 二、各类PID1. 位置式PID(用于位置环)(1)公式(2)代码使用代码 2. 增量式…...

【Goland】怎么执行 go mod download

1、终端的执行 go mod tidy 2、终端执行不行的话,就可以通过右击go.mod文件来执行; 3、也可以按住Ctrl点击这个包安装;...

服务器主机测试网络

测试命令 speedtest-cli sudo yum install python-pip pip install speedtest-cli # 默认连接国外被拒绝,用阿里云 pip install -i https://mirrors.aliyun.com/pypi/web/simple --trusted-host mirrors.aliyun.com speedtest-cli Collecting speedtest-cliDownlo…...

【JMeter详解】

JMeter详解 Apache JMeter 是一个开源的、100%纯Java应用程序,设计用于负载测试和性能测量。它最初是为测试Web应用程序而设计的,但后来扩展到其他测试功能。JMeter可以用来对静态和动态资源(如静态文件、Servlets、Perl脚本、Java对象、数据…...

Maven Wrapper 报错“未找到有效的 Maven 安装”

1. 检查 Maven Wrapper 配置: 确保你的项目中包含 .mvn/wrapper/maven-wrapper.properties 文件。 检查该文件中的 distributionUrl 属性,确保它指向一个有效的 Maven 发行版 URL。 2.确认 Maven Wrapper 脚本存在: 在项目根目录下&#x…...

如何通过 360 驱动大师检查自己电脑上的显卡信息

在深入探讨如何查看显卡信息之前,首先需要了解显卡的基本概念。显卡(Graphics Processing Unit, GPU),是计算机中负责处理图形输出到显示器的重要硬件。根据其集成度和性能,显卡通常被分为两类: 集成显卡&…...

C++并发:线程管控

1 线程基本管控 每个C程序都含有至少一个线程,即运行main()的线程,它由C运行时系统启动。随后程序可以发起更多线程,它们以别的函数作为入口。这些新线程连同起始线程并发运行。当main()返回时,程序就会退出;同样&…...

C++ 设计模式:策略模式(Strategy Pattern)

链接:C 设计模式 链接:C 设计模式 - 模板方法 链接:C 设计模式 - 观察者模式 策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以…...

SpringBoot(Ⅱ-2)——,SpringBoot版本控制,自动装配原理补充(源码),自动导包原理补充(源码),run方法

SpringBoot的版本控制是怎么做的 starter版本控制 SpringBoot的核心父依赖,下面导入的所有starter依赖都不需要指定版本,版本默认和spring-boot-starter-parent的parent版本一致; xxxstarter内部jar包依赖的版本管理,starter自…...

爬虫的工作原理

摘要: 本文详细阐述了爬虫的工作原理,从其基本概念出发,深入探讨了爬虫的主要组成部分,包括URL管理器、网页下载器、网页解析器和数据存储模块等。同时,分析了爬虫的抓取策略,如深度优先、广度优先等&#…...

你了解DNS吗?

你了解DNS吗? 一. 介绍二. DNS的工作原理三. DNS查询流程示意图四. DNS 记录类型五. DNS的安全问题与 DNSSEC 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 一. 介绍 …...

利用JavaScript实现顺序九宫格抽奖

顺序九宫格思路: 1.先获取抽奖按钮,方便给按钮绑定点击事件2.初始化下标k0,用于表示当前选中的索引下标,后续滚动起来会一直刷新3.获取大div盒子4.获取盒子里所有div元素,充当一个数组,后续可以通过下标来访问每个小div&#xff0…...

音视频入门知识(四):封装篇

⭐四、封装篇 H264封装成mp4、flv等格式,那为什么需要封装? ​ h264也能播放,但是按照帧率进行播放,可能不准 ★FLV **FLV(Flash Video)**是一种用于传输和播放视频的容器文件格式。FLV 格式广泛应用于流媒…...

在基于IMX6ULL的Linux嵌入式编程中,与内存相关的堆(Heap)和栈(Stack)有什么区别?Linux 系统中堆和栈的内存布局是怎么样的?

堆(Heap)和栈(Stack)的概念和区别 在基于 IMX6ULL 的 Linux 嵌入式编程中,堆(Heap)和栈(Stack)是两种不同的内存分配方式,各自具有不同的特点和用途。以下是它们的主要区别: 1. 存储位置 堆&am…...

Sealos Devbox 基础教程:使用 Cursor 从零开发一个 One API 替代品

随着技术的成熟和 AI 的崛起,很多原本需要团队协作才能完成的工作现在都可以通过自动化和智能化的方式完成。于是乎,单个开发者的能力得到了极大的提升 - 借助各种工具,一个人就可以完成开发、测试、运维等整条链路上的工作,渡劫飞…...

pthread.h互斥锁与原子操作

一:互斥锁 pthread.h 是 POSIX 线程库的头文件,它提供了多线程编程所需的各种功能。其中,互斥锁(mutex)的实现涉及多个底层机制: 1. 互斥锁的基本结构 在 POSIX 线程库中,互斥锁通常包含以下…...

网络基础入门到深入(3):网络协议-HTTP/S

目录 一、HTTP和HTTPS协议简介 1.HTTP协议 .HTTP 协议 作用: 特点: 2.HTTPS协议 作用: 实现方式: 特点: 二.HTTP的请求与响应结构 1.HTTP请求结构 1.请求行:描述操作和资源 2.请求头: 3.请求体 : 2.HTTP…...

Git的.gitignore文件详解与常见用法

诸神缄默不语-个人CSDN博文目录 在日常使用 Git 进行版本控制时,我们经常会遇到一些不需要被提交到远程仓库的文件(例如日志文件、临时配置文件、环境变量文件等)。为了忽略这些文件的提交,Git 提供了一个非常有用的功能&#xf…...

千问3.5-2B实战案例:在线考试截图作弊行为特征识别与标记

千问3.5-2B实战案例:在线考试截图作弊行为特征识别与标记 1. 项目背景与挑战 在线教育平台的监考人员每天需要审核大量考试截图,人工识别作弊行为存在以下痛点: 效率低下:平均每张截图需要30秒人工检查标准不一:不同…...

20轮对话后GPT开始“胡说八道“:我用Subagent分层架构让上下文永不清零

复杂任务跑20轮后,Agent开始"胡说八道"——重复已做过的操作、提出已否决的方案。 这不是模型变笨了,是上下文窗口被污染。本文用Subagent分层架构,让父Agent保持清醒,子Agent承担脏活,实现20轮对话上下文仅…...

基于R语言的自动数据收集:网络抓取和文本挖掘实用指南【1.8】

3.6 JSON文档示例在本节,我们要熟悉数据交换标准JSON的优点。这个首字母缩写(发音是“Jason”)代表JavaScript对象标记(JavaScript Object Notation)。JSON的设计和XML如出一辙,两者通常都是用来存储和交换…...

OpenClaw自动化周报:Qwen2.5-VL-7B整合代码提交与JIRA生成图文报告

OpenClaw自动化周报:Qwen2.5-VL-7B整合代码提交与JIRA生成图文报告 1. 为什么需要自动化周报 每周五下午,我都会陷入一种"周报焦虑"——要手动整理Git提交记录、JIRA任务状态、代码评审意见,再用Excel做数据透视,最后…...

Kali Linux下7z解压vmdk文件的完整教程(含BUUCTF-Misc题目复现)

Kali Linux下7z解压vmdk文件的完整指南与实战案例 在网络安全竞赛和数字取证工作中,虚拟磁盘文件(如vmdk格式)的处理是常见需求。作为专为安全测试设计的操作系统,Kali Linux内置了强大的7z工具链,能够高效处理各类压缩…...

如何永久保存微信聊天记录并挖掘数据价值?WeChatMsg全攻略

如何永久保存微信聊天记录并挖掘数据价值?WeChatMsg全攻略 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/W…...

2025最权威的五大降重复率方案推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 当下,各种各样的AI生成内容检测系统变得越发精密,这给那些依赖AI进行…...

2026届学术党必备的十大降重复率神器解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 减少AIGC率的关键要点是全力去降低文本里那些能够被分辨出来的机器生成特性 ,这…...

AI术语大白话:一张表让你从“小白“变“懂王“

看完这篇,下次开会再也不怕听不懂同事说的"黑话"了。为什么你需要了解这些?现如今,AI已经无处不在,想象一下这个场景:老板:"这个需求用RAGFine-tuning实现,Prompt要优化一下&…...

8 个值得收藏的综合类在线工具网站

8 个值得收藏的综合类在线工具网站1. tool.lu:老牌开发者工具箱,胜在稳定tool.lu 是很多开发者都用过的老站。它的优势不在“花哨”,而在于工具体系比较成熟,像代码格式化、压缩、加密解密、时间处理、图片与图标处理这类高频需求…...