链接,顾名思义就是可以从一个地方链接到另一个地方,那么linux 操作系统里面的链接又有什么呢??

linux操作系统里面的链接有两种,一种是软链接,一个是硬链接

浅谈Linux下文件链接:硬链接和软链接

文件节点

要理解软链接和硬链接,首先要简单理解下文件节点,inode.

举个不是很恰当例子:我们把一个文件比作人,文件节点就是身份证号,每个人都有一个身份证号,每个文件也对应一个文件节点,系统通过文件节点来找文件。

软链接

软链接比较好理解,就相当于的windows系统中的快捷方式,你将软链接(即windows快捷方式)删除了,并不会影响源文件;同样你删除了原文件,快捷方式就不起作用了。访问软链接其实是去访问原始文件。

其中的原理是: A是B的软链接(A和B都是文件名),A的目录项中的inode节点号与B的目录项中的inode节点号不相同,A和B指向的是两个不同的inode,继而指向两块不同的数据块。但是A的数据块中存放的只是B的路径名(可以根据这个找到B的目录项)。A和B之间是“主从”关系,如果B被删除了,A仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。

硬链接

硬链接比软链接稍微复杂一点,但是也很好理解。对于硬链接来说,要创建一个硬链接,首先要先有一个文件,主要是为了先有一个文件节点。当创建了硬链接后,查看硬链接文件属性,和源文件一样(软链接是l,链接文件),这里因为所有硬链接都指向同一个文件节点。硬链接和软链接不同的是,硬链接只有一个文件节点,也就只有一个文件。

其中的原理是: A是B的硬链接(A和B都是文件名),则A的目录项中的inode节点号与B的目录项中的inode节点号相同,即一个inode节点对应两个不同的文件名,两个文件名指向同一个文件,A和B对文件系统来说是完全平等的。如果删除了其中一个,对另外一个没有影响。每增加一个文件名,inode节点上的链接数增加一,每删除一个对应的文件名,inode节点上的链接数减一,直到为0,inode节点和对应的数据块被回收。注:文件和文件名是不同的东西,rm A删除的只是A这个文件名,而A对应的数据块(文件)只有在inode节点链接数减少为0的时候才会被系统回收。

例子

创建硬链接 ln source target
创建软链接 ln -s source target
jklou@ubuntu:~/Todo/jkl$ ln testfile hard
jklou@ubuntu:~/Todo/jkl$ ln -s testfile soft
jklou@ubuntu:~/Todo/jkl$ ls -l hard
-rw-rw-r– 2 jklou jklou 9 Apr 22 04:35 hard
jklou@ubuntu:~/Todo/jkl$ ls -l soft
lrwxrwxrwx 1 jklou jklou 8 Apr 22 04:35 soft -> testfile
jklou@ubuntu:~/Todo/jkl$ ls -l testfile
-rw-rw-r– 2 jklou jklou 9 Apr 22 04:35 testfile

解释一下例子可能就比较明确:

首先有一个文件testfile,里面存储内容“1234”,然后创建硬链接hard,hard和testfile的文件类型是一样的,是一个普通的文件,打开文件里面的内容也是一样的,任意修改testfile或者修改hard,两个文件都是同时修改的,也就是说,两者是平等的,当删除了testfile,hard还是完好的存在。

对于soft,它只是一个指向testfile的快捷方式,去修改soft,其实是修改的testfile,当删除了testfile,soft还是指向testfile,但是soft已经没有内容了。

另外注意一个问题,我们重新创建一个testfile,存储内容“5678”,这个时候,操作打开hard,发现hard还是“1234”,打开soft发现soft是“5678”,也就是说testfile删除后hard没有关系了。因为上面说到了,开始的时候,testfile和hard都是指向同一个文件节点的,这个inode下面有testfile和hard两个名字,但是当第一次删除了testfile的时候,这个inode就解除了和testfile这个名字的关系,后面创建的testfile是一个新的文件,有自己的一个新的inode;对于soft来说,它就是存储了一个文件的地址,soft被访问的时候去这个目录下面找所对应的文件,有文件就访问那个文件,而且和原来的testfile是不同的inode,并不关心testfile和自己inode 的关系,所以testfile被删除,只是这个目录下没找到了而已,当创建了一个文件后来,这个目录下面就又有了,仅此而已。

使用限制

硬链接

1:不能对目录创建硬链接,原因有几种,最重要的是:文件系统不能存在链接环(目录创建时的”.”除外,这个系统可以识别出来),存在环的后果会导致例如文件遍历等操作的混乱(du,pwd等命令的运作原理就是基于文件硬链接,顺便一提,ls -l结果的第二列也是文件的硬链接数,即inode节点的链接数)

2:不能对不同的文件系统创建硬链接,即两个文件名要在相同的文件系统下。

3:不能对不存在的文件创建硬链接,由原理即可知原因。

软链接

a:可以对目录创建软链接,遍历操作会忽略目录的软链接。

b:可以跨文件系统

c:可以对不存在的文件创建软链接,因为放的只是一个字符串,至于这个字符串是不是对于一个实际的文件,就是另外一回事了