LINUX 的EXT2文件系统的组织方式

LINUX 的EXT2文件系统学习理解

文件系统的构架非常复杂,在学习中使用了EXT2进行分析和学习,EXT3,EXT4虽然有改进但是基本原理一致
结合学习的东西必须记录一下。

磁盘的块分布情况,默认的我们的一个块是4K,在磁盘中块被划分成成组的形式。记为GROUP 0-GROUP N。
使用dumpe2fs 命令可以看到block group的使用情况。

块的组织方式:

磁盘第一个块:启动块 (boot block)
组0:(假设I个块)
组第一个块:超级块 (SUPER BLOCK)
组第二到第N个块:块组描述符表(GDT)
组第N+1个块:块位图块(block bit map)
组第N+2个块:Inode 位图块(Inode bit map block)
组第N+3到M个块:Inode 表块 (Inode table block)
组第M+1个块到I个块:data block 

组1:也是如组0进行组织
组2:也是如组0进行组织
....
组N:也是如组0进行组织

接下来我们进行每个块的分开讨论:
1、启动块 (boot block):这是一个磁盘只有一个的块用来记录磁盘的分区和启动信息,这是不归入文件系统的一个块
2、超级块 (SUPER BLOCK):
描述整个分区的文件系统信息,例如块大小、文件系统版本号、上次mount的时间等等。超级块在每个块组的开头都有一份拷贝。
3、块组描述符表(GDT):每个块组描述符(Group Descriptor)存储一个
块组的描述信息,例如在这个块组中从哪里开始是inode表,从哪里开始是数据块,空闲的
inode和数据块还有多少个等等。和超级块类似,块组描述符表在每个块组的开头也都有一
份拷贝,这些信息是非常重要的,一旦超级块意外损坏就会丢失整个分区的数据,一旦块组
描述符意外损坏就会丢失整个块组的数据,因此它们都有多份拷贝
4、块位图块(block bit map):
这里面的一位表示了块是否可用,没有使用记为0,使用了标记为1,考虑到这里ORACLE 11G的
一个数据文件的前128个块也是用于这个作用,而这里如果一个块为4K,那么一个块一共有
4096*8=32768个bit位,那么也就算出来一个组的最大大小为 32768*4096。使用dumpe2fs /sda1
也能有这样的显示:
Block size:               4096  
Blocks per group:         32768 
5、Inode 位图块(Inode bit map block):
同样为Inode的使用情况,没有使用记为0,使用了标记为1,同样也是占用一个块。如果通过计算发现
4096*8=32768个位是用不完的。见后面INODE分析
6、Inode 表块 (Inode table block)
每个文件都有一个Inode,而这些Inode记录实际是记录在Inode表中的,形成一行一行的Inode记录
Inode用于记录文件的基本信息,而不是文件真正的数据信息,如下:
root@bogon:~# stat log.log
  File: ‘log.log’
  Size: 35848           Blocks: 72         IO Block: 4096   regular file
Device: 801h/2049d      Inode: 1332077     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-01-17 21:31:00.359863946 +0800
Modify: 2016-01-17 21:30:56.995864067 +0800
Change: 2016-01-17 21:30:56.995864067 +0800
Birth: -
可以看到这里信息非常多,
例如文件类型(常规、目录、符号链接等),权限,文件大小,创建/修改/访
问时间等 ,这其实在内核中是一个数据结构。
 23 struct stat {
 24     unsigned long   st_dev;     /* Device.  */
 25     unsigned long   st_ino;     /* File serial number.  */
 26     unsigned int    st_mode;    /* File mode.  */
 27     unsigned int    st_nlink;   /* Link count.  */
 28     unsigned int    st_uid;     /* User ID of the file's owner.  */
 29     unsigned int    st_gid;     /* Group ID of the file's group. */
 30     unsigned long   st_rdev;    /* Device number, if device.  */
 31     unsigned long   __pad1;
 32     long        st_size;    /* Size of file, in bytes.  */
 33     int     st_blksize; /* Optimal block size for I/O.  */
 34     int     __pad2;
 35     long        st_blocks;  /* Number 512-byte blocks allocated. */
 36     long        st_atime;   /* Time of last access.  */
 37     unsigned long   st_atime_nsec;
 38     long        st_mtime;   /* Time of last modification.  */
 39     unsigned long   st_mtime_nsec;
 40     long        st_ctime;   /* Time of last status change.  */
 41     unsigned long   st_ctime_nsec;
 42     unsigned int    __unused4;
 43     unsigned int    __unused5;
 44 };

