【Linux】文件系统--文件存储/软硬链接/inode/dentry

在当今的计算机世界中,文件系统是操作系统中至关重要的一部分,它负责管理数据的存储和访问。尤其是在Linux系统中,文件系统不仅决定了数据如何组织和存取,还影响了系统的性能和安全性。了解Linux文件系统的结构和工作原理,可以帮助我们更有效地管理文件、优化系统性能,并解决潜在的问题。接下来,我们将深入探讨Linux文件系统的基本概念、常见类型以及它们的特点。

文件存储

上面我们说文件系统决定了数据如何组织和存取,这一点是我们今天着重了解的内容。在学习文件系统时,我们主要就是学习文件系统是如何存储文件,如何管理文件的。再深入的内容我们不做过多的了解。

首先要了解如下文件存储的相关概念:inode、dentry、数据存储、文件系统。

inode与dentry

inode :其本质是一个结构体,存储文件的属性信息。如:权限、类型、大小、时间、用户、盘块位置等(ls -l查看到的内容基本上都会存到inode中),inode的结构也叫做文件属性管理结构,大多数的inode都存储在磁盘上。少量使用、近期使用的inode会被缓存到内存中。

dentry:目录项,其本质依旧是结构体,重要成员变量有两个(文件名,inode,......),而文件内容data保存在磁盘盘块中。

从这里我们能够挖掘出两个关键信息:

①[inode和文件名同时存在目录项中],那么inode中包含文件名这项文件属性嘛?实际上并不存在,这一点需要特别注意。

②[文本内容data保存在磁盘盘块上],那么inode中其实是不包含文件内容的。

现在将其存储的大致模型给出来:

在inode中,包含很多信息,这些信息中其中一个就是数据块(数据块内就是文件内容)位置的信息,这样的话,尽管数据在磁盘中存放的位置再乱,再随机,我们知道它在哪我们就能找到它。通过这样的管理方式,方便我们后续来搜索文件位置,从而查看文件内容。

软硬链接

Linux链接文件类似于Windows下的快捷方式

链接文件分为符号链接(软链接)和实体链接(硬链接)。

软链接:软链接不占用磁盘空间,源文件删除则软链接失效

硬链接:硬链接只能链接普通文件,不能链接目录

链接文件使用 ln 命令创建。用法:

bash 复制代码
ln 源文件 链接文件
ln -s 源文件 链接文件 
#创建软链接时,建议源文件为绝对路径
#否则,假如使用相对路径的话,当软链接文件移动到其它路径下时,将找不到该文件

如果没有-s选项代表建立一个硬链接文件,两个文件占用相同大小的硬盘空间,即使删除了源文件,链接文件还是存在,所以-s选项是更常见的形式

注意:如果软链接文件和源文件不在同一个目录,源文件最好还是使用绝对路径,不建议使用相对路径。

软链接

1、类似于Windows的快捷方式,软链接依赖于源文件存在

2、软链接占用一定的很小的内存,无论源文件多大。(类似于指针类型,只占一定的字节数,不管那个地址存放的数据所占字节大小)

3、源文件删除,软链接将失效,没有任何意义了

4、为了保证软连接可以任意搬移到其它目录中,创建时,务必对源文件使用绝对路径。

5、软链接创建时,默认权限为全开放。777

硬链接

1、给某个文件拷贝一份,这两个文件独立占用内存。

2、改变其中一个文件,会影响另外一个文件。

3、删除某个硬链接文件,不会影响另一个文件

4、创建硬链接不会增加inode和block,与源文件共用一个inode号

考虑一下硬链接的实际原理,为什么会有这些特性呢?

首先,新建一个该文件的硬链接,我们就会新建一个目录项,该目录项存储的信息包括:硬链接的文件名(可以与原文件的文件名不同),然后还有inode编号,该编号指向与源文件一样的索引节点(inode),此时,inode内部有一个信息叫做硬链接计数(对应到C++就叫做引用计数),所以但删除源文件后,由于还有新文件指向了该结点,那么计数没有减少到零,inode结点就不会删除,那么inode所代表的文件就不会删除,更何谈其指向的block数据块了。

此时,再来分析上面四个特点:

①拷贝文件,独立占用内存:因为新生成了目录项,所以该目录项占用的内存就是硬链接文件占用的内存,但是显示出来的文件大小是inode内包含的文件属性中的文件大小,而非目录项本身大小。

②改变其中一个文件,会影响另一个:因为操作的都是同一个inode代表的文件,只是目录项入口不同而已。

③删除某个硬链接文件,不会影响另一个文件:由于硬链接计数的特点,所以我们删除时,只是减少一个硬链接计数,只要没有达到零,就不会触发真正的删除操作。

