加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱资讯网 (https://www.52junxun.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux系统中“软链接”和“硬链接”的区别

发布时间:2022-10-14 10:53:50 所属栏目:Linux 来源:
导读:  我们知道文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性
  我们知道文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。
 
  在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。而有一种方法可以快速的寻找到数据元,那就是软硬链接,让我们一起来看一下吧。
 
  什么是链接?
 
  链接简单说实际上是一种文件共享的方式,是 POSIX 中的概念,主流文件系统都支持链接文件。
 
  它是用来干什么的?
 
  你可以将链接简单地理解为 Windows 中常见的快捷方式(或是 OS X 中的替身),Linux 中常用它来解决一些库版本的问题,通常也会将一些目录层次较深的文件链接到一个更易访问的目录中。在这些用途上,我们通常会使用到软链接(也称符号链接)。
 
  软链接和硬链接的区别是?
 
  首先,从使用的角度讲,两者没有任何区别,都与正常的文件访问方式一样,支持读写,如果是可执行文件的话也可以直接执行。那区别在哪呢?在底层的原理上。为了解释清楚,我们首先在自己的一个工作目录下创建一个文件,然后对这个文件进行链接的创建:
 
  $?touch?myfile?&&?echo?"This?is?a?plain?text?file."?>?myfile
  $?cat?myfile
  This?is?a?plain?text?file.
  现在我们创建了一个普通地不能再普通的文件了。然后我们对它创建一个硬链接,并查看一下当前目录:
 
  $?ln?myfile?hard
  $?ls?-li
  25869085?-rw-r--r--?2?unixzii?staff?27?7?8?17:39?hard
  25869085?-rw-r--r--?2?unixzii?staff?27?7?8?17:39?myfile
  在 ls 结果的最左边一列,是文件的 inode 值,你可以简单把它想成 C 语言中的指针。它指向了物理硬盘的一个区块,事实上文件系统会维护一个引用计数,只要有文件指向这个区块,它就不会从硬盘上消失。你也看到了,这两个文件就如同一个文件一样,inode 值相同,都指向同一个区块。
 
  然后我们修改一下刚才创建的 hard 链接文件:
 
  $?echo?"New?line"?>>?hard
  $?cat?myfile
  This?is?a?plain?text?file.
  New?line
  可以看到linux软链接,这两个文件果真就是一个文件。下面我们看看软链接(也就是符号链接)和它有什么区别。
 
  $?ln?-s?myfile?soft
  $?ls?-li
  25869085?-rw-r--r--?2?unixzii?staff?36?7?8?17:45?hard
  25869085?-rw-r--r--?2?unixzii?staff?36?7?8?17:45?myfile
  25869216?lrwxr-xr-x?1?unixzii?staff?6?7?8?17:47?soft?->?myfile
  诶,你会发现,这个软链接的 inode 竟然不一样啊,并且它的文件属性上也有一个 l 的 flag,这就说明它与之前我们创建的两个文件根本不是一个类型。
 
  下面我们试着删除 myfile 文件,然后分别输出软硬链接的文件内容:
 
  $?rm?myfile
  $?cat?hard
  This?is?a?plain?text?file.
  New?line
  $?cat?soft
  cat:?soft:?No?such?file?or?directory
  之前的硬链接没有丝毫地影响,因为它 inode 所指向的区块由于有一个硬链接在指向它,所以这个区块仍然有效,并且可以访问到。然而软链接的 inode 所指向的内容实际上是保存了一个绝对路径,当用户访问这个文件时,系统会自动将其替换成其所指的文件路径,然而这个文件已经被删除了,所以自然就会显示无法找到该文件了。
 
  为验证这一猜想,我们再向这个软链接写点东西:
 
  $?echo?"Something"?>>?soft
  $?ls
  hard?myfile?soft
  可以看到,刚才删除的 myfile 文件竟然又出现了!这就说明,当我们写入访问软链接时,系统自动将其路径替换为其所代表的绝对路径,并直接访问那个路径了。
 
  $?echo?"Something"?gtgt?soft$?lshard?myfile?soft
  可以看到,刚才删除的 myfile 文件竟然又出现了!这就说明,当我们写入访问软链接时,系统自动将其路径替换为其所代表的绝对路径,并直接访问那个路径了。
 
  到这里我们其实可以总结一下了:
 
  硬链接:与普通文件没什么不同,inode 都指向同一个文件在硬盘中的区块
 
  软链接:保存了其代表的文件的绝对路径,是另外一种文件,在硬盘上有独立的区块,访问时替换自身路径。
 

(编辑:我爱资讯网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!