硬连接和软连接的区别

简述

我们都知道,在linux系统中,本质上是通过inode(index node)来对文件进行访问(或者说数据控制)的。linux的人性化设置,使得平时我们可以通过文件名来访问文件。其实吧,不是一般性的说,文件名,就是inode的别名。


认识目录项,inode以及block

这里有几个简单的知识点:

  1. 一个文件可以被存储在一个或者多个block中;
  2. 每个文件都会并且只能占用一个inode,inode可以指向该文件所在的block,inode中还存储该文件的各种属性,如rwx...;
  3. 想读取该文件,必须经过目录项的文件名来指向到正确的inode号码才能读取。

看到这里,该提出两个问题了:

  1. 什么是目录项?当新建一个目录时,文件系统会分配一个inode和至少一块block给该目录。其中,inode记录该目录的相关权限和属性,并记录分配到的那块block号码。而block则是记录在这个目录下的文件名和这些文件名所对应的inode号码数据,这就是我们所说的数据项
  2. 当几个不同文件名,指向同一个inode号码时,会发生什么事?这就引出了我们要说的内容了,硬连接(hard link)和软连接(symbolic link).
    这幅图可以完美说明这一切:

    为了应题,我把目录项的内容用红色框框出来了。其余那些文件属性是在文件inode中读取出来的。

过程我简单描述一下(这是我个人理解,还有很多细节没写)
系统通过挂载信息找到"/" --> 目录项inode --> 目录项block(block中存有文件名和文件对用的inode,如上图中的python对应inode号码1165874) --> 找到文件inode,验证文件权限和属性 --> 访问文件block(block里存有文件数据)。


硬连接和软连接

其实,硬连接和软连接的区别很简单的,下图可以清晰说明了:

可以很清楚看到,文件名pythonpython2.4的inode是一样的,而且,在蓝色框那里,它们对应的数字都是2(这个2就是连接数)。没错,这就是硬连接
剩下的便是python2 -> python了,它的连接数为1,同时它的inode不同于其他的,但它指向了python,也就是说,inode号码1156324指向了一个block,这个block内存有找到inode号码1165874的信息,这便是软连接,有很多人都说它就像windows上的快捷方式。


硬连接的限制

其他关于硬连接和软连接的,网上一大把了。这里我再说一下硬连接的两个主要限制:

  1. 不能跨文件系统。由于指向的是同一个inode,不同文件系统对inode的定义也不同。
  2. 不能连接到目录。如果你为/etc创建一个硬连接/etc_hard,那么,/etc文件下的所有文件名也要同/etc_hard创建硬连接。每次修改/etc,系统也要修改/etc_hard.这样,会造成很大的系统开销。所以,目前还没实现对目录进行硬连接。

版权声明:保留所有权,转载需声明出处。


posted @   busui  阅读(11562)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示