linux下软链接和硬链接的区别

1. 软链接和硬链接的区别总结

在linux系统中,链接分两种 :一种被称为硬链接(Hard Link),另一种被称为符号链接或软链接(Symbolic Link)。

1)默认不带参数情况下,ln命令创建的是硬链接。

2)硬链接文件与源文件的inode节点号相同,而软链接文件的inode节点号与源文件不同。

3)ln命令不能对目录创建硬链接,但可以创建软链接,对目录的软链接会经常被用到。

4)删除软链接文件,对源文件及硬链接文件无任何影响;

5)删除文件的硬链接文件,对源文件及软链接文件无任何影响;

6)删除链接文件的原文件,对硬链接文件无影响,会导致其软链接失效(红底白字闪烁状);

7)同时删除原文件及其硬链接文件,整个文件才会被真正的删除。

8)很多硬件设备中的快照功能,使用的就类似硬链接的原理。

9)软连接可以跨文件系统,硬链接不可以跨文件系统。

2. 链接的概念

硬链接 Hard Link

软链接或符号链接 Symbolic Link

ln不带参数创建的链接是硬链接

2.1. 硬链接

硬链接是指通过索引节点(Inode Index)来进行链接。在linux文件系统中,保存在磁盘分区中的文件不管是什么类型都会给它分配一个编号,这个编号称为索引节点编号(Inode Index)或者Inode。

多个文件名指向同一个索引节点(Inode)是正常且允许的。一般这种链接就称为硬链接。硬链接的作用之一是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要的文件,以防止误删数据。

因为文件系统的原理是,只要文件的索引节点(Inode Index)还有一个以上的链接(仅仅删除了该文件指向),只删除其中一个链接并不影响索引节点和其它的链接(即数据文件实体并未被删除),只有当最后一个链接被删除后,此时如果有新数据要存储到硬盘时,被删除文件的数据块及目录才会被释放,空间被新数据占用覆盖。此时数据再也无法找回了。也就是说,在linux系统中,删除文件(目录)的条件是与之相关的所有硬链接文件均被删除(与进程的占用也有关)。 硬链接相当于文件的另外一个入口。

2.2. 软链接

软链接类似windows的快捷方式。

3. 示例演示

3.1. 文件示例

[root@n1 ~]# mkdir test
[root@n1 ~]# cd test/
[root@n1 test]# touch file
[root@n1 test]# ls
file
[root@n1 test]# ls -ld
drwxr-xr-x 2 root root 4096 Jun 23 20:36 .
[root@n1 test]# ls -ld file
-rw-r--r-- 1 root root 0 Jun 23 20:36 file
[root@n1 test]# ln file file_hard_file 	#创建硬链接文件
[root@n1 test]# ls -ld file
-rw-r--r-- 2 root root 0 Jun 23 20:36 file
[root@n1 test]# ln -s file file_soft_link #创建软链接
[root@n1 test]# ls -ld file
-rw-r--r-- 2 root root 0 Jun 23 20:36 file
[root@n1 test]# ls -ld *
-rw-r--r-- 2 root root 0 Jun 23 20:36 file
-rw-r--r-- 2 root root 0 Jun 23 20:36 file_hard_file
lrwxrwxrwx 1 root root 4 Jun 23 20:38 file_soft_link -> file
[root@n1 test]# ls -li *
1671174 -rw-r--r-- 2 root root 0 Jun 23 20:36 file
1671174 -rw-r--r-- 2 root root 0 Jun 23 20:36 file_hard_file
1671175 lrwxrwxrwx 1 root root 4 Jun 23 20:38 file_soft_link -> file
#硬链接的节点编号是一样的,软链接文件的inode节点号与原文件不一样
总结:硬链接的节点编号是一样的,软链接文件的inode节点号与原文件不一样

3.2. 目录示例

[root@n1 test]# mkdir testdir
[root@n1 test]# ln testdir testdir_hard_link  
ln: `testdir': hard link not allowed for directory    #目录无法创建硬链接
[root@n1 test]# ln -s testdir testdir_soft_link   #但目录可以创建软链接
[root@n1 test]# ls -l
total 4
-rw-r--r-- 2 root root    0 Jun 23 20:36 file
-rw-r--r-- 2 root root    0 Jun 23 20:36 file_hard_file
lrwxrwxrwx 1 root root    4 Jun 23 20:38 file_soft_link -> file
drwxr-xr-x 2 root root 4096 Jun 23 20:42 testdir
lrwxrwxrwx 1 root root    7 Jun 23 20:42 testdir_soft_link -> testdir
[root@n1 test]# ls -li
total 4
1671174 -rw-r--r-- 2 root root    0 Jun 23 20:36 file
1671174 -rw-r--r-- 2 root root    0 Jun 23 20:36 file_hard_file
1671175 lrwxrwxrwx 1 root root    4 Jun 23 20:38 file_soft_link -> file
1671176 drwxr-xr-x 2 root root 4096 Jun 23 20:42 testdir
1671177 lrwxrwxrwx 1 root root    7 Jun 23 20:42 testdir_soft_link -> testdir
总结:ln不能对目录建硬链接,但可以创建软链接。目录软链接在生产运维场景中常用。

3.3. 删除示例

[root@n1 test]# echo "oldboyfile " > file
[root@n1 test]# cat file
oldboyfile
[root@n1 test]# cat file_hard_file
oldboyfile
[root@n1 test]# cat file_soft_link
oldboyfile
[root@n1 test]# rm -f file #删除原始文件,其实就是删除了一个文件的硬链接。
[root@n1 test]# ls -lirt
total 8
1671175 lrwxrwxrwx 1 root root    4 Jun 23 20:38 file_soft_link -> file
1671176 drwxr-xr-x 2 root root 4096 Jun 23 20:42 testdir
1671177 lrwxrwxrwx 1 root root    7 Jun 23 20:42 testdir_soft_link -> testdir
1671174 -rw-r--r-- 1 root root   12 Jun 23 20:47 file_hard_file
[root@n1 test]# cat file_hard_file #硬链接不受影响
oldboyfile
[root@n1 test]# cat file_soft_link #软链接失效
cat: file_soft_link: No such file or directory

总结:删除原文件file后,其硬链接不受影响,但其软链接失效

4. 链接总结

4.1. 有关文件

(1) 删除软链接file_soft_link后,对file,file_hard_file无影响

(2) 删除硬链接file_hard_link后,对file,file_soft_link无影响

(3) 删除原文件file,对硬链接file_hard_link无影响,导致软链接file_soft_link失效。

(4) 同时删除原文件file、硬链接file_hard_link时,整个文件会真正的被删除。

(5) 很多硬件设备中的快照功能,就是利用了硬链接的原理。

4.2. 有关目录

(1) 目录不可以创建硬链接,但可以创建软链接。

(2) 目录软链接是生产环境常用技巧。

5. 链接知识拓展

5.1. 软链接的生产使用案例

编译apachel软件时,编译路径有版本号/application/apache2.2.21,而在访问目录时又希望简便,就可以建立简单的软链接路径文件 ln –s /application/apache2.2.21 /application/apache来达到方便访问的目的。

5.2. 硬链接的生产使用案例

硬件存储的快照功能,或者为备份数据建多个硬链接,防止误删除数据。