百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

硬链接和软链接 硬链接和软链接的优缺点

sinye56 2024-12-15 16:36 11 浏览 0 评论

硬链接(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 /.. 就是根目录的内容。

相关推荐

一个不错的软件版本命名规范!

之前写了一篇如何自动生成版本号的文章,《让你的C程序,自动打印版本信息》初衷是让自己的程序在运行时自动打印与版本相关的信息,避免测试时因为版本信息不确定导致的一些功能对应不上去的问题,当时留了一个坑,...

国产操作系统迎来发展风口 公务领域更能培育起Linux生态

谷歌和微软在俄罗斯市场的一番套路猛如虎,就让我们深刻地意识到了,只有自己的东西才能靠得住。也由此,国内操作系统发展迎来了发展风口。我就看到有朋友就秀出了他们单位采购的纯国产的主机,一款华为的主机,纯国...

5个大有“前途”的Linux桌面发行版本

ZD至顶网CIO与应用频道08月27日专栏:Linux无处不在。你的服务器里,你的电话、汽车、手表、烤面包机、冰箱……和台式机里都有Linux的身影。虽然在桌面上见到Linux的用户比在自动调温...

Linux 常用应用软件大全

编译自:https://www.fossmint.com/most-used-linux-applications/作者:MartinsD.Okoi译者:HankChow对于许多应用程序...

Linux 4.1 系列的最大版本 4.1.18 LTS发布,带来大量修改

(LCTT译注:这是一则过期的消息,但是为了披露更新内容,还是发布出来给大家参考)著名的内核维护者GregKroah-Hartman貌似正在度假中,因为SashaLevin2016年2月16日的...

Linux发行版需要杀软吗?卡巴斯基推出免费KVRT病毒扫描清理工具

IT之家6月4日消息,你认为使用Linux发行版,需要杀毒软件吗?或许很多用户认为Linux发行版偏小众,因此受到黑客攻击的风险也相对较小,不过卡巴斯基并不这么认为,近期推出了适用于...

适合开发人员的 5款 Linux 发行版

什么是Linux?Linux是基于Unix的操作系统。由LinusTorvalds开发于1991年首次发布其内核。因为Linux是开源软件,其发行版由不同组织发布,因此不同的发行版具有不同的风格...

VMware Workstation 17.0 Pro 发布:新增 TPM 2.0 完美兼容Win11

IT之家11月18日消息,VMwareWorkstation17.0Pro现已发布,它带来了许多新特性,例如微软Windows11硬性要求:虚拟可信平台模块(TPM)2.0。...

你是否需要一个容器专用的Linux发行版本?

单单使用容器是不够的,提供商们认为你需要一个容器专用的Linux发行版本。我们可以让容器在不同的操作系统上运行,不同的操作系统都有自己的虚拟化服务,如:SolarisZones、BSDJails、...

Tizen 3.0版本发布 采用Linux 4.1内核

2015-09-2111:31:39作者:马荣【中关村在线软件资讯】9月21日消息:尽管三星靠着Android系统设备在移动市场赚钱,但是仍然没有忘记自家的Tizen开发。现在Tizen3.0版...

欧拉操作系统演进:应用累计超130万套 支持鲲鹏、英特尔、飞腾等芯片

21世纪经济报道记者倪雨晴深圳报道4月15日,在欧拉开发者大会(openEulerDeveloperDay2022)的主论坛上,欧拉首个数字基础设施全场景长周期版openEuler22.03...

Papyros:以Material Design为灵感的Linux发行版本

项目团队并不希望只是采用传统的桌面主题,而是致敬谷歌Android系统的MaterialDesign设计语言想要打造出某些不同以往足够吸引用户的Linux发行版本,自然该版本还在不断的更新和改进中,...

比特网早报:全国空间计量技术委员会成立,银河麒麟操作系统上架微信Linux4.0.0版本

2024年11月6日消息,昨夜今晨,科技圈都发生了哪些大事?行业大咖抛出了哪些新的观点?比特网为您带来值得关注的科技资讯:全国空间计量技术委员会在北京成立近日,经市场监管总局批准,全国空间计量技术委员...

2024年最稳定的5个Linux发行版,赶紧收藏!

Linux是最流行的免费开源平台之一。Linux已被广泛使用,因为它安全、可扩展和灵活。Linux发行版收集开源代码,对其进行编译,并将其组合成一个可以轻松启动和安装的操作系统。它们还提供不同的...

彰显Linux生态繁华,Ubuntu、Fedora等四发行版同时发布新版本

上周对于开源社区来说是忙碌的一周。EndeavourOS和TrueNASScale于周二(4月16日)发布,Fedora于周三(4月17日)发布,Ubuntu于周四(4月18日)发布。四个新版本中都...

取消回复欢迎 发表评论: