- 内核索引节点(in-core indoe):保存在内存中,在系统中每个打开的文件都对应着一个内核索引节点,
- 磁盘索引节点(on-disk inode):在文件系统中的每一个文件都有一个磁盘索引节点,保存在磁盘上,它所保存的具体信息与文件系统的类型有关。
注意:这两种索引节点的关系为:当进程打开一个文件时,文件的磁盘索引节点中的信息就会被载入内存,并建立一个内核索引节点。当内核索引节点被修改后,系统负责将其同步到磁盘上。磁盘索引节点与对应的内核索引节点所保存的信息并不是完全相同的。内核索引节点记录的是关于文件的更通用的一些信息,而忽略掉于具体文件系统类型相关的一些信息。
简而言之,软链接相当于windows中的快捷方式,硬链接相当于一个灾备系统,数据存放在两处,与复制不同
的是两处之间存在同步机制,一处数据的改变会实时同步到另一处,另外,一处数据如果被删除了,不会影响
到另一处的数据.下面是详细的介绍:
硬连接指向的是节点(inode),是已存在文件的另一个名字,修改其中一个,与其连接的文件同时被修
改;对硬链接文件进行读写和删除操作时候,效果和软链接相同。但如果我们删除硬链接文件的源文件,
硬链接文件仍然存在,而且保留了原有的内容。这时,系统就“忘记”了它曾经是硬链接文件,而把他当
成一个普通文件。
硬链接文件有两个限制:
1、不允许给目录创建硬链接;
2、只有在同一文件系统中的文件之间才能创建链接。
软连接指向的是路径(path),软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是
任意文件或目录,还可以链接不同文件系统的文件,和win下的快捷方式差不多。 软链接文件甚至可以链
接不存在的文件,这就产生一般称之为"断链"的问题(或曰“现象"),链接文件甚至可以循环链接自己,类
似于编程语言中的递归。
软链接和硬链接实例:
[flydream@flydream test]$ echo "This is a source file." > source_file
[flydream@flydream test]$ ls -li source_file
661162 -rw-rw-r-- 1 flydream flydream 23 Apr 20 13:05 source_file
[flydream@flydream test]$ ln -s source_file soft_link1 加了参数 '-s' 参数表示软链接
[flydream@flydream test]$ ln source_file hard_link1 没有参数表示硬链接
[flydream@flydream test]$ ls -li
total 8
661162 -rw-rw-r-- 2 flydream flydream 23 Apr 20 13:05 hard_link1
661163 lrwxrwxrwx 1 flydream flydream 11 Apr 20 13:05 soft_link1 -> source_file
661162 -rw-rw-r-- 2 flydream flydream 23 Apr 20 13:05 source_file
[flydream@flydream test]$ ln source_file hard_link2
[flydream@flydream test]$ ln source_file hard_link3
[flydream@flydream test]$ ln source_file hard_link4
[flydream@flydream test]$ ll
total 20
-rw-rw-r-- 5 flydream flydream 23 Apr 20 13:05 hard_link1
-rw-rw-r-- 5 flydream flydream 23 Apr 20 13:05 hard_link2
-rw-rw-r-- 5 flydream flydream 23 Apr 20 13:05 hard_link3
-rw-rw-r-- 5 flydream flydream 23 Apr 20 13:05 hard_link4
lrwxrwxrwx 1 flydream flydream 11 Apr 20 13:05 soft_link1 -> source_file
-rw-rw-r-- 5 flydream flydream 23 Apr 20 13:05 source_file
[flydream@flydream test]$ ln -s source_file soft_link2
[flydream@flydream test]$ ln -s source_file soft_link3
[flydream@flydream test]$ ln -s source_file soft_link4
[flydream@flydream test]$ ll -li
total 20
661162 -rw-rw-r-- 5 flydream flydream 23 Apr 20 13:05 hard_link1
661162 -rw-rw-r-- 5 flydream flydream 23 Apr 20 13:05 hard_link2
661162 -rw-rw-r-- 5 flydream flydream 23 Apr 20 13:05 hard_link3
661162 -rw-rw-r-- 5 flydream flydream 23 Apr 20 13:05 hard_link4
661163 lrwxrwxrwx 1 flydream flydream 11 Apr 20 13:05 soft_link1 -> source_file
657714 lrwxrwxrwx 1 flydream flydream 11 Apr 20 13:11 soft_link2 -> source_file
661164 lrwxrwxrwx 1 flydream flydream 11 Apr 20 13:11 soft_link3 -> source_file
661165 lrwxrwxrwx 1 flydream flydream 11 Apr 20 13:11 soft_link4 -> source_file
661162 -rw-rw-r-- 5 flydream flydream 23 Apr 20 13:05 source_file
从上可以看出硬链接的inode 节点号码是一样的和原始文件source_file的inode号码都为661162。且链接数都为5
每当增加一个硬链接那么链接数就会增加1,当要删除一个硬链接的时候链接数就会减一, 当链接数目减为0的时候
原始文件就会被从文件系统中删除, 硬链接的为个文件大小一样,inode一样,硬链接不能够夸文件系统,不能
在目录上使用硬链接, 软链接增加的时候链接数不会增加, 软链接的inode节点不一样,且当原始文件删除的时候其他的软链接就失效了。
从上面链接后的结果可以看出来软链接与硬链接,区别不仅仅是在概念上,在实现上也是不同的。
区别:硬链接原文件与链接文件公用一个inode号[上面的例子中为661162],说明他们是同一个文件,而软链接原文件与链接文件拥有不同的inode号,表明他们是两个不同的文件;在文件属性上软链接明确写出了是链接文件,而硬链
接没有写出来,因为在本质上硬链接文件和原文件是完全平等关系;链接数目是不一样的,软链接的链接
数目不会增加;文件大小是不一样的,硬链接文件显示的大小是跟原文件是一样的,这用强调,因为是等
同的嘛,而这里软链接显示的大小与原文件就不同了,source_file大小是23Bytes,而soft_link1是11Bytes,这里面的11实际上就是“source_file”的大小。
总之,建立软链接就是建立了一个新文件。当访问链接文件时,系统就会发现他是个链接文件,它读取链
接文件找到真正要访问的文件。
在不同系统之间建立软链接、对目录建立链接,这里就不举例了,读者可以自己去尝试,我也是在不断实
践中学习的。当然软链接也有硬链接没有的缺点,因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移;
还有它要系统分配额外的空间用于建立新的索引节点和保存原文件的路径。
什么是软链接?
软链接是最容易理解的,因为你很可能已经用到它了。软链接扮演了Windows中快捷方式的角色。简单说来,软链接就是一个指向另一个文件的文件。当你创建一个软链接的时候,你创建的是一个新文件,而该文件存在的意义只是一个指向系统某处的另一个文件的指针。
所有的链接都是用ln命令创建的,如果你要创建软链接就使用-s标志(如果不使用该标志,你会得到一个我即将讲到的硬链接)。该命令的语法是:
ln -s [目标] [链接名]
比如,下面这个命令会创建一个指向/usr/bin/firefox的名叫firefox的链接(在我的“Desktop”目录):
ln -s /usr/bin/firefox ~/Desktop/firefox
现在我们理解了软链接,接下来我们讨论硬链接。
什么是硬链接?
软链接是一个指向已有文件的新文件,而硬链接是原始链接的另一个实例。一张简图是解释这个问题最容易的方式:
你可以点击任意一张图片以查看更大的版本。这些图画所解释的是:当你创建一个硬链接时,你创建的是指向数据位置的另一个指针,而不是指向现有文件的指针。这意味着编辑一个文件的硬链接等价于编辑该文件的原始实例。
把这个问题再讲透彻一点:一个软链接是一个指向已有文件的快捷方式,而一个硬链接是磁盘上某个位置的引用(或者更准确的说,文件系统中的某个位置)。这意味着快捷方式的概念,指向另一个文件的链接,对于硬链接来说是没有意义的。而有意义的则是询问磁盘上一个指定的位置有多少个引用存在(一个文件存在多少个硬链接),你可以通过运行‘stat’命令来看到:
stat /path/to/file
比如,在这个屏幕快照里面,我创建了一个文件,然后为其建立了三个硬链接。当我对其中任意一个文件运行‘stat’命令的时候,会显示其引用数目为4:
什么时候使用软链接
硬链接有两个局限。在这些情况下你 必须使用软链接:
- 跨文件系统的链接
因为硬链接是底层文件系统的直接引用,你不能跨文件系统建立硬链接。
- 链接到一个目录
你不能用硬链接来链接到一个目录。
在上述的两种情况中,你必须使用软链接,因为很简单,硬链接做不了这个室。在另外一些情况下,虽然硬链接也行,但软链接要比硬链接更好。比如,当你想要创建一个快捷方式,尤其是快捷方式的目标以后可能会改变的情况下,你很可能会选用软链接。举个例子,你有一个应用程序的beta版的启动器,你可能希望使用软链接,这样你就可以很容易地在各个版本之间改变目标。
在其他的大多数情况中(创建一个链接到同一个文件系统的文件时),硬链接应当是首选,基于以下原因:
- 性能
使用硬链接可以得到少量的性能提升。这是由于硬链接是一个磁盘位置的引用而不是一个指向另一个文件的文件(指向你所需要的真实磁盘位置),硬链接所涉及到的磁盘寻道动作要少一次。
- 存储空间
硬链接不占用额外的空间,因为它只是一个简单的指向已有磁盘空间的引用。而创建软链接是创建一个新文件,会消耗掉你文件系统上的少量空间(通常是4KB)。
另外,硬链接更好的一个原因是软链接很容易丢失一个文件的‘主’实例(所有软链接指向的那个文件)。如果原始文件删除了,那么所有的软链接都将变成无效的。而使用硬链接的话,你可以删除任意一个实例,包括原始实例。只要还有一个实例存在,该文件就存在于系统中。