揭秘:Linux 文件系统的内部运作

在这里插入图片描述


文件系统

文件在没有被打开时一般都是存储到物理储存介质——磁盘中,当一个文件要被加载到内存时枚举需要先去磁盘中找到这个文件,然后再进行加载。

如何在磁盘中找到文件?

磁盘的物理结构

物理结构定义组成/作用
盘片(Platter)硬盘由一个或多个盘片组成,这些盘片是覆盖着磁性材料的圆形片,用于存储数据。盘片以固定的转速旋转(如 5400 RPM 或 7200 RPM),使得磁头可以在不同位置读取或写入数据。
磁道(Track)每个盘片表面被划分为多个同心圆形的磁道。磁道是盘片上的圆形路径,磁头沿着磁道读取或写入数据。每个盘片表面有许多磁道,磁道之间相互平行。
扇区(Sector)磁道进一步被划分为多个扇区,扇区是磁盘上的最小物理存储单元。传统上,每个扇区大小为 512 字节,现代磁盘通常采用 4096 字节的扇区。
柱面(Cylinder)柱面是由多个盘片上具有相同半径的磁道组成的虚拟柱体。当磁头移动到一个特定的柱面时,它可以在不同的盘片上读取或写入数据,而不必移动磁头。
磁头(Read/Write Head)磁头负责读取和写入磁盘上的数据。每个盘片表面都有一个磁头。磁头通过悬臂移动到盘片的不同位置,定位到目标磁道和扇区进行读写操作。

image-20240813184128334

CHS 地址定位

定位步骤:

  1. 选择柱面:首先,通过柱面号(C)将磁头移动到指定的柱面。磁头移动到对应的磁道位置,这个操作被称为“寻道”。

  2. 选择磁头:在选定的柱面上,选择一个特定的磁头(H)。这个磁头对应一个盘片表面的特定磁道。

  3. 选择扇区:在指定的磁头位置,磁盘开始旋转,直到所需的扇区(S)旋转到磁头下方。此时,磁头可以读取或写入该扇区的数据。

根据磁盘的物理结构,可以通过指定柱面号、磁头号和扇区号来唯一确定磁盘上的一个物理位置,即CHS地址。

  • C(Cylinder,柱面):柱面是指磁盘上所有盘片同一位置的磁道集合。例如,第 0 号柱面包含了每个盘片的第 0 号磁道。

  • H(Head,磁头):每个盘片都有一个磁头用于读取或写入数据。磁头编号表示当前使用的盘片表面的磁头编号。

  • S(Sector,扇区):磁道被划分为多个扇区,扇区是磁盘上的最小物理存储单元,通常是 512 字节或 4096 字节。

结论:通过 CHS 地址,操作系统可以精确地定位磁盘上的每一块数据。

LBA地址定位

LBA(Logical Block Addressing,逻辑块寻址)是现代硬盘中普遍使用的一种数据寻址方式,用于替代传统的 CHS定位法。LBA 通过一个线性地址来定位磁盘上的数据块,从而简化了数据访问过程,尤其是在大容量硬盘中。

  • 逻辑块(Block):硬盘的存储空间被划分为许多大小相等的块(通常是 512 字节或 4096 字节)。每个块都有一个唯一的编号,称为 LBA 编号。

  • 线性寻址:在 LBA 模式下,硬盘被视为一个包含多个连续块的线性数组,LBA 编号从 0 开始,一直增加,直至覆盖整个硬盘的存储空间。

定位步骤:

  1. 分配 LBA 编号:每个数据块都被分配一个 LBA 编号,从 0 开始,按照块的顺序依次编号。LBA 编号与磁盘的物理结构无关,仅仅是一个逻辑标识。

  2. 计算物理地址:硬盘控制器接收到 LBA 编号后,将其转换为对应的物理地址。这通常包括计算目标块所在的磁道、磁头和扇区位置(尽管这些细节对用户和操作系统是透明的)。

  3. 读取/写入数据:硬盘控制器根据计算出的物理地址定位磁头,并读取或写入相应的数据块。

LBA和CHS地址转化

CHS寻址:CHS 定位一个扇区需要三个值:柱面号、磁头号、扇区号。

LBA寻址:将整个硬盘看作一个扁平的线性块序列,每个块有一个唯一的编号,从 0 开始,直到硬盘的总扇区数减一。

CHS 转 LBA

