帮助文档 > LINUX虚拟文件系统

LINUX虚拟文件系统

发布时间:2024-07-11 16:35

LINUX虚拟文件系统

1.虚拟文件系统介绍

Linux支持多种文件系统格式,如Ext3、Ext4、FAT、NTFS、ISO9660等。不同的磁盘分区、光盘或其他存储设备都有各自的文件系统格式,然而这些文件系统都可以通过mount命令挂载到某个目录下,从而呈现给用户一个统一的目录树。通过ls命令查看不同文件系统上的目录和文件时,显示的效果是一样的,读写操作也都相同。这是如何实现的呢?Linux内核在不同的文件系统之上建立了一个抽象层,使得文件、目录、读写访问等概念在这个抽象层中统一,这个抽象层称为虚拟文件系统。

2.超级块

超级块是虚拟文件系统中的一个重要数据结构,每个文件系统对应一个超级块。硬盘的第一个扇区存储着主引导记录和分区表,每个分区的第一个块存储着超级块的信息,接下来是Inode位图、块位图和数据块。超级块的数据结构如图所示:

在超级块中,文件系统类型是一个重要的字段,这个结构体中设置了文件系统的类型,文件系统类型的数据结构如图所示:

以Ext4文件系统为例,介绍超级块的创建过程,这个过程从文件系统的挂载开始,主要包括分配超级块和填充超级块。首先要检查设备是否已经挂载,不能重复挂载。分配超级块后,需要初始化一些工作,如链表初始化和设置缓存回收函数等。接下来,将超级块加入全局超级块链表,对应的文件类型也要加入全局文件系统列表,并注册缓存回收函数到全局回收链表。填充超级块主要针对具体的文件系统,设置相应的超级块信息,包括Inode资源的操作集合,如分配、销毁和写操作等。

3.索引结点

在Linux系统中,进行分区后需要格式化以创建文件系统。每个存储设备或其分区(如硬盘、软盘、U盘等)格式化为Ext4文件系统后,通常分为两个部分:索引结点(Inode)和块(Block)。索引结点存储文件的属性信息(如文件大小、用户、用户组、读写权限、文件类型、修改时间等)以及指向文件内容的指针,但不包括文件名。因为索引结点存放文件属性信息,所以它有固定大小,通常为128或256字节。格式化后索引结点的大小无法更改,但在格式化之前可以指定其大小。

一个文件至少占用一个索引结点和一个块,块用于存储文件的实际内容(如文本、照片、视频等)。一个块只能被一个文件占用,不同文件可以共享一个Inode,如硬链接。索引结点的总数是固定的,如果有太多小文件,可能会造成磁盘空间剩余过多但Inode用尽的情况。可以通过“df -i”命令查看Inode的使用情况。

一个大文件可能需要占用大量存储空间,一个索引结点无法完全记录该文件的存储位置。为此,Linux定义了12个直接记录区和多个间接记录区(单间接、双间接、三间接)。这些间接记录区通过层层指向块的方式记录文件内容的位置。

4.目录项

通过索引结点可以定位到指定对象,但索引结点的属性很多,直接使用效率低。因此引入了目录项。目录项使得解析文件路径的代码执行更快。目录项对象有三种状态,具体说明如表所示。

状态  说明 
被使用 对应一个有效的索引结点,并且该对象有一个或多个使用者
未使用 对应一个有效的索引结点,但是VFS当前并没有使用这个目录项
负状态 没有对应的有效索引结点

5.文件对象

虚拟文件系统中的最后一个对象是文件对象,表示进程已打开的文件。进程直接处理的是文件对象,而不是超级块、索引结点或目录项。文件对象包含访问模式、当前偏移等信息,文件操作与系统调用中的读写操作类似。

文件对象是已打开文件在内存中的表示,由相应的打开文件函数创建,关闭文件时销毁。多个进程可以同时打开和操作同一个文件,因此同一个文件可能有多个文件对象。文件对象在进程中代表已打开的文件,指向目录项对象,实际文件由目录项表示。尽管同一文件可能有多个文件对象,但其对应的索引结点和目录项是唯一的。文件对象在进程打开文件时才在内存中生成。

本文导读

客户热线:13306992629

客户服务中心