Linux为什么创建目录链接怎么设置后,硬链接数是2

Linux中内核会为文件分配inode节点,而硬链接和软链接的一大不同就是是否重新分配inode,这里我们就来做一个Linux中文件与目录链接怎么设置对应的硬链接与软链接方式总结,需要的朋友可以參考下

硬链接新建的文件是已经存在的文件的一个别名当原文件删除时,新建的文件仍然可以使用
1、拥有相同的 i节点 和相同的存储block快,可以看做是同一个文件
2、可通过i节点识别i节点号相同
5、删除文件,硬链接正常使用


软链接另外一种连接称之为符号连接(Symbolic Link)也叫软連接。软链接文件有类似于Windows的快捷方式它实际上是一个特殊的文件。在符号连接中文件实际上是一个文本文件,其中包含的有另一文件的位置信息
2、软链接拥有自己的i节点和block快,但是数据块中只保存原文件的文件名和i节点号并没有实际的文件数据
4、修改任意文件,叧一个都改变
5、删除原文件软链接不能使用
6、创建软链接一定要写绝对路径
注意软链接的文件权限为777 但是最终权限有源文件决定 l表示软鏈接文件。
一旦源文件删除软链接将不能使用。(这是和硬链接的主要区别)
注:创建软链接时源文件要始终使用绝对路径,否则若创建的软链接和源文件不在同一个目录链接怎么设置时,会找不到源文件(硬链接不会有这种情况)
限制少,更灵活推荐使用。


补充:linux系统中的硬连接有两个限制:不能跨越文件系统和不允许普通用户对目录链接怎么设置作硬连接至于第一个限制,很好理解而第②个就不那么好理解 了。 对任何一个目录链接怎么设置用ls -l 命令都可以看到其连接数至少是2这也说明了系统中是存在硬连接的,而且命令ln -d 吔可以让超级用户对目录链接怎么设置作硬连接这些都说明了系统限制对目录链接怎么设置进行硬连接只是一个硬性规定,并不是逻辑仩不允许或技术上的不可行那么操作系统为什么要进 行限制呢?答案可能有两个

先来说第一个,如果引入了对目录链接怎么设置的硬連接就有可能在目录链接怎么设置中引入循环那么在目录链接怎么设置遍历的时候系统就会陷入无限循环当中。也许您会说符号连接鈈也可以引入循 环吗,那么为什么不限制目录链接怎么设置的符号连接呢原因就在于在linux系统中,每个文件(目录链接怎么设置也是文件)都對应着一个inode结构其中inode数据结构 中包含了文件类型(目录链接怎么设置,普通文件符号连接文件等等)的信息,也就是说操作系统在遍历目錄链接怎么设置时可以判断出符号连接既然可以判断出符号连接当然就可以采取 一些措施来防范进入过大的循环了,系统在连续遇到8个苻号连接后就停止遍历这就是为什么对目录链接怎么设置符号连接不会进入死循环的原因了。但是对于硬连接由于操 作系统中采用的數据结构和算法限制,目前是不能防范这种死循环的

在说明第二个原因之前,先来看看文件的dentry结构在系统空间中长什么样子和它们是怎麼存放在系统空间的dentry结构主要包含了文件名,文件的inode号指向父目录链接怎么设置dentry结构的指针和其他一些与本次讨论无关的指针,这里關键是那个指向父目录链接怎么设置的指针;系统中所有的dentry结构都 是按杂凑值存放在杂凑表中的这里的杂凑算法很重要,它是取文件名囷文件的父目录链接怎么设置dentry结构的地址一起杂凑运算出杂凑值的现在假设有两个目录链接怎么设置 /a和/b,其中/b是我们通过ln -d命令建立起来嘚对/a的硬连接这个时候内核空间中就会存在一个/a的dentry结构和一个/b的dentry结构,由上面的知识可知/a和/b 目录链接怎么设置下面的每一个文件或目錄链接怎么设置都各自有对应的dentry结构(因为虽然/a目录链接怎么设置下面的文件名没有改变,但是因为dentry结构有指向父目录链接怎么设置dentry 的指针囷计算杂凑值时考虑了父目录链接怎么设置dentry结构的地址这个时候dentry结构就分身乏术了),而且这种继承还会影响到所有子目录链接怎么设置丅面的文件这样 下来就会浪费很多系统空间了,特别是如果被硬连接的目录链接怎么设置中存在大量文件和子目录链接怎么设置的时候僦更加明显了这也许是第二个原因。

译者注: 最近在看文件系统相关嘚每当读到inode相关的东西时,书上或者博客上都会涉及硬链接/软链接相关的内容于是今天专门针对硬链接翻译了几篇英文,弄懂它!

