浅谈EXT2文件系统(1)

简介

EXT2(Second Extended Filesystem)文件系统是Linux操作系统的早期文件系统之一,它于 1993 年推出,是第一个旨在克服 Ext 文件系统限制的商业文件系统。EXT2 没有日志功能,EXT2 支持的单个文件大小为 2TB,根据块大小,可以从 4TB 到 32 TB。 

其架构较为简单,但具有良好的性能和灵活性。以下是EXT2文件系统的架构组成:

1.引导扇区(Boot Sector)

EXT文件系统 中,每个分区最开始的两个扇区(通常被称为 Boot Sector引导扇区),在 EXT文件系统下,分区开头的 Boot Sector 和操作系统启动几乎没有直接关系。启动过程主要依赖于引导加载程序(如 GRUB),而不是依赖于 ext 文件系统的特定结构。 Boot Sector 更多是在传统 BIOS 或某些特定引导环境中发挥作用。

2. 块组(Block Groups)

EXT2文件系统将整个磁盘分成多个块组(block group),每个块组都相对独立,包含了该组内的数据和元数据。块组的设计使得文件系统的数据和元数据分布在多个位置,从而减少文件系统损坏的影响,并提高文件访问性能。每个块组都包含以下几部分:

  • 超级块:超级块位于每个文件系统的开头,包含文件系统的基本信息,只存在与Group 0
  • 超级块的备份:为保证可靠性,块组中包含超级块的备份。
  • 块组描述符(Block Group Descriptor):记录了每个块组的重要元数据,它指向该块组中的关键结构,比如块位图、inode位图和inode表等。
  • 保留的组描述符表块(Reserved GDT blocks):是一种用于增强文件系统可靠性的机制。
  • 块位图(Block Bitmap):跟踪块的使用情况,标记哪些块被使用,哪些块是空闲的。
  • inode位图(Inode Bitmap):跟踪inode的使用情况,类似于块位图,标记哪些inode被占用。
  • inode表(Inode Table):每个文件或目录都通过一个inode表示,inode包含了文件的元数据信息,如文件大小、权限、时间戳、指向数据块的指针等。
  • 数据块(Data Blocks):用于存储实际文件数据。

3. 超级块(Superblock)

超级块位于文件系统的第一个块组(Block Group)中的第一个块(Block),超级块(Superblock)是文件系统的核心结构之一,负责存储整个文件系统的元数据,如文件系统的大小、块大小、空闲块和 inode 的数量等关键信息。

4.超级块的备份

为了确保文件系统的可靠性,EXT2 文件系统设计了超级块的备份机制,以防止超级块损坏导致的文件系统无法使用。

  1. 超级块的备份

    • 为了增强容错性,EXT2 在每个块组的起始位置都备份了超级块以及块组描述符表。
    • 如果文件系统中的主超级块损坏,系统可以使用这些备份来恢复文件系统的关键信息。
  2. 备份的分布方式

    这种稀疏备份策略减少了超级块备份的数量,从而节省了空间,但仍然提供了足够的冗余。

    • 常规备份:默认情况下,EXT2 文件系统会在每个块组的起始位置备份超级块。这意味着文件系统中每个块组的头部都会包含一个超级块的副本。
    • 稀疏备份(Sparse Superblock):在某些情况下,EXT2 使用一种优化的稀疏备份策略。即不是每个块组都备份超级块,而是只在特定的块组中保存超级块的备份。通常,备份会存在以下这些块组中:
      • 第 1 组
      • 2 的幂次方位置的块组,如第 3 组、5 组、7 组等
  3. 恢复机制

    • 当文件系统检测到主超级块损坏时,可以通过工具(如 e2fsck)从备份超级块中恢复文件系统。
    • 用户在使用修复工具时,可以指定备份超级块的位置来手动恢复文件系统。

这种备份机制为 EXT2 提供了更好的容错能力,确保即使主超级块损坏,文件系统也能通过备份恢复关键元数据。

5.块组描述符(Block Group Descriptor)