除了记录这些结构数据,剩下就是指向数据块的指针一个指针为4BYTES,每个文件的inode的索引项一共有15 个,
从 Blocks[0] 到Blocks[14],0-11个块指针可以直接指向数据块,叫做直接寻址,而第12个块指针指向的实际是一个新的指针
块,那么如果一个块为4K那么这个块又可以指向4096/4=1024个块,这叫一级寻址这样一级寻址能够建立的最大文件
为11*4+1024*4 这样就上MB了,如果这样还不够还有 13 指针还可以使用二级寻址,甚至还有14号指针使用三级寻址,
如果启用三级寻址那么最大文件大小是:11*4+1024*4+1024*4096/4+1024*4096/4*4096/4=44+4096+1048576+1073741824=1074794540 个块
如果算上4K 1074794540*4/1024/1024~4T。

在格式化的时候INODE就进行了分配,那么一个GROUP到底分配多少个INODE合适呢,LINUX用一个小文件来
默认的操作系统认为一个文件为8K,那么如果一个group有多少个8K就分配多少个INODE,
这样算下:
32768*4/8=16384 个Inode
查看

Inodes per group:         16384 
Inode blocks per group:   512

但是我查看新的Ubuntu 14.04.3 中这个改变了
Inodes per group:         8192
Inode blocks per group:   512

那么我们很容易的算出 这个他认为文件为16K,那么也就是说,如果大量的文件小于16K那么会出现 Inode耗尽的情况,
如果是以前是如果大量的文件小于8k。

理论上rm 一个文件只是将他的block bit map,inode bit map进行反转为0同时可能的释放指针指向的数据块,实际数据并没有真正删除,所以删除非常快,这个和数据库中的DROP有一样的原理。

除此以外我们需要理解我们的目录
目录实际上也是一个需要一个inode的文件,而初始Inode指向一个数据库为4096,同样他的各种信息
如例如文件类型(常规、目录、符号链接等),权限,文件大小,创建/修改/访
问时间等 
如下:
  Size: 4096            Blocks: 8          IO Block: 4096   directory
Device: 801h/2049d      Inode: 1330599     Links: 2
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-01-19 12:19:56.896204445 +0800
Modify: 2016-01-16 13:56:06.586658881 +0800
Change: 2016-01-16 13:56:06.586658881 +0800

而在这个数据块中存放着关于文件的记录
包含文件名、Inode、记录长度、文件类型,文件名实际数存在目录的记录中的,而他又包含了Inode。

大家都知道在文件系统中都有一个/ 根目录,这个/ 目录的Inode固定而2,这样我们就能找到/目录的数据块,然后就能
进行依次定位了,比如我们方位/home/oracle/log.log文件那么找到log.log文件的次序如下:
1、先找到inode 2,然后通过 Inode 2的数据指针找到/根目录的数据块。
2、在根目录的数据块中寻找到home目录在 /目录数据块中的记录项,其中包含了
   文件名、Inode、记录长度、文件类型
   那么文件名就是HOME ,Inode指向的数据块就是Home目录实际的数据块
3、找到Home目录的数据块,定位ORACLE目录在Home目录数据块的记录项,同样包含
   文件名、Inode、记录长度、文件类型
    那么文件名就是oracle Inode指向的数据块就是oralce目录实际的数据块
4、在ORACLE目录的数据块中找到LOG.LOG的记录项目,同样为
   文件名、Inode、记录长度、文件类型
   文件名为LOG.LOG Inode指向的数据块就是log.log文件实际的数据块
 那么我们归纳一下
 /根目录的Inode 为2------》/根目录的数据块------》找到Home目录的记录项
 --------》通过Inode定位到HOME目录的数据块-----》找到ORACLE目录的记录项
 -------》根据Inode定位到ORACLE目录的数据块-----》找到LOG.LOG文件的记录项目
 ------》根据Inode定位到LOG.LOG的文件块
 如此数据就找到了Inode也找到了
 
 所以我们可以简单的认为目录越深,查找的代价越大

最后记录一下这几个时间
Access: 2016-01-24 19:57:38.228325273 +0800  访问时间
Modify: 2016-01-24 19:56:36.140325137 +0800  修改数据块时间
Change: 2016-01-25 04:56:58.941460486 +0800 修改Inode信息时间,换句话说比如修改了文件权限

时间: 2024-09-11 00:55:35

LINUX 的EXT2文件系统的组织方式的相关文章

Linux中ext2文件系统存储结构的个人理解

