您好,登录后才能下订单哦!
ext3文件系统基础知识点有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
文件系统的构成
引导块:存储引导代码
超级块:单块大小/总块数;每组块数;i节点数/每组i节点数;卷名;最后写入时间/挂载时间/挂载路径;空闲i节点/块信息(分配新i节点/块时使用)
组描述符表:每个32字节,描述每组块位图/i节点位图/i节点表起始块号,块组中空闲块数和目录数;文件系统中所有块被等分为若干块组,最后一个可能略小;
块位图:占有1个数据块
I节点位图:占用1个数据块,通常用不完
I节点表:存放inode,ext3下每个128字节,包含12个直接块指针/1个1级间接快指针/1个2级间接块指针/1个3级块指针
数据区:存放文件数据
对于具备稀疏超级块特性的文件系统,只在组号为3/5/7的幂的块组备份超级块和块组描述符,否则每个块组都有备份;
目录
目录也是文件的一种,除了inode,每个目录至少占有1个数据块,以目录项的形式存储其下的文件列表;
存储内容包括:文件名的ASCII码/名字长度/本目录项长度/i节点号/文件类型
目录项长度=max((8字节固定+文件名), 4*n),对于文件file.txt,其长度为16;
硬连接:本质上为指向同一inode的不同目录项而已
--假定每个块组的inode数量为2008
创建文件
在/dir1下建立file.txt文件,大致步骤:
1 读取超级块(固定位置),获取文件系统基本信息(块大小/每组inode数量);读取组描述符表(固定位置),获知各个块组布局情况;
2 读取根目录,从其目录项中找到dir1以及其inode
—其inode为2号(固定,位于0号块组),而inode表开始于5号块,读取5号块访问第2个inode,其块指针显示根目录的目录块号为256;
--读取256号块,遍历其目录项,直至找到dir1的目录项,显示其inode号为4724;更新根目录最后访问时间;
3 创建file.txt的目录项
--对dir1的inode号整除运算int(4724/2008)确定其位于2号块组,其余数708为该inode表项号,依据2号组描述符表项获知其i节点表起始于16387块,
--读取该块, 获取其708号表项,显示 dir1目录块号为17216
--读取17216块查找空闲空间,新建文件file.txt名字长度7字符,需要16字节空间
--创建好目录项,更新该目录的最后修改时间和最后改变时间,并其改变情况记录入日志
4 创建inode
--优先在父目录同一块组创建,即2号组
--读取2号块组位于16386块的i节点位图,获知尚未分配的i节点号4850,将其对应bit置1,并将超级块/组描述符表中空闲inode数减1
--将该inode地址添加到上一步创建的目录项中
--初始化4850号inode
5 分配数据块
File.txt需要6个数据块,查看2号块组的块位图,在本块组中找出6个空闲块并将相应bit置1,将这些块分配到4850号inode的直接块指针中
更新超级块/组描述符中的空闲块数,更新inode的最后修改时间和改变时间
6 写数据
将file.txt内容写入新分配的块中
删除文件
1 读取超级块 & 组描述符表
2 获取dir1的inode
--根目录inode号为2(位于0号块组),i节点表起始于第5块(组描述符表),从第5号块读取i节点表并访问第2个表项
--从inode的直接块指针获知根目录的目录块为256号块
--读取256号块,遍历目录项直至找到dir1记录,其i节点号为4724
--更新根目录最后访问时间
3 获取file.txt的inode,回收目录项
--dir1的i节点号为4724,取整运算int(4724/2008)=2,位于2号块组,而2号组的i节点描述符起始于16387号块(组描述符表)
--取余运算(4724%2008)=708,则从16387块开始读取第708项inode,inode显示dir1目录块号为17216
--读取17216号块遍历目录项,直至找到file.txt匹配项,获取其i节点号为4850
--取消该目录项,其前一项的长度值直接指向其下一项开始处
4 回收file.txt的数据块,
--从2号组的i节点表获取4850号i节点项,将链接数减1,若链接数为0则回收该inode(相应bit置0)
--对应的6个块的块位图bit置0
注:具体请参考马林编著的《数据重现》
常见问题:
1 为何df显示磁盘满但du却显示有空闲空间?
删除文件时有进程正在打开,所以实际占有空间并未释放;
删除或truncate一个inode时,先将该inode添加到orphan inode单向链表头,super block结构有相应字段s_last_orphan指向此链表;
如果执行期间系统崩溃,则下次加载该文件系统时会检查该链表并继续删除或truncate操作;
以下是ext4删除inode的正常过程
-->do_unlinkat
-->vfs_unlink
-->ext4_unlink
-->ext4_delete_entry从该文件所在目录中删除该文件
-->ext4_orphan_add
-->iput
-->iput_final
-->generic_drop_inode
-->generic_delete_inode(inode);
-->ext4_delete_inode
-->ext4_truncate清除磁盘上的索引信息
-->ext4_orphan_del
-->ext4_free_inode从内存中和磁盘上分别删除该inode
http://blogimg.chinaunix.net/blog/upfile2/101008204403.pdf
ext3采用间接块映射,当文件较大时则映射表开销会很高,删除文件时会将inode中的块指针清空;
Ext4引入extent,减少了元数据块的数量,unlink/truncate的开销会下降不少,每个extent结构体12字节,每个inode最多可存放4个;
大部分文件只需一些extent来描述logical-to-physical块映射,然而对于稀疏或碎片化十分严重的文件,extent map效率则没那么高;
对此需借助于ext4改进的块分配器,尽量将小文件紧邻存放同时为大文件分配连续区域;
http://ols.fedoraproject.org/OLS/Reprints-2008/kumar-reprint.pdf
2 如何分配数据块/inode/目录项
分配块
优先在其inode所属块组分配,
分配inode
文件:优先在其父目录所在组创建;目录:优先在空余空间较多的组创建
分配目录项
从前向后遍历该目录的目录项,对每个目录项,依据文件名长度计算其改目录项所需长度,并将其同实际长度值比较,如果不一致则说明要么为最后一项,要么跨越了若干被删除的目录项,则尝试在此处分配新目录项;如当前块没有足够空间,则挂起文件名并分配新块,linux不允许目录项跨越块;
看完上述内容,你们掌握ext3文件系统基础知识点有哪些的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。