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


​​点击打开链接​​


一、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 ,其标志位置为 0 。


当我们需要找一个空闲的 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与软硬链接_inode_02


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


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


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


(1)存储属性



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


(2)存储数据



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


(3)记录分配情况



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


(4)添加文件名到目录



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


注意:每个文件都 有自己的编号,inode,且一个文件只有一个inode


5、目录文件



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


二、硬链接



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


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


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


这就称为硬链接。


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



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



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



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



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


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



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


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



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


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


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


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


理解文件系统----inode与软硬链接_位图_07




三、软链接



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




这就意味着,文件1是依赖文件2存在的,如果删除了文件2,打开文件1就会报错,找不到文件2,可以理解为文件1 存放的是如何找到file2,和Windows的快捷方式特别像。所以它们都 有自己的inode:如下图,


创建软链接:



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



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



给file2写入hello world,查看s_file2:



理解文件系统----inode与软硬链接_位图_09




那么删除呢?



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


再次创建,试一下删除file2会不会报错:


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