看了几天<深入理解linux内核>的ext2文件系统部分和VFS部分,稍微了解了点文件在内存中的存储结构,但是总是弄不清楚在硬盘上实际的存储方式,特别是文件夹的存储. 保存文件夹的结构很简单,没有这个文件夹下所有文件的索引,看了几遍书,都不能理解在硬盘上文件夹结构的存储,只能根据网上的例子自己跟着做实验.(过程参考了http://blog.chinaunix.net/u1/48373/showart_1210707.html的博客) 首先显示要分配一个空间,格式化为ext2分区,并在这个空间上

Linux的ext2/ext3文件系统知识

Linux最传统的磁盘文件系统(filesystem)使用的是ext2,所以要了解文件系统就得要由ext2开始. 一.文件系统特性 磁盘分区完毕后还需要进行格式化,之后操作系统才能够使用这个分区.这是因为每种操作系统所设置的文件属性/权限并不相同,为了存放这些文件所需的数据,因此就需要将分区进行格式化,以成为操作系统能够利用的文件系统格式.传统的磁盘与文件系统的应用中,一个分区誻只能够被格式化成为一个文件系统,所以我们可以说一个文件系统就是一个分区. 操作系统的文件数据除文件内容外,通常还有非常

Linux日志式文件系统面面观_unix linux

    文件系统是用来管理和组织保存在磁盘驱动器上的数据的系统软件,其实现了数据完整性的保 证,也就是保证写入磁盘的数据和随后读出的内容的一致性.除了保存以文件方式存储的数据以外,一个文件系统同样存储和管理关于文件和文件系统自身的一些重要信息(例如:日期时间.属主.访问权限.文件大小和存储位置等等).这些信息通常被称为元数据(metadata). 由于为了避免磁盘访问瓶颈效应,一般文件系统大都以异步方式工作,因此如果磁盘操作被突然中断可能导致数据被丢失.例如如果出现这种情况:如果当你处理一个在l

Linux下Ext2与Ext3文件系统的区别

Linux下的Ext2文件系统,是 GNU/Linux 系统中标准的文件系统,其特点为存取文件的性能极好,对于中小型的文件更显示出优势,这主要得利于其簇快取层的优良设计. 其单一文件大小与文件系统本身的容量上限与文件系统本身的簇大小有关,在一般常见的 x86 电脑系统中,簇最大为 4KB, 则单一文件大小上限为 2048GB, 而文件系统的容量上限为 16384GB. 但由于目前核心 2.4 所能使用的单一分割区最大只有 2048GB,实际上能使用的文件系统容量最多也只有 2048GB. 至于E

Ext2 文件系统的硬盘布局_unix linux

本文主要讲述 Linux 上比较流行的 ext2 文件系统在硬盘分区上的详细布局情况.Ext2 文件系统加上日志支持的下一个版本是 ext3 文件系统,它和 ext2 文件系统在硬盘布局上是一样的,其差别仅仅是 ext3 文件系统在硬盘上多出了一个特殊的 ino de(可以理解为一个特殊文件),用来记录文件系统的日志,也即所谓的 journal.由于本文并不讨论日志文件,所以本文的内容对于 ext2 和 ext3 都是适用的. 1.前言 本文的资料来源是 Linux 内核中 ext3 文件系统的

Linux的EXT4 文件系统的历史、特性以及最佳实践

让我们大概地从 EXT4 的历史.特性以及最佳实践这几个方面来学习它和之前的几代 EXT 文件系统有何不同. 在之前关于 Linux 文件系统的文章里,我写过一篇 Linux 文件系统介绍 和一些更高级的概念例如 一切都是文件.现在我想要更深入地了解 EXT 文件系统的特性的详细内容,但是首先让我们来回答一个问题,"什么样才算是一个文件系统 ?" 一个文件系统应该涵盖以下所有特点: 数据存储: 对于任何一个文件系统来说,一个最主要的功能就是能够被当作一个结构化的容器来存储和获取数据.

Linux下常见文件系统的对比

本文将对Linux下常见的几种文件系统进行对比,包括ext2.ext3.ext4.XFS和Btrfs,希望能帮助大家更好的选择合适的文件系统. 内容来自于网上找的资料以及自己的一些经验,能力有限,错误在所难免,仅供参考 历史 文件系统 创建者 创建时间 最开始支持的平台 ext2 Rémy Card 1993 Linux,Hurd XFS SGI 1994 IRIX, Linux, FreeBSD ext3 Dr. Stephen C. Tweedie 1999 Linux ZFS Sun 20

ext2文件系统存储结构(sina博客移入)

看了几天<深入理解linux内核>的ext2文件系统部分和VFS部分,稍微了解了点文件在内存中的存储结构,但是总是弄不清楚在硬盘上实际的存储方式,特别是文件夹的存储. 保存文件夹的结构很简单,没有这个文件夹下所有文件的索引,看了几遍书,都不能理解在硬盘上文件夹结构的存储,只能根据网上的例子自己跟着做实验.(过程参考了http://blog.chinaunix.net/u1/48373/showart_1210707.html的博客) 首先显示要分配一个空间,格式化为ext2分区,并在这个空间上

Linux集群文件系统简介和集群应用的新挑战

Linux集群文件系统简介 集群文件系统在多个方面完善了 Oracle RAC 的数据库集群功能.以下是它们的对比情况.   通常,集群只是一组作为单一系统运行的服务器(PC 或者工作站).但是,这个定义的外延不断显着扩大:集群技术现在不但是一个动态领域,而且其各种应用程序正不断吸收新的特性.此外,集群文件系统技术(无论是开放源代码的还是专有的)在其功能方面正在迅速趋同. 很多人谈到集群应用程序和其中所使用的文件系统软件时,就象它们完全是一回事似的.更准确地说,大多数集群包含两个主要组件:通过快