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

文件系统入门到精通:理解与优化 Linux 文件存储

个人主页:chian-ocean

文章专栏-Linux

前言:

Linux 文件系统是 Linux 内核管理数据存储和访问的核心部分,它提供了一种结构化方式来组织、存储和检索数据。Linux 支持多种文件系统类型,如 ext4、XFS、Btrfs、FAT32、NTFS 等。

在这里插入图片描述

机械磁盘(HHD)

HHD构成

在这里插入图片描述

机械磁盘(硬盘)由以下几个主要部分组成:

  1. 盘片:存储数据的圆形盘片,表面涂有磁性材料,数据通过磁头读取或写入。
  2. 磁头:用于读写数据的部件,悬挂在磁头臂上,移动时在盘片表面上方“飞”行。
  3. 磁头臂:支撑磁头的臂,控制磁头在盘片表面上定位。
  4. 主轴电机:驱动盘片旋转的电机,通常以7200转/分钟或5400转/分钟的速度旋转。
  5. 控制电路:硬盘的控制器,处理数据读写请求并控制磁头、盘片和电机的操作。
  6. 外壳:硬盘的金属外壳,保护内部组件免受外界损害。

盘片构造

在这里插入图片描述

左侧 (a) 单个盘片的结构

  • 主轴(中心蓝色部分):用于驱动盘片旋转。
  • 磁道(同心圆):数据存储在盘片表面上的磁道中,每个磁道由多个扇区组成。
  • 间隙:磁道之间存在间隙,以避免数据干扰。

右侧 (b) 多个盘片的结构

  • 多个盘片(盘片 0、盘片 1、盘片 2):硬盘通常由多个盘片叠加在主轴上,每个盘片的两面都可以存储数据。
  • 柱面(Cylinder):在所有盘片相同磁道编号的位置组成的垂直数据存储单元,称为柱面。
  • 主轴:所有盘片固定在主轴上,并由主轴电机驱动同步旋转。

磁盘IO本质(通过磁头)

磁头和盘片之间存在一定间隙(大约0.1微米)。主要通过磁场变化进行IO

  • 电流通过线圈:在写操作中,磁头内部有一个非常细小的线圈,当电流通过线圈时,会产生一个强大的磁场。

  • 磁场作用:这个磁场作用于盘片表面的磁性颗粒,磁头会控制磁场的方向,从而改变磁性颗粒的极性。每个磁性颗粒在盘片表面都可以被改变磁极,代表“0”或“1”数据。

    • 磁场方向的变化会将磁性颗粒的方向改变,形成不同的磁性状态。这种状态的变化表示了存储的数据(通常是二进制数据,即“0”和“1”)。

扇区写入:这些磁性颗粒的排列方式在物理上存储数据,每个磁道上的一段数据通常由多个扇区组成。磁头的动作会将每个扇区的磁性状态按照预定的数据模式进行写入。

磁盘访问时间影响

在这里插入图片描述

磁盘以扇区为单位进行IO:对扇区的访问有以下三个主要部分

  • 寻道时间(Seek time): 机械硬盘使用一个机械臂,靠近盘片表面读取或写入数据。这个过程首先需要将磁头移动到正确的磁道位置上。这一步骤会产生一定的延迟时间。磁头在磁盘上来回移动,以找到存储数据的正确位置。

  • 旋转延迟(Rotational Latency): 硬盘盘片以一定的速度旋转,通常是5400 RPM(转/分钟)或7200 RPM等。由于磁盘的旋转,所需访问的数据可能还需要等待一段时间,直到目标数据的磁道恰好旋转到磁头下面。这段等待的时间称为旋转延迟(Rotational Latency),具体时间取决于磁盘的转速。转速越快,旋转延迟越短。

  • 数据传输(Data Transfer): 一旦磁头定位到正确的磁道,并且目标数据位于磁头下方,硬盘就可以开始读取或写入数据。此时的数据传输速度主要取决于硬盘的旋转速度、磁头读取速度和硬盘的缓存等因素。数据传输的速度通常是一个持续的过程,直到整个操作完成。

磁盘寻址方式

寻址在计算机系统中有着重要的意义,它不仅是硬盘、内存等存储设备正常运作的基础,还涉及到数据的高效存取、资源的合理分配、系统的兼容性等多个方面。下面介绍两种常见的寻址方式:

CHS寻址

