002 Linux内核中虚拟文件系统VFS组织方式和文件系统注册

Linux支持多种文件系统,据维基百科统计多达上百种,它是如何进行组织和管理这些文件系统?答案就是VFS。Linux内核使用VFS框架,来组织和管理多个文件系统,VFS叫虚拟文件系统,也叫(Virtual Filesystem Switch)。VFS是内核中的软件层,为用户空间程序提供文件系统接口,同时在内核中提供了一个抽象,允许不同的文件系统可以共存。

虚拟文件系统
虚拟文件系统

一、VFS的组织方式

北向(用户接口)和南向(文件系统接口)

VFS北向提供了一组抽象接口,例如open(),read()、write()等,这些函数以系统调用的形式供用户程序调用。用户程序使用这些系统调用时,无需关心所操作的文件
属于哪个文件系统,但是VFS会根据操作对象所属的文件系统,将上层用户操作翻译成对应文件系统操作,调用对应的文件系统进行IO处理。

所以,VFS起到文件系统的组织和操作中转作用,对外封装了文件基本操作,对内管理多种文件系统,保障多种文件系统共存,同时有外部调用时,把操作转发给具体文件系统处理。

举例说明VFS的作用
举例说明VFS的作用

二、如何注册文件系统?

1.流程梳理

文件系统注册实际上是填写一个file_system_type数据结构,此结构提供了文件系统的名称、以及几个钩子函数,钩子函数包括:初始化文件系统上下文init_fs_context()、挂载文件系统mount()、销毁无用的超级块kill_sb()。

内核采用file_system_type类型的链表(file_system_type *file_systems),组织和管理每个注册的文件系统,所有注册的文件系统,都会放到file_systems链表尾部。

VFS管理的是实际挂载的文件系统实例,因为只有挂载的文件系统,才会分配相应内存和磁盘空间,构造出多种文件系统对象。那么挂载的文件系统信息,VFS使用超级块(super_block)数据结构来描述。

file_system_type的组织形式
file_system_type的组织形式

file_systems:是VFS组织的file_system_type链表

file_system_type:文件系统注册的file_system_type,包含name,fs_flag属性,fs_supers链接到超级块

super_block:超级块,s_type链接到file_system_type,s_instances指向下一个超级块

file_system_type结构体的详细内容如下,包含name、fs_flag、module属性,mount和kill_sb操作,fs_supers是关联超级块super_block

struct file_system_type {
	const char *name;
	int fs_flags;
#define FS_REQUIRES_DEV		1 
#define FS_BINARY_MOUNTDATA	2
#define FS_HAS_SUBTYPE		4
#define FS_USERNS_MOUNT		8	/* Can be mounted by userns root */
#define FS_DISALLOW_NOTIFY_PERM	16	/* Disable fanotify permission events */
#define FS_ALLOW_IDMAP         32      /* FS has been updated to handle vfs idmappings. */
#define FS_RENAME_DOES_D_MOVE	32768	/* FS will handle d_move() during rename() internally. */
	int (*init_fs_context)(struct fs_context *);
	const struct fs_parameter_spec *parameters;
	struct dentry *(*mount) (struct file_system_type *, int,
		       const char *, void *);
	void (*kill_sb) (struct super_block *);
	struct module *owner;
	struct file_system_type * next;
	struct hlist_head fs_supers;

	struct lock_class_key s_lock_key;
	struct lock_class_key s_umount_key;
	struct lock_class_key s_vfs_rename_key;
	struct lock_class_key s_writers_key[SB_FREEZE_LEVELS];

	struct lock_class_key i_lock_key;
	struct lock_class_key i_mutex_key;
	struct lock_class_key invalidate_lock_key;
	struct lock_class_key i_mutex_dir_key;
};

2.代码示例

在模块启动时,构造一个file_system_type结构体实例,然后调用register_filesystem()注册文件系统

file_system_type结构体实例
file_system_type结构体实例
register_filesystem注册文件系统到VFS
register_filesystem注册文件系统到VFS

上一篇:什么是文件系统?

参考文献:

《002 Linux内核中虚拟文件系统VFS组织方式和文件系统注册》有2个想法

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注