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,又是如何实现的呢?关注公众号【硬核子牙】,看后续文章

相关推荐
chlk1231 天前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑1 天前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件2 天前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
深紫色的三北六号2 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash2 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI3 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行3 天前
Linux和window共享文件夹
linux
木心月转码ing3 天前
WSL+Cpp开发环境配置
linux
崔小汤呀5 天前
最全的docker安装笔记,包含CentOS和Ubuntu
linux·后端
何中应5 天前
vi编辑器使用
linux·后端·操作系统