超级块,文件系统的心脏。

  如果说inode块是Unix操作系统中文件的核心,那么超级块就是文件系统的心脏。启动Unix操作系统后,发现某个文件系统无法使用,很有 可能就是超级块出现了问题。为什么这个超级块有这么大的作用呢?主要是因为在超级块中保存了全局文件信息,如硬盘已用空间、数据块可用空间、inode结 点信息等等。做一个形象的比喻,这个超级块就好像是企业的资产负债表,一个文件系统中有哪些资源都记录在这个表中。

  当操作系统启动后,系统内核会把超级块中的内容复制到内存中,并周期性的利用内存里的最新内容去更新硬盘上的超级块中的内容。由于这个更新存在 一个时间差,为此内存中的超级块信息与硬盘中的超级块信息往往只有在开机与关机的某个特定时刻是同步的;而在其他时间都是不同步的。假设当操作系统意外当 机或者因为断电而造成的意外事故时,内存中的超级块信息没有及时保存到硬盘中,此时文件系统的完整性就会受到破坏。轻者导致刚建立的丢失,重则的话会导致 文件系统瘫痪。遇到这种情况时,系统工程师往往需要利用系统提供的sync命令在系统出现故障的那一刻把内存里的内容复制到磁盘上。这个过程往往操作系统 会自动完成,这也正是因为为什么Unix操作系统要比Windows操作系统稳定的一个重要原因。当操作系统重新启动的过程中,系统内核会对两者进行比 较,根据他们之间的差异,给文件系统打上干净或者脏的标签。这个信息也是存储在文件系统的超级块中。

  可见超级块如果发生损坏的话,对于文件系统的破坏性非常的大。轻者的话导致某个文件系统无法挂载,重则的话导致整个操作系统崩溃。在Unix操 作系统中,除了可以利用sync命令来保证硬盘上的内容决不会比内存里的内容更新之外,还提供了一个很有利的措施来保证其的安全性。其实,这个技术很早就 有,只是一开始并没有用在超级块的管理中。这个技术就是跟磁盘阵列类似。操作系统会将多个超级块内容保存到硬盘中的不同区域。当其中一个超级块出现问题 时,操作系统会自动采用另外一个超级块。等到系统运行正常后,系统内容就会把可用的超级块去替换那个故障的超级块。为此除非所有的超级块都损坏了,否则的 话,只要有一个超级块是可用的,那么文件系统与操作系统就可以正常挂载与启动。这种安全机制在很大程度上提高了超级块的安全性,系统了Unix操作系统的 稳定性。现在大部分的Unix操作系统(包括Linux操作系统)已经实现了类似的安全机制。

原文地址:超级块的定义 - linux--quan - 博客园(版权归原文作者所有,侵权留言联系删除)

超级块

VFS超级块是各种具体文件系统在安装时建立的,并在这些文件系统卸载时自动删除,可见,VFS超级块确实只存在于内存中,同时提到VFS超级块也应该说成是哪个具体文件系统的VFS超级块。VFS超级块在inculde/fs/fs.h中定义,即数据结构super_block,该结构及其主要域的含义如下:

struct super_block{ /************描述具体文件系统的整体信息的域*****************/ kdev_t s_dev;                /* 包含该具体文件系统的块设备标识符。例如,对于 /dev/hda1,其设备标识符为 0x301*/unsigned long s_blocksize;        /*该具体文件系统中数据块的大小, 以字节为单位 */                                                                       unsigned char s_blocksize_bits;   /*块大小的值占用的位数,例如,如果块大小为1024字节,则该值为10*/  unsigned long long  s_maxbytes;     /* 文件的最大长度 */nsigned long s_flags;           /* 安装标志*/unsigned long s_magic;           /*魔数,即该具体文件系统区别于其它 文系统的一个标志*/ /**************用于管理超级块的域******************/struct list_head      s_list;   /*指向超级块链表的指针*/  struct semaphore      s_lock      /*锁标志位,若置该位,则其它进程不能对该超级块操作*/struct rw_semaphore   s_umount   /*对超级块读写时进行同步*/                                                                                                                                          unsigned char         s_dirt;        /*脏位,若置该位,表明该超级块已被修改*/                                                                struct dentry         *s_root; /*指向该具体文件系统安装目录的目录项。*/int                   s_count; /*对超级块的使用计数*/atomic_t              s_active;                            struct list_head      s_dirty;        /*已修改的索引节点形成的链表 */struct list_head      s_locked_inodes;/* 要进行同步的索引节点形成的链表*/struct list_head      s_files/***********和具体文件系统相联系的域*************************/struct file_system_type *s_type;  /*指向文件系统的 file_system_type 数据结构的指针 */                                                                                  struct super_operations *s_op;    /*指向某个特定的具体文件系统的用 于超级块操作的函数集合 */                                                                               struct dquot_operations *dq_op;            /* 指向某个特定的具体文件系统   用于限额操作的函数集合 */                                                                               u;                                /*一个共用体,其成员是各种文件系统  的 fsname_sb_info数据结构 */                                                                                      };

