本章开始介绍UNIX文件系统。
文件系统是如何管理文件的呢?那咱们要先文件的存储介质开始--磁盘
磁盘是计算机系统的一个硬件设备,文件系统为了能够管理磁盘,对其进行了三层抽象(本文所有内容均指UNIX文件系统,windows文件系统有兴趣的同学自行研究!~)
第一层抽象:将一整块磁盘分区
第二层抽象:将磁盘分割为block
第三层抽象:将block 逻辑上划分为四个区域
第三个层次也就是咱们要研究的部分
Unix系统的分区如下:
引导块 | 超级块 | i节点表 | 文件存储区 |
(2)超级块:1号块,通常也成为管理块,是文件系统的第二块,也是文件系统的头,存放安装和管理文件系统的全部管理信息,包括文件系统大小、文件系统所在的设备区、i节点表大小、空闲空间大小、空闲链表头等。
(3)i节点表:由若干块构成的一片磁盘区域,i节点表在超级块中指明,一个i节点号对应一个文件,i节点相关内容如下:
mode | type | uid | gid | link.no | size | addr.pt | time |
占用标志,0:空,1:占用 | 文件类型 | 属主 | 属组 | 链接数 | 大小 | 指向文件实际数据块的指针 | 最近访问/修改日期时间 |
每个文件系统的属性,如大小,文件的所有者,最近修改时间等,都记录在I-节点的结构中,所有的I-节点都有相同的大小
(4)文件存储区:除了前三部分外,其余空间都是文件存储区,该区占了整个存储空间的绝大部分。
生命短暂,咱们还是通过实例来看
一、创建文件:文件系统是如何分配这三个区域的
运行一个cat spwd.c > test 如图:
创建的过程如下图
1、找到一个空i-节点存储文件属性
2、内核从free的数据block中找出能够存储文件大小的几个block,存储数据图中是找出A,B,C三块
3、将A,B,Cblock记录到第40个block i节点上(i-节点,一共能存储13个block,仅仅能存储10个数据block,后3个空间在存在大文件使用,11块叫二级间接块,12块叫三级间接块,13呢?那就说明文件太大了,需要重新定义block的大小,block大了,自然i-节点就可以放下了)
4、将i-节点 添加到目中,映射关系是40:test,目录下边将讨论
二、什么是目录
目录是一种包含文件名字列表的特殊文件,不同的系统实现方式不同,但是,其抽象模型基本一致-------i-节点和文件名列表。知道这些 就差不多了。
三、文件是如何被读取出来的呢?
可以看做是创建文件的逆操作。
1、去目录 查找与test文件名相同的i-节点号
2、去顺序为40i-节点的记录中 查找blockA,B,C
3、读取A,B,C
4、复制到用户空间
需要注意是1,2,3 过程都是在内核空间中,第4步 才到用户堆栈空间,这里有涉及到了内核态和用户态,依然不会再这里讨论,内容太多了。
以上仅仅是粗略的介绍,文件系统涉及内容还有很多,比如大文件的存储,多个文件系统的整合,虚拟文件系统等
在结束本篇之前,再说两句,一个block 是5 1 2字节,我们经常使用的find 命令中size选项 的大小就是blcok为计算,find 命令的使用请自行查阅man find 手册
至于是不是5 1 2字节,那么咱们就实践一下,spwd是9368个字节
运行一下 find . -type f -size +19
意思查找当前目录下type为文件类型,大于19个block的文件。
没有找到,那么咱们运行 find . -type f -size +18 (18*512=9126)
OK 找到了。
今天就到这里,接下来将讨论文件属性和目录