前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【Linux】文件系统

【Linux】文件系统

作者头像
用户11029103
发布2025-03-04 08:34:42
发布2025-03-04 08:34:42
10000
代码可运行
举报
文章被收录于专栏:技术学习技术学习
运行总次数:0
代码可运行

01.认识磁盘

磁盘是一种通过磁性原理进行数据存储和读取的设备,常用于存储操作系统、应用程序以及用户文件等。它通常由多个盘片组成,这些盘片通过旋转来提高数据存取速度

磁盘是计算机存储系统中非常重要的组成部分,负责持久化存储数据。通过不同类型的磁盘(如HDD、SSD、SSHD)以及不同的工作原理,磁盘提供了多样化的解决方案来满足不同的性能、容量和价格需求。对于现代计算机系统,SSD提供了极快的读取速度和较低的功耗,成为了主流的存储选择。而对于大容量存储,HDD 依然是性价比高的选择。

硬盘驱动器(HDD,Hard Disk Drive)

硬盘驱动器是最常见的磁盘类型,利用磁性存储来读写数据。硬盘内部包含多个磁盘盘片,这些盘片不断旋转,磁头通过电磁感应的原理在盘片表面读取和写入数据。

工作原理

  • 盘片(Platters):硬盘的存储介质,表面涂有磁性材料,数据通过磁化在这些盘片上存储。
  • 磁头(Read/Write Head):负责读取和写入数据。磁头非常微小,悬浮在盘片上方。
  • 旋转速度(RPM):硬盘的盘片以每分钟转数(RPM)为单位进行旋转,常见的有5400RPM、7200RPM等,转速越高,数据的读写速度越快。

固态硬盘(SSD,Solid-State Drive)

固态硬盘是一种基于闪存技术的存储设备,不包含任何机械部件。SSD 的数据存储原理基于电荷在 NAND 闪存芯片中的存储。

优点

  • 无机械部件,抗震动能力强,耐用性好。
  • 读取和写入速度极快,能够显著提高计算机的性能,尤其是在启动速度和文件加载速度方面。
  • 功耗低,适合用于移动设备。

缺点

  • 价格较高,尤其是在大容量方面,相比于 HDD 成本较高。
  • 数据写入的次数有限,尽管现代 SSD 的寿命已经非常长。

工作原理

  • 闪存芯片:通过电荷在存储单元中存储数据。每个单元可以存储一定数量的数据,SSD 通过 NAND 闪存技术实现数据的存储和访问。
  • 控制器(Controller):控制器负责管理数据的读写,并确保数据的可靠性和持久性。

混合硬盘(SSHD,Solid-State Hybrid Drive): 混合硬盘结合了 HDD 和 SSD 的优点,通常包含一个大容量的机械硬盘和一个较小的固态硬盘。混合硬盘会将常用的数据或文件存储在 SSD 部分,以提高性能,而大容量数据存储则依然使用 HDD 部分。

磁盘的工作原理

磁盘的核心工作原理就是使用磁场和电流的变化来控制数据的存储与读取。具体来说,磁盘的工作可以分为以下几个步骤:

  1. 数据写入
    • 数据写入时,磁头根据电信号的变化,在磁盘的磁性表面磁化不同区域。
    • 磁盘表面由成千上万的小区域组成,每个区域可以表示二进制的“0”或“1”。
    • 写入操作是通过改变这些区域的磁化方向来实现的。
  2. 数据读取
    • 读取数据时,磁头通过感应盘片表面不同的磁化状态来读取数据。
    • 当磁头经过某个磁化区域时,磁场的变化会被感知并转换成电信号,进而被计算机处理成数据。
  3. 机械部分
    • 磁盘内部的盘片不断旋转,磁头则通过精确的机械控制悬浮在盘片表面,以进行数据的读写。
    • 盘片的旋转速度和磁头的精确度直接影响硬盘的性能。
  4. 数据存储
    • 存储介质的不同(磁性、闪存)决定了存储数据的方式和存取速度。机械硬盘依赖磁性盘片,而固态硬盘依赖 NAND 闪存芯片。
磁盘的分类