删除:

那么,当计数达到零的时候,磁盘会擦除这些数据吗?不会,当这块空间没有数据被指向时,磁盘不会擦除磁盘上的数据,而是等待下一个指向这里的inode结点指向这里,使用新内容将这些数据覆盖掉。所以我们所谓的格式化后,仍然有办法恢复数据,就是因为这个原理。

④创建硬链接不会增加inode和block,与源文件共用inode:这根据我们的分析显而易见,只是增加了目录项而已。

在Linux中,一切皆文件,那么目录也是文件,那么目录这个文件的存储方式是怎样的呢?

目录的存储方式跟文件类似:目录文件的目录项存储的是,目录路径和inode号,inode中存放着基本信息和block块位置,而block块中存放的内容是一条又一条的文件路径+文件对应的inode号。根据这些inode号,我们找到文件的inode结点,从inode结点中找到block块位置,然后查看文件的具体内容。

文件系统

Boot Block:

介绍:位于文件系统的最前端,通常是512字节或多个数据块的大小。

功能:引导块包含引导加载程序,用于系统启动时加载操作系统,它会将控制权转移到操作系统内核上去。

意义:确保系统可以从硬件启动并加载正确的系统软件,使计算机能够正常运行。

BlockGroups:

文件系统被分割成多个块组,每个块组内包含多个结构,用于高效的存储和管理数据。

每个块组通常包括超级快、描述符表、位图和数据块等。功能是允许文件系统在存储设备中分散管理、减少碎片、提高访问效率。

1. Super Block

  • 结构:位于每个块组的开头,包含有关整个文件系统的元数据。
  • 功能:存储文件系统的状态信息,诸如文件系统的大小、块大小、可用块数量、inode数量等。
  • 意义:超级块是文件系统管理的核心,提供了管理和维护文件系统所需的基本信息。

2. Group Descriptor Table

  • 结构:包含一个或多个块组的描述符,每个描述符描述一个块组的元信息。
  • 功能:每个描述符指向相应块组中的位图和 inode 表。
  • 意义:通过群组描述符,操作系统能够快速定位和管理各个块组中的数据结构。

3. Block Bitmap

  • 结构:位图结构,用于标记块组中的数据块的使用情况。
  • 功能:每一位代表一个数据块的状态(使用或未使用),允许操作系统快速查找可用的数据块。
  • 意义:位图的使用使得文件系统能有效管理存储空间,减少碎片,提高存储效率。

4. Inode Bitmap

  • 结构:类似于块位图,指示 inode 表中每个 inode 的使用情况。
  • 功能:每一位表示一个 inode 的状态(使用或未使用),支持快速分配和回收 inode。
  • 意义:确保 inode 的有效管理,提升文件和目录的存取性能。

5. Inode Table

  • 结构:存储该块组中所有 inode 的表格。
  • 功能:每个 inode 记录相应文件或目录的元数据,如权限、大小、时间戳等。
  • 意义:inode 表的存在使得文件系统能够精确控制和管理文件及目录的访问和存储。

6. Data Blocks

  • 结构:实际存储文件内容和目录项的数据块。
  • 功能:用于存放文件的实际数据或目录中的其他文件信息。
  • 意义:数据块是文件系统中最核心的部分,以块为单位高效存储和访问文件内容。

感谢大家!!!

相关推荐
开源优测1 小时前
这些年 devops 和自动化测试项目实践工具链集合
运维·devops
小青柑-2 小时前
Go语言中的接收器(Receiver)详解
开发语言·后端·golang
Bytebase2 小时前
MySQL 如何赶上 PostgreSQL 的势头?
运维·数据库·dba·开发者·数据库管理·devops
MonkeyKing_sunyuhua4 小时前
在 Ubuntu 22.04 上从 Wayland 切换到 X11的详细步骤
linux·运维·ubuntu
C++小厨神4 小时前
Bash语言的计算机基础
开发语言·后端·golang
BinaryBardC4 小时前
Bash语言的软件工程
开发语言·后端·golang
没有名字的鬼4 小时前
C_字符数组存储汉字字符串及其索引
c语言·开发语言·数据结构
xchenhao4 小时前
Linux 环境(Ubuntu)部署 Hadoop 环境
大数据·linux·hadoop·ubuntu·hdfs·环境·dfs
凡人的AI工具箱4 小时前
每天40分玩转Django:Django DevOps实践指南
运维·后端·python·django·devops
running thunderbolt4 小时前
Linux : Linux环境开发工具vim / gcc / makefile / gdb / git的使用
linux·git·vim