什么是链接?
链接简单说实际上是一种文件共享的方式,是 POSIX 中的概念,主流文件系统都支持链接文件。
它是用来干什么的?
你可以将链接简单地理解为 Windows 中常见的快捷方式(或是 OS X 中的替身),Linux 中常用它来解决一些库版本的问题,通常也会将一些目录层次较深的文件链接到一个更易访问的目录中。在这些用途上,我们通常会使用到软链接(也称符号链接)。
软链接和硬链接的区别是?
首先,从使用的角度讲,两者没有任何区别,都与正常的文件访问方式一样,支持读写,如果是可执行文件的话也可以直接执行。
那区别在哪呢?在底层的原理上。
为了解释清楚下面用一个实例来说明硬链接和软链接。
现在目录下有两个文件,一个名为AAA,一个名为BBB
[root@centos7 app]#ls -il
total 0
67 -rw-r--r--. 1 root root 8 Nov 18 19:41 AAA
68 -rw-r--r--. 1 root root 0 Nov 18 19:41 BBB
首先先做一个AAA的硬链接。
引用
[root@centos7 app]#ln AAA AAAhard
[root@centos7 app]#ls -il
67 -rw-r--r--. 2 root root 8 Nov 18 19:41 AAA
67 -rw-r--r--. 2 root root 8 Nov 18 19:41 AAAhard
68 -rw-r--r--. 1 root root 0 Nov 18 19:41 BBB
这里我们注意在创建链接前,AAA显示的链接数目为1,创建链接后
1. AAA和AAAhard的链接数目都变为2。
2. AAA和AAAhard的inode号是一样的,都是67。
3. AAA和AAAhard显示的文件大小也是一样,都是8B。
可见进行了ln命令的操作结果:AAA和AAAhard是同一个文件的两个名字, 它们具有同样的索引节点号和文件属性,建立文件AAA的硬链接,就是为 AAA的文件索引节点在当前目录上建立一个新指针。你可以删除其中任何一个,如rm AAA,每次只会删除一个指针,链接数同时减一,只有将所有指向文件内容的指针,也即链接数减为0时,内核才会把文件内容从磁盘上删除。
尽管硬链接节省空间,也是Linux系统整合文件系统的传统方式,但是存在一些不足之处:
1. 不允许给目录创建硬链接。
2. 不可以在不同文件系统的文件间建立链接。因为 inode 是这个文件在当前分区中的索引值,是相对于这个分区的,当然不能跨越文件系统了。
接着我们做一个指向BBB的软链接,软链接克服了硬链接的不足,没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。因而现在更为广泛使用,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行链接。
[root@centos7 app]#ln -s BBB BBBsoft
[root@centos7 app]#ls -il
67 -rw-r--r--. 2 root root 8 Nov 18 19:44 AAA
67 -rw-r--r--. 2 root root 8 Nov 18 19:44 AAAhard
68 -rw-r--r--. 1 root root 0 Nov 18 19:41 BBB
69 lrwxrwxrwx. 1 root root 3 Nov 18 19:46 BBBsoft -> BBB
从上面链接后的结果可以看出来软链接与硬链接,区别不仅仅是在概念上,在实现上也是完全不同的。
区别:
- 硬链接原文件/链接文件公用一个inode号,说明他们是同一个文件,而软链接原文件/链接文件拥有不同的inode号,表明他们是两个不同的文件;
- 在文件属性上软链接明确写出了是链接文件,而硬链接没有写出来,因为在本质上硬链接文件和原文件是完全平等关系;
- 链接数目是不一样的,软链接的链接数目不会增加;
- 文件大小是不一样的,硬链接文件显示的大小是跟原文件是一样的。而这里软链接显示的大小与原文件就不同了,BBB大小是95B,而BBBsoft是3B。因为BBB共有3个字符
- 软链接没有任何文件系统的限制,任何用户可以创建指向目录的符号链接
总结
总之,建立软链接就是建立了一个新文件。当访问链接文件时,系统就会发现他是个链接文件,它读取链接文件找到真正要访问的文件。
当然软链接也有硬链接没有的缺点:因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移;还有它要系统分配额外的空间用于建立新的索引节点和保存原文件的路径。