文件系统结构
磁盘是由若干扇区组成,每个扇区有512B(将磁盘存储区扇区化是为了更好的管理磁盘)。又由若干个扇区组成一个块(ext2默认是由8个扇区组成一个块,即4kb,这里为了简化说明,就把2个扇区组成一个块,即1kb)。由图知,将磁盘分成若干个分区,每个分区由若干个块组成。
- 自举块(boot block):占用1 block;主要存储分区的操作系统类型、分区起始地址;pc联盟规定的大小,和各个文件系统无关;每个分区只有一个;
- 超级块:占用1 block;存储分区操作系统版本、块大小、文件系统;
- 块组描述表(GDT):占用3 block;存储一个块组的描述信息;
- 块位图(block bitmap):占用1 block;每个比特位表示一个数据块是否被标记使用;1:已使用,0:未使用;
- inode 位图(inode bitmap):占用1 block;每一个比特位表示一个inode节点。1:已使用,0:未使用;
- inode节点:占用128B;分为文件属性部分和数据指针部分;数据指针占用60B,长度为15的指针数组;每个数据块的大小是1 block,那么15个指针最多只能维护15*1K个文件大小,显然,文件大小的上限太小了。所以文件系统通过三级间接寻址的方式来提高文件大小的上限。块大小若以1 block计算,文件大小的上限为16G,若以4 block为块大小,那文件大小的上限超过了1T;ext4文件系统中,数据指针有256B,那文件大小上限就非常大了;
- 数据块:存储文件的内容;
三级间接寻址策略
三级间接寻址图
将数据指针数组命名为data数组。文件系统中,将data[12]进行一级间接寻址。即:将data[12] 指针指向的数据块,转化为一个更大的指针数组,长度为1024/4=256。在将这个更大的指针数组的分别数指向256个数据块;data[13]进行二级间接寻址,data[14] 进行三级间接寻址。都和一级间接寻址同理。
目录文件
数据块存储内容
数据块中存储的是一条一条的记录项,每条记录项都由文件名、indoe编号、记录长度(该记录项首地址到下一条记录项的首地址的长度)。每一个记录项就是该目录下“ls -a”的结果。
普通文件结构
由图可以看出,每个inode节点可以对应多个数据块,和上文在分析inode节点的内容一致。然后,若干个目录块中的记录项指向每个inode节点,通过inode节点中链接数这个数据成员来标识指向其的记录项个数,这就是硬链接。当然,这些目录块都是目录文件的数据块;
目录文件结构
由上图知,inode节点在文件系统中被维护成了结构体数组,inode编号为数组的下标;2549号i节点是1267号i节点的子目录,因为1267号i节点的数据块中有2549号i节点的记录项;“.”目录文件和 “..”目录文件都是硬链接。
从以上分析能够得出结论:所有的目录块都是不同目录文件的数据块。
文件创建和查询过程
执行命令:mkdir /home/aaron/a.c
(1)通过块位图区找到空闲的数据块,存放a.c中的内容
(2)通过inode位图区找到空闲的inode节点块,生成相应的inode节点
(3)在aaron目录文件的数据块中添加一条a.c的记录项
执行命令:vim /home/aaron/a.c
(1)找到inode编号为2的inode节点,
(2)遍历根目录文件的数据块中的记录项,匹配aaron记录项,获取其inode编号
(3)通过aaron目录文件的inode编号,找到aaron文件对应的数据块
(4)遍历aaron文件的数据块中的记录项,匹配a.c记录项。同理,找到对应的a.c的数据块。用vim打开相应文件
- unix和Linux系统是通过文件名来对应inode节点号,从而找到对应的数据块,完成文件查询的过程
- inode节点中没有文件名就是因为基于这种定位文件位置的机制