Linux中的软链接和硬链接

在Linux系统中,有硬链接和软链接两种特殊的文件存在,今天我们就分析一下这两种连接到底有什么区别!!!

建立硬链接和软链接非常简单,那这两种链接有什么区别呢?都有什么作用呢?

ln创建硬链接

 

[root@centos7 ~]# touch test   #源文件

[root@centos7 ~]# ln /root/test /tmp/testhard    #把源文件建立硬链接文件

[root@centos7 ~]# ll -i /root/test /tmp/testhard    #查看两个文件的信息,加上-i选项查看inode显示,可以看出两个                                文件的inode号是一样的
100663409 -rw-r--r-- 2 root root 0 May 19 14:55 /root/test
100663409 -rw-r--r-- 2 root root 0 May 19 14:55 /tmp/testhard

inode节点号就相当于文件ID,在查找文件的时候,要先查找indoe号,才能读取到文件的内容。

根据上面我们查看的结果可以看出源文件和硬链接文件的inode号是一样的,那当我们要查找文件的时候,会调取哪一个文件呢?

在inode信息中,不会记录文件名称的,而是把文件名记录在上级目录的block中。目录的block中记录的是这个目录下所有一级子文件和子目录的文件名以及inode的对应。文件的 block 中记录的才是文件实际的数据。

  在查找文件的时候,要进过的步骤:

  1. 首先找到根目录的 inode(根目录的 inode 是系统已知的,inode 号是 2),然后判断用户是否有权限访问根目录的 block。
  2. 如果有权限,则可以在根目录的 block 中访问到 /root 的文件名及对应的 inode 号。
  3. 通过 /root/ 目录的 inode 号,可以查找到 /root/ 目录的 inode 信息,接着判断用户是否有权限访问 /root/ 目录的 block。
  4. 如果有权限,则可以从 /root/ 目录的 block 中读取到 test 文件的文件名及对应的 inode 号。
  5. 通过 test 文件的 inode 号,就可以找到 test 文件的 inode 信息,接着判断用户是否有权限访问 test 文件的 block。
  6. 如果有权限,则可以读取 block 中的数据,这样就完成了 /root/test 文件的读取与访问。

在给源文件 /root/test 建立了硬链接文件 /tmp/testhard 之后,在 /root/ 目录和 /tmp/ 目录的 block 中就会建立 test 和 testhard 的信息,这个信息主要就是文件名和对应的 inode 号。那么,我们无论访问哪个文件,最终都会访问 inode 号100663409这个文件信息。

 

硬链接的特点:

  • 创建硬链接会增加额外的记录项以引用文件。
  • 对应于同一文件系统上一个物理文件。
  • 每个目录引用相同的inode号。
  • 创建时链接数递增。
  • 删除文件时:

           rm命令递减计数的链接

      文件要存在,至少有一个链接数

      当链接数为零时,该文件被删除

  • 不能跨越驱动器或分区建立,因为在不同的文件系统中,inode号是重新计算的。
  • 语法:

    ln filename [linkname ]

  • 硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,目录下所有的子文件,包括子目录中的所有子文件都需要建立硬链接,这对当前的 Linux 来讲过于复杂

硬链接的限制比较多,既不能跨文件系统,也不能链接目录,而且源文件和硬链接文件之间除 inode 号是一样的之外,没有其他明显的特征。这些特征都使得硬链接并不常用。

 

ln创建软链接

软链接也称作符号链接,相比硬链接来讲,软链接就要常用多了。

[root@centos7 ~]# touch abc    #源文件
[root@centos7 ~]#
[root@centos7 ~]# ln -s /root/abc /tmp/abc-soft  #建立软链接文件
[root@centos7 ~]#
[root@centos7 ~]# ll -id /root/abc /tmp/abc-soft   #查看链接信息
101889732 -rw-r--r-- 1 root root 0 May 19 15:38 /root/abc
67167876 lrwxrwxrwx 1 root root 9 May 19 15:39 /tmp/abc-soft -> /root/abc  #在软链接的权限位上l表示链接文件

在上面可以看出链接文件和源文件的inode号不一致,

注意:软链接的源文件必须写绝对路径,否则建立的软链接文件就会报错,无法正常使用。

软链接的标志非常明显,首先,权限位中"l"表示这是一个软链接文件;其次,在文件的后面通过 "->" 显示出源文件的完整名字。所以软链接比硬链接的标志要明显得多,而且软链接也不像硬链接的限制那样多,比如软链接可以链接目录,也可以跨分区来建立软链接。

 

软链接和硬链接在原理上最主要的不同在于:硬链接不会建立自己的 inode 索引和 block(数据块),而是直接指向源文件的 inode 信息和 block,所以硬链接和源文件的 inode 号是一致的;而软链接会真正建立自己的 inode 索引和 block,所以软链接和源文件的 inode 号是不一致的,而且在软链接的 block 中,写的不是真正的数据,而仅仅是源文件的文件名及 inode 号

软链接的特点:(软链接的特点和windows中的快捷方式其实是完全一致的)

  • 删除软链接文件,源文件不受影响。而删除原文件,软链接文件将找不到实际的数据,从而显示文件不存在。
  • 软链接会新建自己的inode信息和block,只是在 block 中不存储实际文件数据,而存储的是源文件的文件名及 inode 号。
  • 一个符号链接指向另一个文件
  • ls -l的显示链接的名称和引用的文件
  • 一个符号链接的内容是它引用文件的名称
  • 可以对目录进行
  • 可以跨分区
  • 指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的引用计数
  • 语法

    ln -s filename [linkname]

 

确定文件内容

  • 文件可以包含多种类型的数据
  • 检查文件的类型,然后确定适当的打开命令或应用程序使用
  • file [options] <filename>…
  • 常用选项:
-b 列出文件辨识结果时,不显示文件名称
-f filelist 列出文件filelist中文件名的文件类型
-F 使用指定分隔符号替换输出文件名后默认的”:”分隔符
-L 查看对应软链接对应文件的文件类型
--help 显示命令在线帮助
posted @ 2019-05-19 15:57  薛小新  阅读(562)  评论(0编辑  收藏  举报