所有超级块对象(每个已安装的文件系统都有一个超级块)以双向环形链表的形式链接在一起。链表中第一个元素和最后一个元素的地址分别存放在super_blocks变量的s_list域的 next 和 prev域中。s_list域的数据类型为struct list_head,在超级块的s_dirty域以及内核的其他很多地方都可以找到这样的数据类型;这种数据类型仅仅包括指向链表中的前一个元素和后一个元素的指针。因此,超级块对象的s_list域包含指向链表中两个相邻超级块对象的指针。图8.2说明了list_head 元素、next 和 prev是如何嵌入到超级块对象中的。

图: 超级块链表

超级块最后一个u 联合体域包括属于具体文件系统的超级块信息:

 1   union {2 3                 struct Minix_sb_info    Minix_sb;4 5                 struct Ext2_sb_info     Ext2_sb;6 7                 struct ext3_sb_info     ext3_sb;8 9                 struct hpfs_sb_info     hpfs_sb;
10
11                 struct ntfs_sb_info     ntfs_sb;
12
13                 struct msdos_sb_info    msdos_sb;
14
15                 struct isofs_sb_info    isofs_sb;
16
17                 struct nfs_sb_info      nfs_sb;
18
19                 struct sysv_sb_info     sysv_sb;
20
21                 struct affs_sb_info     affs_sb;
22
23                 struct ufs_sb_info      ufs_sb;
24
25                 struct efs_sb_info      efs_sb;
26
27                 struct shmem_sb_info    shmem_sb;
28
29                 struct romfs_sb_info    romfs_sb;
30
31                 struct smb_sb_info      smbfs_sb;
32
33                 struct hfs_sb_info      hfs_sb;
34
35                 struct adfs_sb_info     adfs_sb;
36
37                 struct qnx4_sb_info     qnx4_sb;
38
39                 struct reiserfs_sb_info reiserfs_sb;
40
41                 struct bfs_sb_info      bfs_sb;
42
43                 struct udf_sb_info      udf_sb;
44
45                struct ncp_sb_info      ncpfs_sb;
46
47                 struct usbdev_sb_info   usbdevfs_sb;
48
49                struct jffs2_sb_info    jffs2_sb;
50
51                struct cramfs_sb_info   cramfs_sb;
52
53                 void                    *generic_sbp;
54
55        } u;

通常,为了效率起见u域的数据被复制到内存。任何基于磁盘的文件系统都需要访问和更改自己的磁盘分配位示图,以便分配和释放磁盘块。VFS允许这些文件系统直接对内存超级块的u联合体域进行操作,无需访问磁盘。

但是,这种方法带来一个新问题:有可能VFS超级块最终不再与磁盘上相应的超级块同步。因此,有必要引入一个s_dirt标志,来表示该超级块是否是脏的,也就是说,磁盘上的数据是否必须要更新。缺乏同步还导致我们熟悉的一个问题:当一台机器的电源突然断开而用户来不及正常关闭系统时,就会出现文件系统崩溃。Linux是通过周期性地将所有“脏”的超级块写回磁盘来减少该问题带来的危害。

与超级块关联的方法就是所谓的超级块操作。这些操作是由数据结构super_operations来描述的,该结构的起始地址存放在超级块的s_op域中,稍后将与其他对象的操作一块介绍。

原文作者:Joilee

原文地址:超级块 - Joilee - 博客园(版权归原文作者所有,侵权留言联系删除)

零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核)

涵盖了c++语言类目的大部分技术方向的实战项目,可做校招 社招的简历项目书写

提供项目的源码,学不好可以全额退款

物美价廉,通过39.9/40+小时。得到零声VIP课程体验

【1】基础架构:KV存储项目

【2】高性能存储:spdk项目

【3】golang云原生:基础语法、邮件发送、短信发、人脸识别、云点播、云直播项目

【4】音视频:FFmpeg播放器项目

【5】Linux内核:内存管理实战案例分析

【6】Qt项目实战:MP3音乐播放器搜索引擎

扫码登录查看

【文章福利】小编推荐自己的Linux内核技术交流群: 【977878001】整理一些个人觉得比较好得学习书籍、视频资料;进群私聊群管理领取 内核资料包(含视频教程、电子书、实战项目及代码)

