文件系统类型
-
基于磁盘的文件系统
如FAT、EXT4
-
虚拟文件系统
如proc
-
网络文件系统
顾名思义,网络文件系统还将网络通信封装起来,这意味可以直接通过通信访问另一台设备的文件系统。
man fs # 查看文件系统,其实这里只是内存中使用的inode,底层介质上的inode内容会更少
文件系统基本概念
文件描述符
对于一个用户进程来说,一个文件由一个fd整数进行标识。两个用户进程,可以使用相同的fd整数,但是不会指向相同的文件,这是由于(struct file)唯一标识文件。task_strcut包含了一个成员,其中包含了所有打开的文件。
inode
内核处理文件的关键就是inode,inode中包括文件(目录)的元数据(访问权限、上次修改日期)、指向文件数据的指针等,但是并不包括文件名。假如访问/usr/bin/cat,查找从inode开始,表示根目录/,该目录由一个inode进行标记,其中数据段存的是根目录下的各个目录项,每个目录项由两个元素组成
- inode的编号
- 文件或目录的名称
系统中所有的inode都有一个编号,唯一标识一个inode,文件名和inode之间的关系通过编号建立。不通过名字标识inode的原因是,这样复用率高,更加高效。
每个修改过的inode会被记录在超级块列表中,被称为脏inode,内核会定期扫描列表,将修改写回底层硬件。
链接
链接可以认为是一种目录项,用于建立两种文件系统对象之间的联系,有两种类型的连接,符号链接与硬链接。
每个符号链接都由一个特定的inode进行标识,其中数据端包含了一个字符串,标识目标文件的路径。
硬链接作为一个inode,是使用一个现存的inode编号,此时同时绑定在这个编号上的文件,会无法区分文件是原来的,还是后来建立的。那么此时假如要删除硬链接会删去inode以及相关信息,这样会导致另一个文件也无法访问。
解决方案是增加一个计数器,但内核仍然无法区分删除的是硬链接还是原文件,但是可以保证一个文件删除之后,计数器减1,从而不会导致另一个文件因为硬链接释放inode和相关文件信息而无法进行访问,计数器减为0时才删除inode。
思考:为什么要设计硬链接和符号链接?
接口
每一个文件都要通过open\openat打开,成功之后内核会返回一个整数表示fd,这个fd时大于2的,这是因为0表示标准输入 、1表示标准输出、2表示标准错误输出。
使用fd作为通信手段的方式包括:
- 字符和块设备(/dev,真正的文件)
- 进程之间的管道
- 所有网络协议的套接字
- 用于交互输入和输出的终端
超级块
超级块中包含文件系统的关键信息(长度,大小、inode数量和空闲数量等),以及读、写、操作inode的函数指针,内核建立了一个链表,维护所有活动文件系统的超级块实例。
虚拟文件系统(VFS)
虚拟文件的系统(内核)的出现是为了解决底层文件系统无法向上提供统一调用的问题,所以通过VFS做的抽象层提供统一接口(系统调用)进行访问,而不用关心底层的细节。VFS提供了一种机制统一不同的文件系统的inode
操作。目前来说,ubuntu已经有EXT4文件系统。在此情况下,内核可以支持多种文件系统包括FAT、NFS、proc等实现。VFS能够管理文件、目录以及文件对象。
df -Th # 查看磁盘文件系统
VFS主要由两部分组成
-
文件(inode操作、文件操作作用于文件的数据内容)
VFS 层定义了通用
inode
结构,有些文件系统如FAT是没有inode结构的,VFS运行时,会自动加载inode
相关信息。以及通用的inode
操作集合,称为inode_operations
,它包括了对inode
进行操作的函数指针,如打开、读取、写入、释放等每个inode都有一个i_list
成员,存储VFSinode
。文件操作集合结构为
struct file_operations
包括read\write\aio_read\aio_write\mmap\open\poll\writev\readv\pen\等系统调用,值得一提select/poll系统调用都是poll实现的。 -
文件系统(读取超级块)
VFS支持的底层文件系统通过一种内核特殊对象连接到VFS,该对象提供了一种读取超级块的方法。
VFS 定义了一系列的数据结构和操作,如
struct super_block
(超级块,描述整个文件系统)。VFS有目录项缓存机制,能够达到快速访问此前查找操作的结果。该目录项由结构struct dentry
建立。所有的dentry实例保存在一个散列表中,由一个hashtable实现,使用d_hash解决散列冲突问题。
VFS文件系统注册
VFS提供了两种操作mount和umount装载\未装载文件系统,每个装载的文件系统都会 有一个vfsmount结构。
mount # 查看文件系统装载情况
标签:文件,片段,VFS,文件系统,内核,inode,链接
From: https://www.cnblogs.com/solicit/p/18328230