欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > Linx:理解文件系统

Linx:理解文件系统

2025/9/17 21:30:07 来源:https://blog.csdn.net/MaoRuofeng/article/details/141172718  浏览:    关键词:Linx:理解文件系统

        我们使用ls -l的时候看到的除了看到文件名,还看到了文件元数据。

[root@localhost linux]# ls -l
总用量 12
-rwxr-xr-x. 1 root root 7438 "9月 13 14:56" a.out
-rw-r--r--. 1 root root 654 "9月 13 14:56" test.c

每行包含7列:

  1. 模式 (-rwxr-xr-x.): 这列显示了文件的权限和类型。第一个字符表示文件类型,例如 - 表示普通文件,d 表示目录。接下来的三组字符分别表示所有者、组和其他用户的读(r)、写(w)和执行(x)权限。最后的点(.)表示这个文件有SELinux安全上下文。

  2. 硬链接数 (1): 这列显示了文件的硬链接数量。硬链接是指向文件的指针,普通文件的硬链接数至少是1。

  3. 文件所有者 (root): 这列显示了文件的所有者用户名。

  4. (root): 这列显示了文件所属的用户组。

  5. 大小 (7438): 这列显示了文件的大小,单位是字节。

  6. 最后修改时间 ("9月 13 14:56"): 这列显示了文件最后被修改的日期和时间。

  7. 文件名 (a.outtest.c): 这是文件或目录的名称。

ls -l读取存储在磁盘上的文件信息,然后显示出来
 

 

其实这个信息除了通过这种方式来读取,还有一个stat命令能够看到更多信息:

inode

为了能解释清楚inode我们先简单了解一下文件系统:

Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的。

A:Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。

B:超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了

C:GDT,Group Descriptor Table:块组描述符,描述块组属性信息,有兴趣的同学可以在了解一下

D:块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。

E:inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。

F:i节点表:存放文件属性 如 文件大小,所有者,最近修改时间等

G:数据区:存放文件内容

将属性和数据分开存放的想法看起来很简单,但实际上是如何工作的呢?我们通过touch一个新文件来看看如何工作。

[root@localhost linux]# touch abc
[root@localhost linux]# ls -i abc
263466 abc

创建一个新文件主要有一下4个操作:

1. 存储属性

        内核先找到一个空闲的i节点(这里是263466)。内核把文件信息记录到其中。

2. 存储数据

        该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。

3. 记录分配情况

        文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。

4. 添加文件名到目录

        新的文件名abc。linux如何在当前的目录中记录这个文件?内核将入口(263466,abc)添加到目录文件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。

重点

A: 文件 = 内容 + 属性(属性也是数据)

B:文件在磁盘存储的本质文件的内容 + 文件的属性数据

C:Linux文件系统特定:文件内容 和 文件属性 分开存储

D:Linux中文件的属性是一个大小固定的集合体(sysv_fs.h)。

E:我们这里讲的是inode,但是我们在日常操作的时候都是用的文件名?为什么?

 目录(inode) = 文件属性 + 文件内容(文件名和inode的映射关系)

目录:

        1:一个目录下不能建立同名文件。

        2:查找文件的顺序:文件名 -> inode编号

        3:目录的r权限标志位,本质是:允许我们读取目录的内容。文件名:inode的映射关系

        4:目录的w权限标志位,本质是:新建文件,要向目录内容中写入文件名和inode的一个映射关系。

        5:如何理解一个文件的增删查改?

1. 增(Create)- 创建文件

  • inode分配:当创建一个新文件时,文件系统会为该文件分配一个inode(索引节点),inode包含了文件的元数据,如权限、所有者、大小等。
  • 目录项更新:文件名和inode之间的映射会被添加到目录中,目录项(dentry)是文件系统中用于快速查找文件inode的结构。
  • 文件数据块分配:虽然新创建的文件可能没有数据,但文件系统可能会分配一些数据块用于将来写入数据。

