【Linux系统编程十六】:文件系统(inode与软硬链接)
- 一.磁盘硬件
- 二.文件系统(inode)
- 三.软硬链接
一.磁盘硬件
Linux下的文件在磁盘中存储,文件的内容和属性是分开存储的!
文件的内容存储在数据块。
文件的属性存储在inode里。
我们首先需要先了解一下磁盘这个硬件的结构
磁盘的物理结构可以抽象成一个基于扇区数组的逻辑结构:
按着一定的算法,就可以按照LBA的方式访问磁盘的任意位置
因为这个扇区数组太大了,不好进行管理,所以我们首先对这个数组进行分区,划分成多个区域,只要能管理一个分区里的扇区,那么其他分区也就可以管理好。
但是每个分区还是比较大,所以我们又将每个分区分成若干个小块。block group想管理好磁盘,先管理好这些组块,管理好组块,就可以管理好分区,管理好分区就可以管理好磁盘。
每个组块由下面的几部分构成:
二.文件系统(inode)
每个块组都是由这6部分构成的,这部分就是文件系统。
Data blocks里存储的是文件的内容,文件的内容是以块的形式存储的。
inode里存储的是文件的属性,一个文件有唯一的inode。inode里还存储着一个块数组,这个块数组就是存储文件内容的块,所以只要找到该文件的inode,就可以根据该inode里的块数组找到该文件的内容。
Block Bitmap是干嘛的呢?它利用比特位的位置和块号映射起来,这样就可以表示这个块号是否被用。
inode Bitmap是干嘛的呢?它也是利用比特位的位和inode编号映射起来,那么比特位的内容就可以表示该inode是否是有效的。
其他部分的理解如图所示:
所以我们对于一个文件的增删查改,都是基于这个文件的inode,然后修改这个文件对应的inode bitmap 和 block bitmap里的内容,而不是真正的修改这个文件的内容。
但是存在一个问题,我们是怎么找到这个文件的?
我们原来的理解就是查找文件名字就可以查找到文件,现在理解文件系统,了解到,每个文件都有唯一的indoe编号。是根据inode的编号找到这个文件的。
但是文件的名字并不在inode里面,文件的名字并不属于文件的属性。
那文件的名字和文件的inode之间有什么联系呢?
目录也是文件,它有自己的inode,那么目录的数据块里存放的是什么呢?
目录的数据块里存放的是当前目录下所有文件的:文件名和inode的映射关系。
所以文件的文件名和inode之间存在着映射关系,这层关系存储在当前文件的目录的数据块里。
所以查找一个文件,必须要带有路径。这样目录将文件的文件名和inode映射起来。
所以查找一个文件,首先会先根据这个文件的indoe找到目录的数据块,就找到了文件的名字和inode映射关系。就可以找到文件了。
三.软硬链接
软硬链接是什么呢?
软连接是一个独立的文件,具有唯一的inode,也具有独立的数据块,而它的数据块里存放的是指向链接文件的路径。
就像window下的快捷方式,那些快捷方式并不是真正的程序,而只是一个文件标识。但是这个文件的数据块里存放的是该程序的存放路径。所以点击快捷方式,就可以执行程序。
硬链接不是独立的文件,因为它没有独立的inode,也就是硬链接形成的文件与链接指向的文件的inode一样。本质上就是在特定目录的数据块下新增,文件名和指向文件的inode的映射关系。多个文件名可以同时映射一个inode。
在一个目录文件中,有默认的两个隐藏文件,一个是.一个是…
.表示当前目录,…表示上一级目录。
那…是如何找到上上一级目录的呢?就是因为使用硬链接,…的inode和上一级目录的inode是一样的。.的inode和当前目录的inode是一样的。