Linux支持多种文件系统,据维基百科统计多达上百种,它是如何进行组织和管理这些文件系统?答案就是VFS。Linux内核使用VFS框架,来组织和管理多个文件系统,VFS叫虚拟文件系统,也叫(Virtual Filesystem Switch)。VFS是内核中的软件层,为用户空间程序提供文件系统接口,同时在内核中提供了一个抽象,允许不同的文件系统可以共存。
一、VFS的组织方式
北向(用户接口)和南向(文件系统接口)
VFS北向提供了一组抽象接口,例如open(),read()、write()等,这些函数以系统调用的形式供用户程序调用。用户程序使用这些系统调用时,无需关心所操作的文件
属于哪个文件系统,但是VFS会根据操作对象所属的文件系统,将上层用户操作翻译成对应文件系统操作,调用对应的文件系统进行IO处理。
所以,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_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()注册文件系统
上一篇:什么是文件系统?
参考文献:
《002 Linux内核中虚拟文件系统VFS组织方式和文件系统注册》有2个想法