在 EXT2 文件系统中,块组描述符(Block Group Descriptor)是用于管理文件系统中各个块组的关键数据结构。EXT2 文件系统将整个存储设备划分为若干个块组(Block Group),每个块组由一组相对较小的连续块组成。块组描述符存储了有关这些块组的元数据信息,以便管理文件的存储、读取和写入操作。

EXT2 块组描述符的结构与功能

每个块组描述符对应一个块组,描述符存储在文件系统的超级块之后,并且会有一个描述符表存放这些块组描述符的信息。描述符表可以理解为块组的索引,便于定位和管理文件系统中的资源。

块组描述符的主要字段

每个块组描述符结构包含以下重要字段:

  1. 块位图的块号(Block Bitmap Block Address):

    • 存储指向块组中块位图的块号。
    • 块位图是一个位数组,用于记录块组中的块是否被占用。每一位代表一个块,值为 0 表示该块空闲,1 表示该块已被使用。
  2. inode 位图的块号(Inode Bitmap Block Address):

    • 存储指向块组中inode 位图的块号。
    • inode 位图类似于块位图,用来记录 inode 是否被使用。每一位表示一个 inode,0 表示空闲,1 表示已使用。
  3. inode 表的起始块号(Inode Table Block Address):

    • 该字段记录块组中 inode 表(Inode Table)的起始块号。
    • inode 表是存储文件 inode 结构的表,每个 inode 结构记录了文件的元数据(如文件类型、权限、大小、数据块指针等)。
  4. 块组中空闲块的数量(Free Blocks Count):

    • 记录该块组中当前空闲数据块的数量。
  5. 块组中空闲 inode 的数量(Free Inodes Count):

    • 记录该块组中当前空闲 inode 的数量。
  6. 该块组中的目录数量(Directories Count):

    • 记录该块组中目录的数量。
块组描述符的位置
  • 块组描述符紧随超级块之后。在每个块组的第一个块中都有一个超级块的备份,备份后面紧跟块组描述符表的备份。
  • EXT2 文件系统为每个块组创建一个块组描述符,因此块组描述符表是一个连续的区域,其中每个描述符对应一个块组。
块组描述符的作用

块组描述符表充当了文件系统管理的“目录”:

  1. 管理块和 inode 的分配

    • 通过块位图和 inode 位图来跟踪块组中的可用块和 inode,确保数据的存储和文件的创建能够高效分配空间。
  2. 高效文件访问

    • 块组描述符记录了每个块组中 inode 表的位置,方便快速找到文件的 inode,从而提高文件的读取和写入效率。
  3. 文件系统一致性检查

    • 块组描述符表中的字段(如空闲块和空闲 inode 数量)用于文件系统的一致性检查和修复,帮助工具(如 e2fsck)修复文件系统中的错误。
块组描述符与超级块的关系
  • 超级块包含整个文件系统的全局信息,而块组描述符提供了对每个块组的局部管理。
  • 超级块会存储一些块组全局计数信息,如文件系统总块数、总 inode 数等,而块组描述符则存储各个块组的具体分配情况。

6.保留的组描述符表块(Reserved GDT blocks)

在 EXT2 文件系统中,Reserved GDT Blocks(保留的组描述符表块)是一种用于增强文件系统可靠性的机制。它们主要用于在文件系统扩展时为新的块组描述符提供额外的存储空间。GDT 是组描述符表(Group Descriptor Table)的缩写,而这些保留块可以确保在将来扩展文件系统时有足够的空间记录新的块组的描述信息。

Reserved GDT Blocks 的背景

在 EXT2 文件系统中,存储设备被划分为多个块组(Block Groups),每个块组都包含以下几个部分:

  • 超级块(Superblock)
  • 块组描述符表(Group Descriptor Table)
  • 数据块、inode 位图和 inode 表
  • 文件数据块

块组描述符表存储了每个块组的重要元数据信息,例如每个块组中的 inode 表和数据块的起始位置。这个表通常位于文件系统的起始区域,当文件系统需要扩展时,可能会出现空间不足的情况,导致无法添加新的块组描述符。

