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

相关推荐
虾..4 小时前
Linux 软硬链接和动静态库
linux·运维·服务器
Evan芙4 小时前
Linux常见的日志服务管理的常见日志服务
linux·运维·服务器
hkhkhkhkh1236 小时前
Linux设备节点基础知识
linux·服务器·驱动开发
HZero.chen7 小时前
Linux字符串处理
linux·string
张童瑶7 小时前
Linux SSH隧道代理转发及多层转发
linux·运维·ssh
汪汪队立大功1237 小时前
什么是SELinux
linux
石小千7 小时前
Linux安装OpenProject
linux·运维
柏木乃一7 小时前
进程(2)进程概念与基本操作
linux·服务器·开发语言·性能优化·shell·进程
Lime-30907 小时前
制作Ubuntu 24.04-GPU服务器测试系统盘
linux·运维·ubuntu
百年渔翁_肯肯8 小时前
Linux 与 Unix 的核心区别(清晰对比版)
linux·运维·unix