第十一章学习笔记
## EXT2文件系统
多年来,Linux一直使用EXT2作为默认文件系统
EXT3是EXT2的拓展。EXT3中增加的主要内容是一个日志文件
EXT4的主要变化是磁盘块的分配
EXT2文件系统数据结构
通过mkfs创建虚拟磁盘
创建了一个带有nblocks个块(每个块大小blksize字节)和ninodes个索引节点的EXT2文件系统。
虚拟磁盘布局
索引节点
-
直接块:i_block[0]至i_block[11]指向直接磁块盘
-
间接块:i_block[12]指向一个包含256个块编号的磁盘块,每个块编号指向一个磁盘块
-
双重间接块:i_block[13]指向一个指向256个块的块,每个块指向256个磁盘块
-
三重间接块:i_block[14]对于小型EXT2文件可忽略,索引节点大小用于平均分割块大小,所以每个索引节点块都包含整数个索引节点。
-
目录条目 EXT2目录条目;目录包含dir_entry_2结构
dir_entry是一种可扩充结构。名称字段包含1到255个字符,不含终止NULL。所以dir_entry的rec_len也各不相同。
遍历EXT2文件系统树
遍历算法:
一、读取超级块;
二、读取块组描述符;
三、读取InodeBegin Block,以获取/的索引节点;
四、将路径名标记为组件字符串;
五、从3.中的跟索引节点开始搜索;
六、使用索引节点号ino来定位相应的索引节点七、重复第5第6步。
EXT2文件系统的实现
文件系统结构
第一级别实现基本文件系统树;
第二级别实现文件读/写函数;
第三级别实现系统的挂载,卸载和文件保护
基本文件系统
1级文件系统函数
- mkdir 算法:创建一个带路径名的新目录
mkdir pathname
- creat 算法:创建一个空的普通文件
Algorithm of creat
- rmdir 算法:删除目录(前提是目录必须为空)
rmdir dirname
- link 算法:创建应用于普通文件的硬链接
link old_file new_file
- unlink 算法:取消文件链接,将文件的links-count减一并从其父目录中删除文件名。当links_count为0时,通过释放它的数据块和索引节点来真正删除文件。
UNlink filename
-
symlink 算法:创建新文件和旧文件的符号链接。符号链接不同于硬链接,它可以链接到任何对象,包括目录,甚至不同设备上的文件。
-
readlink 算法:读取符号文件的目标文件名并返回目标文件名的长度。
2级文件系统函数
实现了文件内容的读/写操作
3级文件系统
支持文件系统的挂载、卸载和文件保护
文件锁定
文件锁定机制允许进程对一个文件或文件的某些部分设置文件锁,以防止在更新文件时出现竞态条件。文件锁可共享(允许同步读取),也可独占(执行独占写)。文件锁既可以是强制性的,也可以是建议性的。例如, Linux既支持共享文件锁,也支持独占文件锁,但文件锁定只是建议性的。在 Linux I中,文件锁可通过ntl(系统调用设置,也可通过fock系统调用操作。为简单起见,我们假设一种非常简单的文件锁定。
当一个进程试图打开一个文件时,将会检查目标操作模式的兼容性。唯一容模式是读模式。如果已经为更新模式打开了一个文件,即写读写追加,则该文件无法再次打开。但是,这并不会阻止相关进程(例如父进程和子进程)修改父进程打开的同一文件,而且在Unix/ Linux中同样如此。在这种情况下,文件系统只能保证每个写操作是原操作,但不能保证进程的写入顺序,写入顺序取决于进程调度。
文件系统项目的扩展
(1)多个组
(2)4KB大小的块
(3)管道文件
(4)I/O缓冲
苏格拉底挑战
Unix/LinuxEXT2文件系统
基本文件系统