CHS寻址(Cylinders, Heads, Sectors)是一种早期的硬盘数据存取方式,基于硬盘的物理结构来定位存储在硬盘上的数据。CHS寻址方式是通过三个参数来确定数据的存储位置:

  1. C (Cylinder - 磁道柱):硬盘的每个盘片上有多个同心圆形的磁道,所有盘片上对应位置的磁道共同形成一个磁道柱。磁道柱的编号从0开始,指示硬盘上的磁道位置。每个磁道柱都包含硬盘所有磁头对同一磁道的访问。
  2. H (Head - 磁头):硬盘通常由多个盘片组成,每个盘片有一个磁头用于读取和写入数据。磁头的编号从0开始,用来表示硬盘的哪一个磁头正在访问数据。硬盘的每个盘面通常都有一个磁头。
  3. S (Sector - 扇区):每个磁道被划分为若干个扇区,每个扇区是硬盘存储数据的最小单位。每个扇区的大小通常为512字节。扇区从0开始编号,表示磁道上的具体存储位置。
CHS寻址方式的工作原理:

硬盘使用这三个参数来定位数据的具体位置。**Cylinder(磁道柱)**指的是在硬盘上垂直方向上的数据位置,**Head(磁头)指定使用哪个磁头访问数据,而Sector(扇区)**则确定磁道上的具体存储位置。通过这三个信息,硬盘可以定位到数据所在的确切位置。

LBA寻址方式(Logical Block Addressing,逻辑块寻址)是一种现代硬盘(HDD)、固态硬盘(SSD)和其他存储设备常用的寻址方式。它通过将硬盘视为一个连续的逻辑地址空间,每个存储单元(通常是一个扇区)都有一个唯一的编号,而不依赖于硬盘的物理结构(如磁道、磁头和扇区)。

LBA的基本概念

在LBA寻址方式中,硬盘的存储单元(通常是一个扇区)被赋予一个连续的逻辑地址。每个扇区通常为512字节或4KB。LBA采用单一的逻辑块号来标识硬盘中的每个扇区,而不再依赖于物理位置(如磁道、磁头、扇区)。

LBA如何工作
  • 线性地址空间:LBA将硬盘中的所有扇区视为一个大的线性数组,每个扇区有一个唯一的编号,从0开始依次递增。每个LBA地址指向硬盘中的某个具体存储单元。
  • 简化寻址:操作系统通过LBA直接访问硬盘上的逻辑块。硬盘的控制器负责将LBA地址转换为具体的物理地址(如磁道、磁头、扇区)。这种方式隐藏了硬盘的物理结构,简化了数据的存取。
  • LBA地址映射:当操作系统请求访问某个LBA地址时,硬盘内部的控制器会将该LBA地址转换为实际的物理磁道、磁头和扇区组合。这是通过硬盘的内部映射机制完成的。

在这里插入图片描述

LBA与CHS的区别

特性LBA寻址CHS寻址
寻址方式使用逻辑块编号,硬盘看作一个连续的存储区依赖于磁道、磁头、扇区的物理结构
数据存储方式线性寻址依赖于硬盘的物理结构
访问效率高,适用于大容量存储较低,难以应对大容量硬盘
适用硬盘容量支持TB级及以上适用于较小的硬盘容量
灵活性非常灵活,支持不同硬盘架构受硬盘物理结构限制

文件系统(ext2为主)

Ext文件系统(Extended File System)是Linux操作系统中广泛使用的一系列文件系统的统称。Ext系列文件系统起源于1992年,经过多个版本的更新与改进,目前主要包括 Ext2Ext3Ext4

fdisk -l #查看磁盘信息

在这里插入图片描述

磁盘信息

  • 磁盘设备/dev/vda,这是您系统上的虚拟磁盘设备,通常在虚拟化环境中使用。
  • 磁盘大小42.9 GB,这表示磁盘的总容量为 42.9 GB(42949672960 字节)。
  • 磁盘扇区数83886080 sectors,磁盘的扇区总数。每个扇区的大小为 512 字节,因此总磁盘容量为 42.9 GB。

单位

  • 单位sectors of 1 * 512 = 512 bytes,每个扇区大小为 512 字节,磁盘空间是按扇区来计算的。

扇区大小

  • Sector size (logical/physical)512 bytes / 512 bytes,表示每个逻辑和物理扇区的大小都是 512 字节。

I/O 大小

  • I/O size (minimum/optimal)512 bytes / 512 bytes,最小和最优的 I/O 大小也是 512 字节。

