您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

硬链接和软链接

时间:2023-07-02 15:52:02  来源:今日头条  作者:漫漫编程路

硬链接(Hard Link)

1. 释义

是对原文件起了一个别名。

2. 特性

(1)硬链接有相同的 inode 及 data block;

(2)只能对已存在的文件进行创建;

(3)不能交叉文件系统进行硬链接的创建;

(4)不能对目录进行创建,只可对文件创建;

(5)删除一个硬链接文件并不影响其他有相同inode号的文件。

3.创建硬链接

ln file link

软链接(Soft Link)

1. 释义

又被叫为符号链接(symbolic Link),它包含了到原文件的路径信息。

2. 特性

(1)软链接有自己的文件属性及权限等;

(2)可对不存在的文件或目录创建软链接;

(3)软链接可交叉文件系统;

(4)软链接可对文件或目录创建;

(5)创建软链接时,链接计数 i_nlink 不会增加;

(6)删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。

3. 创建软链接

ln -s file link

区别

 

硬链接

软链接

本质

是同一个文件

不是同一个文件

跨设备

不支持

支持

inode

相同

不同

链接数

创建新的硬链接,链接数会增加,删除硬链接,链接数减少

 

是不同的文件,无链接数一说

目录

不支持

支持

相对路径

原始文件相对路径是相对于当前工作目录

原始文件的相对路径是相对于链接文件的相对路径

删除源文件

只是链接数减一,但链接文件的访问不受影响

链接文件将无法访问

文件类型

和原文件相同

和原文件无关

文件大小

和原文件相同

原文件的路径的长度

为什么不允许创建指向目录的硬链接?

以下内容翻译自:
http://unix.stackexchange.com/questions/22394/why-hard-links-not-allowed-to-directories-in-unix-linux

1. 从inode角度谈

允许目录的硬链接可能会打破文件系统的有向无环图结构,可能创建目录循环,这可能会导致fsck以及其他一些遍历文件树的软件出错。

首先,要想理解这点必须先了解inode。文件系统中的数据保存在磁盘上的数据块中,而这些数据块由inode集合在一起。可以说inode就是文件,但是inode缺少文件名,所以就需要链接。一个链接其实就是一个指向inode的指针。目录是一个保存着这些链接的inode,目录中的每一个文件名都是一个指向inode的链接。这里提一下,UNIX系统中打开一个文件也会创建一个链接,但是它是不同类型的链接(它不是一个命名链接)。
硬链接只是一个指向inode的额外的目录项,当你使用ls -l命令查看文件时,文件权限后面的数字就是命名连接数。绝大多数文件只有一个链接。创建一个新的硬链接到一个文件会将两个文件名指向同一个inode。

xx@xx:~/test$ touch test
xx@xx:~/test$ ls -l
total 0
-rw-r--r-- 1 long long 0 Apr 16 16:56 test
xx@xx:~/test$ ln test test1
xx@xx:~/test$ ls -l
total 0
-rw-r--r-- 2 xx xx 0 Apr 16 16:56 test
-rw-r--r-- 2 xx xx 0 Apr 16 16:56 test1

现在你可以清楚的看到,其实并没有什么硬链接,一个硬链接和正常的名字是一样的。在上面的例子中,test 和 test1 哪个是原始文件,哪个是硬链接?其实你并不能分辨(忽略时间戳)因为它们都是指向相同内容相同inode的链接。

xx@xx:~/test$ ls -li 
total 0
2114356 -rw-r--r-- 2 xx xx 0 Apr 16 16:56 test
2114356 -rw-r--r-- 2 xx xx 0 Apr 16 16:56 test1

使用ls -li (-i 标志让 ls 将文件的 inode 号显示在第一列)我们可以看到此时 test 和test1 有着相同的inode号。现在,如果你被允许在目录上使用硬链接,文件系统中的不同指针的不同目录项会指向相同的东西。实际上,一个子目录可以指向他的父目录从而创建一个循环。

为什么需要考虑这个循环?因为当你遍历目录树时,你没有办法检测到循环(如果您没有跟踪遍历的inode号)。比如说,你现在在使用du命令,du需要遍历所有的子目录来了解磁盘的使用情况。而du命令如何知道它遇到了个循环?这很容易发生错误。

软链接,亦称符号链接,是一个完全不同的东东,因为它们是一种特殊类型的文件(UNIX文件系统中的文件种类包括:普通文件,目录文件,块特殊文件,字符特殊文件,FIFO,套接字以及符号链接。比如通过 “ ln -s a b ” 创建的软链接,创建软链接之后文件 b 和 a 的 inode 号并不一样,也就是说此时文件 a 和 b 并不是同一文件。 此时文件 b 中存的是文件 a 的路径,当读取 b 时,系统识别出文件 b 是符号链接会自动导向其对应的文件 a。)。注意,一个符号链接可以指向一个不存在的目标,因为他们指向的只是名字而不是直接指向inode。这与硬链接不一样,因为硬链接就表示肯定有文件存在。

