天天看点

理解文件系统----inode与软硬链接

在之前一篇文章里,我们讲了文件的部分属性,现在我们来了解一下文件系统。

​​点击打开链接​​

一、inode

1、什么是inode

理解inode,要从文件存储说起。

文件储存在硬盘上,硬盘的最小存储单位叫做“扇区“(Sector),每个扇区储存512字节,操作系统读取硬盘的时候,不是一个一个扇区读取的,而是一次性读取多个扇区,即一次性读取一个块(block)。

这种由多个扇区组成的块,是文件存取的最小单位。

而储存一个文件,我们应该保存其内容和属性。

文件数据都存储在块中,很显然,我们必须找到一个地方储存文件的属性,比如文件的创建者、创建日期、大小等,这种存储文件属性的区域就叫inode。

2、inode的内容

inode包含文件的属性,有下列内容:

文件的字节数

文件拥有者的User ID

文件的Group ID

文件的时间戳,包含ctime(inode上一次变动的时间)、mtime(文件内容上次变动的时间)、atime(文件上次打开的时间)

链接数(下面会介绍)

文件数据block的位置

我们可以用一个命令stat,查看文件,如下图:

理解文件系统----inode与软硬链接

3、inode的结构

当文件系统创建完成之后,会在整个元数据区域为每一个

inode

创建一个位图(

bitmap

)区域。每一个

inode

都在

bitmap

中占据一位。已使用的

inode

,其标志位置为

1

,未使用的

inode

,其标志位置为

当我们需要找一个空闲的

inode

时,只需要扫描一下

bitmap

。同理数据区也是用

bitmap

来管理

block

。前者称为节点位图,后者称为块位图。

同理:

删除文件时只需要在节点位图中把文件对应的inode标记为0就可以了,所以在Linux系统删文件是特别快的哦!

当要统计硬盘已使用空间时,扫描节点位图中inode标志位为1的文件占多少个block,然后乘以每个block的大小就可以了。

为什么删除了的文件能找回来?

是因为数据在block中没有动,只是把block对应的块位图标记为0。当我们在存新的文件进来时,就把块位图标志位为0的block覆盖掉。这也就是为什么当我们删除了文件,如果添加好多新的文件进来后就不容易找回旧文件的原因。

块位图标记为0后,块位图对应的inode也要标记为0。

这个inode以后也可以被其他文件所使用了。

4、创建一个新文件

当创建一个新文件时,会发生什么?

用ls -i 可以查看文件名对应的inode号码

理解文件系统----inode与软硬链接

可以看出file4的inode的inode号是926742,那么建立一个新文件是如何将属性与内容分开的呢?

理解文件系统----inode与软硬链接

所以,创建一个新文件的操作:

(1)存储属性

内核先找到一个空闲的i节点(上例中是926742),内核把文件信息记录在其中。

(2)存储数据

该文件需要存储在三个磁盘块,内核找到三个空闲块,将内核缓冲区的数据依次复制。

(3)记录分配情况

文件内容按顺序300,500,800存放,内核在inode的磁盘分区记录上述块链表。

(4)添加文件名到目录

新的文件名为file4,内核将入口(926742,file4)添加到目录文件。文件名和inode的对应关系将文件名的内容和属性连接起来。

注意:每个文件都

有自己的编号,inode,且一个文件只有一个inode

5、目录文件

注意目录也是文件,不过目录的数据区存放的是目录下的文件名及该文件的inode的对应关系。

二、硬链接

经过上面的学习,我们知道,真正找到磁盘上文件的并不是文件名,而是inode。

其实在Linux中可以让多个文件名对应同一个inode。

这就意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响所有的文件名;删除一个文件名,不影响另一个文件名的访问。

这就称为硬链接。

ln命令可以用来创建硬链接:

理解文件系统----inode与软硬链接

可以发现,file1与h_file1的inode一样,且链接数(记录指向该inode的文件名总数)增加了1,变成了2。

我们来看一下修改其中一个文件时另一个的变化:

理解文件系统----inode与软硬链接

上图中,我们先将"hello world"写入了file1中,用cat查看h_file1,发现内容一致。

接下来,修改了file1的权限,h_file1也相应发生了变化。

都可以证明它们其实是同一文件,和我们之前接触的引用计数很像,回忆一下引用计数的删除,硬链接也遵守这个规则。

若删除一个文件名,inode节点的链接数就会减一,当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode,以及所对应的block区域,如下,链接数变为1。

理解文件系统----inode与软硬链接

注:对于目录的链接数,由于目录创建时会自动生成两个目录项"."和"..",前者的inode号码就是当前目录文件的inode号码,相当于当前目录的硬链接,那么后者就是父目录的inode,等同于父目录的硬链接。

所以,任何一个目录文件的链接数,总是等于2加上它的子目录总数(包括隐藏目录),这里的2指的是父目录对其的硬链接和当前目录的硬链接:

理解文件系统----inode与软硬链接

三、软链接

有一种情况,文件1与文件2,虽然inode号码不一样,但文件1的内容是文件2的路径。读取文件1时,系统会自动将访问者导向2。也就是说,不管打开哪一个文件,最终读取的都是文件2。这时,文件1就称为文件2的软链接。

这就意味着,文件1是依赖文件2存在的,如果删除了文件2,打开文件1就会报错,找不到文件2,可以理解为文件1

存放的是如何找到file2,和Windows的快捷方式特别像。所以它们都

有自己的inode:如下图,

创建软链接:

理解文件系统----inode与软硬链接

s_file2是file2的软链接,可以看出inode是不一样的。

给file2写入hello world,查看s_file2:

理解文件系统----inode与软硬链接

那么删除呢?

理解文件系统----inode与软硬链接