1,前言
有关文件系统的学习记录,若有不当之处,请您指出,您的指点是我的荣幸。
参考自–鸟哥的Linux私房菜
2,Ext2文件系统
2.1,文件系统特性
在Linux中,当我们新建一个文件的时候,文件的权限,创作者等相关属性该如何存储?文件中的数据该如何存储?
实际上,文件系统会将权限等相关属性存储到inode中,文件中的数据会存到data block块中。而inode和block的数量自然不能只有一个,实际上有很多的inode和block,还有一个数据叫super block用来记录文件系统的相关信息。
这里提一句:当磁盘分区之后,需要先进行格式化才能使用,格式化的目的对指定的硬盘分区进行初始化,建立文件分配表以便系统按指定的格式存储文件。
2.1.1,inode&block&super block
- inode:记录文件的属性,一个文件占用一个inode(无论这个文件多大或者多小),同时记录此文件的数据所在的block号码
- block:实际记录文件的内容,若是文件太大的时候,会占用多个block
- super block:记录此文件系统的整体信息,包括inode/block的总量,使用量,剩余量以及文件系统的格式与相关属性
对于一个文件来说,它的权限等属性存储在inode,一个文件占用一个inode,而inode也会记载存储文件数据的block编号,以便需要访问文件的时候,系统知道去哪个block读取数据,提高了访问效率。
下面依据数据访问方式的不同,介绍两个常用的文件系统
2.1.2,索引式文件系统
例如:某一个文件的权限等属性是存在inode 4号中,inode 4号中同时记录了该文件的数据实际放置点是在2,7,13,15这几个block中,那么文件系统就会按照这样的顺序来读取文件的数据并进行组装。
这种数据访问方式我们称之为索引式文件系统
2.1.3,FAT文件系统
U盘所采用的是FAT(File Allocation Table)文件系统,这种格式的文件系统是没有inode存在的,所以文件系统无法在一开始就将所有相关的block读取出来,每个block的号码都存在前一个block中,也就是:
2.2,Ext2文件系统
文件系统一开始的时候就将inode和block规划好了,除非重新格式化,否则inode和block固定就不再改变了。但如果文件系统高达数百GB的时候,那么inode和block的数量也会极多,这么多数量的inode和block如果不采取一些措施,会变得不易管理。
所以Ext2在格式化的时候是区分为多个块组(block group),每个块组都有独立的inode/block/super block系统。
下面对block group进行介绍
2.2.1,block group
2.2.1.1,data block
data block是用来放置文件内容的地方,Ext2支持的block的大小有1KB,2KB,4KB三种。block的大小在格式化的时候就已经固定好了。由于block的大小,文件系统容量和最大单一文件容量并不相同
- block的大小和数量在格式化完成之后便不能再改变,除非重新格式化
- 每个block最多只能放置一个文件的数据,也就是说不能将两个文件的内容放置到一个block中。
- 如果文件的大小大于一个block的容量时,会多占用一个block来存储数据
- 若文件的大小小于一个block的容量时,则该block的剩余空间便不会被使用,也就会造成磁盘空间的浪费。
- block过大或者过小都不行:block过小会消耗更多的inode,过大会浪费更多的磁盘空间
- 所以在进行文件系统的格式化之前,需要先估计一下文件系统的使用情况。
2.2.1.2,inode table
接下来探究一下inode里面记录了什么?
inode的内容至少包括这些:
- 文件的权限
- 文件的所有者与组
- 文件大小
- 文件的创建或者修改时间
- 最近一次读取时间
- 最近的修改时间
- 文件内容的真正指向
- 定义文件特性的标志
每个inode固定大小是128bytes或者256bytes,每个文件都仅会占用一个inode,所以一个文件系统能创建多少个文件取决于inode的数量。
接下来简单探究一下inode/block和文件大小的关系:这里的inode大小以128bytes为例
一个inode除了存储文件权限等属性的区域,还有12个直接索引,一个间接索引,一个双间接索引,一个三间接索引
以1KB大小的block为例,而记录一个block号码需要4bytes
也就是说,用block来存储block号码的话,每个block能存储1KB/4B=256个
- 直接(一级索引):每个直接指向一个block,这个block存储的是文件数据
- 间接(二级索引):每个间接指向一个block(1),这个block(1)存储的是文件数据所在的block的编号
- 双间接(三级索引):每个双间接指向一个block(1),这个block(1)指向的是256个block(2),而每个block(2)里面存储的是文件数据所在的block的编号
- 三间接(四级索引):以此类推
所以一个inode(一个文件)可以存储的数据是:
12*1KB+256*1KB+256*256*1KB+256*256*256*1KB=16843020KB
约等于16GB
这是1KB大小的block
而2KB大小的block,单一文件大小为256GB
4KB大小的block,单一文件大小为2TB
2.2.1.3,super block
super block是记录整个文件系统相关信息的地方,没有super block就没有这个文件系统。它主要记录:
- block与inode的数量
- 未使用的与已经使用的inode/block数量
- block与inode的大小
- 文件系统的挂载时间,最后一次写入数据的时间,最后一次检验磁盘(fsck)的时间等文件系统的相关信息
- 一个validbit数值,如果该文件系统已经被挂载,则validbit为0,否则为1
superblock是至关重要的,每个block group里面都可能含有super block,一般来说,super block都会存有备份,以便当super block损坏时得以恢复。
2.2.1.4,查看super block
可以通过df调出目前已经挂载的设备,然后使用dumpe2fs查看super block的信息
df
dumpe2fs 设备名 | more
查看文件系统的相关信息
查询结果:上半部分是superblock的内容,下半部分是每个block group的内容。
2.2.1.5,inode bitmap & block bitmap
记录哪些inode,block是已使用和未使用的。
通过这两个,系统可以很快的找到可用的空间来处置文件。