内核达人

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1|回复: 0

mount在Linux内核中藏着的秘密

[复制链接]

25

主题

25

帖子

83

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
83
发表于 7 天前 | 显示全部楼层 |阅读模式
哈喽,大家好,我就是那个不喜欢在大厂搬砖,不喜欢在研究院做研究,只喜欢创业做计算机底层课程的coder,子牙老师

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

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

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

# 1. 分区fdisk /dev/sdb# 2. 格式化mkfs.ext4 /dev/sdb# 3. 挂载mount /dev/sdb /mnt/data# 4. 验证df -h

大家在使用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学习,也可以加入我的课程学习

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

看完本篇文章,你就能做到:
  • 查看进程的nsproxy
  • 查看同一个命名空间中所有的挂载信息
  • 查看Linux内核中所有的超级块
  • 查看一个文件系统关联的所有超级块
  • 查看一个超级块关联的所有inode
  • 查看一个超级块关联的所有dentry
  • 查看一个超级块关联的所有挂载
  • 查看一个inode关联的所有dentry
  • 查看挂载点的子挂载
  • 查看一个inode对应的dentry
  • 查看一个inode对应的超级块
  • 查看一个inode对应的文件系统
  • 查看一个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,又是如何实现的呢?关注公众号【硬核子牙】,看后续文章



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|内核达人

GMT+8, 2025-12-6 12:37 , Processed in 0.070656 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表