Linux文件系统1---VFS的引入
Posted HZero
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux文件系统1---VFS的引入相关的知识,希望对你有一定的参考价值。
1.引言
本文所述关于文件管理的系列文章主要是对陈莉君老师所讲述的文件系统管理知识讲座的整理。Linux可以支持不同的文件系统,它源于unix文件系统,也是unix文件系统的一大特色。
本文主要先引入VFS的概念,并从直观上了解Linux中所注册的文件系统,从而对Linux文件系统有一个概括的认识。
2.虚拟文件系统的引入
2.1 VFS(Virtual FileSystem Switch)架构
图 VFS文件系统架构图
VFS为用户空间提供了统一的接口,不同的文件系统需要实现这些接口,对于设备文件,驱动程序中也要实现相应的接口,这体现了一种机制与分离的理念。
2.2 查看内核注册的文件系统
图 内核所注册的文件系统
通过cat /proc/filesystems可以查看当前内核所注册的文件系统,文件系统不仅作为一种文件的管理机制,也可以作为其它的一种机制加入VFS中,如cgroup等
2.3 Linux文件系统目录结构
图 文件系统目录结构
Linux的文件是统一的,位于一棵目录树中,它与进程管理是一脉相承的理念。
注:所有进程都来源于唯一的初始进程,所有进程都是该进程的后代进程
3.file_system_type结构体
1 struct file_system_type { 2 const char *name; /*文件系统的名字*/ 3 int fs_flags; /*文件系统类型标志*/ 4 #define FS_REQUIRES_DEV 1 5 #define FS_BINARY_MOUNTDATA 2 6 #define FS_HAS_SUBTYPE 4 7 #define FS_USERNS_MOUNT 8 /* Can be mounted by userns root */ 8 #define FS_USERNS_DEV_MOUNT 16 /* A userns mount does not imply MNT_NODEV */ 9 #define FS_USERNS_VISIBLE 32 /* FS must already be visible */ 10 #define FS_RENAME_DOES_D_MOVE 32768 /* FS will handle d_move() during rename() internally. */ 11 struct dentry *(*mount) (struct file_system_type *, int, 12 const char *, void *); 13 void (*kill_sb) (struct super_block *); /*禁止访问超级块*/ 14 struct module *owner; /*文件系统模块*/ 15 struct file_system_type * next; /*链表中下一个文件系统类型*/ 16 struct hlist_head fs_supers; /*超级块对象列表*/ 17 18 struct lock_class_key s_lock_key; 19 struct lock_class_key s_umount_key; 20 struct lock_class_key s_vfs_rename_key; 21 struct lock_class_key s_writers_key[SB_FREEZE_LEVELS]; 22 23 struct lock_class_key i_lock_key; 24 struct lock_class_key i_mutex_key; 25 struct lock_class_key i_mutex_dir_key; 26 };
注:如上为Linux4.6中的结构,讲座中采用的是Linux2.6
- Linux内核采用VFS(Virtual Filesystem Switch)框架
- 每个文件系统都需要在VFS中注册,即填充一个struct file_system_type结构
- 此结构描述的是文件系统的名称以及一个指向对应VFS超级块读取例程的地址等信息
图 file_system_type的组织结构
- 内核采用链表组织每个注册的文件系统,链表头为file_systems
- 所有注册的文件系统通过next指针进行链接
- 每个文件系统实例都对应一个super_block,同种文件系统类型的super_block挂在fs_supers链表上
4. 实例:打印file_system_type信息
可以通过cat /proc/kallsyms | wc可以统计内核有多少个符号。
由于内核有些符号是没有导出的,不允许访问,通过cat /proc/kallsyms | grep file_systems可以打印出file_systems的地址,通过这个地址进行遍历,可以将打印出所有注册的文件系统
以上是关于Linux文件系统1---VFS的引入的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )(代码片段