Reserved GDT Blocks 的作用
  1. 存储新的块组描述符

    • 在文件系统创建时,系统会在文件系统的开始部分分配用于存储当前块组描述符的空间。为了确保文件系统扩展时能够记录更多块组的描述符信息,EXT2 文件系统会在创建时保留一部分额外的空间,即 Reserved GDT Blocks。这样,当文件系统扩展时,可以在这些保留的块中添加新的块组描述符,而不必重新安排原有数据结构。
  2. 增强文件系统的灵活性

    • 如果没有 Reserved GDT Blocks,当文件系统需要扩展并增加更多块组时,可能无法为新的块组描述符找到足够的空间。通过在创建文件系统时预留这些块,EXT2 能够轻松扩展,而不需要对已有文件系统进行复杂的调整。
  3. 容错机制

    • Reserved GDT Blocks 也可以为文件系统提供一定的容错能力。在文件系统的一些元数据损坏时,保留的块可以作为备份或补充区域,确保文件系统在出现问题时仍然能够进行修复和扩展。
Reserved GDT Blocks 的数量与配置
  • 数量:在创建文件系统时,文件系统的工具(如 mke2fs)可以指定创建多少个保留的 GDT 块。这个数量通常是根据文件系统的大小和预期的扩展需求来决定的。
  • 位置:这些保留的块通常位于文件系统的开始部分,与超级块、块组描述符表等结构相邻。
Reserved GDT Blocks 与文件系统扩展
  1. 文件系统扩展

    • 当文件系统扩展时,需要增加新的块组来容纳更多的数据和 inode。此时,需要为新的块组在组描述符表中添加对应的描述符。
    • 如果没有保留的 GDT 块,系统可能会面临无法扩展的问题,特别是在文件系统的开始部分没有足够的空间存放新的组描述符。
  2. 扩展时的操作

    • EXT2 文件系统的扩展操作会检查是否存在足够的 Reserved GDT Blocks 供使用。如果有足够的保留块,新的块组描述符将被添加到这些保留的块中,从而支持更多的块组。否则,扩展操作可能会失败。

7.块位图(Block Bitmap)

在 EXT2 文件系统中,块位图(Block Bitmap)是用于跟踪每个块组中数据块分配情况的关键结构。它通过位图(bitmap)的方式标记文件系统中的哪些块是空闲的,哪些块已经被占用,从而帮助文件系统高效地管理和分配存储空间。

块位图的结构与作用
  1. 位图形式

    • 块位图是一个位数组,每一位表示文件系统中的一个数据块。
    • 如果某一位为 0,表示对应的数据块是空闲的,可以分配给文件存储数据。
    • 如果某一位为 1,表示对应的数据块已经被占用,无法再分配。
  2. 块位图的大小

    • 块位图的大小取决于块组中数据块的数量。假设一个块组包含 8192 个数据块,则块位图需要 8192 位(即 1024 字节)。因此,文件系统中的每个块组都需要一个块位图来记录其内部块的使用情况。
  3. 块位图的位置

    • 每个块组都有自己的块位图,它的具体位置由块组描述符中的字段指定。块位图通常紧随块组描述符之后存储。
块位图的功能
  1. 管理数据块的分配和回收

    • 文件系统通过块位图判断哪些数据块是空闲的,以便为新文件分配空间。
    • 当文件删除时,文件系统会更新块位图,将对应的数据块标记为空闲状态,使其可以重新分配。
  2. 文件系统的完整性检查

    • 在文件系统检查或修复时(如使用 e2fsck 工具),块位图被用来检测文件系统的空闲块和已使用块是否匹配,确保没有数据块被错误占用或标记为未使用。
  3. 提高空间利用效率

    • 块位图的位粒度控制非常精细,这种精确管理使得文件系统能最大化利用存储设备中的每一个块,避免空间浪费。
