数据存放在磁盘中,磁盘最小存取单位sector(512Byte);文件系统中存储的最小单位是 块(Block),大小通常(1KB,2KB,4KB...),

一个block对应多个sector,因而可用block逻辑上 分割 物理磁盘。

通常文件除了 其内部数据外,还有一些属性需要记录。如 权限,大小等, 即 metadata,

将metadata存放在一个叫 inode 中,而数据data则放在block中,(当然 ,inode本身也是存放在块中),于是一个文件对应了一个inode,现在将inode与block关联起来。

1,索引式,inode存放所有block的索引

2, 链接式 ,  inode存放首个block,然后每个block指向其下一个

至于目录,与普通文件相同,只是目录的内容是目录项,它应包含 该目录所有文件(含目录)名,及其inode的索引,方便我们能找到对应文件。

此外,为了对Block和inode进行管理,分配。还有个bitmap位图用与标识一个Block有无被使用.


Ext2文件系统

ext2文件系统结构如图:

说明:(此信息从外部复制引用,用背景色标注...以上图片也是拷贝的)

一、超级块(Super block):
 描述整个分区的文件系统信息。
1、block与inode总量;
2、未使用与已使用的inode、block数量;
3、block与inode的大小; inode为128 Byte, block 大小格式化时指定
4、文件系统的挂载时间、最近一次写入数据的时间,最近一次检验磁盘的时间等文件系统的相关信息;
5、一个validbit数值,若此文件系统已挂载,则validbit为0,若未挂载,则validbit为1;

一般来说, superblock 的大小为 1024bytes。相关的 superblock 信息我们可以dumpe2fs 命令来呼叫出来观察!

超级块在每个块组的开头都有一份拷贝。事实上除了第一个 block group 内会含有 superblock 之外,后续的 block group 不一定含有 superblock ,

而若含则是第一个 block group 内 superblock 的备份,这样可以进行 superblock 的救援!

二、组描述符表(GDT,Group Descriptor Table):

由很多块组描述符组成,整个分区分成多少个块组就对应有多少个块组描述符。每个块组描述符(Group Descriptor)存储一个块组的描述信息,例如在这个块组中从哪里开始是inode表,从哪里开始是数据块,空闲的inode和数据块还有多少个等等。和超级块类似,块组描述符表在每个块组的开头也都有一份拷贝,这些信息是非常重要的,一旦超级块意外损坏就会丢失整个分区的数据,一旦块组描述符意外损坏就会丢失整个块组的数据,因此它们都有多份拷贝。通常内核只用到第0个块组中的拷贝,当执行e2fsck检查文件系统一致性时,第0个块组中的超级块和块组描述符表就会拷贝到其它块组,这样当第0个块组的开头意外损坏时就可以用其它拷贝来恢复,从而减少损失。

三、位图 (bitmap) :

其中每个bit表示一个inode/Block是否空闲可用。

测试及思考:

mke2fs时通过 -b 指定blocksize,从而得到 block count.

通常用 -i 来得到 inode count ,其参数 字节/inode,就是每?字节一个inode,通常设为block size 倍数.

(说明: B→block size,Gnum→group count,Bnum→block count,Inum→inode count)

1).因为每个group中用一个B来表示位图,所以一个group中最多8*B个数据块,因而ext2的group分配策略是:每个group大小为8*B (单位:块),

那么 gnum=bnum/8*B,每个组的inode count=inum/gnum,从而得出 inode表占用block的数量

现在需确定 GDT占用 block数,剩下的则都是用于数据块了。而根据dumpe2fs显示结果看,GDT也是固定的,还有 保留的GDT块。这不理解怎么分配的。

另外,只有前两个group有超级块和GDT....

因而每个组中各个数据的偏移位置也就能确定了。从而能根据给定一个 inode idx或 data idx找到其对应group的对应block !!(即找到读写位置)

2).我测试时用dumpe2fs 显示的inode size总是256,而不是128,建的也是ext2,不知道为什么.