根据存储介质和传输方式,磁盘可以分为不同类型:

  1. 内置磁盘(Internal Disks):这些磁盘被安装在计算机内部,直接通过数据总线与计算机连接。
  2. 外置磁盘(External Disks):这些磁盘通常通过 USB、Thunderbolt 或其他接口与计算机连接,用于备份、数据传输等。
磁盘的逻辑结构

磁盘的逻辑结构是如何将物理存储划分为可管理的单位,以便计算机能有效地存储和检索数据。磁盘的逻辑结构包括以下几个层次:

扇区(Sector)

磁盘的最小数据存储单位是扇区(sector)。每个扇区通常由 512 字节或 4 KB 组成(现代磁盘也支持更大的扇区)。每个扇区都有唯一的地址,用于定位和访问数据。

  • 每个扇区的数据是按顺序存储的。
  • 硬盘的存储空间是通过扇区来划分和管理的,操作系统通过扇区来读写数据。

簇(Cluster)

簇是操作系统在磁盘上分配空间的最小单位,通常由多个扇区组成。簇的大小通常是 4 KB、8 KB、16 KB 等。簇的大小决定了磁盘的存储效率和性能。

  • 由于操作系统一次只能分配一个簇,所以如果文件小于一个簇,剩余的空间会被浪费。
  • 通过增加簇的大小,可以减少磁盘空间的碎片。

轨道(Track)

轨道是盘片表面上的同心圆,磁盘的每个盘片表面都有多个轨道。每个轨道由多个扇区组成,磁头通过磁臂定位到指定的轨道进行数据读取和写入。

  • 轨道的数量与磁盘的旋转速度和盘片数量相关。
  • 不同的轨道上存储的数据顺序可以帮助提高磁盘的读取性能。

柱面(Cylinder)

柱面是由多个盘片表面上具有相同位置的轨道组成的集合。每个柱面上包括磁盘中所有盘片的相同位置的轨道。例如,柱面 0 包含所有盘片的第一个轨道,柱面 1 包含所有盘片的第二个轨道,依此类推。

  • 操作系统访问磁盘时,通常会试图访问同一个柱面上的所有轨道,以减少磁头的移动,提高读取效率。

哪怕现在我只需要改一个比特位,也需要把磁盘中512位全部读到内存中

如何找到一个指定位置的扇区(CHS定址法): a. 找到指定的磁头(找到在哪个面)(Header) b. 找到指定的磁道(柱面)(Cylinder) c. 找到指定的扇区(Sector)

磁盘盘片旋转:定位扇区 磁头左右移动:定位轨道

文件其实就是在磁盘中占有几个扇区的问题

逻辑抽象

OS直接用CHS对设备进行管理的话耦合度太高

对磁盘可以将其抽象为一个线性结构,把磁盘每一面拉直拼在一起,线性结构每一个小段是一个扇区,最终把磁盘直接抽象为数组,sector

假设一个面有1000个扇区,10个磁道,未来通过下标可以确定扇面位置

可以得到H C S

对于操作系统来言,未来我们读取数据,可以以块为单位了

文件只需要记录自己的LBA地址

块大小=4KB(八个连续的扇区)

磁盘存在多个块,对磁盘进行分区管理,我们电脑的C,D盘就是一个分区,选取其中一个分区进行分析,分区里面进行分组,管理好一组就能管理好每一组,就能管理好每一个分区,这里用了分治的思想

02.文件系统

上面的逻辑图与之对应

文件 = 内容 + 属性

文件在磁盘存储,本质是文件的内容+文件的属性数据,Linux文件系统特定:文件内容和文件属性分开存储

文件系统的结构
  1. 数据块(Data Blocks)
  • 数据块只存储实际的文件内容。文件的每个部分都会分配一个或多个数据块。

每个数据块固定4kb的大小

  1. 超级块(Superblock)(不是每个分组都有) 存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了
  2. 块位图(Block Bitmap) Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用,块位图的位置代表块号,在文件系统的块位图中,每一位的位置对应一个具体的数据块,通过该位置的索引值,我们可以确定对应的数据块的块号,内容表示该块是否被占用(0/1)
  3. i节点表(inode Table) 存放文件属性,如文件大小,所有者,最近修改时间等

Linux中的文件属性是一个大小固定的集合体,inode是用于描述文件属性的结构体

inode内部不包含文件名!

