ext2/3文件系统存储,查找,新建,删除文件机制详解

来源:互联网 发布:thinkphp socket编程 编辑:程序博客网 时间:2024/05/16 04:54

ext2文件系统分为两个区域:元数据区和数据区



         元数据区包含索引节点区index node,索引位图区inode bitmap,块位图区block bitmap,分别存储:

         index node:存储文件的inode节点信息,并指向相应节点块所处的位置,以及文件的访问信息(包括accesss,modefy,change时间戳等),可以用stat 文件名来查看相关信息。

         inode bitmap:存储inode 节点是否被使用的信息,每个inode位占用1位,inode位为0表示该inode未被使用,inode位为1表示该inode已被使用。

         block bitmap :存储block块是否被使用的信息,每个block位占用1位,block数据块位为0表示该数据块未存储数据,否则该数据块已存储数据。

 

         数据区包含目录和文件,分别存储:

         目录存储当前目录下文件/一级子目录的名称(右)和对应的inode号(左),模型如下:


       文件:存储文件包含的数据,但不包含文件名,时间戳等信息。

 

         在新建文件系统时应注意

          (1)适当指定块大小,以防文件多次存储过程中造成空间碎片化导致空间严重浪费的情况;当系统主要用于存储大文件时,可以增大块大小,减少存取频率,加快存取速度;当主要用于存储小文件时,尽量减小块大小,较少磁盘碎片化现象,提高磁盘空间利用率。

          (2)Inode数和block数应该保持1:1的对应关系,这样才能保证有足够的inode节点记录block块存储位置,同时又不至于过多的inode节点数造成空间的浪费;

          (3)创建文件系统指定了Inode节点数和Block块大小和Block块数后,系统会自动为inode位图和block位图分配空间,用来实现inode索引节点和block数据块的使用情况的监控;

        

基于ext2文件系统的文件查找

         /跟路径可以自动寻址,找到相应的inode节点;

         例:寻找/var/log/message文件

         先寻址根目录,假设根目录inode号为1,在数据区1号块下寻找var目录,对应节点为90,回到inode索引区,找到var目录(90号)对应的inode节点号97:




到数据区97号block块下寻找log目录,对应节点为105,回到索引区,找到log目录(105号)对应的inode节点号133:



到数据区133号block块下寻找message文件,对应节点为138,回到索引区,找到message文件(138号)对应的inode节点号155:



通过inode索引找到message文件存储的位置155号block块:


基于ext2文件系统的文件新建:

 例:新建文件/tmp/myFile.txt

  搜索inode位图表,定位到值为0的位,找到并标记inode节点索引区对应的节点号121,以及数据区块号157



先寻址根目录,假设根目录inode号为1,在数据区1号块下寻找tmp目录,对应节点为56,回到inode索引区,找到tmp目录(56号)对应的inode节点号78:



到数据区78号block块下新建文件名myFile.txt,对应节点号为121,回到索引区,找到myFile.txt文件(121号)对应的块号157号:


假设每个数据块4k,myFile.txt文件大小为20k.在数据区为该文件分配5个block块:157—161号block块,并将数据写入block块中。与此同时,将inode 位图表中相应bit位置为1。




基于ext2文件系统的文件删除:

例:删除/etc/initrd文件

1)根据ext2文件系统寻址方式找到initrd文件;

2)将相应inode位图表中对应该Inode节点的bit位置为0即可。



:这种情况下,block块中的数据在下次新的数据填充进来之前不会被清楚掉,依然保存在block数据块中。只是inode位图表相应bit位被置为0。这种删除文件的方式加快了删除文件的效率,新文件创建时,直接向相应的block块中填充数据,就会覆盖掉原有的数据。





0 0
原创粉丝点击