而first inode总是11,(刚格式化未建立任何文件).

我能理解的是,为了能正常访问FS中的数据,我需要预先创建一个/根目录,之后的所有新建的文件都在这其下。

也就是标记一个BLOCK作为入口,那么刚格式化时占用一个inode我能理解,为何11个?还需要作什么?

3).inode table中,每个inode size 为128字节,其中 最后60字节用于索引 数据块,15个(12直接,一次,一级,二级……)每个4字节用于指定 block id.

4字节 unsigned 32,可标识 232 =4*G个block,也就是说最多能用于 4*G*B个字节的FS,而ext2有相应的最大系统总容量限制,都没有超过这个。

4)目录在文件系统中具体如何存储?

存储的应是 文件名+inode id,

文件名linux限制最长255,应该是用NUL作结束标志,占256字节。那么inode id用多长来标识?

若定长,则一个块只能放几个目录,测试了下,很明显不是。

所以 ,若不定长,用NUL标识文件名结束,再加一个定长Id,但这样的话,不能……

突然又意识到 ,在磁盘中读取目录内容不正是要读出所有 么。所以递归遍历刚好!!

那么 inode用多长来标识?首先inode count必然小于 block count,所以,还是用4字节标识把,应该...

5). 读取文件系统时,需要先 从入口 /进入,查看其内容,得到子目录列表,然后依次 往下……

直到遍历到所需为止。e.g.如果我要打开文件系统某个文件,我得从根目录开始依次读取下去,直到找到该文件inode,然后再打开。。

这涉及多次读取磁盘,如果目录深度够深,结果 可想....

我之所以会如此思考,是因为,文件系统应独立于OS!

所幸,Linux有其目录系统。从/开始。每个目录或文件,绑定了 inode,先跳转下思路,

当我挂载某个文件系统时,此时,就会遍历该FS整个目录结构,并记录下。续接到其挂载目录之下。

其中包含文件名和inode,因为inode只能用与其本身的文件系统,所以目录树还应包含挂载到目录上的FS,子目录默认继承父目录。

这样我们指定一个path时就能通过目录树,快速找到其所在文件系统,以及inode,从而进行读写.

我想,这也是linux需要 挂载的理由 把------为了生成目录树,(根目录/也有挂载的分区的),方便读写。

顺便一提,ls命令中的文件类型我猜测也是保存于目录树上的。

Linux ext2文件系统之初步思考的更多相关文章

  1. linux ext2 文件系统学习

    Linux  ext2文件系统理解 硬盘组成: 硬盘由多个圆形硬盘片组成.按照硬盘片能够容纳的数据量分为单盘和多盘.硬盘的数据读取主要靠机械手臂上的磁头,在机械手臂上有多个磁头.机械手臂不动硬盘旋转一 ...

  2. Linux ext2文件系统

    Linux最传统的磁盘文件系统(filesystem)使用的是ext2 1.ext2文件系统结构ext2文件系统划分为多个块组,每个块组拥有独立的inode/block,一个文件系统只有一个Super ...

  3. Linux EXT2 文件系统

    磁盘是用来储文件的,但是必须先把磁盘格式化为某种格式的文件系统,才能存储文件.文件系统的目的就是组织和管理磁盘中的文件.在 Linux 系统中,最长见的是 ext2 系列的文件系统.其早期版本为 ex ...

  4. Linux 下EXT2文件系统 —— 如何将蚂蚁和大象优雅的装进冰箱里

    这一阵子真是偷懒,无时无刻不和自己身体中的懒癌做斗争.最终我还是被打败了,星期天两天几乎都是荒废过去的,在空闲的时候实际上我内心也是有点焦虑的,不知道去怎么度过这时间.学习吧又不想学习,看电视娱乐吧也 ...

  5. Linux ext2/ext3文件系统详解

    转载: Linux ext2/ext3文件系统使用索引节点来记录文件信息,作用像windows的文件分配表.索引节点是一个结构,它包含了一个文件的长度.创建及修改时间.权限.所属关系.磁盘中的位置等信 ...

  6. 文件系统的特性,linux的EXT2文件系统【转】

    本文转载自:https://blog.csdn.net/tongyijia/article/details/52809281 先来提出三个概念: - superblock - inode - bloc ...

  7. Linux中ext2文件系统的结构

    1.ext2产生的历史 最早的Linux内核是从MINIX系统过渡发展而来的.Linux最早的文件系统就是MINIX文件系统.MINIX文件系统几乎到处都是bug,采用的是16bit偏移量,最大容量为 ...

  8. Linux磁盘管理——Ext2文件系统

    前言 通常而言,对于一块新磁盘我们不是直接使用,而是先分区,分区完毕后格式化,格式化后OS才能使用这个文件系统.分区可能会涉及到MBR和GPT问题.至于格式化和文件系统又有什么关系? 这里的格式化指的 ...

  9. Linux 文件系统及 ext2 文件系统

      linux 支持的文件系统类型 Ext2:     有点像 UNIX 文件系统.有 blocks,inodes,directories 的概念. Ext3:     Ext2 的加强版,添加了日志 ...