每个文件都有一个唯一的inode,每个文件都有inode number,通过inode号来标识一个文件

inode里面会包含一个数组,这个数组会保存该文件会占用哪些数据块

  1. inode位图:比特位的位置表示第几个inode,内容表示是否被占用

我们寻找文件的时候,都必须先得到文件的inode编号,inode编号是以分区为单位的!

一个 磁盘分区 是磁盘的一个独立区域,可以被格式化为一个 文件系统。在文件系统中,文件(以及目录等对象)是通过 inode 来管理的。

  • 磁盘分区(Partition):磁盘分为多个分区,每个分区可以独立存储数据。每个分区都可以包含一个完整的文件系统。
  • 文件系统(Filesystem):在一个磁盘分区中,文件系统管理磁盘空间,用于存储文件的数据和元数据(如 inode)。文件系统是一个独立的区域,它有自己的结构,包括 inode 表、数据块、块位图等。
inode 编号与文件系统分区的关系

在每个文件系统中,inode 编号是从文件系统的 inode 表中分配的。每个文件系统在创建时会分配一个 inode 表,这个表包含了该文件系统中所有文件和目录的 inode 信息。

  • inode 编号的范围限定在当前文件系统的 inode 表内,也就是说,一个分区的 inode 编号只能在该分区内有效。不同分区中的文件系统有各自独立的 inode 编号空间。

例如,如果你有一个磁盘分区 sda1 和另一个磁盘分区 sda2,它们各自有自己的 inode 编号空间:

  • 在分区 sda1 中,inode 编号可能从 1 开始,到 N(N 是分区中最大 inode 数量)。
  • 在分区 sda2 中,inode 编号也会从 1 开始,到 M(M 是该分区最大 inode 数量)。

每个分区的 inode 表是 独立的,所以 inode 编号对不同分区来说是不重叠的

文件的 inode 编号

每个文件都有一个 inode 编号,该编号唯一标识文件的元数据。当我们查找文件时,操作系统通过目录项找到文件的 inode 编号,然后根据该 inode 编号查找 inode 结构来获取文件的详细信息。

  • inode 编号 是一个 相对编号,它仅在当前文件系统(分区)中有效。操作系统通过目录项(如 /home/user/document.txt)解析出该文件对应的 inode 编号。
  • 跨分区文件:如果文件位于不同的磁盘分区上,操作系统需要知道文件所属分区,然后在该分区的 inode 表中查找对应的 inode 编号。

假设你有两个分区 /dev/sda1/dev/sda2,每个分区上都有一个文件系统(如 ext4)。文件系统分别管理它们各自的 inode 表:

  • 分区 /dev/sda1 的 inode 编号可能从 1 开始,最大值为 1000,这些 inode 只在 /dev/sda1 分区的文件系统中有效。
  • 分区 /dev/sda2 的 inode 编号可能从 1 开始,最大值为 2000,这些 inode 只在 /dev/sda2 分区的文件系统中有效。

如果你要查找文件 /home/user/file1.txt,操作系统首先会解析路径 /home/user/file1.txt,然后找到 /home/user/ 目录项中包含的 inode 编号(比如 inode 编号 120),操作系统会在 /dev/sda1 分区的 inode 表中查找 inode 120

现在,得到inode就知道在哪个分区的哪个分组里,然后根据inode编号直接在inode表里面就可以找到inode信息,找到了文件的所有属性和内容,那和文件名有什么关系呢?

inode与文件名的映射

在 Linux 文件系统中,文件名inode 之间的映射关系是通过 目录项(directory entry) 来建立的。每个目录都有自己的目录项,每个目录项包含了文件的 名称 和指向该文件的 inode 的引用。简而言之,文件名是通过 目录文件(如 /home/etc 等)来与其对应的 inode 建立关联的。

目录也是文件,它也有自己的属性,关键就是目录的内容

