Fork me on GitHub

Linux中硬链接与软链接

一、硬链接

(一)什么是硬链接

  硬链接是指通过索引节点来进行链接。在Linux中一个索引节点可能被多个文件名指向,这样就会产生多个硬链接,它的作用是可以防止误删文件。删除其中一种硬链接并不影响索引节点和其它的硬链接。也就是文件实体并没有被删除。只有当所有的硬链接被删除以及该文件并未被其它应用程序占用才会被删除。硬链接的原理可以简单使用下图解释:

(二)实战

硬链接的创建通过 “ln 源文件 硬链接文件”来进行创建:

# 文件的软链接
# 1、创建文件
 [root@localhost project]# touch t1.txt
# 2、文件创建完成后本身就是一个硬链接
[root@localhost project]# ll -l
total 0
-rw-r--r-- 1 root root 0 Oct 31 12:04 t1.txt
# 3、文件创建硬链接
[root@localhost project]# ln t1.txt t1_hard.txt
# 4、所有硬链接的inode号是相同的
[root@localhost project]# ll -il
total 0
25537617 -rw-r--r-- 2 root root 0 Oct 31 12:04 t1_hard.txt
25537617 -rw-r--r-- 2 root root 0 Oct 31 12:04 t1.txt

# 创建文件夹
[root@localhost project]# mkdir tt
# 文件夹的硬链接默认就是2个,除了它本身还有内部的一个.
[root@localhost project]# ll
total 0
drwxr-xr-x 2 root root 6 Oct 31 12:06 tt
# 文件夹不能创建软连接
[root@localhost project]# ln tt tt_hard
ln: ‘tt’: hard link not allowed for directory

总结:

  • 硬链接是具有相同inode节点的不同的文件名
  • 删除硬链接之一或者源文件,文件实体并未被删除;只有删除所有的硬链接以及源文件才被删除(没有被其它应用程序使用的情况下)
  • 通过给文件设置硬链接来防止误删文件
  • 创建硬链接通过“ln 源文件 硬链接文件”,删除硬链接通过“rm -f 硬链接”
  • 文件创建后默认有一个硬链接,文件夹创建默认有2个硬链接
  • 文件夹不能创建硬链接,因为文件夹是用来挂载分区的,如果使用硬链接的话会造成不同分区的同一个inode号表示不同的内容

二、软链接

(一)什么是软链接

 软连接你可以将其理解为Windows下的快捷方式,在Linux下,软连接就是一个普通文件,它包含指向源文件的位置信息,其原理如下图所示:

 

(二)实战

软连接的创建通过“ln -s 源文件 软链接”命令:

# 文件创建软链接
# 1、创建文件
[root@localhost project]# touch t2.txt
[root@localhost project]# ll -il
total 0
25537617 -rw-r--r-- 1 root root 0 Oct 31 13:11 t2.txt
# 2、创建软链接
[root@localhost project]# ln -s  t2.txt t2_soft.txt 
# 3、软链接与源文件是不同的文件,inode是不同的
[root@localhost project]# ll -il
total 0
25537624 lrwxrwxrwx 1 root root 6 Oct 31 13:11 t2_soft.txt -> t2.txt
25537617 -rw-r--r-- 1 root root 0 Oct 31 13:11 t2.txt

# 目录创建软链接
# 1、创建目录
[root@localhost project]# mkdir d3
[root@localhost project]# ll -il
total 0
  759984 drwxr-xr-x 2 root root 6 Oct 31 13:13 d3
25537624 lrwxrwxrwx 1 root root 6 Oct 31 13:11 t2_soft.txt -> t2.txt
25537617 -rw-r--r-- 1 root root 0 Oct 31 13:11 t2.txt
# 2、给目录创建软链接
[root@localhost project]# ln -s  d3 d3_soft
[root@localhost project]# ll -il
total 0
  759984 drwxr-xr-x 2 root root 6 Oct 31 13:13 d3
25537625 lrwxrwxrwx 1 root root 2 Oct 31 13:14 d3_soft -> d3
25537624 lrwxrwxrwx 1 root root 6 Oct 31 13:11 t2_soft.txt -> t2.txt

总结:

  • 文件与目录均可以创建软链接
  • 源文件被删除后,软链接失效
  • 软链接与源文件是不同类型的文件
  • 通过rm -f 软链接文件可以删除软链接

 如果源文件删除,软链接失效,此时可以通过硬链接的方式恢复源文件,从而让软链接正常:

# 创建测试文件
[root@localhost project]# touch test.txt
# 创建硬链接
[root@localhost project]# ln test.txt test_hard.txt 
[root@localhost project]# ll -il
total 0
25537617 -rw-r--r-- 2 root root 0 Oct 31 13:22 test_hard.txt
25537617 -rw-r--r-- 2 root root 0 Oct 31 13:22 test.txt
# 创建软链接
[root@localhost project]# ln -s test.txt test_soft.txt
[root@localhost project]# ll -il
total 0
25537617 -rw-r--r-- 2 root root 0 Oct 31 13:22 test_hard.txt
25537624 lrwxrwxrwx 1 root root 8 Oct 31 13:23 test_soft.txt -> test.txt
25537617 -rw-r--r-- 2 root root 0 Oct 31 13:22 test.txt
# 删除源文件
[root@localhost project]# rm -f test.txt 
# 软链接失效
[root@localhost project]# ll -il
total 0
25537617 -rw-r--r-- 1 root root 0 Oct 31 13:22 test_hard.txt
25537624 lrwxrwxrwx 1 root root 8 Oct 31 13:23 test_soft.txt -> test.txt
# 恢复源文件
[root@localhost project]# ln test_hard.txt test.txt
# 软链接正常
[root@localhost project]# ll -il
total 0
25537617 -rw-r--r-- 2 root root 0 Oct 31 13:22 test_hard.txt
25537624 lrwxrwxrwx 1 root root 8 Oct 31 13:23 test_soft.txt -> test.txt
25537617 -rw-r--r-- 2 root root 0 Oct 31 13:22 test.txt

 三、应用(文件的删除原理)

从上面软、硬链接的说明来看,它们有以下几点需要注意:

  • 文件可以创建软、硬链接,目录只可以创建软链接
  • 删除某个硬链接文件对源文件以及软链接文件无影响
  • 删除软链接文件对源文件以及硬链接文件无影响
  • 删除源文件对硬链接无影响,但软链接文件失效
  • 每个目录中都有一个硬链接“.”以及上级目录的硬链接“.”;每在该目录创建一个子目录,其链接数增加1;但创建文件不会

文件的删除不仅仅是硬链接和源文件删除完就可以确保该文件删除,一个文件是否被删除,包含以下两方面:

  • 硬链接数为0
  • 被程序正在调用的次数为0

   比较常见的就是日志文件被占用的实例,网站被访问,有日志记录,当日志文件沾满空间需要删除时,即使已经删除了该文件,但是还是没有彻底删除,这是为什么呢?就是因为虽然所有的硬链接被删除了,但是程序仍然占据着这个日志文件,所以可以有两种方式解决这个问题:

  • 方式一、删除日志文件,重启服务
  • 方式二、清空日志文件,不需要重启服务

 

posted @ 2020-10-31 14:55  iveBoy  阅读(271)  评论(0编辑  收藏  举报
TOP