块位图的操作
  1. 分配新块

    • 当文件系统需要为文件分配新数据块时,会扫描块位图以找到第一个值为 0 的位,然后将其置为 1,表示该块已被分配。
  2. 释放块

    • 当文件删除或缩减大小时,文件系统会更新块位图,将文件占用的数据块对应的位重新设置为 0,表示这些块已经释放,可以被其他文件重新使用。
  3. 块位图的优化

    • 为了提高文件系统的性能,文件系统可能会将块位图加载到内存中进行缓存,这样可以减少频繁读写块位图导致的性能损失。
块位图的优势
  • 效率高:通过位图这种结构,文件系统能够以非常高效的方式管理大量的数据块,占用的空间极少。
  • 易于检查:通过简单的扫描块位图,文件系统可以快速确定哪些块是空闲的或已占用,从而简化了空间分配与管理的逻辑。
  • 结构简单:块位图的结构相对简单,读取与写入操作容易实现,适合大型文件系统的空间管理。
块位图与 inode 位图的关系
  • EXT2 文件系统中除了块位图外,还有 inode 位图,其作用和块位图类似,但负责跟踪每个块组中 inode 的分配情况。块位图管理数据块的分配,而 inode 位图管理 inode 的分配。

8.inode位图(Inode Bitmap)

在 EXT2 文件系统中,inode 位图(Inode Bitmap)是用于管理 inode 分配的关键数据结构。与块位图类似,inode 位图也是一个位数组,用于表示每个 inode 的使用状态。通过 inode 位图,EXT2 文件系统可以跟踪哪些 inode 是空闲的,哪些已经被分配给文件或目录。

inode 位图的结构与作用
  1. 位图形式

    • inode 位图是一个位数组,每一位对应文件系统中的一个 inode。
    • 如果某一位的值为 0,表示对应的 inode 是空闲的,没有被使用。
    • 如果某一位的值为 1,表示该 inode 已被分配,用于存储文件或目录的元数据信息。
  2. inode 位图的大小

    • inode 位图的大小取决于块组中 inode 的数量。假设每个块组中有 8192 个 inode,则 inode 位图需要 8192 位(即 1024 字节)。每个块组都有自己的 inode 位图,用于管理该块组内所有 inode 的使用状态。
  3. inode 位图的位置

    • inode 位图通常位于块组起始处,紧跟在超级块和块组描述符表之后。每个块组都有自己的 inode 位图,存储在块组内部。
    • inode 位图的位置由块组描述符中的字段指定。
inode 位图的功能
  1. 管理 inode 的分配和释放

    • 当文件系统需要创建新文件或目录时,会从 inode 位图中寻找一个空闲 inode,将其分配给该文件或目录。
    • 当文件或目录被删除时,文件系统会将该 inode 重新标记为空闲,以便后续的分配。
  2. 文件系统的一致性检查

    • 在文件系统检查(如使用 e2fsck 工具)时,inode 位图用于验证 inode 的分配是否一致,确保文件系统中的 inode 不会被错误地分配或标记为未使用。
  3. 提高 inode 分配效率

    • inode 位图通过位数组的形式提供了高效的 inode 分配和释放方式。系统可以快速扫描位图,找到空闲 inode,节省分配时间。
inode 位图的操作
  1. 分配 inode

    • 当需要创建一个新文件或目录时,文件系统会扫描 inode 位图,找到第一个值为 0 的位,将其置为 1,表示该 inode 已被分配。
    • 文件的元数据(如文件类型、大小、访问权限等)存储在分配的 inode 中。
  2. 释放 inode

    • 当文件或目录被删除时,文件系统会更新 inode 位图,将该文件或目录对应的 inode 所在位重新设置为 0,表示该 inode 为空闲状态,可以被重新分配。
  3. inode 位图的优化

    • 为了提高性能,文件系统可能会将 inode 位图部分或全部缓存到内存中,这样可以减少频繁的磁盘 I/O 操作,加快 inode 的分配与回收速度。
inode 位图与块位图的关系
  • inode 位图管理的是文件系统中的 inode 分配情况,而块位图管理的是数据块的分配情况。两者协同工作,分别确保 inode 和数据块的分配与回收。
  • 每个文件或目录都有一个对应的 inode,其中包含了指向该文件数据块的指针。inode 位图用于标记哪些 inode 已被分配,而块位图则用于标记哪些数据块被分配给了文件或目录。
