一、Ext2文件系统
1.1 概述
文件系统中存储的最小单位是块(Block),一个块究竟多大是在格式化时确定的,使用 tune2fs
命令可以查看块大小。
**注:**我这里演示使用的是ext3,但是没有影响。
1 | [root@VM_120_243_centos 1]# cat /etc/fstab |
1 | [root@VM_120_243_centos 1]# tune2fs -l /dev/vda1 | grep Block |
一个分区的开头必须有 1k 的 boot block
,任何文件系统不能使用这块内容,用来存储磁盘分区信息和启动信息。启动块之后才是文件系统。
ext2文件系统将整个分区划成若干个同样大小的块组(Block Group),如下图所示:
1.2 详细描述
1. 超级块(Super Block)
描述整个分区的文件系统信息,例如块大小、文件系统版本号、上次mount的时间等等。
由于 super block
很重要 ,在每个block group
都会存一份进行备份。
2. 块组描述符表(GDT,Group Descriptor Table)
由很多块组描述符
组成,整个分区分成多少个块组就对应有多少个块组描述符。
每个块组描述符(Group Descriptor)存储一个块组的描述信息,例如在这个块组中从哪里开始是inode表,从哪里开始是数据块,空闲的inode和数据块还有多少个等等。
和超级块类似,块组描述符表
在每个块组的开头也都有一份拷贝,这些信息是非常重要的。超级块意外损坏就会导致丢失整个分区的数据,块组描述符意外损坏就会导致丢失整个块组的数据。
通常内核只用到第0个块组中的拷贝,当执行e2fsck
检查文件系统一致性时,第0个块组中的超级块和块组描述符表就会拷贝到其它块组,这样当第0个块组的开头意外损坏时就可以用其它拷贝来恢复,从而减少损失。
3. 块位图(Block Bitmap)
数据块存储所有文件的数据,比如某个分区的块大小是 1024字节,某个文件是 2049字节,那么就需要三个数据块来存,即使第三个块只存了一个字节也需要占用一个整块。超级块、块组描述符表、块位图、 inode位图、 inode表这几部分存储该块组的描述信息。
那么如何知道哪些块已经用来存储文件数据或其它描述信息,哪些块仍然空闲可用呢?块位图就是用来描述整个块组中哪些块已用哪些块空闲的。
它本身占一个块,其中的每 bit代表本块组中的一个块,这个 bit为 1表示该块已用,这个 bit为 0表示该块空闲可用。
4. inode位图(inode Bitmap)
和块位图类似,本身占一个块,其中每个 bit表示一个 inode是否空闲可用。
5. inode表(inode Table)
我们知道,一个文件除了数据需要存储之外,一些描述信息也需要存储,例如文件类型、权限、文件大小、创建 /修改 /访问时间等,这些信息存在 inode中而不是数据块中。每个文件都有一个inode
,一个块组中的所有 inode ** 组成了inode表
** 。
6. 数据块(Data Block)
根据不同的文件类型有以下几种情况:
-
常规文件,文件的数据存储在数据块中。
-
目录,该目录下的所有文件名和目录名存储在数据块中,其它信息都保存在该文件的inode中。注意:目录是一种特殊类型的文件。
-
对于符号链接,如果目标路径名较短则直接保存在 inode中以便更快地查找,如果目标路径名较长则分配一个数据块来保存。
-
设备文件、FIFO和socket 等特殊文件没有数据块,即文件大小为0;设备文件的主设备号和次设备号保存在 inode中。
二、Ext3 文件系统
众所周知,Linux通过唯一数值(索引节点号
)来标识每个文件。当文件系统每次存储或更新文件,它都要用新信息来更新索引节点表。
如果系统在存储文件和更新索引节点表之间发生了故障。即使文件数据正常保存到了物理设备上,如果索引节点表记录没有完成更新的话,ext2文件系统将无法找到那个文件。
为了解决这个问题,引入了ext3文件系统。它和 ext2 文件系统具有相同的索引节点表结构,其差别是 ext3 文件系统在硬盘上多出了一个特殊的 inode,用来记录文件系统的日志(journal)。
在存储或更新文件时先将文件的更改写入到日志中,在数据成功写到存储设备和索引节点表后,再删除对应的日志条目。如果系统在数据被写入存储设备之前崩溃或断电了,日志文件系统下次会读取日志文件并处理上次留下的未写入的数据。
虽然ext3文件系统为Linux添加了基本的日志功能,但它仍缺少一些功能。例如ext3文件系统无法删除误删的文件,它没有任何内建的数据压缩功能,也不支持加密文件。
三、Ext4 文件系统
ext4文件系统在2008年收到了Linux内核官方的支持,除了支持数据的压缩和解密,ext4还支持一个称作**区段(extent)**的特性。
区段在存储设备上按块分配空间,但在索引节点表中只保存起始块的位置。
ext4还引入了块预分配技术(block preallocation)。如果你想在存储设备上给一个你知道要变大的文件预留空间,ext4文件系统可以为文件分配所有需要用到的块,而不仅仅是你现在用到的块。它会用0来填满这些块,不会将它们分配给其他文件。