Ext2文件系统结构(inode & block):
inode存放文件的用户权限,属性,以及记录文件数据使用到的block编号,一个inode大小为 128 bytes;
block负责存放文件的实际数据,大小有 1KB,2KB 和 4KB 可选;
- 每一个文件对应唯一的一个inode节点;
- 每一个inode下面可以有一个或多个block节点,取决于文件的大小;
- block节点一旦确定大小(有 1KB,2KB 和 4KB 可选)则无法改变(除非格式化该文件系统);
- 一个block仅能对应单个文件(单个inode),如:单个文件大小为1KB,而block大小为4K,会造成磁盘空间的浪费(3KB无法为其他文件所用);
当单个文件内容增大时,使用的block数量也会随之增加,然而inode仅仅能存放 32个block的编号(inode中一个编号占 4 bytes,故 128 / 4 = 32 个);
尽管采用4KB大小的block存放文件数据,则32 * 4K = 128KB,这对于大多数文件来说,是远远不够的;
而Linux规定一个inode只能对应一个文件,所以不能申请更多的inode进行存放文件数据,因此该inode会指定其中的几个block作为存储其他block编号的容器;
假设当前使用的是 1KB 的block存放文件数据,则inode可以将其中的一个block作为inode的扩容区,即1KB全都用来存放其他block的编号,则可以多出 1024bytes / 4bytes = 256 个编号存放空间,而每个编号对应一个 1KB 大小的block,则文件大小可在原来基础上大致增大 256 * 1KB = 256KB的大小 (称之为一层间接);
而存储编号的block中指定的block也可以继续用于存储编号,则又可扩容 256 * 256 * 1KB = 65536KB(二层间接);一般来说,为了控制block数量,到了三层间接(即 256^3 * 1KB) 后就不再扩展了,这也是出于文件系统的IO性能考虑;
如何在ext2中读取某文件的数据?
例如要查看/etc/passwd文件的内容:
- 首先解析这个地址,根据挂载点信息先去找到根目录 “/” 所对应的文件系统inode,通过inode权限检查,访问其下的block内容;
- 在这个block中找到记录 “etc/” 所在inode的编号(假设为 2000);
- 返回寻找编号为2000的inode,找到后进行inode权限检查,具有权限则进入到这个inode的block;
- 在编号为2000的inode的block查找passwd文件的inode编号(假设为30000)
- 返回寻找编号为30000的inode,并进行权限检查,通过则读取其下的block信息,其中的信息即为passwd内部存储的数据;
硬链接:
由上述查找过程可知:要想查看某个文件的数据信息,则必须从目录着手,不断地找出inode编号才行;
那么也许存在这种情况:一个inode,同时被多个目录下的block所记录,造成在这些目录下也可以直接找到这个文件,这就叫做hard link(硬链接);
而每增加一个硬链接,该文件inode的引用次数就会+1,这是个很重要的地方;
所以澄清一个概念:在使用 “rm [filename]” 命令来进行删除文件的时候,表面上看来我们是删除了某文件;
但实际上仅仅只是删除了名为[filename]的 文件名 ,使得当前目录下没有了这个 文件名 ;
换句话说,我们并没有直接去删除文件所对应的的inode,而是让这个inode所对应的 引用数-1 而已,当这个引用数量变为0的时候,系统才会去回收这个inode以及其对应的block;
所以这就是为什么硬链接可以在删除源文件的情况下,能正常使用的原因,因为inode依然存在于文件系统当中,只不过在源文件所在的目录下没有了这个 文件名 罢了;
需要注意的是:1. 硬链接不可以跨文件系统使用,因为inode; 2. 不能连接到目录;
软连接(windows快捷方式):
软连接 不关联源文件的inode,而是直接依附在源文件的文件名上,通过将源文件的信息复制到本身,所以当文件名被删除了,这个软连接的文件也就无法打开了;
软连接会创建自己的inode,并且将读取到的数据写入到block中显示,但这些都是动态的,每次打开软连接文件的时候,它都会重新地去查找源文件读取最新的数据,这个过程一旦失败,则软连接文件也就无法使用了;
EXT3 & EXT4
- Ext3与Ext2的区别在于Ext3支持文件系统日志的记录,其余部分两者一致;
- Ext4较于前两者来说,支持的单个文件大小由16GB-2TB增长到了16GB-16TB,而文件系统总体大小由32TB 增长到 1EB(1024TB * 1024)
FAT文件系统: 没有inode,block的编号由上一个block存储,不能一次性取出全部相关的block,性能上不如ext2
当inode数量过多时,为了便于文件系统的管理,将inode及block分成对对应的blockgroup;
- Boot Sector: 启动扇区,安装引导装载程序,每个文件系统都有一个,用于制造多重引导环境;
- Superblock:大小为1KB,用于记录所有分组的inode和block数量,大小以及使用情况(已用和未用的);
各种时间(最后一次写入磁盘时间,最后一次检验磁盘时间fsck,文件挂载时间等);
validbit --> 为0代表文件系统已挂载, 为1则表示文件系统未挂载;
因此Superblock存放于第一个分组的最前端,其他分组可能也存在Spuerblock,作为Superblock的备份使用; - 文件系统描述(FIle System Description): 记录每个group内block的开始与结束编号;
- 块对照表(block bitmap) : 记录group内block 的使用情况,写入时能快速找到未被使用的block,删除数据后将block置为未使用;
- inode对照表(inode bitmap): 同理,记录group内各inode的使用情况
- inode table: inode所在的区域,每个inode存在:1.用户权限(rwx);2.文件所有者(owner/group);3.文件大小;4.文件创建或修改时间(ctime);5.最近一次读取时间(atime);6.最近修改时间(mtime);7.文件特性(SUID,GUID等);8.内容指向(即指向block的pointer)
- data block: block所在区域;
df 命令查看系统磁盘使用情况:
由上述的 superblock 可知,其内部管理了当前文件系统所有的分组信息,所以我们可以通过 superblock 内记载的信息快速地了解当前文件系统以及磁盘的使用情况;
[cocan@bogon ~]$ df -[ahikmHT] [filename/dirname]
-a: all,列出所有文件系统信息;
-k:以kb的容量单位来计量信息;
-m:以mb的容量单位来计量信息;
-h:自动转换容量计量单位(1024b ==> 1k , 1024k ==> 1m);
-i:不用容量计量单位,改用inodes数量计量;
-H:转换计量单位(以1000b = 1k 来计量);
-T:将分区所用的文件系统名称一并显示出来;
du 命令评估文件系统所占磁盘容量
[cocan@bogon ~]$ du -[ahskm] [filename/dirname]
-a:all,列出所有文件与目录所占容量,默认仅显示当前目录下的目录;
-h、-k、-m:参考上述;
-s:直接列出总量,而不列出各别目录所占容量;