磁盘标签类型

  • Disk label typedos,表示磁盘使用的是 DOS 分区表(MBR)。这种分区类型是传统的分区方案,最多支持 4 个主分区或 3 个主分区加一个扩展分区。

磁盘标识符

  • Disk identifier0x000148e1,这是磁盘的唯一标识符,用于区分不同的磁盘。

磁盘分区

在这里插入图片描述

磁盘与分区

  • 磁盘(Disk):这是物理存储设备,图中展示了一个典型的磁盘,它被划分为多个分区(Partition 1、Partition 2、Partition 3、Partition 4)。
  • 每个分区被格式化为一个 Ext2 文件系统(如 Partition 1、Partition 2 等)。

文件系统和块组

  • Ext2 文件系统:每个分区被格式化为 Ext2 文件系统。Ext2 文件系统通过 块组(Block Group) 来管理磁盘上的存储空间。每个分区被划分成若干个块组(Block Group 0、Block Group 1、…Block Group N)。每个块组都包含文件系统的一部分数据。

块组(Block Group)

每个块组包括以下几个重要部分:

  • 超级块(Superblock):超级块包含文件系统的元数据,例如块组的数量、块大小、总文件系统大小等。
  • 组描述符表(Group Descriptor Table,GDT):记录每个块组的具体信息,如 inode 位图、数据块位图、inode 表的位置等。
  • 块位图(Block Bitmap):记录块组内哪些数据块是空闲的,哪些已经被占用。
  • inode 位图(Inode Bitmap):记录块组内哪些 inode 是空闲的,哪些已经被占用。
  • inode 表(Inode Table):存储文件和目录的元数据,即 inode。每个文件或目录都有一个对应的 inode,包含文件的大小、权限、时间戳、指向数据块的指针等信息。
  • 数据块(Data Blocks):存储文件的实际数据。每个块组都有数据块,用于存储文件的内容。

inode 表

  • inode 是一个关键的数据结构,描述文件的元数据,包括文件的类型、权限、大小、所有者(UID/GID)等信息。它还包含指向数据块的指针。
  • inode 表 中列出了每个文件或目录的 inode 号码、文件类型、权限、链接计数、文件大小、用户和组 ID(UID/GID)等信息。

启动块(Boot Block/Sector)

  • 启动块是文件系统的第一部分,它的大小为 1KB,并包含操作系统启动所需的信息。启动块仅在系统引导时使用,一旦系统启动,Ext2 文件系统的管理才开始。

Inode和Data Block

inodeDataBlock 是文件系统中的两个核心概念,它们分别承担不同的职责,共同帮助操作系统管理文件的存储和访问。

文件 = 属性 + 数据(内容),属性就是 储存的inode里面,数据储存在Data Block中,他们之间存在某种映射关系建立联系。

inode中大致包含

文件类型:文件是普通文件、目录、符号链接等。
文件权限:包括文件的读、写、执行权限。
文件大小:文件的大小(以字节为单位)。
创建时间、修改时间和访问时间:文件的时间戳。
硬链接数:指向该 inode 的硬链接数量。
文件的用户 ID 和组 ID:文件的所有者和所属的用户组。
指向数据块的指针:这些指针指向存储文件内容的数据块。
......

inode 和 datablock 的映射方式

  • 直接指针(Direct Pointers):inode 中包含多个直接指针,直接指向文件的数据块。如果文件大小较小,inode 中的直接指针足够指向所有数据块。
    • 例如,如果一个文件有 5KB 的数据,inode 中可能包含 1 或 2 个直接指针,每个指针指向 1KB 或 2KB 大小的数据块。
  • 间接指针(Indirect Pointers):对于较大的文件,inode 中的直接指针无法容纳所有的数据块,因此使用间接指针来支持更大的文件。
    • 一级间接指针(Single Indirect Pointer):inode 中有一个指向一个指针块的指针。指针块本身存储了多个指向数据块的指针。因此,一级间接指针可以指向更多的数据块。
    • 二级间接指针(Double Indirect Pointer):如果文件的数据块更加庞大,inode 中还会包含指向二级指针块的指针。二级指针块本身包含指向一级指针块的指针,而一级指针块包含指向数据块的指针。
    • 三级间接指针(Triple Indirect Pointer):对于非常大的文件,inode 中可能包含三级间接指针,依此类推。

理解文件和目录

文件:文件 = 属性 + 数据

  • 属性储存在inode里 。
  • 数据存储在数据块中。

目录的定义

  • 目录也是一种文件,拥有自己的 inode(索引节点),包含文件的内容和属性。
  • 文件的组成是“内容 + 属性”,而目录本身也有内容和属性。

