搞懂Linux的硬链接

前言:

硬链接:nlink,是一个数值,表示有多少个目录项指向自己。
首先说下Linux的文件系统结构:
在这里插入图片描述
  i节点即i-node,包含了文件的各种信息,也是命令stat(查看i-node信息)数据的来源。文件的真实数据存储在后面的数据块中。
  数据块包含的是,文件内容信息和目录信息。要明确的是i节点不只是一个文件特有的,一个文件夹也有对应的i节点,指向数据块中的目录项。
  下面是详细的i节点和数据块的结构。比如说当前目录下有.txt文件,那我这个i节点直接指向数据块(里面存储的是文件内容)。如果当前目录下有个文件夹,那它是个木留项。这个文件夹的i节点指向目录块,这个目录块中包含当前目录下的所有文件,这些文件项按照以下形式又返回去指向自己对应的i节点。
在这里插入图片描述

核心:

  这个不是说硬链接吗? 感觉逐渐偏题?

  不然。前面是理解硬链接必备的,硬链接的数值就是指向自己i节点的目录块的个数。上图可以看见有一个i节点被指向了两次,那硬链接就是2。
  给你一个场景,1267是一个文件夹,文件夹下包含了2549对应的文件夹,看下图。
说明下:创建一个文件夹之后,会自动生成两个文件项,.和…表示当前目录和父目录。当前目录指向自己目录下的文件,…指向包含自己的文件,这也就是我们为什么cd…退回上一个目录。
在这里插入图片描述
  关于如何验证,我们可以采用stat命令查看inode节点信息。
在这里插入图片描述  硬链为2,这个t是个文件夹,什么都没有包含。为什么是2,你细品。
  t节点指向了一个目录块,.目录项指回来,这是一个。还有就是父目录的目录块中有test,要指回来,这又是一个,所以是2。如果我们在test文件夹中再创建一个file.txt文件,链接数是不会变的,只是在t目录块中增加了一个指向file.txt的目录项。
  既然如此,如果是txt文件,链接数就是1,因为当前目录目录项中有它,指向了它。如图所示:
在这里插入图片描述

总结:

  主要从三个图,理解目录块和文件块。有很多书上说删除一个文件其实并不是真正删除了,而是nlink的值–,减到0删除,确实如此。其实道理是一样的,你删除了就一定会减到0,然后就会让他删除。
  普通文件如txt什么的本身就是1,删除了直接就没了。文件夹删除之后,父目录nlink也会减1,因为…的缘故。
  理解可能存在偏差,欢迎讨论。

发布了62 篇原创文章 · 获赞 83 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_41033366/article/details/104593422