2. 删(Delete)- 删除文件

  • 目录项删除:删除文件首先会从目录中删除文件名和inode的映射,这使得文件名不再指向任何inode。
  • 释放inode:如果没有任何硬链接指向该inode,文件系统会回收inode资源。
  • 释放数据块:文件系统会回收文件占用的数据块,这些数据块可以被其他文件使用。

3. 查(Read/Query)- 读取文件

  • 查找inode:通过文件名查找目录项,获取inode。
  • 读取数据块:根据inode中的信息,操作系统读取文件的数据块。
  • 文件系统缓存:为了提高性能,操作系统可能会将文件数据缓存在内存中,这样后续的读取操作可以直接从缓存中获取数据。

4. 改(Modify)- 修改文件

  • 更新inode:修改文件可能会改变inode中的元数据,如修改时间。
  • 数据块写入:如果修改涉及到文件内容的更改,操作系统会写入新的数据块,并更新inode中的数据块指针。
  • 同步写入:为了保证数据的一致性,操作系统可能会使用缓冲区来暂存写入操作,然后在适当的时候将缓冲区的数据同步到磁盘。

6:找到指定的文件 -> 文件所在的目录 -> 打开 -> 根据文件名 : indie -> 目标文件的inode(逆向)

7:为什么任何一个文件任何时候都要有一个路径: 一个文件其实在访问前都是要有目录的!

8:找到指定inode的前提:

  1. 文件系统挂载:文件所在的分区必须已经挂载到操作系统的文件系统上,这样操作系统才能访问该分区上的文件。

  2. 目录结构:文件必须位于一个已知的目录路径中。文件系统通过目录树来组织文件,每个文件都有一个从根目录开始的路径。

  3. 文件名:需要知道要访问的文件的确切文件名,包括其扩展名(如果有的话)。

  4. 目录项(dentry):操作系统使用目录项来快速查找文件的inode。目录项是文件系统中的一个缓存结构,它存储了文件名到inode的映射。

  5. 文件路径:需要提供文件的完整路径或相对于当前工作目录的相对路径。

  6. 访问权限:用户或进程需要有足够的权限来访问该文件。这包括读取文件的权限,以及访问包含文件的目录的权限。

  7. 文件存在:要查找的文件必须实际存在于文件系统中。如果文件已被删除或路径错误,将无法找到inode。

理解硬链接

我们看到,真正找到磁盘上文件的并不是文件名,而是inode。 其实在linux中可以让多个文件名对应于同一个inode

A:abc和def的链接状态完全相同,他们被称为指向文件的硬链接。内核记录了这个连接数,inode 263466 的硬连接数为2。

B:我们在删除文件时干了两件事情:1.在目录中将对应的记录删除,2.将硬连接数-1,如果为0,则将对应的磁盘释放。

硬链接的特点:

  1. 指向相同数据:硬链接共享相同的文件数据,因此对任何一个硬链接的修改都会反映在其他硬链接上。

  2. 文件类型:硬链接可以链接普通文件和目录,但要注意,硬链接不能跨文件系统创建,也不能链接到符号链接。

  3. 硬链接数量:文件的硬链接数量表示有多少个文件名指向该文件数据。删除硬链接不会删除原始文件数据,只有当所有硬链接都被删除后,文件数据才会被删除。

  4. 文件名无关:硬链接与文件名无关,即使原始文件名被重命名或移动,硬链接仍然有效。

