首先从文件存储相关概念入手:
inode
其本质为结构体,存储文件的属性信息。如:权限,类型,大小,时间,用户,盘块位置....也叫作文件属性管理结构,多数的inode都存储在磁盘上。少量常用,近期使用的inode会被缓存到内存中。
dentry
目录项,本质上是结构体,重要成员有两个{文件名,inode,.....}文件内容data保存在磁盘块中。
文件系统
文件系统是一组规则,规定对文件的存储及读取的一般方法。文件系统在磁盘格式化 过程中指定。
常见的文件系统有:fat32 ntfs exfat ext2 ext3 ext4
简单描述一下ext2文件系统
一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(mkfs)格式化成某种格式的文件系统,然后才能存储,格式化的过程会在磁盘上写一些管理存储布局的信息。
文件系统中存储的最小单位是块(block),一个块的大小是在格式化时确定的,也可以通过设置来确定块大小。启动快Bootblock的大小是确定的,就是1kb,启动快是由pc标准规定的,用来存储磁盘分区信息和启动信息,任何文件系统都不能使用启动快。启动块之后才是ext2文件系统的开始,ext2文件系统将整个分区划成若干个同样大小的块组BlockGroup,每个块组都由超级快Super Block,块组描述符表(GDT),块位图(Block Bitmap),inode位图,inode表
Super Block:描述整个分区的文件系统信息,例如块大小,文件系统版本号,上次mount的时间等等。超级快在每个块组的开头都有一份拷贝。
GDT:由多块组描述符组成,整个分区分成多少个块组就对应有多少个块组描述符。每个块组描述符存储一个块组的描述信息,例如在这个块组中从哪里开始是inode表,从哪里开始是数据块,空闲的inode和数据块还有多少个等等。和超级块类似,块组描述符表在每个块组的开头也都有一份拷贝。
块位图:用来描述整个块组中哪些块已用哪些块空闲的。它本身就是一个块,其中的每个bit代表本块组中的一个块,这个bit为1表示该块已用,这个bit为0表示该块空闲可用。
由块位图引出两个问题:
为什么用df命令统计整个磁盘的已用空间非常快呢?
因为只需要查看每个块组的块位图即可,不需要搜遍整个分区。相反,用du命令查看一个较大目录的已用空间就非常慢,因为不可避免的要搜遍整个目录的所有文件。
在格式化一个分区时究竟会划出多少个块组呢?
主要的限制在于块位图本身必须占用一个块。
inode位图:和块位图类似,本身占一个块,其中每个bit表示一个inode是否空闲可用。
inode表:一个文件除了数据需要存储之外,一些描述信息也需要存储,例如文件类型,权限,大小等,这些文件信息存储在inode中而不是数据块中。每个文件都有一个inode,一个块组中的所有inode组成了inode表。inode表中的每个ionde的大小:ext2,ext3中128字节,ext4中256字节