inode 位图与 inode 表的关系
  • inode 位图用于标记每个 inode 的使用状态,而 inode 表(Inode Table)则存储文件和目录的实际 inode 结构。
  • 当 inode 位图中的某个位被设置为 1 时,表示 inode 表中对应位置的 inode 被分配并使用,用于存储文件或目录的元数据。

9.inode表(Inode Table)

在 EXT2 文件系统中,inode 表(Inode Table)是一个非常重要的结构,用于存储文件和目录的元数据。每个文件和目录都由一个 inode(索引节点)来表示,inode 中包含了关于该文件或目录的关键信息,如文件的大小、权限、所属用户、时间戳以及指向数据块的指针等。EXT2 文件系统将所有 inode 结构集中存储在 inode 表中。

inode 表的结构与作用
  1. inode 表的组成

    • inode 表是由多个 inode 组成的数组,每个 inode 的大小固定,通常为 128 字节。
    • inode 表记录了文件系统中所有文件和目录的元数据,每个 inode 表项对应一个文件或目录。
  2. inode 表的大小

    • inode 表的大小由文件系统创建时的 inode 数量决定。在创建文件系统时,可以指定每个块组包含的 inode 数量,从而确定整个 inode 表的大小。
  3. inode 表的位置

    • 每个块组都有自己的一段 inode 表,用于存储该块组内的 inode。inode 表的位置在块组描述符中记录,紧随块位图和 inode 位图之后。
    • inode 表可能会占用多个块,具体视文件系统的块大小和 inode 数量而定。
inode 结构的主要字段

每个 inode 是一个 128 字节的结构,包含以下重要字段:

  1. 文件类型与权限(File Mode):

    • 记录文件的类型(普通文件、目录、符号链接等)以及文件的访问权限(读、写、执行权限)。
  2. 用户标识符(UID)和组标识符(GID)

    • UID 和 GID 用于记录文件的所有者和所属组。
  3. 文件大小(File Size):

    • 记录文件的大小,单位为字节。
    • 对于大文件,EXT2 支持文件大小超过 4GB(在后续版本中支持)。
  4. 时间戳

    • inode 包含三个时间戳字段:
      • 访问时间(Access Time, atime):记录文件上次被读取的时间。
      • 修改时间(Modification Time, mtime):记录文件内容最后一次被修改的时间。
      • 状态改变时间(Change Time, ctime):记录 inode 元数据最后一次被修改的时间。
  5. 指向数据块的指针(Block Pointers):

    • inode 包含 15 个指针,用于指向文件实际存储的数据块:
      • 前 12 个指针:直接指向文件数据的块(Direct Block Pointers),用于小文件。
      • 第 13 个指针:单级间接指针(Single Indirect Block Pointer),指向一个块,该块包含更多的指向数据块的指针。
      • 第 14 个指针:双级间接指针(Double Indirect Block Pointer),指向一个块,该块包含指向其他指针块的指针。
      • 第 15 个指针:三级间接指针(Triple Indirect Block Pointer),用于大文件的存储。
  6. 链接计数(Link Count):

    • 记录有多少个文件名(硬链接)指向该 inode。当链接计数为 0 时,文件可以被删除。
  7. 块计数(Block Count):

    • 记录该文件占用了多少个文件系统的块。
inode 表的功能
  1. 存储文件元数据

    • inode 表中的每个 inode 都存储着与文件或目录相关的所有元数据(如文件大小、权限、时间戳、数据块位置等),它不包含文件的数据本身,但包含指向这些数据的指针。
  2. 快速访问文件数据

    • 当用户访问文件时,文件系统会根据 inode 位图找到对应的 inode,然后通过 inode 中的指针字段快速定位文件的实际数据块,从而读取或修改文件内容。
  3. 目录管理

    • 目录也是一种特殊的文件,其 inode 也存储在 inode 表中。目录文件的内容是一个包含文件名和 inode 号的列表,从而实现目录中对文件的组织和管理。
