回顾硬盘
分区
磁盘分区指定分区的起始与结束柱面,分区的柱面范围记录在第一个扇区的分区表里面
硬盘的第一个扇区中有主引导记录 MBR 446bytes 和分区表 partition table 64bytes,由于大小限制最多只能记录四条分区的记录,即主分区或扩展分区
- GPT + UEFI 则扫描整块磁盘上的分区,读取 EFI 分区里的引导文件,所以不再限制在扇区开头的 512bytes 中
硬盘限制主分区和扩展分区最多可以有四个,操作系统限制扩展分区只能有一个,无法被格式化即无法作为数据访问,但扩展分区可以再分出逻辑分区
格式化
文件系统通过格式化将 inode 和 block 规划好,并不再变动;不同文件系统格式化方法不同,所以不能相互识别利用
- inode 记录文件属性和此文件的数据所在的 block,一个文件占用一个 inode
- block 实际记录文件内容,可占用多个
- super block 记录此文件系统的整体信息,如 inode/block 总量使用量剩余量,文件系统的格式等
碎片整理即因为文件写入的 block 过于离散,影响文件读取性能,需要将它们汇合到一起;这针对没有 inode 的 FAT 系统,Linux 的索引式文件系统基本不需要
文件系统
当 inode 和 block 数量极大时不容易管理,Ext2 在格式化时区分为多个块组 block group,每个块组有独立的 inode/block/superblock 系统
boot sector 启动扇区
在文件系统最前面,用于安装引导装载程序,这样不用覆盖整块硬盘唯一的 MBR,制作多重引导环境
data block 数据块
放置文件内容,每个 block 最多放置一个文件的数据,若有剩余空间则浪费;Ext2 支持 1KB 2KB 4KB 三种 block 大小,其决定最大总容量和最大单一文件容量
inodetable
至少记录访问模式 所有者和组 大小 ctime atime mtime 内容指向 文件特性,系统读取文件时会先分析 inode 所记录的权限与用户是否符合;每个文件占用一个inode,所以文件系统能创建的文件数量与 inode 数量有关
inode 大小固定为 128bytes,当文件较大则不足以记录下所有的 block 编号,故定义了 12 个直接,一个间接,一个双间接,一个三间接记录区
- 用一个 block 来记录额外的编号,若依然不够则用一个 block 指出下一个记录编号的 block,依此最多三层;以 1KB 大小的 block 计算,12*1K + 256*1K + 256*256*1K + 256*256*256*1K = 16GB,即该文件系统最大容量
superblock
一般为 1024bytes,除了第一个 blockgroup 中含有 superblock 外,后面的不一定含有,若有则为备份
文件系统描述 File system Dscription
描述每个 blockgroup 的开始与结束编号,说明每个区段介于哪个 block 之间
- 区段指 superblock bitmap inodemap datablock
- block bitmap 标记/修改某个 block 是否被使用
- inode bitmap同上
查询文件系统
1 | # df <== 查询目前挂载的设备 |
新增文件的过程
- 检查目录是否有 w 和 x 权限
- 根据 inode bitmap 查找没有使用的 inode 编号并写入新文件的权限属性
- 根据 block bitmap 查找没有使用的 block 编号并写入实际数据,更新 inode 的指向
- 将 inode 和 block 信息更新到 inode bitmap 与 block bitmap,并更新 superblock
由于 superblock inodebitmap blockbitmap 的数据经常变动,被称为 metadata 中间数据,而 inode table 和 data block 称为数据存放区域
异步处理 asynchronoly
提高效率:系统加载一个文件到内存后,若文件没有被改动,则被设置成 clean,更改过则为 dirty,系统不定时将 dirty 数据写回硬盘
- 可以 sync 命令手动写回
- 正常关机会主动调用 sync 命令
与目录树的关系
ext2 中的目录
新建目录时,会分配一个 inode 和至少一块 block,inode 记录目录的相关权限,属性,和分配到的 block 编号;block 记录此目录下的文件名与文件名的 inode 编号数据
ext2 中的文件
新建一般文件时,会分配一个 inode 和对应大小的 block 数量,由于只有 12 个直接指向,可能分配额外的 block 用来记录块编号
inode 本身不记录文件名,而是在目录的 block 中,所以增删改文件名与目录的 w 权限有关。
当读取某个文件时务必会经过目录的 inode 和 block,然后找到文件的 inode 最终获得 block 中的数据
系统通过挂载信息获得根目录的 inode 号码,并据此获得根目录 block 内的文件名数据,再一层层向下
日志文件系统
inconsistent 状态
文件在写入文件系统时发生中断,未同步更新 metadata 导致 metadata 的内容和实际数据存放区不一致
避免 inconsistent 发生
- 写入文件前先在日志记录块记录准备要写入的信息
- 实际写入,包括更新 metadata 的数据
- 在日志记录块中完成该文件的记录
发生问题时通过检查日志记录块定位到文件,不必检查整个文件系统,Ext2 中没有文件日志系统,需要对比 metadata 区域和数据存放区