linux内核 struct super_block

struct super_block(超级块)是内核用来描述已挂载文件系统的核心数据结构,存储的是文件系统的 "全局元数据"------ 相当于文件系统的 "系统级身份证",管理整个文件系统的资源、规则和状态。

可以这样类比:

  • struct inode 描述单个文件 / 目录的元数据;
  • struct super_block 描述整个文件系统的元数据(比如文件系统类型、总大小、空闲块数、挂载点、全局操作规则等)。

每个已挂载的文件系统(如 //home/tmp)对应且仅对应一个 super_block 实例,内核会将所有 super_block 维护在一个全局链表中。

核心定义

核心字段

字段 核心作用
s_magic 文件系统 "指纹",内核通过它识别文件系统类型(如 stat -f / 可查看魔数)。
s_blocksize 文件系统的基础块大小,所有数据分配 / 读写都以该大小为单位(如 ext4 默认 4KB)。
s_op 超级块操作集(见下文),定义文件系统的全局操作(如创建 inode、卸载、同步)。
s_root 指向文件系统根目录的 vfsmount,通过它可访问根目录的 dentry/inode
s_fs_info 具体文件系统的私有数据(如 ext4 的 struct ext4_sb_info),存储 ext4 特有的全局信息(如日志位置、块组数量)。
s_bdev 关联的块设备(如 /dev/sda1),文件系统的所有磁盘 IO 最终通过该设备完成。
s_inodes 该文件系统中所有 "活跃"(已加载到内存)的 inode 链表,内核通过它管理内存中的 inode。

核心操作集:super_operations

struct super_operationssuper_block 的 "全局操作手册",定义了对整个文件系统的核心操作,由具体文件系统实现(如 ext4 实现 ext4_super_operations):

super_operations与inode_operations

  • struct super_operations文件系统级别的全局操作集,定义对整个已挂载文件系统的 "宏观操作"(如分配 / 释放 inode、同步整个文件系统、卸载文件系统);
  • struct inode_operations单个 inode 级别的操作集,定义对单个文件 / 目录 / 设备文件的 "微观操作"(如创建文件、删除目录、重命名、查找文件)。
维度 struct super_operations(超级块操作集) struct inode_operations(inode 操作集)
操作粒度 整个文件系统 单个 inode(文件 / 目录 / 设备)
核心操作 - 分配 / 销毁 inode(alloc_inode/destroy_inode)- 同步整个文件系统(sync_fs)- 卸载文件系统(umount_begin)- 写回 inode 到磁盘(write_inode)- 设置文件系统只读 / 可写(remount_fs - 创建文件 / 目录(create/mkdir)- 删除文件 / 目录(unlink/rmdir)- 重命名(rename)- 查找文件(lookup)- 创建硬链接 / 软链接(link/symlink)- 修改文件属性(setattr
关联结构体 绑定到 struct super_blocks_op 字段 绑定到 struct inodei_op 字段
调用场景 挂载 / 卸载文件系统、全局同步(sync 命令)、系统内存回收、文件系统只读切换 日常文件操作(touch/mkdir/rm/mv/ln)、文件权限校验、属性修改
实现主体 每个文件系统(ext4/XFS/tmpfs)实现一套,全局共用 同一文件系统内,不同类型 inode(目录 / 普通文件 / 设备文件)有不同实现(如 ext4 目录和普通文件的 i_op 不同)

关键协作点:

  1. inode_operationscreate 是 "业务入口",处理单个文件的创建逻辑;
  2. 底层依赖 super_operationsalloc_inode 完成 "资源分配"(从文件系统的空闲 inode 池中分配);
  3. 操作完成后,通过 super_operationswrite_inode 将新 inode 的元数据持久化到磁盘。

区别:

  • 粒度不同super_operations 管 "整个文件系统",inode_operations 管 "单个文件 / 目录";
  • 职责不同:前者负责全局资源管理、系统级维护;后者负责单个文件的增删改查、属性操作;
  • 绑定对象不同 :前者绑定到 super_block(一个文件系统一个实例);后者绑定到 inode(不同类型 inode 有不同实例)。

struct dquot_operations

struct dquot_operations(配额操作集)是内核为磁盘配额功能设计的操作接口集合 ,绑定到 struct super_block(超级块)的配额相关字段中。它的核心作用是:

  • 为不同文件系统(ext4、XFS、Btrfs 等)提供统一的配额操作接口;
  • 定义对 "配额项(dquot)" 的具体操作(如创建配额、扣减磁盘空间、同步配额到磁盘)。

简单类比:

  • 磁盘配额(dquot)是 "给用户 / 组设置的磁盘使用额度"(比如限制用户 A 最多用 10GB 空间);
  • dquot_operations 是 "管理这个额度的操作手册"(比如查看额度、扣减已用空间、超额度时限制写入、同步额度到磁盘)。

核心定义

核心字段解释

函数指针 核心作用 触发场景
dq_init 初始化文件系统的配额功能(如加载配额文件、初始化配额缓存) mount -o usrquota /dev/sda1 /mnt(挂载时启用用户配额)
dq_alloc_space 扣减配额的已用空间(按文件大小计算) 用户写入文件(如 dd if=/dev/zero of=test bs=1G count=1
dq_free_space 释放配额的已用空间 用户删除文件(如 rm test
dq_alloc_inode 扣减配额的已用 inode 数(创建文件会消耗 1 个 inode) touch newfile.txt(创建新文件)
dq_check 检查用户已用空间 /inode 是否超过限额 写入文件前校验,超限则返回 EDQUOT 错误(磁盘配额超出)
dq_sync 将所有配额数据同步到磁盘(配额文件,如 aquota.user) quotasync 命令或内核后台刷盘

核心要点

  • 配额分 "空间配额"(限制字节数)和 "inode 配额"(限制创建的文件数量),dq_alloc_inode/dq_free_inode 管理 inode 配额;
  • 配额超限后,软限制(soft limit)超了会警告,宽限期内仍可写入;硬限制(hard limit)超了才会拒绝写入;
  • 所有文件系统对配额功能的支持:主流文件系统(ext4、XFS、Btrfs)支持,部分轻量级文件系统(如 tmpfs、vfat)不支持。
  • dquot_operations 是管理磁盘配额的核心操作集,定义了配额的初始化、读写、空间 /inode 扣减、校验、同步等操作;
  • 它绑定到文件系统的超级块(super_block->s_dquot_ops),不同文件系统实现各自的配额操作逻辑;
  • 核心作用是在用户写入文件 / 创建文件时,校验并更新配额,确保用户 / 组不超出设定的磁盘使用限额。

工作流程(以挂载 ext4 为例)

当你执行 mount /dev/sda1 /mnt/data 时,内核的核心流程:

  1. 解析挂载参数 :识别设备 /dev/sda1 和文件系统类型 ext4
  2. 读取磁盘超级块 :从 /dev/sda1 的固定位置(通常是块 1)读取 ext4 磁盘超级块,解析出块大小、魔数、空闲 inode / 块数等;
  3. 创建内存 super_block :在内核中分配并初始化 struct super_block,填充 s_magics_blocksizes_bdev 等字段;
  4. 关联私有数据 :分配 ext4_sb_info 结构体,存储 ext4 特有信息(如块组描述符、日志信息),赋值给 s_fs_info
  5. 设置操作集 :将 s_op 指向 ext4_super_operations
  6. 创建根目录 inode :加载文件系统根目录的 inode,关联到 s_root
  7. 加入全局链表 :将该 super_block 加入内核全局 super_blocks 链表,完成挂载。

与其他核心结构体的关联

super_block 是 VFS 的 "中枢",关联了所有关键结构体:

核心要点

  1. struct super_block 是已挂载文件系统的核心描述符,存储整个文件系统的全局元数据和规则;
  2. 核心字段包括文件系统魔数、块大小、挂载信息、全局操作集(s_op)、私有数据(s_fs_info)等;
  3. 每个已挂载的文件系统对应一个 super_block,它是连接 VFS 和具体文件系统、关联 inode / 块设备 / 挂载点的中枢。
相关推荐
Getgit2 小时前
Linux 下查看 DNS 配置信息的常用命令详解
linux·运维·服务器·面试·maven
zhangrelay3 小时前
Linux(ubuntu)如何锁定cpu频率工作在最低能耗模式下
linux·笔记·学习
_OP_CHEN3 小时前
【Linux系统编程】(二十)揭秘 Linux 文件描述符:从底层原理到实战应用,一篇吃透 fd 本质!
linux·后端·操作系统·c/c++·重定向·文件描述符·linux文件
chem41113 小时前
玩客云 边缘AI模型 本地搭建部署 llama.cpp qwen
linux·人工智能·llama
一个平凡而乐于分享的小比特4 小时前
Linux内核中的BogoMIPS详解
linux·bogomips
橘颂TA4 小时前
【Linux 网络】TCP 拥塞控制与异常处理:从原理到实践的深度剖析
linux·运维·网络·tcp/ip·算法·职场和发展·结构与算法
zbguolei4 小时前
CentOS 7.6离线安装Nginx
linux·nginx·centos
苏宸啊4 小时前
Linux开发工具(二)
linux
Linux技术芯5 小时前
黄益平《金融的价值》解码:从浙金中心风暴看金融风险识别与普通人理财生存指南
linux