操作系统实战 45 讲
彭东
网名 LMOS,Intel 傲腾项目关键开发者
65203 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 60 讲
尝尝鲜:从一个Hello到另一个Hello (2讲)
特别放送 (1讲)
操作系统实战 45 讲
15
15
1.0x
00:00/00:00
登录|注册

35 | 瞧一瞧Linux:虚拟文件系统如何管理文件?

mount
insmod
make
trfs_kill_superblock
trfs_mount
trfs_fs_type
...
write
read
llseek
...
f_inode
f_path
f_u
...
link
lookup
create
...
i_uid
i_opflags
i_mode
...
d_compare
d_hash
d_revalidate
...
d_hash
d_seq
d_flags
...
dirty_inode
destroy_inode
alloc_inode
...
s_blocksize_bits
s_dev
s_list
super_block,dentry,inode
实现一个小的trfs文件系统
VFS和具体文件系统的工作机制
VFS的数据结构
什么是VFS
使用trfs文件系统
注册trfs
文件操作函数集
打开的文件
文件索引结点函数集
文件索引结点
目录函数集
目录结构
超级块函数集合
超级块结构
提供标准接口
通用文件系统抽象层
VFS(Virtual Filesystem)
思考题
重点回顾
文件系统实例
VFS数据结构
什么是VFS
Linux虚拟文件系统管理文件

该思维导图由 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
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • pedro
    置顶
    请说一说 super_block,dentry,inode 这三个数据结构 ,一定要在储存设备上对应存在吗? 不需要严格对应,之所以要对应是为了使用、维护更加方便,抽象是软件设计最大的魅力。

    作者回复: 铁子 正确

    2021-07-28
    7
  • 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-08
    6
  • Fan
    请说一说 super_block,dentry,inode 这三个数据结构 ,一定要在储存设备上对应存在吗? 要的。

    作者回复: 不需要 只是需要对应的文件系统代码在内存中构造出相应的结构就行了

    2021-07-29
    2
    1
  • 蓝色梦幻
    请教一下:"有了上述代码,挂载 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
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部