注意事项:

  1. 不要链接目录:虽然技术上可以创建指向目录的硬链接,但这可能会导致文件系统损坏或不一致,因此通常不建议这样做。

  2. 文件系统限制:硬链接不能跨越不同的文件系统。如果尝试在不同的文件系统之间创建硬链接,将会导致错误。

  3. 权限问题:硬链接的权限与原始文件相同,即使更改硬链接的权限,也不会影响原始文件的权限。

  4. 删除操作:删除硬链接不会删除文件数据,只有当所有指向同一数据的硬链接都被删除后,文件数据才会被系统回收。

  5. 文件名更改:更改硬链接的文件名不会影响其他硬链接,因为它们指向的是相同的文件数据。

  6. 符号链接与硬链接的区别:符号链接(Symbolic Link)是指向另一个文件或目录的快捷方式,它有自己的文件数据,而硬链接则直接指向原始文件数据。

  7. 文件系统支持:所有现代的Linux文件系统都支持硬链接,但在某些特殊情况下,如网络文件系统(NFS)或某些特定的文件系统配置中,硬链接的行为可能会有所不同。

软链接

        硬链接是通过inode引用另外一个文件,软链接是通过名字引用另外一个文件,在shell中的做法。在Linux系统中,软链接(也称为符号链接,Symbolic Link)是一种特殊的文件,它指向另一个文件或目录的路径。软链接类似于Windows系统中的快捷方式。
 

软链接的特点:

  1. 路径引用:软链接包含指向目标文件或目录的路径,它是一个独立的文件,有自己的权限和属性。

  2. 跨文件系统:软链接可以跨越不同的文件系统,指向其他文件系统上的文件或目录。

  3. 删除独立性:删除软链接不会影响它所指向的原始文件或目录。

  4. 更新灵活性:如果软链接指向的原始文件或目录被移动或重命名,软链接将变得无效,需要手动更新。

  5. 目录支持:软链接可以指向目录,而且使用起来相对安全,不会引起文件系统损坏。

  6. 文件类型:软链接可以指向普通文件或目录,但它本身是一个特殊的文件类型。

注意事项:

  1. 失效链接:如果软链接指向的原始文件或目录被删除或移动,软链接将变成一个失效链接(也称为悬挂链接或断链)。

  2. 绝对路径与相对路径:软链接可以是绝对路径或相对路径。绝对路径的软链接在任何目录下都能正确解析,而相对路径的软链接则依赖于当前工作目录。

  3. 权限问题:软链接的权限通常允许用户读取链接内容(即目标文件的路径),但不一定允许用户访问目标文件。执行权限允许用户通过软链接执行目标文件。

  4. 创建限制:不能为目录创建硬链接的规则不适用于软链接,可以安全地为目录创建软链接。

  5. 网络文件系统:在使用网络文件系统(如NFS)时,软链接的行为可能会受到限制或表现不同,具体取决于NFS的配置。

  6. 备份和同步:在备份或同步文件时,软链接可能会被复制为实际的文件或目录,这取决于使用的备份或同步工具的配置。

  7. 安全性:软链接可以用于隐藏文件的真实路径或创建复杂的文件结构,但这也可能导致安全问题,如路径遍历攻击。

  8. 文件系统支持:大多数现代文件系统都支持软链接,但在某些特殊情况下,软链接的行为可能会有所不同。

ACM时间

在Linux系统中,文件的三个时间戳(Access Time, Modify Time, Change Time)是文件属性的一部分,它们分别表示:

  1. Access Time (最后访问时间) (atime): 这个时间戳记录了文件最后一次被访问的时间。当文件被读取时,这个时间会被更新。有些系统默认情况下会更新这个时间戳,但出于性能考虑,有些系统配置可能不会更新它。

  2. Modify Time (文件内容最后修改时间) (mtime): 这个时间戳记录了文件内容最后一次被修改的时间。每当文件的内容发生变化时,这个时间戳就会被更新。这包括写入文件、修改文件内容或执行某些命令(如touch)。

  3. Change Time (属性最后修改时间) (ctime): 这个时间戳记录了文件的元数据最后一次被修改的时间。元数据包括文件的权限、所有者、组、以及文件的inode信息等。当这些属性发生改变时,ctime会被更新。需要注意的是,ctime并不总是反映文件内容的修改时间,而是任何导致文件状态改变的操作。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词