dentry缓存

  • 目录会有自己的 inode 编号,并且存在 dentry 缓存,这主要用于提高目录查找效率。

目录中是否有内容

  • 目录本身确实有内容,内容是与该目录相关的文件名及文件的 inode 映射关系。目录内容存储的是文件名与文件 inode 编号的关联。

软硬连接

软连接(Symbolic Link)和硬连接(Hard Link)是文件系统中的两种连接方式,它们各自有不同的特点和应用场景:

1软连接(Symbolic Link, symlink)**:

  • 软连接类似于快捷方式,它是一个指向另一个文件路径的文件。

  • 特点:

    • 软连接有自己的 inode,指向原文件的路径,而不是原文件的数据块。
    • 如果原文件被删除或移动,软连接会失效(成为“悬挂链接”或“死链接”),因为它依赖于文件路径。
    • 可以跨文件系统创建软连接。
    • 支持链接目录。
  • 创建方法

ln -s <目标文件> <软连接文件>
ln -s file link #建立软链接

在这里插入图片描述

硬连接(Hard Link)

  • 硬连接是指两个或多个文件名指向同一个 inode 号码,即它们都指向同一块数据存储区域。
  • 特点:
    • 硬连接和原文件共享同一个 inode,数据内容是相同的,硬连接的文件内容修改会影响其他硬连接。
    • 删除一个硬连接不会影响其他硬连接,只要有一个硬连接存在,文件内容就不会被删除。
    • 不能跨文件系统创建硬连接。
    • 不能为目录创建硬连接(除非超级用户使用特定操作)。
  • 创建方法
ln <目标文件> <硬连接文件>
ln file hard_link

在这里插入图片描述

引用计数变为了2 ,增加了一个硬链接。

  • 创建目录,为什么默认的引用计数为 2

在这里插入图片描述

对于目录而言,硬链接计数的含义略有不同。每个目录至少会有 两个硬链接(即硬链接计数为 2),这是由以下两个部分组成的:

  • 一个指向该目录本身的硬链接,即目录的正常名字。
  • 一个指向该目录的父目录的硬链接,每个目录项 ... 都是一个硬链接。

观察dir1的引用计数

在这里插入图片描述
目录 dir1

  • 目录 dir1 的硬链接数为 3。这表示该目录有 3 个硬链接:

    • 一个链接指向 dir1 本身。
    • 另一个链接指向该目录的父目录 ..
      (即硬链接计数为 2),这是由以下两个部分组成的:
  • 一个指向该目录本身的硬链接,即目录的正常名字。

  • 一个指向该目录的父目录的硬链接,每个目录项 ... 都是一个硬链接。


http://www.kler.cn/a/541924.html

相关文章:

  • 【Java】Object类中的equals()和hashCode()
  • 不小心删除服务[null]后,git bash出现错误
  • 30~32.ppt
  • Qt文本处理【正则表达式】示例详解:【QRegularExpression】
  • HTML之JavaScript分支结构
  • 查询语句来提取 detail 字段中包含 xxx 的 URL 里的 commodity/ 后面的数字串
  • 【音视频】RTSP拉流: RTP负载AAC详解(三)
  • 一种非完全图下的TSP求解算法
  • 记PasteSpider部署工具的Windows.IIS版本开发过程之草稿-效果展示(4)
  • 现代C++多线程基础 -忆苦思甜pthread_mutex
  • 外贸网站源码 助力企业抢占蛇年市场先机!
  • 使用redis实现 令牌桶算法 漏桶算法
  • TCP传输层协议
  • Terraform 最佳实践:Top 10 常见 DevOps/SRE 面试问题及答案
  • 【使用 rimraf 闪电删除 node_modules 目录】
  • 嵌入式接单/派单网站
  • Cursor 编辑器详细介绍与使用
  • 负载测试和压力测试的原理分别是什么
  • Redis 集群工作原理? 如何通信?MOVED和ASKED 有什么区别
  • RabbitMQ消息队列 发送和接受
  • CP AUTOSAR标准之IOHardwareAbstraction(AUTOSAR_SWS_IOHardwareAbstraction)(更新中……)
  • 洛必达法则的证明与重要条件
  • DaDianNao:一种无主存储器的多核加速器
  • 机器学习算法的种类(机器学习类型的比较)
  • FPGA开发技能(10)热电偶测温ADS1118方案
  • Docker Desktop 镜像源配置