要将 CHS 地址转换为 LBA 地址,需要知道硬盘的几个参数:

  • C(总柱面数): 硬盘的总柱面数。
  • H(总磁头数): 硬盘的总磁头数。
  • S(每磁道的扇区数): 每个磁道上的扇区数。

假设给定 CHS 值为 (C, H, S),LBA 地址可以通过以下公式计算:

LBA = ( C × H t + H ) × S t + ( S − 1 ) \text{LBA} = (C \times H_t + H) \times S_t + (S - 1) LBA=(C×Ht+H)×St+(S1)
其中:

  • C 是柱面号。 C 是柱面号。 C是柱面号。

  • H t 是每个柱面的磁头数。 H_t 是每个柱面的磁头数。 Ht是每个柱面的磁头数。

  • H 是磁头号。 H 是磁头号。 H是磁头号。

  • S t 是每个磁道的扇区数。 S_t 是每个磁道的扇区数。 St是每个磁道的扇区数。

  • S 是扇区号。 S 是扇区号。 S是扇区号。

LBA 转 CHS

要将 LBA 地址转换为 CHS,需要反向操作:

  1. 首先计算柱面号:
    C = LBA H t × S t C = \frac{\text{LBA}}{H_t \times S_t} C=Ht×StLBA

  2. 然后计算磁头号:
    H = LBA m o d    ( H t × S t ) S t H = \frac{\text{LBA} \mod (H_t \times S_t)}{S_t} H=StLBAmod(Ht×St)

  3. 最后计算扇区号:
    S = ( LBA m o d    S t ) + 1 S = (\text{LBA}\mod S_t) + 1 S=(LBAmodSt)+1

CHS 寻址更接近于硬件层面的物理结构,但因为硬盘技术的发展,它的局限性使得现代硬盘更倾向于使用 LBA 寻址

LBA地址 VS CHS地址

CHS寻址:

  • CHS 是基于硬盘的物理结构来进行寻址的方式。它使用三个参数——柱面号(Cylinder)、磁头号(Head)、扇区号(Sector)来定位数据在硬盘上的具体位置。
  • 柱面代表的是磁盘上的圆形轨道集合;磁头代表具体使用的读写磁头;扇区是轨道上的最小存储单位。
  • CHS 寻址直接依赖硬盘的物理特性。

LBA寻址:

  • LBA 是一种逻辑寻址方式,将硬盘看作一个连续的线性块序列,每个块(也就是扇区)都有一个唯一的编号。
  • LBA 忽略了硬盘的物理结构,使用一个线性地址来访问数据,方便与操作系统和文件系统的交互。
  • 这种方式更灵活,适合大容量硬盘,特别是在现代存储设备中,LBA 已经取代了 CHS 成为标准。

适用范围和局限性

  • CHS 寻址:

    • 局限性: CHS 寻址方式依赖于硬盘的物理结构,因此当硬盘容量增加到一定程度时(如超过 8.4 GB),CHS 寻址就会出现无法表示的情况,因为传统 BIOS 对 CHS 寻址的支持有限(最多支持 1024 个柱面、256 个磁头和 63 个扇区)。
    • 适用范围: CHS 适用于早期的小容量硬盘,适合直接硬件层面的低级访问,但随着硬盘容量的增加,CHS 寻址变得越来越不实际。
  • LBA 寻址:

    • 优势: LBA 更符合现代大容量存储设备的需求,消除了 CHS 寻址的物理局限性,适用于各种存储设备(包括固态硬盘、磁盘阵列等)。
    • 灵活性: LBA 方式使得操作系统和文件系统可以不必考虑硬盘的物理特性,从而简化了数据管理和操作。
    • 适用范围: LBA 已成为现代硬盘的标准寻址方式,几乎所有现代硬盘和固态硬盘都使用 LBA。

性能与复杂度

  • CHS 寻址:

    • 性能: 在早期小容量硬盘上,CHS 寻址可以直接反映磁盘的物理结构,可能在某些特定硬件操作中更高效。
    • 复杂度: 对于程序员和系统开发者来说,CHS 寻址方式相对复杂,因为它需要精确地了解硬盘的物理结构,进行数据位置的计算。
  • LBA 寻址:

    • 性能: LBA 寻址在现代硬盘上表现更好,因为它简化了寻址过程,并且能够更好地适应大容量存储设备。
    • 复杂度: LBA 寻址极大地简化了数据访问的复杂度,不再需要考虑底层的硬盘物理结构,使得软件开发和系统管理更加简单。

