45 mount 文件系统

前言

在 linux 中常见的文件系统 有很多, 如下

基于磁盘的文件系统, ext2, ext3, ext4, xfs, btrfs, jfs, ntfs

内存文件系统, procfs, sysfs, tmpfs, squashfs, debugfs

闪存文件系统, ubifs, jffs2, yaffs

文件系统这一套体系在 linux 有一层 vfs 抽象, 用户程序不用关心 底层文件系统的具体实现, 用户只用操作 open/read/write/ioctl/close 的相关 系统调用, 这一层系统调用 会操作 vfs 来处理响应的业务

vfs 会有上面各种文件系统对应的 读写 相关服务, 进而 将操作下沉到 具体的文件系统

我们这里 着重来关注一下 文件系统的挂载

系统自身的文件系统挂载

在启动的过程中需要挂载如下文件系统

复制代码
mnt_init - sysfs_init
mnt_init - init_rootfs
mnt_init - init_ramfs
vfs_caches_init - bdev_cache_init
start_kernel - proc_root_init
start_kernel - cpuset_init
start_kernel - cgroup_init
start_kernel - cgroup_init - cgroup2
kernel_init - shmem_init
kernel_init - driver_init - devtmpfs_init
kernel_init - do_init_calls - debugfs_init
kernel_init - do_init_calls - tracefs_init
kernel_init - do_init_calls - securityfs_init
kernel_init - do_init_calls - sock_init
kernel_init - do_init_calls - bpf_init
kernel_init - do_init_calls - pipepfs_init
kernel_init - do_init_calls - init_hugetlbfs_fs
kernel_init - do_init_calls - init_devpts_fs
kernel_init - do_init_calls - ext4_init_fs - register_as_ext3
kernel_init - do_init_calls - ext4_init_fs - register_as_ext2
kernel_init - do_init_calls - ext4_init_fs
kernel_init - do_init_calls - init_squashfs_fs
kernel_init - do_init_calls - init_vfat_fs
kernel_init - do_init_calls - init_ecrypt_fs
kernel_init - do_init_calls - fuse_fs_init
kernel_init - do_init_calls - fuse_ctl_init
kernel_init - do_init_calls - init_pstore_fs
kernel_init - do_init_calls - init_mqueue_fs

基于 tmpfs 来调试

主要是调试 mount 这个系统调用, 我们使用比较简单一点的 tmpfs 来进行调试, 测试

主要是有几个流程, 创建super_block, 初始化super_block, 真实的挂载操作

复制代码
(initramfs) mkdir /memFs
(initramfs) mount -t tmpfs -osize=64m tmpfs /memFs

创建 super_block

为 super_block 分配空间, 初始化各个链表, 各种基础属性, 锁

注册 super_block 到 全局链表

初始化 super_block

主要是基于 各个 fsType 传入的 fill_super 来进行初始化 super_block

初始化 maxBytes, blockSize, blockSizeBits, magic, s_op[文件系统给的各类操作], root 节点的 inode, 创建 root 对应的 dentry, 并和 super_block 关联起来

挂载 mount节点 到 mount树

如下 这里还是在初始化 mount, vfsmount

记录 mount_root, mount_super_block, mount_point 等等, 返回给 上层的是 vfs_mount

将 mount 挂载到 mount 树, 挂载路径为 "/memFs"

这里就是在 namespace.mount_hashtable 中注册 rootfs 的 "/memFs" 挂载到了 "tmpfs" 的 "/" 上面, 访问 rootfs 的 "/memFs" 需要转换为 访问 tmpfs 的 "/"

除此之外 还有记录其他的元数据什么的

挂载信息的使用

在根据 path 进行 lookup 的时候, 会查询 mount_hashtable, 查看给定的 路径 是否挂载了其他文件系统, 如果有转换为 给定的文件系统的 "/"

如下地方就是在 切换 path

更详细可以参考 proc 文件系统 中 "根据 path 获取到 inode 的过程"

相关推荐
wj3055853783 小时前
课程 9:模型测试记录与 Prompt 策略
linux·人工智能·python·comfyui
abigriver3 小时前
打造 Linux 离线大模型级语音输入法:Whisper.cpp + 3090 显卡加速与 Rime 中英混输终极调优指南
linux·运维·whisper
wangqiaowq3 小时前
windows下nginx的安装
linux·服务器·前端
YYRAN_ZZU4 小时前
Petalinux新建自动脚本启动
linux
charlie1145141914 小时前
嵌入式Linux驱动开发pinctrl篇(1)——从寄存器到子系统:驱动演进之路
linux·运维·驱动开发
于小猿Sup5 小时前
VMware在Ubuntu22.04驱动Livox Mid360s
linux·c++·嵌入式硬件·自动驾驶
cen__y5 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
不仙5206 小时前
VMware Workstation 26.0.0 在 Ubuntu 24.04 (内核 6.17.0) 上的安装与内核模块编译问题
linux·ubuntu·elasticsearch
AI视觉网奇7 小时前
linux 检索库 判断库是否支持
java·linux·服务器
dapeng-大鹏7 小时前
KVM+LVM 零停机在线扩容 Ubuntu 根分区:从磁盘添加到逻辑卷扩展完整
linux·运维·ubuntu·磁盘空间扩展