35 | 瞧一瞧Linux:虚拟文件系统如何管理文件?
LMOS
该思维导图由 AI 生成,仅供参考
你好,我是 LMOS。
在前面的课程中,我们已经实现了 Cosmos 下的文件系统 rfs,相信你已经感受到了一个文件系统是如何管理文件的。今天我们一起来瞧一瞧 Linux 是如何管理文件,也验证一下 Linux 那句口号:一切皆为文件。
为此,我们需要首先搞清楚什么是 VFS,接着理清为了实现 VFS 所用到的数据结构,然后看看一个文件的打开、读写、关闭的过程,最后我们还要亲自动手实践,在 VFS 下实现一个“小”且“能跑”的文件系统。
什么是 VFS
VFS(Virtual Filesystem)就像伙伴系统、SLAB 内存管理算法一样,也是 SUN 公司最早在 Sloaris 上实现的虚拟文件系统,也可以理解为通用文件系统抽象层。Linux 又一次“白嫖”了 Sun 公司的技术。
在 Linux 中,支持 EXT、XFS、JFS、BTRFS、FAT、NTFS 等多达十几种不同的文件系统,但不管在什么储存设备上使用什么文件系统,也不管访问什么文件,都可以统一地使用一套 open(), read()、write()、close() 这样的接口。
这些接口看上去都很简单,但要基于不同的存储设备设计,还要适应不同的文件系统,这并不容易。这就得靠优秀的 VFS 了,它提供了一个抽象层,让不同的文件系统表现出一致的行为。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
Linux的虚拟文件系统(VFS)是Linux文件系统管理的核心技术之一,通过统一不同文件系统的行为,使得应用程序可以使用一套标准的接口操作多种不同的文件系统,无需关注细节。VFS的核心数据结构包括超级块结构和超级块函数集合,文件系统只需实现这两个结构就可以插入到VFS中。对于目录,VFS使用dentry结构表示,包含目录的名字和挂载子目录的链表,同时也能指向父目录。而文件索引结点则由inode结构表示,包含文件的全部信息。VFS通过定义inode结构和函数集合,让具体文件系统根据自己的文件信息生成相应的inode结构,实现了对文件的抽象表示。文章还介绍了文件对象结构、文件操作流程以及一个最小文件系统的实现。总的来说,通过统一文件系统的行为和数据结构,让应用程序可以统一地操作文件,体现了Linux的口号“一切皆为文件”的特点。文章内容详实,通过具体的数据结构和操作流程,帮助读者了解了Linux文件系统管理的核心技术,为进一步深入学习提供了基础。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《操作系统实战 45 讲》,新⼈⾸单¥68
《操作系统实战 45 讲》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(7)
- 最新
- 精选
- pedro置顶请说一说 super_block,dentry,inode 这三个数据结构 ,一定要在储存设备上对应存在吗? 不需要严格对应,之所以要对应是为了使用、维护更加方便,抽象是软件设计最大的魅力。
作者回复: 铁子 正确
2021-07-287 - neohope一、数据结构 1、四大基本结构 A、超级块管理为super_block,用于描述存储设备上的文件系统,可以从super_block出发把存储设备上的内容读取出来 B、目录结构管理为dentry,通过其来组织整个目录结构 C、文件索引节点管理为inode,可以先把它看作是存储设备上的具体对象,一个inode可以对应多个dentry【比如link】 D、文件管理为file,描述进程中的某个文件对象 2、Linux在挂载文件系统时,会读取文件系统超级块super_block,然后从超级块出发读取并构造全部dentry目录结构;dentry目录结构指向存储设备文件时,是一个个的inode结构。 3、应用程序在打开文件时,在进程结构task_struct->fs_struct中,记录进程相关的文件系统信息,这样就可以对文件系统,进行新增、删除、打开、关闭等相关操作。 4、同时,在进程结构task_struct->files_struct->fdtable->file,保存全部打开的文件指针,文件指针file结构中,会保存inode指针,从而可以获取文件权限、文件访问记录、文件数据块号的信息,进一步可以从文件读取文件信息。 二、trfs demo 1、除上面的结构外,内部使用了两个结构:文件描述fileinfo,目录描述dir_entry A、fileinfo记录在了inode的私有数据中,这样通过inode就可以方便的找到fileinfo B、如果是文件,fileinfo.data中记录的就是文件内容 C、如果是文件夹,fileinfo.data记录的就是一个个dir_entry 2、trfs基于非连续内存 A、由MAX_FILES+1个fileinfo组成,记录在全局变量finfo_arr中,但第0和第MAX_FILES个好像没有使用 B、每个fileinfo中包含一个文件块,大小为MAX_BLOCKSIZE C、并没有使用单独的位图,而是通过每个fileinfo来记录其使用情况的 3、初始化 A、初始化了finfo_arr结构 trfs_init->init_fileinfo B、超级块创建,占用了finfo_arr[1] trfs_mount->mount_nodev->trfs_fill_super 4、使用 A、每次新建文件或文件夹,就占用一个空闲的fileinfo B、删除文件或文件夹,就将一个fileinfo设置为可用 C、读写文件就是通过file找到fileinfo.data D、查找和枚举就是通过file找到fileinfo.data,然后访问其中的每个dir_entry
作者回复: 正确 的
2021-08-086 - Fan请说一说 super_block,dentry,inode 这三个数据结构 ,一定要在储存设备上对应存在吗? 要的。
作者回复: 不需要 只是需要对应的文件系统代码在内存中构造出相应的结构就行了
2021-07-2921 - 蓝色梦幻请教一下:"有了上述代码,挂载 trfs 到 /mnt 下,我们就可以用 touch 建立一个文件,然后用 cat 读取这个文件了。" 这里具体要怎么操作呀?我可以用findmnt 查看到trfs系统的挂载,后续要怎么操作呢? TARGET SOURCE FSTYPE OPTIONS ├─/mnt none trfs rw,relatime
作者回复: 直接 用touch cat 啊
2022-05-14 - 艾恩凝打卡
编辑回复: 加油咯
2022-05-13 - Geek_cb2b43请问在一个新建的空文件,从100兆的位置写200兆数据,操作的流程是什么,文件的大小是300兆吗?
作者回复: 不一定的
2021-11-13 - 不及胜于过之文件系统就是 super_block/和super_operations,dentry和dentry_operations,inode和inode_operations,file 和 file_operations,真的是醍醐灌顶,大佬可以按这个表述风格,详细说下mount 嘛, 一直理解的不是很深刻,尤其是容器用到的union mount
作者回复: 好的 敬请期待
2021-08-08
收起评论