Linux下对superblock的理解

对superblock的理解首先从partition structure的结构开始:

1、首先了解下block,对于ext2(ext3)文件系统而言,硬盘分区首先被划分为一个个的block,同一个ext2文件系统上的每个block大小都是一样的。但是对于不同的ext2文件系统,block的大小可以有区别。典型的block大小是1024 bytes或者4096 bytes。这个大小在创建ext2、ext3文件系统的时候被决定,mkfs –t ext2/3 –b xx就可以设定块大小了!一个硬盘分区上的block计数是从0开始的,总的来说,block这个概念好理解。
2、理解了block的概念后,接着就是对block group的理解,硬盘分区上所有的block被聚在一起分成几个大的block group。其中每个block group中有多少个block是固定的。从上面的图可以看出来!每个block group都相对应一个group descriptor,每个group descriptor当中有几个重要的block指针,指向block group中的inode table、block bitmap和inode bitmap。
以上三个结构记载了其所属block group的许多信息。
3、下面就是对super block的理解了
Super block即为超级块,它是硬盘分区开头——开头的第一个byte是byte 0,从 byte 1024开始往后的一部分数据。由于 block size最小是 1024 bytes,所以super block可能是在block 1中(此时block 的大小正好是 1024 bytes)
超级块中的数据其实就是文件卷的控制信息部分,也可以说它是卷资源表,有关文件卷的大部分信息都保存在这里。例如:硬盘分区中每个block的大小、硬盘分区上一共有多少个block group、以及每个block group中有多少个inode。
对于super block的结构和涵义可以通过查看/usr/include/linux/ext3_fs.h文件:
通过set number:
386 struct ext3_super_block {
386 struct ext3_super_block {
387 /*00*/  __le32  s_inodes_count;         /* Inodes count */
388         __le32  s_blocks_count;         /* Blocks count */
389         __le32  s_r_blocks_count;       /* Reserved blocks count */
390         __le32  s_free_blocks_count;    /* Free blocks count */
391 /*10*/  __le32  s_free_inodes_count;    /* Free inodes count */
392         __le32  s_first_data_block;     /* First Data Block */
393         __le32  s_log_block_size;       /* Block size */
394         __le32  s_log_frag_size;        /* Fragment size */
395 /*20*/  __le32  s_blocks_per_group;     /* # Blocks per group */
396         __le32  s_frags_per_group;      /* # Fragments per group */
397         __le32  s_inodes_per_group;     /* # Inodes per group */
398         __le32  s_mtime;                /* Mount time */
399 /*30*/  __le32  s_wtime;                /* Write time */
400         __le16  s_mnt_count;            /* Mount count */
401         __le16  s_max_mnt_count;        /* Maximal mount count */
402         __le16  s_magic;                /* Magic signature */
403         __le16  s_state;                /* File system state */
404         __le16  s_errors;               /* Behaviour when detecting errors */
405         __le16  s_minor_rev_level;      /* minor revision level */
406 /*40*/  __le32  s_lastcheck;            /* time of last check */
407         __le32  s_checkinterval;        /* max. time between checks */
408         __le32  s_creator_os;           /* OS */
409         __le32  s_rev_level;            /* Revision level */
410 /*50*/  __le16  s_def_resuid;           /* Default uid for reserved blocks */
411         __le16  s_def_resgid;           /* Default gid for reserved blocks */

super block的几个重要成员

1、Magic 签名

  对于ext2和ext3文件系统来说,这个字段的值应该正好等于0xEF53。如果不等的话,那么这个硬盘分区上肯定不是一个正常的ext2或ext3文件系统。

2、s_log_block_size

   从这个字段,我们可以得出真正的block的大小。我们把真正block的大小记作B,B=1 << s_log_block_size + 10),单位是bytes。举例来说,如果这个字段是0,那么block的大小就是 1024bytes,这正好就是最小的block大小;如果这个字段是2,那么block大小就是4096 bytes。从这里我们就得到了block的大小这一非常重要的数据。

3、s_blocks_count和s_blocks_per_group

  通过这两个成员,我们可以得到硬盘分区上一共有多少个block group,或者说一共有多少个group descriptors

  s_blocks_count记录了硬盘分区上的block的总数,而 s_blocks_per_group记录了每个group中有多少个block。显然,文件系统上的block groups数量,我们把它记作G,G=(s_blocks_count-s_first_data_block- 1)/s_blocks_per_group+1。为什么要减去s_first_data_block,因为s_blocks_count是硬盘分区上全 部的block的数量,而在s_first_data_block之前的block是不归block group管的,所以当然要减去。最后为什么又要加一,这是因为尾巴上可能多出来一些block,这些block我们要把它划在一个相对较小的group 里面。

4、s_inodes_per_group

  s_inodes_per_group记载了每个block group中有多少个inode。在从已知的inode号,读取这个inode数据的过程中,s_inodes_per_group起到了至关重要的作用。

  用我们得到的inode号数除以s_inodes_per_group,我们就知道了我们要的 这个inode是在哪一个block group里面,这个除法的余数也告诉我们,我们要的这个inode是这个block group里面的第几个inode;然后,我们可以先找到这个block group的group descriptor,从这个descriptor,我们找到这个group的inode table,再从inode table找到我们要的第几个 inode,再以后,我们就可以开始读取inode中的用户数据了。这个公式是这样的:

  block_group = (ino - 1) / s_inodes_per_group。这里ino就是我们的inode号数

  offset = (ino - 1) % s_inodes_per_group,这个offset就指出了我们要的inode是这个block group里面的第几个inode。

原文地址:https://www.cnblogs.com/654321cc/p/9261136.html

时间: 2024-08-10 16:00:33

Linux下对superblock的理解的相关文章

Linux下对于inode的理解

0x01 什么是inode 文件存储在硬盘上,硬盘的最小存储单位叫做“扇区”(Sector),每个扇区储存512字节: 操作系统读取硬盘时,不会一个个扇区地读取,这样效率低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block).这种由扇区组成的块是文件存储的最小单位,块的大小,最常见的是4kb,即连续8个Sector组成一个Block: 文件数据存储在块中,显然,还必须找一个地方存储文件的元信息,比如文件的创建者,文件的创建日期,文件的大小等.这种存储文件元信息的区域就叫做