inode 表的分布
  • 文件系统中的每个块组都有自己的 inode 表片段,用于存储该块组中的 inode。通过这种分布式设计,文件系统能够更好地管理和分配 inode,从而减少访问文件时的寻道时间,提高性能。
inode 表的操作
  1. 分配 inode

    • 当创建新文件或目录时,文件系统会在 inode 位图中找到一个空闲的 inode,并从 inode 表中分配该 inode,填充文件的元数据。
  2. 释放 inode

    • 当文件或目录被删除时,文件系统会将该文件的 inode 在 inode 位图中标记为空闲,并释放其对应的 inode 表项。
  3. 更新 inode

    • 当文件的内容或属性发生变化时,文件系统会更新 inode 表中的相关字段,例如修改时间、文件大小等。
inode 表与 inode 位图的关系
  • inode 位图:用于标记 inode 的分配情况,表明 inode 是空闲还是已分配。
  • inode 表:存储每个 inode 的实际元数据,如文件属性、数据块指针等。
  • 两者相辅相成,inode 位图管理 inode 表的分配状态,而 inode 表保存了具体的文件或目录元数据信息。

10.数据块(Data Blocks)

在 EXT2 文件系统中,数据块(Data Blocks)是用于实际存储文件和目录内容的基本单位。每个文件的实际数据(包括文本、二进制数据、目录项等)都存储在一个或多个数据块中。EXT2 文件系统通过 inode 来管理和访问这些数据块,从而实现文件数据的组织和存取。

数据块的基本概念
  1. 数据块的大小

    • 数据块的大小可以在文件系统创建时指定,通常是 1KB、2KB 或 4KB。较大的数据块可以减少访问大文件时的寻道次数,但可能会导致小文件产生碎片和空间浪费。
    • 一个文件可能会占用多个数据块,但对于非常小的文件,它可能只使用一个数据块。
  2. 数据块的分布

    • 文件系统中的数据块被划分为若干块组(Block Groups),每个块组包含若干个数据块。每个文件的数据块可以分布在多个块组中,EXT2 文件系统通过 inode 中的指针来管理文件与数据块之间的映射。
数据块的作用
  1. 存储文件内容

    • 文件的实际内容存储在数据块中。无论是普通文件、目录文件,还是符号链接,所有这些文件的数据都保存在数据块中。
    • 普通文件的数据直接存储在数据块中,而目录文件的数据块则存储了目录项,即文件名和对应的 inode 号。
  2. 数据块的分配

    • 当文件系统为新文件分配空间时,它会通过块位图(Block Bitmap)来查找空闲的块,然后将这些块分配给文件,记录文件数据。
    • 文件系统会优先在同一块组内为文件分配连续的数据块,以提高数据访问的效率,减少磁盘寻道时间。
  3. 数据块的释放

    • 当文件被删除时,文件系统会释放该文件所占用的数据块,并将这些块重新标记为空闲,供其他文件使用。
数据块与 inode 的关系
  • inode 是一个文件的元数据结构,其中包含了指向数据块的指针。这些指针告诉文件系统文件的实际数据存储在何处。
  • 每个 inode 包含 15 个指针字段来指向文件的实际数据块:
    1. 直接指针(Direct Block Pointers):前 12 个指针直接指向数据块,适合小文件。
    2. 单级间接指针(Single Indirect Pointer):指向一个间接块,间接块包含指向数据块的指针。
    3. 双级间接指针(Double Indirect Pointer):指向一个块,该块又指向多个单级间接块,每个单级间接块再指向实际的数据块。
    4. 三级间接指针(Triple Indirect Pointer):更适合非常大的文件,结构同上,但增加了更多的间接层次。
数据块的寻址