Linux内核:文件系统之超级块相关推荐

  1. linux文件系统dentry_文件系统中超级块、inode和dentry三者的分析

    原标题:文件系统中超级块.inode和dentry三者的分析 文件系统是用于存储和组织文件的一种机制,便于对文件进行方便的查找与访问. 而随着文件种类的增多,扩增了更多的文件系统,为了对各种文件系统进 ...

  2. linux -inode 详解超级块详细讲解个人参悟

    一.inode块,Unix文件的核心 首先需要明白的是,在Unix操作系统中的任何资源都被当作文件来管理.如目录.光驱.终端设备等等,都被当作是一种文件.从这方面来说,Unix操作系统中的所有的目录. ...

  3. Linux内核文件系统

    Linux 内核文件系统 概述 文件系统这一词在不同上下文时有不同的含义: 指一种具体的文件格式.例如Linux的文件系统是Ext2,MSDOS的文件系统是FAT16,而Windows NT的文件系统 ...

  4. Linux内核文件系统10

    2021SC@SDUSC inode.c(1) 今天来分析inode.c文件.有了前面对ext4_jbd2.h.acl.h等头文件的分析做基础,今天的分析将相对简单. 在看代码之前,首先要说一下ino ...

  5. Linux内核文件系统8

    2021SC@SDUSC 今天来分析ext4_jbd2.h 和 ext4_jbd2.c文件. 以下是ext4_jbd2.h头文件的代码分析 // SPDX-License-Identifier: GP ...

  6. 索引节点inode: Linux内核文件系统之(inode)

    inode译成中文就是索引节点,它用来存放档案及目录的基本信息,包含时间.档名.使用者及群组等. static int eachreg_open(struct inode *inode, struct ...

  7. DM365 linux内核文件系统的烧写步骤及其uboot参数配置

    DM365 linux内核&文件系统的烧写步骤及其uboot参数配置     目录 源文档下载:http://download.csdn.net/detail/zhangjikuan/6443 ...

  8. 【技术分享篇】Linux内核——手把手带你实现一个Linux内核文件系统丨Linux内核源码分析

    手把手带你实现一个Linux内核文件系统 1. 内核文件系统架构分析 2. 行行珠玑,代码实现 [技术分享篇]Linux内核--手把手带你实现一个Linux内核文件系统丨Linux内核源码分析 更多L ...

  9. Linux内核原理之通用块设备层

    文章目录 通用块设备层 I/O体系结构 访问设备 设备文件 字符设备.块设备与其它设备 使用ioctl进行设备寻址 设备数据库 与文件系统关联 inode中的设备文件成员 标准文件操作 用于字符设备的 ...

  10. linux内核文件系统的架构,《深入理解Linux内核》-文件系统学习心得

    内核中要注意的是各种结构体,结构体之间的联系和各个函数以及函数之间的调用关系,参数的传递和函数的功能. 内核中数据结构的字段无外乎包括三种字段:属性字段,调用方法,指向其它结构的指针.具体如下图所示: ...

最新文章

  1. 报名 | 期末考后,快来打比赛赢万元奖金!(北京上海)
  2. linux日志汇总,Linux日志分析常用命令汇总(示例代码)
  3. c 程序 实现一元二次方程
  4. 《大话数据结构》第1章 数据结构绪论 1.1 开场白
  5. 定制iOS 7中的导航栏和状态栏
  6. leetcode剑指 Offer 29. 顺时针打印矩阵
  7. 微信填写服务器配置 php操作方法
  8. AcWing 796. 子矩阵的和
  9. [BZOJ 2154] Crash的数字表格
  10. Asp.net网站使用HttpHandler实现图片防盗链功能
  11. 大数据技术原理与应用 第1章 大数据概述
  12. mysql意外停止后数据库恢复
  13. Unity【Face Cap】- 关于人脸捕捉的解决方案(二)
  14. php工作态度,工作质量,取决于工作态度
  15. 小程序如何隐藏滚动条
  16. 部分国产水文水动力模型介绍
  17. LeetCode1-620题汇总,希望对你有点帮助!
  18. 阿里发布“码上淘”平台 连接更多实体店
  19. 批处理中出现错误: batch must be either executed or cleared
  20. 更新ZTE N880E手机的MAC地址

热门文章

  1. CSS box-flex属性,然后弹性盒子模型简介
  2. 干IT月薪不足5K,劝你去开滴滴!
  3. tableau server 离线加载自定义谷歌地图瓦片
  4. 支付系统设计三:渠道网关设计06-业务处理
  5. BI 思维分析,铅酸蓄电池行业的经营框架
  6. 谈下自己的性格,谈下vbs的一些代码
  7. 有点悲壮的“悲”美车展
  8. Win7+Ubuntu18.04双系统安装
  9. 牛客编程巅峰赛S2赛级
  10. Python 爬虫 爬取豆瓣Top 250 更新