文件系统是一种存储和组织计算机中文件数据的一系列抽象数据类型,它们用来实现数据的存储、管理、查看、等功能。在Linux系统中,所有的设备、进程都是以文件的形式存在,字符设备、块设备以及这些设备的驱动均要依靠文件系统来实现,设备管理的基础框架也要以来文件系统(sysfs),所以文件系统在Linux操作系统中担任着重大的作用。
一、VFS介绍
Linux内核通过虚拟文件系统(Virtual File System,VFS)管理文件系统。VFS对所有的文件系统(如Ext3、Ext2等)提供了一个统一的接口,它在Linux文件系统中担任着及其重要的角色,是一个不可或缺的基础设施;在文件系统的访问操作中,必须通过虚拟文件系统提供的接口才能实现正常的文件操作。同时,在Linux操作系统中,对于所有的文件系统都要遵循虚拟文件系统VFS定义的方式实现。
VFS与具体文件系统的关系
VFS支持三种类型的文件系统:基于磁盘的文件系统、特殊的文件系统和网络文件系统。
- 基于磁盘的文件系统:管理在非易事戒指上存储的文件。这种类型的文件系统最多,比如常见的ext2/3/4、fat、ntfs等。
- 特殊的文件系统:在内核中生成,是一种使用户应用程序与用户通信的方法,比如常见的proc文件系统,它存储于内存,不占用硬件存储空间。
- 网络文件系统:这种文件系统可以通过网络访问另一台计算机上的数据,相当于连接到本地计算机一样。比如nfs文件系统。
二、VFS基本数据结构
VFS通用文件模型包含有4种基本的数据结构,通过这几个数据结构实现将硬盘上的文件抽象到内存中:
- 超级块
- 目录项
- 索引节点
- 文件
这四个数据结构的关系如图所示:
2.1. 超级块(super-block)
超级块代表了整个文件系统本身。Super_block保存了Linux文件系统设定的操作函数还有文件块的大小等信息;super_block是文件系统自己的控制块结构,它的链表头链接来文件系统中的所有inode。由于控制块对于一个具体的文件系统来说,有可能还包含其它的信息;想要找到这些信息,我们就可以通过超级块super_block对象进行查找。
由于超级块super_block是具体物理文件系统super_block超级块在内存的抽象,因而需要物理文件系统的超级块来获取超级快的内容。
super_operations 提供了最重要的超级块操作。例如super_operation 的成员函数read_inode提供了读取inode 信息的功能。VFS虚拟文件系统提供了文件系统的架构,具体的物理文件系统就要遵循这个定义好的架构来实现。Super_operations函数是每个文件系统都要提供的一个函数,因为要通过它来获取inode的信息。
struct super_block {
struct list_head s_list; /* 指向超级块链表的指针,系统将所有文件系统的超级块组成链表 */
dev_t s_dev; /* 设备标识符 */
unsigned long s_blocksize; /* 以字节为单位的块大小 */
unsigned char s_blocksize_bits; /* 以位为单位的块大小 */
unsigned char s_dirt; /* 修改脏标志 */
loff_t s_maxbytes; /* Max file size */
struct file_system_type *s_type;
const struct super_operations *s_op; /* 超级块操作方法 */
const struct dquot_operations *dq_op; /* 磁盘限额处理方法 */
const struct quotactl_ops *s_qcop; /* 磁盘限额管理方法 */
const struct export_operations *s_export_op; /* 网络文件系统使用的输出操作 */
unsigned long s_flags; /* 安装标志 */
unsigned long s_magic; /* 文件系统的魔数 */
struct dentry *s_root; /* 文件系统根目录的目录项对象 */
struct rw_semaphore s_umount; /* 卸载所用的信号量 */
struct mutex s_lock;
int s_count; /* 引用计数器 */
int s_need_sync; /* 对超级块进行同步的标志 */
atomic_t s_active;
#ifdef CONFIG_SECURITY
void *s_security;
#endif
struct xattr_handler **s_xattr;
struct list_head s_inodes; /* all inodes的链表 */
struct hlist_head s_anon; /* anonymous dentries for (nfs) exporting */
struct list_head s_files; /* 文件对象链表 */