linux下logrotate 配置和理解

对于Linux 的系统安全来说,日志文件是极其重要的工具.系统管理员可以使用logrotate 程序用来管理系统中的最新的事件,对于Linux 的系统安全来说,日志文件是极其重要的工具.系统管理员可以使用logrotate 程序用来管理系统中的最新的事件.logrotate 还可以用来备份日志文件,本篇将通过以下几部分来介绍 日志文件的管理:1.logrotate 配置2.缺省配置 logrotate3.使用include 选项读取其他配置文件4.使用include 选项覆盖缺省配置5.为指定的

Linux下线程池的理解与简单实现

首先,线程池是什么?顾名思义,就是把一堆开辟好的线程放在一个池子里统一管理,就是一个线程池. 其次,为什么要用线程池,难道来一个请求给它申请一个线程,请求处理完了释放线程不行么?也行,但是如果创建线程和销毁线程的时间比线程处理请求的时间长,而且请求很多的情况下,我们的CPU资源都浪费在了创建和销毁线程上了,所以这种方法的效率比较低,于是,我们可以将若干已经创建完成的线程放在一起统一管理,如果来了一个请求,我们从线程池中取出一个线程来处理,处理完了放回池内等待下一个任务,线程池的好处是避免了繁琐的

对于linux下system()函数的深度理解(整理)

对于linux下system()函数的深度理解(整理) (2013-02-07 08:58:54) 这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数中调用的命令也都一切正常.就没理这个bug,以为是其他的代码影响到这个,或是内核驱动文件系统什么的异常导致,昨天有出现了这个问题,就随手百了一下度,问题出现了,很多人都说system()函数要慎用要少用要能不用则不用,system()函数不稳定?

Linux下为何都是文件的理解

所谓“文件”,就是在我们的电脑中,以实现某种功能.或某个软件的部分功能为目的而定义的一个单位. Linux都是以文件的形式存在,当我们访问某个文件(Linux中的文件有目录,连接,普通文本),由于Linux的文件的类型 而区分:如连接文件等,那使用这个文件时,那么就是调用了某个命令: 如普通文本文件时,那么当使用这个文件时,那就是访问该文件的内容 由于文件的类型的不同,从而区别于window系统下的应用:如播放器,EditPlus,浏览器,文件夹等,这些在Linux中都有 对于的不同类型的文件!

从汇编角度来理解linux下多层函数调用堆栈执行状态

注:在linux下开发经常使用的辅助小工具: readelf .hexdump.od.objdump.nm.telnet.nc 等,详细能够man一下. 我们用以下的C代码来研究函数调用的过程. C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int bar(int c, int d) { int e = c + d; return e; } int foo(int a, int b) { return bar(a, b); } int main(

深入理解MongoDB(一)Linux下配置MongoDB全攻略

一 MongoDB简介 MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值存储方式,Mongo使用C++开发.Mongo的官方网站地址是:http://www.mongodb.org/,读者可以在此获得更详细的信息. 特点: 它的特点是高性能.易部署.易使用,存储数据非常方便.主要功能特性有: 面向集合存储,易存储对象类型的数据. 模式自由. 支持动态查询. 支持完全索引,包含内部对象. 支持查询.

对Linux 虚拟内存和物理内存的理解以及Linux下怎样增加虚拟内存

首先,让我们看下linux虚拟内存: 第一层理解 1.         每个进程都有自己独立的4G内存空间,各个进程的内存空间具有类似的结构 2.       一个新进程建立的时候,将会建立起自己的内存空间,此进程的数据,代码等从磁盘拷贝到自己的进程空间,哪些数据在哪里,都由进程控制表中的task_struct记录,task_struct中记录中一条链表,记录中内存空间的分配情况,哪些地址有数据,哪些地址无数据,哪些可读,哪些可写,都可以通过这个链表记录 3.       每个进程已经分配的内存

从Docker在Linux和Windows下的区别简单理解Docker的层次结构

上篇文章我们成功在Windows下安装了Docker,输出了一个简单的Hello World程序.本文中我们将利用Docker已有的云端镜像training/webapp来发布一个简单Python的Web程序,在浏览器中输出hello world. 本文内容的测试环境是Windows7下的Docker,用例基于官方文档用例.   一:从运行一个简单的Python Web程序说起 启动Docker客户端并登陆.在客户端中输入以下内容: $ sudo docker run -d -P trainin