1、示例描述
以读取/etc/passwd这个文件为例,来阐述文件读取过程。
使用df -aT命令,发现根目录/对应的文件系统为ext3,由于没有/etc对应的项, 故使用根目录/的文件系统ext3。
2、Linux Ext2的索引文件系统结构
为了解读取过程,需要简单介绍下Ext2文件系统。Ext3文件系统结构与Ext2相似。用工具格式化磁盘或分区时, 会选择使用什么文件系统来格式化。若选用Ext2来格式化磁盘或分区, 则磁盘或分区的大部分空间被格式化成了许多个Inode和block两个数据结构。block有3种大小选项1K,2K,4K,可在格式化之前选择。Inode的大小固定为128bytes。每个文件都仅会占用一个Inode,Inode主要用来记录文件相关属性,比如权限、文件大小、修改时间等。block用来记录文件的数据,一个Inode可以关联多个block,且Inode记录一个block号码需要4byte。如果文件非常大的话,则Inode无法直接记录文件所包含的所有block号码。所以Ext2采用12个直接、1个间接、1个双间接、和1个三间接记录区,共需60bytes。
Ext2的文件系统结构如下图:
由图可见,12个直接记录区直接指向带有文件数据的block。1个间接记录区指向一个无真实文件数据的block,此block充当Inode的扩展记录区,此block直接指向带有数据的block。若此扩展block为1K,那么它可记录256个block号码。双间接和三间接类似。
3、示例中的文件读取流程
1)通过挂载点信息找到/dev/sda2的inode号码为2,对应根目录/。如下图:
关于什么是挂载点,不做细讲。
2) 经过上个步骤,由于owner root有r,w,x权限,可从inode取得根目录/的block,然后再从block中取得etc/目录的inode为3303105。这里etc/相当于根目录/的数据。
- 经过上个步骤,由于owner root有r,w,x权限,可从inode 3303105的block中取得passwd的inode号码为3304908。这里passwd相当于父目录etc/的数据。
4)经过上个步骤,由于owner root有r,w权限,可从inode 3304908的block中取出数据。