那么为什么du可以很轻松的处理符号链接而不能处理硬链接?我们前面讨论过,如果对目录使用硬链接和正常的目录是没有区别的,而软链接是特殊的,可检测的且可跳过的。du注意到一个目录是一个符号链接它会完全跳过它。

xx@xx:~/test$ ln -s  /home/xx/Videos test2
xx@xx:~/test$ ls -l
total 0
-rw-r--r-- 2 xx xx  0 Apr 16 16:56 test
-rw-r--r-- 2 xx xx  0 Apr 16 16:56 test1
lrwxrwxrwx 1 xx xx 17 Apr 16 17:31 test2 -> /home/xx/Videos
xx@xx:~/test$ du -ah 
0	./test
0	./test2
4.0K	.

2. 从挂载点角度谈

从挂载点角度来说,任何目录有且只有一个父目录".."。

pwd的一个方法就是检查设备:"."和".."的inode,如果它们一样,说明你已处于"/"。否则,查找父目录名称并入栈,然后比较"../."和"../..",此后比较"../../.""../../.."...。直到抵达"/"后,开始出栈并打印栈中保存的目录项名称,最后得到当前目录的完整目录名。这个算法依赖于每个目录有且只有一个父目录。

如果对目录的硬链接是允许的,".."该指向多个父目录中的哪个?这是一个“为什么不允许对目录的硬链接”比较令人信服的理由。而目录的软链接不会引发这种问题,如果一个程序需要,它可以通过对路径名进行 lstat() 来检测是否遇到的是符号链接。pwd算法会返回目标目录的正确的路径。

3. 总结

UNIX 文件系统的历史上,对目录的硬链接是可能的。但是这可能会在文件系统树中产生循环,而这会使得遍历文件系统变得混乱(在《Unix高级环境编程》中提到作者Steven在自己的系统上做过实验,结果是:创建目录硬链接后,文件系统变得错误百出)。一个目录甚至可以是自身的父目录,如下图显示,在目录foo中如果创建一个testdir 的硬链接指向 foo 本身,这样一个循环就出现了。

 

现代文件系统一般禁止这些混淆状态,只有根目录保持了特例:根目录是自身的父目录。ls /.. 就是根目录的内容。



Tags:硬链接   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Linux系统中软链接和硬链接
硬链接是指在文件系统中创建一个新的文件名,该文件名指向同一个inode(即文件的实际数据块)。硬链接与原始文件具有相同的inode号,它们共享相同的数据块。当删除原始文件时,硬链接...【详细内容】
2023-11-15  Search: 硬链接  点击:(223)  评论:(0)  加入收藏
硬链接和软链接
硬链接(Hard Link)1. 释义是对原文件起了一个别名。2. 特性(1)硬链接有相同的 inode 及 data block;(2)只能对已存在的文件进行创建;(3)不能交叉文件系统进行硬链接的创建;(4)不能对目录...【详细内容】
2023-07-02  Search: 硬链接  点击:(106)  评论:(0)  加入收藏
Linux 软链接和硬链接区别
软链接就类似快捷方式,或者网页上超级链接:跟原文件一样,也同步更新,但不占空间。如果原文件被删除,那磁盘空间立刻释放(文件真没了),软链接本身不会被删除,但由于指向的文件已经不在...【详细内容】
2022-06-24  Search: 硬链接  点击:(454)  评论:(0)  加入收藏
彻底明白Linux硬链接和软链接
什么是硬链接和软链接,要想知道什么是硬链接和软链接的话,让我带你研究。看完这篇文章,让你彻底明白什么是硬链接,什么是软链接!!!首先,在Linux系统下,有两种链接文件,一种是硬链接(Har...【详细内容】
2022-01-05  Search: 硬链接  点击:(566)  评论:(0)  加入收藏
Linux 软链接和硬链接
在Linux 系统中,链接是一种文件共享的方式,它分为软链接和硬链接,对应的命令是ln什么是软连接软链接又叫符号链接, 它类似于 windows系统中的快捷方式,常用于将目录层次较深的...【详细内容】
2020-10-23  Search: 硬链接  点击:(376)  评论:(0)  加入收藏
Linux 中软链接和硬链接的区别
链接(Link)是一种快捷访问机制,它通过一个文件指向原始文件或目录的方式实现快捷访问,同时还记录了原始文件或目录的一些信息。 来源:https://linux.cn/article-12270-1.html 作...【详细内容】
2020-06-02  Search: 硬链接  点击:(300)  评论:(0)  加入收藏
Linux的硬链接和软链接到底有什么区别?
简介我们现代的操作系统需要防止程序崩溃导致信息丢失,需要将信息存储在文件之中。而且文件能够被多个进程同时读取。在Linux中所以的资源,外设都抽象成了文件,所以就有了Linux...【详细内容】
2019-06-20  Search: 硬链接  点击:(1209)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(6)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(13)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(9)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(11)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(9)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(6)  评论:(0)  加入收藏
站内最新
站内热门
站内头条