文件名与 inode 映射的工作原理
  1. 目录项(Directory Entry)
    • 每个目录是一个文件,目录本质上是一个特殊的文件,其中存储了多个 目录项。每个 目录项 记录了 文件名 和该文件对应的 inode 号
    • 每个目录项通常包含以下两部分:
      • 文件名:表示文件的名称(例如 foo.txt)。
      • inode 号:指向该文件的 inode 结构体,包含文件的元数据。
  2. 目录结构的存储
    • 目录的文件内容实际上是一个 目录项数组,每个目录项记录了一个文件的名称与 inode 号的对应关系。所有的文件都通过目录项与 inode 进行映射。
    • 举个简单的例子,假设一个目录 dir 中有两个文件 file1.txtfile2.txt,那么该目录中的目录项会记录如下信息:
      • 目录项 1:文件名 file1.txt 和 inode 号 123
      • 目录项 2:文件名 file2.txt 和 inode 号 124 所以一个目录下不能建立同名文件,就是因为文件名和inode号要互为键值,互相能找到彼此
  3. 查找文件名对应的 inode
    • 当用户访问一个文件时(例如通过路径 /home/user/file1.txt),操作系统会根据路径从根目录开始查找,逐级查找每个目录,直到找到目标文件的目录。
    • 在每个目录中,操作系统会遍历目录项,查找与文件名匹配的目录项,找到文件的 inode 号
    • 找到 inode 号后,操作系统就可以通过该 inode 获取文件的元数据(如大小、权限、数据块位置等)。

目录的r本质就是是否允许我们读取目录的内容

目录的w,决定是否能新建文件,因为文件的新建最后一定要向当前所处的目录内容中写入文件名和inode的映射关系

目录项缓存(Dentry Cache)
  • 目录项缓存(dentry cache) 用于缓存目录项结构(dentry)
  • 缓存机制:当访问文件路径时,Linux 会通过 目录项缓存 加速路径解析,避免多次遍历目录树
    • 举个例子,当访问路径 /home/user/file.txt 时,操作系统会缓存 /home/home/user 等目录的 dentry,避免下次访问时重新查找这些目录。
  • 缓存路径:路径解析过程中,操作系统检查 dentry 缓存,如果缓存中已存在路径的目录项,则直接使用该缓存,避免再次访问磁盘进行路径解析。
Linux 文件系统缓存路径的工作流程

当用户或程序访问文件时,操作系统通常会按照以下路径结构来处理缓存:

文件访问流程

  1. 路径解析:首先,操作系统会查找 目录项缓存(dentry cache) 来解析文件路径。如果路径的目录项已经缓存,操作系统直接使用缓存,跳过磁盘 I/O;否则,操作系统会从磁盘读取路径信息并缓存。
  2. 查找 inode:在路径解析完成后,操作系统会通过 inode 缓存(inode cache) 来检查文件的 inode。如果 inode 已缓存,操作系统直接使用缓存的 inode 信息,否则从磁盘读取 inode 并缓存。
  3. 读取文件数据:操作系统会查找 页缓存(page cache) 来确定文件的数据是否已缓存。如果文件数据已经在缓存中,操作系统直接返回缓存中的数据;否则,它会从磁盘读取文件数据并将其加载到页缓存中。
  4. 读取数据块:如果文件的数据块不在缓存中,操作系统会访问 块缓存,并在必要时从磁盘读取数据块。
代码语言:javascript
代码运行次数:0
复制
用户请求文件数据
         |
    解析文件路径
         |
   ┌──────────────────┐
   │ 目录项缓存(dentry cache)│ ← 如果存在,直接返回缓存数据
   └──────────────────┘
         |
   查找 inode 信息
         |
   ┌──────────────────┐
   │ inode 缓存(inode cache) │ ← 如果存在,直接返回缓存数据
   └──────────────────┘
         |
   读取文件数据
         |
   ┌──────────────────┐
   │ 页缓存(page cache)   │ ← 如果存在,直接返回缓存数据
   └──────────────────┘
         |
  读取磁盘数据块(如果不在缓存中)
         |
   ┌──────────────────┐
   │ 块缓存(block cache)   │ ← 如果存在,直接返回缓存数据
   └──────────────────┘
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 01.认识磁盘
    • 磁盘的工作原理
    • 磁盘的分类
    • 磁盘的逻辑结构
    • 逻辑抽象
  • 02.文件系统
    • 文件系统的结构
    • inode 编号与文件系统分区的关系
    • 文件的 inode 编号
    • inode与文件名的映射
    • 文件名与 inode 映射的工作原理
      • 目录项缓存(Dentry Cache)
    • Linux 文件系统缓存路径的工作流程
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档