Linux 文件查找读取原理

背景

我们可能工作中使用Linux系统很久了,但是你能真正说清楚当查找某个文件或读取某个文件时,系统使怎样一个过程么?你可能说,Linux文件系统是一个目录树的结构,自上而下查找了;那我们再回顾下到底Linux系统使怎样定位到一个文件的。

文件定位读取

1、Linux普通文件定位:

在Linux中,一个文件分可为两个部分,一个是文件的权限和属性(元数据),另外一个是文件的具体内容(数据本身),这两者分别存放在inode块和block块中。而每个block块都有一个索引号码,这个索引号码会被记录在inode里面。

一个文件可能会很大,所以需要多个block块来存放一个文件的所有内容。而每个block的索引都会被记录在inode里面。每个单一文件只允许有一个inode块。

因此,要读取一个文件的,会先读取这个文件inode块里面存放的所有索引号码,然后按照号码去寻找对应的block块,最后读取block块里面的实际文件内容。

如大家所知,Linux文件系统是一个目录树结构,所有的文件全部存放在根目录下,想要读取一个文件,必先读取其目录。Linux中,一切皆文件,一个目录也是由inode和block块构成的,区别是目录的block块中存放的是该目录下所有文件的文件名和该文件的inode号码的映射。

eg1:当我们使用ls查看/bin/ln这个文件时,执行:ls -lih / /bin /bin/ln
在这里插入图片描述

读取“/”目录,因为“/”是挂载点,所以可以知道挂载点的inode号码是2,
读取bin目录,通过“/”的inode找到“/”的block块,在这个block块里面查询看是否有“bin”这个文件名字,找到这个名字并返回这个名字对应的inode号码,也就是174。
通过编号为174的inode块来找到对应block块,并查询是否有ln这个文件名,找到这个名字并返回对应的inode号码,也就是4824。然后在4824这个inode中,来查询所有保存了block索引的记录,并读取对应索引的block。完毕。

2、链接文件:
一种是硬链接,另外一种是软链接;先说第一种:硬链接
eg1:在“/root”目录下创建一个对“/bin/ln”的硬连接,连接名字是ln2
在这里插入图片描述
如上图,前后2个文件i节点号相同;Linux会在“/root”目录的block块中添加一条文件名为ln2和对应inode号码的映射,实际这个inode号码就是“/bin/ln”文件的inode号码,即硬链接不会消耗新的inode,只是新增了一层映射关系,并没有多占用额外的inode块和block块

硬链接原文件删除后,硬链接文件还是可以访问的,因文件和实际数据的映射关系还在(相当于一个备份);

2)软链接:

与硬链接不通的是,软链接文件会占用一个新的i节点,但是新的I节点指向原文件,再通过源文件映射关系(I节点)指向实际数据的Block块;软连接是直接新建一个文件。鉴于一个文件对应一个inode块和至少一个block块,所以新建一个软连接就至少会占用两个block块。但是这里新占用的block块作用是保存你要链接的文件的完整路径(即链接文件的数据),而非该链接文件内容对应的实际数据;
在这里插入图片描述
上图中,两个文件的inode号码不一样!且新的软链接文件只有7byte,“/bin/ln”正好7个字符,一个字符就是一个byte,所以文件内容是7个byte。

软链接文件,原文家删除后,要链接的文件,通过路径无法再定位,即找不到源文件,也就无法通过源文件再指向实际数据内容,也就无法访问文件。软链接相当于源文件的快捷方式,跟实际数据没有直接关联(即没有文件和实际数据的映射关系数据,故找不到实际数据的block块);

3)文件系统的意义
当我们挂载新的磁盘后,需要选择一种文件格式将新建的分区初始化,从而让Linux能够识别这个分区里面的文件。这里的文件格式就是,磁盘的文件是按照怎样的一种形式组织起来,即上面提到的文件由两部分组成的,inode,block(Blocks的单位是byte )等。

Linux 支持多种的文件系统格式,其中包含了我们熟悉的FAT32、FAT16、NTFS、HP-UX,以及各种 Linux 特有的 Linux Native和 Linux Swap分区类型。

4)常用分区:
/boot分区,它包含了操作系统的内核和在启动系统过程中所要用到的文件,建这个 分区是有必要的,因为目前大多数的pc机要受到bios的限制,况且如果有了一个单独的/boot启动分区,即使主要的根分区出现了问题,计算机依然能够 启动。这个分区的大小约在50mb—100mb之间。但是如果想用lilo启动red hat linux系统的话,含有/boot的分区必须完全在柱面1023以下。又由于8gb后的数据lilo不能读取,所以red hat linux要安装在8gb的区域以内。

/usr分区,是red hat linux系统存放软件的地方,如有可能应将最大空间分给它。

/home分区,是用户的home目录所在地,这个分区的大小取决于有多少用户。如 果是多用户共同使用一台电脑的话,这个分区是完全有必要的,况且根用户也可以很好地控制普通用户使用计算机,如对用户或者用户组实行硬盘限量使用,限制普 通用户访问哪些文件等。其实单用户也有建立这个分区的必要,因为没这个分区的话,那么你只能以根用户的身份登陆系统,这样做是危险的,因为根用户对系统有 绝对的使用权,可一旦你对系统进行了误操作,麻烦也就来了。

/var/log分区,是系统日志记录分区,如果设立了这一单独的分区,这样即使系统的日志文件出现了问题,它们也不会影响到操作系统的主分区。

/tmp分区,用来存放临时文件。这对于多用户系统或者网络服务器来说是有必要的。 这样即使程序运行时生成大量的临时文件,或者用户对系统进行了错误的操作,文件系统的其它部分仍然是安全的。因为文件系统的这一部分仍然还承受着读写操 作,所以它通常会比其它的部分更快地发生问题。

/bin分区,存放标准系统实用程序。

/dev分区,存放设备文件。

/opt分区,存放可选的安装的软件。

/sbin分区,存放标准系统管理文件。

通常,我们一般会建立一个swap分区,一个/boot分区,一个/usr分区,一个/home 分区,一个/var/log分区。

5)分区数量

Linux 规定了主分区(或者扩展分区)占用 1 至 16 号码中的前 4 个号码。主分区(或者扩展分区)占用了 hda1、hda2、hda3、hda4,而逻辑分区占用了 hda5 到 hda16 等 12 个号码。第一个 IDE 硬盘会被标记为 hda1,以此类推;对于SATA硬盘,第一个 SCSI 硬盘会被标记为 sda1;

猜你喜欢

转载自blog.csdn.net/ximenjianxue/article/details/113737689