文件的组织

分区

分区是将存储设备(如硬盘、SSD 等)划分为独立的部分,每个部分可以作为一个独立的逻辑存储单元。每个分区可以有自己的文件系统,也可以被操作系统单独管理。分区在文件系统层面上决定了数据的组织方式。

分区的类型:

  • 主分区(Primary Partition): 硬盘可以有最多四个主分区,操作系统可以直接从主分区启动。
  • 扩展分区(Extended Partition): 扩展分区不是用来存放数据的,而是为了突破主分区数量限制。一个硬盘只能有一个扩展分区,但在扩展分区内可以创建多个逻辑分区。
  • 逻辑分区(Logical Partition): 逻辑分区位于扩展分区内,可以有多个,用来存放数据或安装操作系统。

分区表:

  • 分区表(Partition Table)是存储设备的一个小区域,记录了分区的位置信息和大小。常见的分区表类型有 MBR(Master Boot Record)和 GPT(GUID Partition Table)。
  • MBR: 支持最多四个主分区或三个主分区加一个扩展分区,每个分区最大支持 2TB。
  • GPT: 支持无限数量的分区(实际限制通常为128个),并且支持超过2TB的分区大小,现代系统大多使用 GPT。

分块

分块(Block)是文件系统将存储空间划分为的若干个固定大小的块,每个块是文件存储的最小单位。分块使得文件系统可以高效管理和访问文件内容。

  • 块大小: 块大小是指文件系统中每个块的大小,常见的大小为 4KB、8KB 等。块大小的选择会影响文件系统的性能和空间利用率。

    • 小块大小: 可以减少内部碎片(文件末尾未使用的块部分),但会增加文件系统的管理开销。
    • 大块大小: 可以减少文件系统的管理开销,但可能会导致更多的内部碎片,特别是当大量小文件存在时。
  • 分块的作用:

    • 分块使得文件系统可以有效地管理磁盘空间,通过块号而不是绝对地址来定位数据。
    • 块是文件读写的基本单位,操作系统通常一次读写一个或多个块。

块分配方式:

  • 连续分配: 文件存储在连续的块中,容易管理且访问速度快,但容易产生外部碎片。
  • 链接分配: 文件的块通过链表链接,不要求连续,但顺序访问速度较慢。
  • 索引分配: 为每个文件维护一个索引块,记录所有文件块的地址,能够高效管理大文件。

inode

在文件系统中,inode(索引节点)是一种用于存储文件或目录的元数据信息的数据结构。每个文件或目录在文件系统中都有一个唯一的 inode,它包含了关于该文件或目录的大部分信息,但不包括文件名和文件的实际数据内容。

image-20240814102414296

inode 记录了以下关键元数据:

  • 文件类型:表示这是一个普通文件、目录、符号链接、设备文件等。

  • 文件权限:定义了文件的读、写、执行权限,例如 rwxr-xr-x

  • 所有者信息:文件所有者的用户 ID(UID)和所属组的组 ID(GID)。

  • 文件大小:文件的字节数。

  • 时间戳:记录了文件的相关时间信息,包括:

    • 访问时间(atime):最后一次读取文件内容的时间。
    • 修改时间(mtime):最后一次修改文件内容的时间。
    • 状态改变时间(ctime):最后一次更改 inode 元数据的时间(如权限修改)。
  • 链接计数:指向该 inode 的硬链接数量,即有多少不同的目录项(文件名)指向这个 inode。

  • 数据块指针:指向存储文件数据的实际块位置。一个 inode 通常包含多个直接指针和间接指针,用于处理文件的大小和数据块的组织:

    • 直接指针:直接指向文件数据所在的块。
    • 单级间接指针:指向一个块,该块内包含了更多的直接指针。
    • 双级间接指针:指向一个块,该块内包含了指向其他间接指针的块。
    • 三级间接指针:进一步扩展,用于处理非常大的文件。
  • 文件系统标志:某些特定的文件系统操作标志,比如是否已经被删除但未关闭等。

inode 工作机制

当你在一个文件系统中打开或操作一个文件时,操作系统通过文件名找到对应的 inode 编号,然后通过 inode 编号访问 inode 结构,获取文件的元数据信息和指向实际数据块的指针。

例如,当你在命令行中执行 ls -l 命令时,操作系统会使用文件名找到文件的 inode,并读取其中的元数据信息以显示文件的权限、所有者、大小和时间戳等信息。

