Linux文件系统
文件结构
- 我相信很多人都听过这么一句话:Linux下一切皆文件。
- 其实这是UNIX哲学的一个体现,而Linux是重写UNIX而来,所以这个概念也就传承了下来。在UNIX系统中,把一切资源都看作是文件,包括硬件设备,其实就是为了方便管理。UNIX系统把每个硬件都看成是一个文件,通常称为设备文件,这样用户就可以用读写文件的方式实现对硬件的访问。
- 我们来看看Linux下文件的结构:
文件存储
- 接触了Linux的同学应该都知道Linux下有一个基础命令叫
ls - l
没有接触也没关系,可以参考博客:Linux基础命令详解 有Linux大部分的基础命令的使用详解。 - 下面我们来执行一下该命令,接着分析以下一个存储一个文件应该存储一些什么数据。
- 我们还可以通过
stat
命令来查看文件相关信息,这里我们也看一下
看了那么多文件的信息,其实这些文件信息可以大体分为两类:文件属性 和 文件内容,另外我们都知道文件最后都是要存储在磁盘上的,那这些文件都是怎么在磁盘上存储的呢,这就是我们今天博客的重点了
磁盘结构
硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片,不同容量硬盘的盘片数不等。每个盘片有两面,都可记录信息。盘片被分成许多扇形的区域,每个区域叫一个扇区,每个扇区可存储128×2的N次方(N=0.1.2.3)字节信息。在DOS中每扇区是128×2的2次方=512字节,盘片表面上以盘片中心为圆心,不同半径的同心圆称为磁道。硬盘中,不同盘片相同半径的磁道所组成的圆柱称为柱面。磁道与柱面都是表示不同半径的圆,在许多场合,磁道和柱面可以互换使用,我们知道,每个磁盘有两个面,每个面都有一个磁头,习惯用磁头号来区分。扇区,磁道(或柱面)和磁头数构成了硬盘结构的基本参数。
总结一下要点:
- (1)硬盘有数个盘片,每盘片两个面,每个面一个磁头
- (2)盘片被划分为多个扇形区域即扇区
- (3)同一盘片不同半径的同心圆为磁道
- (4)不同盘片相同半径构成的圆柱面即柱面
- (5)公式: 存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数
- (6)信息记录可表示为:××磁道(柱面),××磁头,××扇区
那了解了硬盘之后,我们来想象一下,就是文件在存储在磁盘上时,其实是将磁道看成一个线性结构来进行管理的,我们可以将下图看成是一个拉直之后的磁道:
Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的。
- Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。政府管理各区的例子
- 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了
- GDT(Group Descriptor Table):块组描述符,描述块组属性信息,有兴趣的同学可以在了解一下
- 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用
- inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。
- inode节点表(inode Table):存放文件属性 如 文件大小,所有者,最近修改时间等
- 数据区(Data blocks):存放文件内容
将属性和数据分开存放的想法看起来很简单,但实际上是如何工作的呢?我们通过touch一个新文件来看看如何工作。
我们将上图简化一下,这样更能说明问题:
创建一个新文件主要有一下4个操作:
- 存储属性
内核先找到一个空闲的i节点,通过inode Bitmap为0的位置即为空(这里是263466),内核把文件信息记录到其中。 - 存储数据
该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。 - 记录分配情况
文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。 - 添加文件名到目录
理解链接
我们知道文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。
- 用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;
- 元数据,则是文件的附加属性,如文件大小、创建时间、所有者等信息。
在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。为方便读者理解,我们这里画一个图来展示了程序通过文件名获取文件内容的过程。
理解硬链接
我们看到,真正找到磁盘上文件的并不是文件名,而是inode。 其实在linux中可以让多个文件名对应于同一个inode。 由于硬链接是有着相同 inode 号仅文件名不同的文件,因此硬链接存在以下几点特性:
- 文件有相同的 inode 及 data block;
- 只能对已存在的文件进行创建;
- 不能交叉文件系统进行硬链接的创建;
- 不能对目录进行创建,只可对文件创建;
- 删除一个硬链接文件并不影响其他有相同 inode 号的文件。
举个栗子
- abc和def的链接状态完全相同,连二者的inode号都是一模一样的,所以说def不能称得上是一个文件,因此他们被称为指向文件的硬链接。内核记录了这个链接数,inode17353854 的硬链接数为2。
- 我们在删除文件时干了两件事情:1.在目录中将对应的记录删除,2.将硬连接数-1,如果为0,则将对应的磁盘释放。
软链接
软链接与硬链接不同,若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块。因此软链接的创建与使用没有类似硬链接的诸多限制:
- 软链接有自己的文件属性及权限等;
- 可对不存在的文件或目录创建软链接;
- 软链接可交叉文件系统;
- 软链接可对文件或目录创建;
- 创建软链接时,链接计数 i_nlink 不会增加;
- 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。
一样,举个栗子
其实简单的来说,文件的软链接就像是我们在Windows系统下创建的快捷方式,在Windows系统下可能某个软件执行文件放在某个文件中比较深的位置,我们不好找,此时创建一个快捷方式,就像我们在Linux系统下为某个文件创建一个软链接是一样的。