为了访问文件的内容,EXT2 文件系统通过 inode 的指针字段来定位文件的具体数据块。数据块寻址分为三种方式:

  1. 直接寻址(Direct Addressing):

    • 通过 inode 中的前 12 个直接指针,可以直接找到文件前 12 个数据块。这种方式适合存储小文件。
  2. 间接寻址(Indirect Addressing):

    • 当文件超过 12 个数据块时,系统会使用单级间接指针。这个指针指向一个间接块,该块中存储着指向文件数据块的指针。
  3. 双重和三级间接寻址(Double and Triple Indirect Addressing):

    • 对于更大的文件,系统会使用双重或三级间接指针。双重间接指针指向的块包含指向单级间接块的指针,而单级间接块再指向实际的数据块。三级间接指针在此基础上增加了更多的间接层次,适合非常大的文件。
数据块的使用示例

假设文件大小为 8KB,块大小为 1KB,该文件需要占用 8 个数据块。其数据块寻址可以按以下步骤实现:

  1. 前 8 个数据块:文件前 8 个数据块通过 inode 中的直接指针找到,每个指针直接指向一个数据块。

  2. 如果文件大小超过直接指针的范围(即超过 12 个数据块):文件系统将启用间接指针来指向更多的数据块。

数据块的优势与局限
  1. 优势

    • 灵活性:EXT2 文件系统允许通过直接、间接、双重间接和三级间接指针的组合来处理从小文件到超大文件的存储需求。
    • 高效存储:通过合理的块组划分和块位图管理,EXT2 文件系统可以在不同的块组之间高效分配数据块,减少碎片。
  2. 局限

    • 小文件的空间浪费:对于较小的文件(例如仅几个字节),即使文件内容远小于块大小,文件系统仍然会为它分配一个完整的数据块,可能造成空间浪费。
    • 文件寻址复杂性:对于非常大的文件,随着间接、双重间接、三级间接寻址的使用,文件系统需要更多的计算和磁盘访问,访问性能可能下降。
数据块与块组的关系
  • 块组(Block Group)是 EXT2 文件系统对存储设备进行管理的基本单位。每个块组包含一系列连续的数据块。文件系统会优先在同一个块组内分配文件的数据块,只有当当前块组中的空闲块不足时,才会跨块组分配数据块。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Word中插入复选框

如何在Word中插入复选框:详细教程与技巧 在Word中插入复选框是一项非常实用的技巧,尤其是在制作问卷调查、待办事项清单、交互式表单或文档中需要用户进行选择时,复选框不仅能提高文档的功能性,还能显得更加专业。本文将详细讲解…

不小心把回收站清空了怎么恢复?别慌!四招找回

在日常使用电脑的过程中,我们可能会不小心清空回收站,从而丢失一些重要的文件。当遇到这种情况时,很多人可能会感到焦虑和无助。然而,幸运的是,有一些方法可以帮助我们尝试恢复这些被删除的文件。下面,我们…

大数据-133 - ClickHouse 基础概述 全面了解

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

关于【禁止new对象时在for循环内定义申明变量】

文章目录 简介代码分析反编译之后对比性能测试内存与垃圾回收情况JDK和常用框架怎么写总结依赖 简介 不知道是谁最先提出了一个不要将变量定义在循环内。 然后我们在代码扫描中有一项是:【禁止new对象时在for循环内定义申明变量】 我也好奇为什么不能&#xff1f…

如何利用MES系统进行产品质量全流程追溯

利用MES(制造执行系统)系统进行产品质量全流程追溯,是一个系统化和精细化的过程,主要涉及数据采集、信息整合、过程控制、查询分析以及持续优化等多个环节。以下是如何具体利用MES系统进行产品质量全流程追溯的步骤: 一…

centos(在线、离线)安装iptables

Iptables 是 Linux 操作系统中的一个用户空间工具,用来配置 Linux 内核中的 Netfilter 防火墙模块。它主要负责网络数据包的过滤、网络地址转换 (NAT) 以及配置防火墙规则。centos默认的防火墙管理工具是Firewalld,所以iptables需要下载安装。 目录 一…

嵌入式软件工程师:科技浪潮中的关键角色

嵌入式软件工程师:科技浪潮中的关键角色 一、嵌入式软件工程师的职业魅力 (一)市场需求旺盛 嵌入式软件工程师在当今科技领域中扮演着至关重要的角色。随着智能化时代的到来,嵌入式系统在各个行业的应用越来越广泛,市…

