目录
本专栏文章将有70篇左右,欢迎+关注,查看后续文章。
9.1 简介
文件系统分类:
FAT:Windows默认使用。
Ext2/Ext3:Linux使用,优先使用Ext3。
Ext2:和VFS类似结构,性能高。
Ext3:Ext2基础上扩展了日志功能,用于系统奔溃时恢复。
传统:一个分区被格式化为一个文件系统。
新技术:LVM,一个分区可格式化为多个文件系统,也可多个分区合并为一个文件系统。
LVM:Logical Volume Manager,即逻辑卷管理器。
可跨越多个物理磁盘存储。
可动态扩展或缩减存储空间。
文件系统面临挑战:
1. 磁盘空间碎片化:文件移动和新增文件时产生碎片,从而影响访问速度。
2. 存储空间利用率:大量管理数据。
9.2 Ext2文件系统
Ext2开始成为强大的文件系统。
Ext2专注于高性能,设计目标:
1. 支持可变块长(根据预期文件大小决定)
2. 支持快速符号链接(若链接目标的路径很短时,存储在inode自身中)
3. 增加扩展能力。升级到Ext3等版本时,无需重新格式化或加载硬盘。
4. 奔溃后可恢复。用fsck工具修复。
5. 可将文件标记不可改变,即使root也不能,如重要配置文件。
Ext2代码实现大约1w行,紧凑。
拓展
fsck:即 file system check。
作用:可修复损坏的超级块、恢复丢失文件、删除不正确文件等。
可检查并修复多种文件系统:如 Ext3、Ext4、JFS 等。
9.2.1 物理结构
文件系统存储最小单元:块(block),所以文件占用大小是整数倍的块长度。
数据传输单元也为块。
块大小在格式化时确定。如:
mkfs.ext2 -b 4096 /dev/sdd
作用:在/dev/sdd分区中创建文件系统,其中块大小为4096B。
1. 结构概观
块组:Block Group。
Ext2 将一个分区被划分成多个块组。
Ext2 中有多个块组:
启动块:
不能写文件系统数据。而是存储启动装载程序。
其余块组:
存储文件系统的数据。
其中每一个块组细分为如下:
实际上,超级块只在某些块组中备份。
一个块组内分为:
1. 超级块:
描述文件系统的信息。如:
1. inode 总数与空闲量。
2. block 总数与空闲量。
3. 时间戳。
4. 文件系统magic值等。
每个块组都可备份超级块,实际中为节省存储空间,只使用第一个块组的超级块。
Ext2 采用稀疏超级块技术:
只是部分块组存储超级块信息。
2. 组描述符:
即GDT,描述当前块组的信息,包括:
1. 数据位图地址,inode 位图地址。
2. inode 表地址,数据块地址。
3. 空闲 inode 数,空闲数据块数。
3. 数据块位图 与 inode 位图:
用每个 bit 位描述对应数据块和 inode 是否已用 /空闲。
4. inode表:
包含该组块所有的 inode。即文件、目录的元数据。
5. 数据块:
存储文件,如:
常规文件:文件数据。
目录文件:存储目录下的文件名和子目录。
符号链接:路径名短则保存在inode ,如果较长则用数据块来保存。
注意:设备文件、FIFO 和 socket 等文件没有数据块,文件大小为 0。设备文件的主设备号和次设备号保存在 inode。
2. 间接
Ext2 技巧:
将磁盘按块编号,inode 指定数据块所在编号。
当文件太大时,需要很多数据块,inode结构无法包含。怎么办?
解决方法:使用间接块,间接存储inode的各个数据块块号。
而普通小文件,直接在inode中存储数据块地址。
文件越大大,所需间接更多。如:
一次间接,二次间接,三次间接等。
间接越多,访问对应数据块越慢。
3. 文件系统碎片
碎片影响分为:
写文件:无法分配连续数据块。
读文件:不能连续读取,机械硬盘磁头寻道时间增长,读变慢。
Ext2尽力防止磁盘碎片:
尽量让同一文件的数据块在同一块组中。