随机推荐

  1. windows访问控制列表 --ACL(Access Control List)

    1.定义 ACL是一个windows中的表示用户(组)权限的列表. Access Control List(ACL) Access Control Entry(ACE) ... 2.分类 ACL分为两 ...

  2. 使用Dapper操作Mysql数据库

    首先我想说明一下:相比最原始的ADO.NET,一般都认为封装过一层的ORM性能上会有损耗,但其实在使用中你会发现,当你需要把数据库对象转化为实体模型时,很多所谓的DbHelper其实封装的很低效,反而 ...

  3. NPOI导出WPF DataGrid控件显示数据

    最近做个项目,需要导出DataGrid显示的数据,中间遇到了不少的坑,在此纪录一下,方便以后查看,也希望能给用到的人,一点帮助. 导出DataGrid显示的数据,并不是导出DataGrid的Items ...

  4. Bootstrap文本排版基础--Bootsrap

    1.排版前的基础 (1)移动设备优先 <meta name="viewport" content="width=device-width, initial-scal ...

  5. 阿里巴巴Java规约插件试用

    阿里Java开发规约Eclipse插件介绍 阿里巴巴集团配合<阿里巴巴Java开发手册>PDF终极版开发的IDE插件,目前包括IDEA插件.Eclipse插件. 安装 检查环境 插件要求: ...

  6. OpenSCAD 建模:相框

    下载地址:https://github.com/ZhangGaoxing/openscad-models/tree/master/PhotoFrame 代码: module bottom(){ dif ...

  7. IO 调优

    磁盘优化 1.增加缓存 2.优化磁盘的管理系统 3.设计合理的磁盘存储数据块 4.应用合理的RAID策略 TCP网络参数调优 网络IO优化 1.减少网络交互次数 2.减少网络传输数据量的大小 3.尽量 ...

  8. Java基础总结--多线程总结2

    ----多线程通信-----1.概述:多个线程处理同一个资源,但是各自的任务不相同eg:线程1负责存储数据,线程2负责处理该数据.数据--就是同一个资源怎样用java语言描述上面的例子:* 资源是变化 ...

  9. PhiloGL学习(4)——三维对象、加载皮肤

    前言 上一篇文章中介绍了如何响应鼠标和键盘事件,本文介绍如何加载三维对象并实现给三维对象添加一个漂亮的皮肤. 一. 原理分析 我对三维的理解为:所谓三维对象无非是多个二维对象拼接到一起,贴图就更简单了 ...

  10. Python2.7 中文字符编码 & Pycharm utf-8设置、Unicode与utf-8的区别

    Python2.7 中文字符编码 & Pycharm utf-8设置.Unicode与utf-8的区别 zoerywzhou@163.com http://www.cnblogs.com/sw ...