【贪心算法】贪心算法

贪心算法简介 1.什么是贪心算法2.贪心算法的特点3.学习贪心的方向 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.什么是贪心算法 与其说是…

[linux基础知识]教你使用vim和ctags阅读linux内核源码

1 安装ctags apt install ctags 2 内核源码目录下添加索引 使用下面命令,添加索引成功后,内核目录下会生成tags 索引文件。 ctags -R 3 vim使用索引阅读源码 跳转到函数变量定义与返回 #跳到函数或者变量定义 Ctrl] #返回 Ctrlo 光标移动到需要…

vue + Element UI table动态合并单元格

一、功能需求 1、根据名称相同的合并工作阶段和主要任务合并这两列,但主要任务内容一样,但要考虑主要任务一样,但工作阶段不一样的情况。(枞向合并) 2、落实情况里的定量内容和定性内容值一样则合并。(横向…

设置使用阿里云服务器DNS

由于云服务器是从腾讯云迁移到阿里云,然后使用ssl验证时一直无法使用dns验证,也无法创建三级域名,原来需要把阿里云服务器改成阿里云的dns使用 如果使用其他服务器DNS会下面会显示当前DNS服务器,

Linux:git

hello,各位小伙伴,本篇文章跟大家一起学习《Linux:git》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 如果本篇文章对你有帮助,还请各位点点赞!!&…

解决Docker镜像不可下载

使用国内可信的镜像中心 可信国内镜像网址:https://hub.atomgit.com/ 点击镜像仓库 搜索想要的镜像 按如图所示,即可查看对应的版本 点击复制,即可下载使用 缺点: 可用的镜像相比于docker官方量少 并且,获取的镜像名字…

【Java】方法2_Java的参数传递机制

文章目录 前言一、Java的参数传递机制都是值传递 1.基本类型的参数传递2.引用类型的参数传递总结 前言 学习Java的参数传递机制,基本类型的参数传递,引用类型的参数传递。 一、Java的参数传递机制都是值传递 值传递:指传输实参给方法的形参…

『功能项目』单例模式框架【37】

我们打开上一篇36C#拓展 - 优化冗余脚本的项目, 本章要做的事情是编写单例模式基类,让继承其基类的子类在运行时只存在一个,共有两个单例基类框架,分别是不继承MonoBehaviour的单例和继承MonoBehaviour的单例框架 首先编写不继承…

OpengGL教程(三)---使用VAO和VBO方式绘制三角形

本章参考官方教程:learnopengl-cn VertexShader.glsl #version 330 core layout(location 0) in vec3 position; layout(location 1) in vec3 color; uniform mat4 projection; // 投影矩阵 out vec4 ourColor; void main() {gl_Position projection * vec4(p…

Probabilistic Embeddings for Cross-Modal Retrieval 论文阅读

Probabilistic Embeddings for Cross-Modal Retrieval 论文阅读 Abstract1. Introduction2. Related work3. Method3.1. Building blocks for PCME3.1.1 Joint visual-textual embeddings3.1.2 Probabilistic embeddings for a single modality 3.2. Probabilistic cross-modal…

Xcode 16 RC (16A242) 发布下载,正式版下周公布

Xcode 16 RC (16A242) - Apple 平台 IDE IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 请访问原文链接:https://sysin.org/blog/apple-xcode-16/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org Xcode 16 的新功…

开源项目低代码表单FormCreate中通过接口加载远程数据选项

在开源项目低代码表单 FormCreate 中,fetch 属性提供了强大的功能,允许从远程 API 加载数据并将其应用到表单组件中。通过灵活的配置,fetch 可以在多种场景下发挥作用,从简单的选项加载到复杂的动态数据处理。 源码地址: Github …

软考中项(第三版) 项目成本管理总结

前言 系统集成项目管理工程师考试(简称软考中项),其中案例分析也是很大一部分考试内容,目前正在学习中,现总结一些可能会考到的知识点供大家参考。 1.1、项目成本管理总线索 1、项目成本失控的原因 (1&a…