mount藏着的Linux内核的秘密


我,子牙老师,一个手写过操作系统、编程语言、Java虚拟机、docker、Ubuntu系统,玩透Windows内核、Linux内核的...硬核男人

众所周知,我最近在更新《实战Linux内核》四期的视频。更到mount底层原理的时候,想到可能大家对这块应该挺感兴趣的,写篇文章分享一下

BTW,第四期开始招生啦,四期是你能同时学习手写64位多核操作系统+实战Linux内核的机会了,五期更完,会将实战Linux内核打造成独立的课程,到时这两门课程会拆成两个课程。这两门课,全网只有我是以实战的方式教的,只有我的课程,才能让你真正学会操作系统及Linux内核,不信的可以自己去了解一下市场作对比,有实力就是这么自信

不会有人没用过mount吧,还是唠叨一下:比如你Linux服务器的盘不够用了,你新加了一块盘,Linux系统能识别到这块新增的盘,但是无法使用,需要你将盘挂载到某个目录下才能使用,比如

大家在使用mount的时候,是否有这样的好奇:为什么执行了mount,操作data目录就能操作新增的硬盘,背后的原理是什么?mount在Linux内核中到底做了什么?

直接说结论,mount在Linux内核中做了很多事情,总结来说就是把进程task_struct、nsproxy、命名空间mnt_namespace、文件系统类型file_system_type、超级块super_block、目录项dentry、inode、mountpoint这些struct关联起来,你只需要搞清楚它们是如何关联的,mount你就算毕业了。本篇文章分享的就是这个

BTW,命名空间很多小伙伴没接触过,这些是玩Linux容器化技术才会涉及到。我之前如果不是做过课程《C语言手写docker》,对这个我也很陌生,我也就玩不明白Linux内核的VFS+文件系统。如果你对这些很陌生,可以自己借助ChatGPT学习,也可以加入我的课程学习

所以知识,学得越多,眼界越广,威力越大。学习最忌急于求成、急于求果,如果做一件事情马上就能看到结果,那这个世界何来优胜劣汰

看完本篇文章,你就能做到:

  1. 查看进程的nsproxy
  2. 查看同一个命名空间中所有的挂载信息
  3. 查看Linux内核中所有的超级块
  4. 查看一个文件系统关联的所有超级块
  5. 查看一个超级块关联的所有inode
  6. 查看一个超级块关联的所有dentry
  7. 查看一个超级块关联的所有挂载
  8. 查看一个inode关联的所有dentry
  9. 查看挂载点的子挂载
  10. 查看一个inode对应的dentry
  11. 查看一个inode对应的超级块
  12. 查看一个inode对应的文件系统
  13. 查看一个dentry对应的inode、超级块、文件系统

......

总之,这篇文章看懂了,自己再结合Linux内核源码自己做到,Linux内核的VFS+文件系统,你差不多就通了!如果你不看这篇文件,你已然能做到这些,那这块你已经拿下了!

那,开始吧!以下,enjoy~

看调用链

直接上图

如果你需要单步调试Linux内核的环境,我之前分享了一篇文章【gdb图形界面调试Linux内核】,在公众号【硬核子牙】中,需要的自取

整个mount分两个阶段:

1、根据你用户态执行的mount命令,找到对应的文件系统结构,执行该文件系统对应的mount函数

比如mount -t aayafs4 aayafs4 mnt,对应的文件系统是aayafs4,对应的文件系统结构是

这个文件系统你是不是没见过?没见过正常,因为这是我自己写的。实战Linux内核四期,就是带大家玩明白Linux内核的VFS+文件系统后,写一个这样的文件系统,实践出真知,这样的Linux内核课程,全网独一份!

图中的调用链就是找到文件系统aayafs4的mount函数myfs_mount。找到了,调用它。这个过程是完成file_system_type、super_block、inode、dentry的关联关系

2、完成第一个阶段,会回到函数do_new_mount,执行do_new_mount_fc

函数do_new_mount_fc分两个大阶段:其一,完成mount、vfsmount、super_block、dentry之间的关联关系;其二、完成task_struct、nsproxy、mnt_namespace、mount、mountpoint之间的关联关系

接下来晒图让大家透彻理解

myfs_mount

myfs_mount是自实现的文件系统aayafs4的mount函数,它执行完后,file_system_type、super_block、inode、dentry之间的关系长这样

super_blocks是全局变量,通过它,能找到Linux系统中的所有super_block

file_system_type中有个属性fs_supers,通过它,能找到该文件系统关联的所有super_block

如果全画在一张图里,这个图就会很大,所有后面的图,我只画相关struct,不代表其他关系断掉了,只是说已经建立了联系,不去看了

vfs_create_mount

在函数do_new_mount_fc中

vfs_create_mount执行完后,mount、vfsmount、super_block、dentry之间的关系如下

关联命名空间

现在只差最后一步,这次挂载与进程的命名空间建立联系,这次挂载就算完成了,核心代码在

调用链如图

怎么样,有一个能单步调试Linux内核的环境玩Linux内核,还是非常方便的吧!

完成挂载,最终的图长这样

至此,mount在Linux内核中干的所有的事情,就清晰了

这块代码其实还是挺容易读的,不信的可以自己去试试,轻松读懂Linux内核源码,还是值得炫耀的一件事,对吧

完成mount后,后面就是目录及文件的crud,又是如何实现的呢?关注公众号【硬核子牙】,看后续文章

相关推荐
歪比巴卜__2 小时前
【系列文章】Linux中的并发与竞争[04]-信号量
linux
東雪蓮☆2 小时前
LVS 负载均衡群集
linux·运维·服务器·负载均衡·lvs
和煦的春风2 小时前
性能案例分析 | Waiting for GPU completion
android·linux
lybugproducer3 小时前
深入 Linux 文件系统:从数据存储到万物皆文件
linux
烦躁的大鼻嘎3 小时前
【Linux】深入Linux多线程架构与高性能编程
linux·运维·服务器·开发语言·c++·ubuntu
羚羊角uou3 小时前
【Linux】system V共享内存
linux·运维·服务器
林克爱塞尔达4 小时前
Linux入门(二)
linux·运维·chrome
破烂儿4 小时前
Ubuntu Server 安装图形界面和通过Window远程桌面连接服务器(Xrdp)
linux·服务器·ubuntu
存储服务专家StorageExpert4 小时前
手搓一个 DELL EMC Unity存储系统健康检查清单
linux·运维·服务器·存储维护·emc存储