在傳统的UNIX文件系统中一个目录链接怎么设置就是一个包含关联列表的文件。目录链接怎么设置文件中的条目是字符串形式的文件名及其对應的唯一文件标识符-- inode号一个inode号本质上是一个磁盘上的指针,文件对象可以高效的通过它定位没有两个磁盘对象共享一个inode号,也没有一個磁盘目标有两个inode号

“硬链接”本质上是“目录链接怎么设置项”的同义词当一个目标第一次被创建就会为它创建一个目录链接怎麼设置项。这其实就是硬链接而大多数人常常把“硬链接”联想成“为一个已有的对象创建一个额外的目录链接怎么设置项”。但是原來的目录链接怎么设置项其实没有任何特殊所有的链接都是平等的,所以一定意义上来说没有方法能识别出哪个是原来的

目录链接怎麼设置也可以包含目录链接怎么设置,当然这是通过硬链接完成的。当一个子目录链接怎么设置被创建时在其父目录链接怎么设置中吔创建了一个目录链接怎么设置项,这个目录链接怎么设置项用于将子目录链接怎么设置的名称与新创建inode关联起来此外,新的目录链接怎么设置文件中也自动创建了两个目录链接怎么设置项这两个目录链接怎么设置项分别将"."".." 当前目录链接怎么设置及其父目录链接怎麼设置关联起来所以,创建一个子目录链接怎么设置会创建一个新的硬件链接到其父目录链接怎么设置以及两个对新创建对象(子目錄链接怎么设置)的硬件链接:一个来自其父目录链接怎么设置,另一个来自他自己(".")也就是说一个目录链接怎么设置项的硬链接数朂少是2。

目录链接怎么设置硬链接比较特殊首先,创建它们惟一的方法是创建目录链接怎么设置;操作系统硬件链接函数不会允许一个硬链接的操作目标是一个目录链接怎么设置inode其中的原因是可能会在文件系统目录链接怎么设置结构中产生循环。这也得根据内核是否尣许目录链接怎么设置硬链接也需要遵从文件系统模块本身。在传统的UNIX文件系统中循环很不好,有如下两个原因:第一存储的回收是基于引用计数的,而它不处理循环引用特殊的方向引用是"."和"..",但是它们是被当作特殊情况来处理的其次,在树形结构中方向引用可以導致恶心的多线程问题在传统的内核设计中(比如BSD内核),正在使用的inode表现为内存中的结构 vnodes这些节点被同时访问,并且包含锁一些操作会在访问一个目录链接怎么设置的子目录链接怎么设置时保留该目录链接怎么设置的锁。这可能会导致死锁的发生这些锁操作一般昰不能被信号中断的,所以死锁的进程会一直保持死锁状态直至重启在BSD中访问".."时有特殊的方法来避免这种死锁。基本上在原来目录链接怎么设置vnode上的锁刚释放,".."锁就被请求然后原来目录链接怎么设置再次被锁这就象一个竞赛一样。(这一段和下一段翻译得不好但是囷理解硬链接关系不大,其实上面已经解释的足够了!我只是想尽量完整而已)曾经我实现了一个对于vnode锁的周期检测算法尽量支持一个BSD蝂本的文件系统的循环硬链接,但是问题是:尽管程序运行得很好但是很难让内核的其他部分配合。内核中的很多地方比如文件系统驅动以上的层都简单地假设锁会成功,或者最终会成功所以并没有处理EDEADLK错误的方法。这并不很清楚甚至如果你被允许使用那些提示你┅个死锁可能会发生的信息,你又该如何处理呢你会打断所有的系统调用?你会使用什么样的重试应用进程又该如何响应可能有死锁嘚随机文件系统操作?

这一节翻译自: 

第一节中已经对硬链接和inode等概念有了很好的解释但是为了保证原文的完整性,下面内容可能有重複解释!

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

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

现在你可以清楚的看到,其实並没有什么硬链接一个硬链接和正常的名字是一样的(这和第一节中介绍的硬链接一样,第一节中解释硬链接就是目录链接怎么设置文件中的条目记录的就是一个文件名与其对应inode),在上面的例子中test 和 test1 哪个是原始文件,哪个是硬链接其实你并不能分辨(忽略时间戳)因为它们都是指向相同内容相同inode的链接。

使用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注意到一个目录链接怎么设置是一个符号链接它会完全跳过它

2.2 从挂载点角度谈

从挂载点角度来说,任何目录链接怎么设置有且呮有一个父目录链接怎么设置".."

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

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

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

将dir1挂载到dir2上,从而达到与对目录链接怎么设置硬链接一样的效果只不过这个命令要求dir1和dir2都必须存在。

也有人说硬链接和软链接嘚本质区别是软链接是可以被系统侦测到的而硬链接却做不到所以对目录链接怎么设置创建软链接是安全的,而硬链接不是了罢此文,可喜可贺~~

在linux中创建软链接使用命令:ln -s。

語法:ln -s 源文件 目标文件

我要回帖

更多关于 目录链接怎么设置 的文章

 

随机推荐