inode结构详解(深层次理解拷贝,删除,移动的本质)以及硬链接和软链接的区别(图文)

为什么要有inode

       信息是存储在硬盘上的,当我们访问文件系统的时候,实际上是按照硬盘上的磁道不断进行读取的。硬盘上是分块存储的,现在我们假定,有一个文件a是动态扩展的,一开始存在块1,然后文件b比较大,存储的时候占用了个4块(即块2-5),当a不断增长,仅有块1已经不足以满足我们的需求了,a需要的就是块1,块6等,也就是文件a的存储不一定是连续的。磁盘结构如下inode结构详解(深层次理解拷贝,删除,移动的本质)以及硬链接和软链接的区别(图文)

inode结构详解(深层次理解拷贝,删除,移动的本质)以及硬链接和软链接的区别(图文)

        假设现在文件a的存储占用了块1和块10,其他位置的块都被占用了,不久后,块5被重置为空闲,那么a在动态增长的过程中,文件a会继续占用块5,也就是说会出现先访问块1,再访问块10,然后再访问块5这样的逻辑顺序。而实际上,磁盘在读取时,是按照磁道顺序读的(假设块1-5在同一个磁道,叫做磁道1,而块10恰好在第二个磁道,叫做磁道2),那么在访问文件a的时候会出现一种很尴尬的情况,就是磁头需要先跳到磁道2,然后再跳到磁道1,这样效率很低,如果磁头在扫描磁道1的时候能直接访问块5就好了。也就是说,如果一开始我们就知道这个文件就存到了哪几个块就好了。这就引出了inode,一个文件对应一个inode,而通过inode我们能知道很多信息。

Inode的表结构


inode结构详解(深层次理解拷贝,删除,移动的本质)以及硬链接和软链接的区别(图文)

       从这个表结构中我们能够看到inode的一个重要功能就是指针,指向文件所存储的块,而且inode不仅自身有指针,他所指向的block数据块也存储的有指针,这样我们就能够单单通过inode知道该文件所存储的位置。

目录和文件的关系

         首先我们知道文件里面存储的有数据和元数据,那么问题来了,文件名既不属于文件的数据,也不属于文件的元数据,那么文件名在哪里存放着呢?在linux中,处处皆文件,那么目录也是文件,目录自然也有数据,文件名就存放在目录中,文件名和Inode号构成的映射表就是目录的数据。也就是说在实际存储中,目录和目录下的文件是同级的,二者都是存储在硬盘上的普通数据,不过由于目录中的数据是Inode Table表,我们能从这个入口对其目录下的文件进行操作,这就是目录和文件的真实关系。

inode结构详解(深层次理解拷贝,删除,移动的本质)以及硬链接和软链接的区别(图文)

深层次理解拷贝,删除和移动

         拷贝时,若目的文件存在,则是将源文件的内容覆盖目的文件的内容,文件的内容改变,其他不变。若目的文件不存在的时候,实际上是重新创立了一个文件,也就是说,给新文件分配了空闲的inode号和空闲的数据块,拷贝数据到这个新文件中。

         删除,删除的实质就是删除硬链接(硬链接解释见下)的数目,当硬链接的数目减少至0时就会将inode块和block块都置为空闲,注意,此处是都置为空闲,不是清空,也就是说,所谓的被删除实际上就是把他的block块和inode块都标记为空闲,内容并没有消失,当这些块重新被占用时,会覆盖以往内容。

,这就是为什么会存在数据恢复这一说法。因为你本来就没有把数据删除掉哇。

         移动,移动并不一定是把整个数据块从这个地方移动到另一个区域。同分区的移动,实际上是删除原有硬链接,并重新加上一个硬链接的过程;跨分区的移动,实际上是产生新的文件,并复制其内容,而原本的内容不会消失,只会删除他的硬链接,当数据块重新被占用时会被覆盖。    

硬链接和软链接

         软链接其实就是路径,一般来说都是相对路径,当然用绝对路径也可以实现,如果要我打个比方的话,那么软链接就好像我们windows系统中的快捷方式,一个指针,本身并不存储任何实际的内容,只是单纯的记录下了到达另一个文件的路径。

         硬链接是在不同目录下引用同一个文件,同一个数据区,同一个inode号,其到达的路径和文件的名称可能不同,单是本质是一样的,不会发生改变的。举个例子,家里有条狗我有时候叫它二狗子,有时候叫它狗娃子,但无论我怎么叫它都不会改变它的本质,当我敲打狗的时候,二狗子和狗娃子都会感觉到疼痛。同理,当我修改硬链接下的文件的时候,与该文件i节点号相同的文件都会变化,牵一发而动全身。其实最好的理解就是,硬链接只是一个不同的名字,其本质仍是一个东西。