image-20240814101926708

inode 与文件名

文件系统通过目录(也是一种文件)将文件名映射到 inode 编号上。当你重命名文件时,文件的 inode 编号保持不变,只是文件名指向的 inode 编号发生了变化。

分块管理

在这里插入图片描述

以 Ext2 文件系统为例,Ext2 文件系统将磁盘分为若干个块组(Block Group),每个块组由若干个连续的磁盘块组成。块组内包含了所有必需的结构,例如超级块(Superblock)、块位图、inode 位图、inode 表和数据块。

  • 超级块(Superblock): 存储文件系统的全局信息,包括文件系统大小、块大小、空闲块数量等。
  • 组描述符表(Group Descriptor Table): 描述每个块组的元数据,包括块位图、inode 位图和 inode 表的起始位置,以及该块组中空闲块、空闲 inode 和目录数量等信息。
  • 块位图(Block Bitmap): 用于记录该块组中哪些块已经被使用,哪些块是空闲的。
  • inode 位图(Inode Bitmap): 记录该块组中哪些 inode 已被分配,哪些是空闲的。
  • inode 表(Inode Table): 存储文件和目录的 inode 信息。每个 inode 包含文件的元数据及其指向的数据块指针。
  • 数据块(Data Blocks): 用于存储实际文件数据和目录内容。
数据块索引

在 Ext2 文件系统中,每个文件的 inode 中包含了指向数据块的指针。根据文件的大小和块数量,这些指针可能是直接的或间接的:

  • 直接指针: inode 直接指向文件的前 12 个数据块。

  • 单级间接指针: 当文件大于 12 个块时,inode 包含一个指向间接块的指针,该间接块中存储了更多的数据块指针。

  • 双级间接指针: 对于更大的文件,inode 包含一个指向双重间接块的指针,该块指向一个包含单级间接指针的块。

  • 三级间接指针: 对于极大的文件,inode 包含一个指向三级间接块的指针,逐级扩展可以管理极大的文件。

这种索引结构允许 Ext2 文件系统高效地处理小文件和大文件,同时保持访问性能。

释放块

当文件被删除或其内容缩小时,文件系统会释放与之关联的块。释放的块会更新块位图,并增加相应块组和超级块中的空闲块计数器。

软硬链接

软链接(Symbolic Link)和硬链接(Hard Link)是文件系统中提供的一种机制,用于创建指向文件或目录的引用。

硬链接

硬链接是指向同一文件数据的不同文件名。换句话说,硬链接是文件的一个直接引用,多个硬链接共享同一个文件的物理数据。

  • 共享相同的 inode 号: 硬链接指向的文件共享相同的 inode 号,因此它们实际上是同一个文件,只是有多个名字而已。
  • 文件删除行为: 只有当所有的硬链接都被删除后,文件的数据才会真正被删除。删除其中一个硬链接,其他的硬链接仍然可以正常访问数据。
  • 只能在同一个文件系统内创建: 硬链接不能跨文件系统创建。

创建硬链接的命令:

ln source_file hard_link
cp -l source_file hard_link

软链接

软链接(有时也称为符号链接)是一个指向另一个文件或目录的快捷方式,类似于 Windows 系统中的快捷方式。

  • 不同的 inode 号: 软链接是一个独立的文件,它包含了目标文件的路径。它本身有自己的 inode 号,与目标文件的 inode 号不同。
  • 文件删除行为: 如果目标文件被删除了,软链接就会失效,变成“悬空链接”,指向一个不存在的文件。
  • 可以跨文件系统创建: 软链接可以跨越不同的文件系统或分区。
  • 可以指向目录: 软链接可以指向一个目录,而硬链接一般不支持对目录进行链接(除非使用超级用户权限)。

创建软链接的命令:

ln -s source_file symbolic_link
cp -s source_file symbolic_link

件,它包含了目标文件的路径。它本身有自己的 inode 号,与目标文件的 inode 号不同。

  • 文件删除行为: 如果目标文件被删除了,软链接就会失效,变成“悬空链接”,指向一个不存在的文件。
  • 可以跨文件系统创建: 软链接可以跨越不同的文件系统或分区。
  • 可以指向目录: 软链接可以指向一个目录,而硬链接一般不支持对目录进行链接(除非使用超级用户权限)。

创建软链接的命令:

ln -s source_file symbolic_link
cp -s source_file symbolic_link
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拖拉机厂第一代码手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值