文件系统与目录树的关系

来源:互联网 发布:php bbs论坛源码 编辑:程序博客网 时间:2024/06/05 02:29

由Ext文件系统的知识点击打开链接可以知道,在Linux系统下,每个文件(不管是一般文件还是目录文件)都会占用一个inode,且可依据文件内容的大小来分配多个block给文件使用。目录文件的内容是记录文件名,而一般文件才是记录实际数据的地方。那么目录与文件构成的目录树在文件系统(在此以Ext系列文件系统为例进行讨论)中是如何记录数据的呢?

目录

在Linux下的Ext文件系统新建一个目录时,文件系统会分配一个inode与至少一块block给该目录。其中,inode记录该目录的相关权限与属性以及分配到的block号码,而block则记录在这个目录下的文件名与该文件名占用的inode号码数据。稍加思考就可以知道,目录文件的内容就是文件名,那么block作为文件系统中记录数据的逻辑块,就应该记录下目录文件的内容——文件名,为了实现目录树结构,还要存储文件名所分配到的inode号码才行。

如果想要实际查看目录内的文件所占用的inode号码时,可以使用“ls -i”来处理:


文件

在Linux下新建一个一般文件时,文件系统会分配一个inode与适当数量的block给该文件。需要注意的是Ext文件系统使用三级间接块来存储数据,所以可能会占用额外的block来存储实际数据的block号码。例如一个block为4KB,新建一个100KB的文件时,那么文件系统将分配1个inode和25个data block,由于inode只有12个block号码的直接存储区,所以要额外使用一个一级间接存储块。因此总共用到了1个inode和26个block共128B+104×1024=106624Byte的存储空间。

目录树读取

由前文可知inode本身并不记录文件名,文件名的记录是在目录的block中。那么Linux文件与权限一文中提到的新增/删除/重命名与目录的w权限有关的特点就可以由文件系统对目录的存储特点知道了。因为文件名是记录在目录的block中,因此当我们要读取某个文件时,就务必会经过目录的inode与block,也就必然要有目录的写权限,然后才能找到那个待读取文件的inode号码,最终才会读取到正确的文件的block内的数据。文件与权限的其他内容也可以由文件系统得到合理解释。

由于目录树是由根目录开始读起,因此系统通过挂载的信息可以找到挂载点的inode号码(通常一个文件系统的最顶层inode号码会由2号开始),此时就能够得到根目录的inode里面的内容,并依据该inode读取根目录的block内的文件名数据,再一层一层地往下读到正确的文件名。

文件系统大小与磁盘读取性能

关于文件系统的使用效率上,如果文件系统规划得很大时,由于硬盘上的数据是会经常变动的,所以,整个文件系统上面的文件通常无法连续写在一起,而是填入式地将数据填入没有被使用的block中。如果文件写入的block真的很分散,就会产生磁盘碎片而影响文件读取效率了。

如果文件系统太大,当一个文件分别记录在这个文件系统的最前面与最后面的block号码中,此时会造成硬盘的机械手臂移动幅度过大,也会造成数据读取性能低。而且磁头在搜寻整个文件系统时,也会花费较多时间。因此分区的规划要根据主机用途因地制宜,不是越大越好。



本文部分内容摘自《鸟哥的Linux私房菜 基础学习篇(第三版)》


原创粉丝点击