趣谈 Linux 操作系统
刘超
前网易杭州研究院云计算技术部首席架构师
85458 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 72 讲
趣谈 Linux 操作系统
15
15
1.0x
00:00/00:00
登录|注册

29 | 虚拟文件系统:文件多了就需要档案管理系统

BIO层
ext4文件系统
file operations
directory operations
inode operations
mount
directory entry
inode
块设备驱动程序
缓存层
块设备I/O层
真正的文件系统
虚拟文件系统
sys_write
sys_read
sys_open
file_operations
inode_operations
dentry cache
struct path
struct nameidata
struct file
files_struct
get_unused_fd_flags
struct vfsmount
struct mount
vfs_kern_mount
mount系统调用
ext4_fs_type
register_filesystem
文件系统层
系统调用
打开文件
挂载文件系统
文件管理模块
虚拟文件系统

该思维导图由 AI 生成,仅供参考

上一节,咱们的图书馆书架,也就是硬盘上的文件系统格式都搭建好了,现在我们还需要一个图书管理与借阅系统,也就是文件管理模块,不然我们怎么知道书都借给谁了呢?
进程要想往文件系统里面读写数据,需要很多层的组件一起合作。具体是怎么合作的呢?我们一起来看一看。
在应用层,进程在进行文件读写操作时,可通过系统调用如 sys_open、sys_read、sys_write 等。
在内核,每个进程都需要为打开的文件,维护一定的数据结构。
在内核,整个系统打开的文件,也需要维护一定的数据结构。
Linux 可以支持多达数十种不同的文件系统。它们的实现各不相同,因此 Linux 内核向用户空间提供了虚拟文件系统这个统一的接口,来对文件系统进行操作。它提供了常见的文件系统对象模型,例如 inode、directory entry、mount 等,以及操作这些对象的方法,例如 inode operations、directory operations、file operations 等。
然后就是对接的是真正的文件系统,例如我们上节讲的 ext4 文件系统。
为了读写 ext4 文件系统,要通过块设备 I/O 层,也即 BIO 层。这是文件系统层和块设备驱动的接口。
为了加快块设备的读写效率,我们还有一个缓存层。
最下层是块设备驱动程序。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

虚拟文件系统是操作系统中的重要组成部分,负责管理文件和文件系统的操作。文章深入浅出地介绍了虚拟文件系统的工作原理和挂载文件系统的过程。在应用层,进程通过系统调用进行文件读写操作;在内核层,需要维护进程打开的文件和整个系统打开的文件的数据结构。Linux内核通过虚拟文件系统提供统一的接口来对文件系统进行操作,并支持多种不同的文件系统。挂载文件系统是操作文件系统的第一步,需要进行注册才能使用,而mount系统调用是挂载文件系统的关键。文章还解析了挂载文件系统的调用链和相关数据结构的关系,以及通过一个例子解释了文件系统的树形关系和相关数据结构之间的关联。 文章内容丰富,涉及了虚拟文件系统的多个方面,包括文件描述符、dentry缓存、inode结构等,为读者提供了全面的技术视角。文章通过详细解释系统调用的过程和内部数据结构之间的关联,展现了文件操作的复杂性和内部数据结构之间的关联。整体而言,本文对虚拟文件系统的解析深入浅出,为读者提供了全面的技术视角。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《趣谈 Linux 操作系统》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(32)

  • 最新
  • 精选
  • geraltlaush
    文章的核心就是把磁盘文件数据映射到进程中,可以把在磁盘的文件组织看成一种协议,内存中进程中的文件组织形式看成另外一种协议,内核就是这两个协议的中转proxy,带着这个主线看文章思路要明朗一些 inode和dentry在一个文件系统挂载的时候怎么初始化和做好映射关系,这个是难点,我一开始也看懵逼了,后来一想,根文件系统不是挂载了各种磁盘分区的文件系统么,这个老师如果结合centos的xfs根文件系统下,可以挂载ext4的文件系统,并且用一个磁盘分区演示挂载,然后分析,可能大家更好理解,毕竟平时大家都是一个文件系统格式走到黑,个人建议这种复杂逻辑关系比如那个挂载图可以拍个动态图和视频,发个链接让大家去看看,

    作者回复: 赞,这个思路好啊

    2019-06-04
    37
  • Feelfree
    结合《Linux内核设计与实现》这本书 进入状态更快

    作者回复: 赞

    2019-06-05
    2
    19
  • oldman
    想问问老师,怎么才能学好C语言

    作者回复: 看书,写代码

    2019-07-20
    3
  • Guarantee
    老师,您专栏中的图,用的是什么软件,还是就是PS做的图吗?

    作者回复: draw.io

    2019-06-16
    3
  • Spring
    从文章可以看出,父文件系统的挂载点其实就是子文件系统挂载的地方,比如文章中的A文件系统挂载在根文件系统的home目录下,那home是根文件系统的一个挂载点。 另外,我有一个疑问:data是一个文件,而dentry是一个目录,为什么data文件struct file的dentry指向一个叫data的dentry呢?明明没有data目录呀?

    作者回复: dentry不仅仅表示目录,也可以表示文件

    2019-06-11
    2
  • 莫名
    `inode 结构就表示硬盘上的 inode,包括块设备号等。` 这个说法不太准确。inode结构体是磁盘文件inode的内存表示,磁盘文件的inode不包含引用计数之类的东西,被读取至内存,使用inode结构体表示。

    作者回复: inode结构就是用来“表示”硬盘上的inode。inode结构体是磁盘文件inode的内存表示,我也是这个意思的

    2019-08-22
    1
  • djfhchdh
    如何维护跨文件系统的文件夹和文件的关系:通过dentry在操作系统层面来维护,dentry和inode关联,而且dentry里有parent、child、subdirs这些成员,正好对应文件夹和文件之间的关系

    作者回复: 在内存里面,也有superblock的,会关联dentry

    2019-06-20
    1
  • 百行吴书
    老师请教一个问题 我们创建的namespace 有没有统一的地方找到它 我创建一个network namespace 在/var/run/netns 目录下会生成一个挂载点 可以通过它 到ns中 现在我将一个网卡设备放到这个ns中 启用并配置IP 可以ping通 此时通过 ip nsnet del 命令将这个ns删除 /var/run/netns/ 目录下 ns的挂载点文件也将消失 再ping 原先那个网卡 发现还可以ping通 疑问:该怎么进入这个ns,怎么将那个网卡拿回来? 还有一个问题 是不是只有在磁盘中的文件 才能通过 find -inum inode找到 在内存中不能通过该方法 有没有其他方法通过 inode找到内存中的文件

    作者回复: 竟然能ping通,能找到网卡吗?

    2020-05-21
    2
  • djfhchdh
    老师您好,请教一个问题:lookup_open创建新的dentry后,会把新的dentry加到dentry cache里吗?

    作者回复: 会的

    2019-06-20
  • 刘強
    老师,实在是不理解home目录为什么是根文件系统的挂载点,难道不是那个“/”吗?我一直理解的挂载点就是挂载文件系统的那个目录,希望老师抽个时间,指点一下挂载目录和挂载点的区别,看了一天了,谢谢。

    作者回复: home是在根文件系统上的一个挂载点

    2019-06-03
收起评论
显示
设置
留言
32
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部