揭开链接文件的面纱——从根本上剖析硬链接与软链接异同

在linux的学习过程中,链接文件的学习让不少人头疼,很多同学往往分不清什么是硬链接,什么是软链接,对于两者的概念和区别常常容易混淆、搞不清楚。今天我们就从原理、从根本上为大家辨析一些两者之间的区别,相信大家在看完这篇文章之后对链接文件会有一个清晰正确的认识。

1、在实现原理上不同

硬链接,涉及到文件的底层模式,因此被称为硬链接文件。硬链接文件只是一个指针指向,确切的说并不是一个真正的文件,它只有一个文件名和指向原文件inode的指针,并没有分配自身的inode和datablock。

软链接,并不涉及文件系统底层,完全是靠软件方式实现的,因此被成为软链接。软链接文件是一个独立的文件,他的创建是需要单独分配相应的inode和datablock。软链接文件的inode是一个全新的inode,而datablock里面的内容所记录的是,指向原文件的一个路径和文件名。

链接文件.jpg 

2、跨分区链接

由于硬链接的创建需要从底层硬件上去指向特定的inode,而每个分区在格式化时都有自己单独的一套inode和datablock分配机制,因此为了保证inode指向的唯一性,硬链接通常只能在同分区内创建。

而软链接只是存储了原文件的访问路径,不涉及到inode的跨分区问题,因此在跨分区链接的创建上更为方便。

3、资源分配上

从硬链接和软链接的实现原理上我们可以看出,软链接创建出了一个全新的文件,而硬链接只是做了一个指针的指向。可以看出硬链接是不分配inode和datablock的,因此通常不占用系统资源和空间。

而软链接则会消耗系统inode和datablock资源,会占用一定的硬盘空间。需要说明的是软链接所占用的空间,其实并不大,因为它是文件内容,存储的只是指向原文件的一个访问路径,文件的大小为路径所占空间。

4、文件属性信息

硬链接由于指向的是原文件的inode,实质上硬链接和原文件其实是一个文件,只是文件名不同,因此硬链接文件与原文件在inode编号、文件权限、属主属组关系、时间戳及大小等属性上是完全相同的。但由于有两个指针指向同一个inode编号,因此创建硬链接,硬链接文件和原文件的硬链接数会加1,当删除时硬链接数减1。

软链接由于是一个全新的独立的文件,因此由于自己单独的inode和创建时间、属主属组信息,但权限信息上全部是rwx。软链接的创建、删除不会影响到硬链接数。

 

 图像 1.jpg

 

5、当原文件被删除、新建时

当原文件被删除时,实质上操作系统所做的并不是马上删除文件的数据和所占用的系统资源。系统所做的操作,首先是删除原文件的文件名对inode的指针指向,并删除文件名记录,同时会检查原文件所对应inode的指向数量,即硬链接数。如果硬链接数减1后大于0,则只是将硬链接数减1;如果硬链接数减1后为0,则说明没有指针指向该数据,则会把对应的inode和datablock标记为删除或可用(只是做了一个标记)。

因此,我们可以看出当原文件被删除后,inode和datablock实际上并没有被删除,由于仍然有硬链接指向该inode,因此也不会被标记为删除,所以对于硬链接来说,删除原文件,硬链接文件仍然是可以正常访问的,并且访问结果仍然是原文件的内容。

而对于软链接来说,其做的只是标记了原文件的访问路径和文件名,当原文件被删除后,原文件对数据的inode指向及文件名都会被删除;对于链接文件来说,就相当于访问路径上的文件已经不存在了,因此也就无法再找到原文件的数据,软链接的访问失效。

图像 2.jpg 

在原文件被删除后,如果再新建一个与原文件同名的文件,我们暂时把它叫做新文件吧。这时候我们会发下软链接文件又可以用了。但是我们会发行软链接指向的是新文件,访问软链接得到的不是原文件的内容,而是新文件的内容。当我们访问硬链接是时候我们会发行访问的仍然是原文件的信息,用ls -il来进行查看会发现新文件和硬链接文件的inode编号完全不同,并且硬链接数也不会增加。

图像 3.jpg 

 

6、创建链接文件时使用相对路径

在创建链接文件的时候我们可以使用绝对路径,但在有的时候我们会觉得使用相对路径会更有必要。但在使用相对路径来创建链接文件的时候会有较大的差异。

在创建硬链接文件的时候,由于指向的是原文件的inode,因此只要在创建的时候使用的路径能够找到对应的原文件,获得原文件的inode信息即可创建硬链接文件,因此无论使用绝对路径还是相对路径都可以成功创建硬链接。

但在创建软链接的时候,我们会发现出了点问题。在使用绝对路径创建软链接的时候很顺利,在使用相对路径来指向原文件的时候也很正常,但当链接文件和原文件不在同一路径而使用相对路径来指向链接文件的时候却发现创建的链接文件是无效的。这是为什么呢???其实也很好理解,因为我们要通过链接文件找到原文件,而不是通过原文件找到链接文件,而链接文件存放的也是指向原文件的访问路径,所以在使用相对路径来创建软链接文件的时候就必须要使用链接文件指向原文件的相对路径。也就是说使用相对路径来创建软链接文件的时候,链接文件的相对路径必须是当前目录,原文件使用的相对路径要使用相对要创建的链接文件的相对路径。

关于这点,就有引申出来一个问题。当链接文件被复制、移动到其他目录,其自身的访问路径发生改变的时候,如果软链接使用的是相对链接,就会出现软链接无法访问的情况。但是硬链接文件和使用绝对链接的软链接则不会出现访问问题。

7、对目录创建链接

软链接是可以直接链接向目录的,这个很容易理解。但是在linux系统中原则上(当然如果非要创建目录的硬链接,在技术上也是可以实现的)是不能创建目录的硬链接的,即硬链接不能链接到目录。这个大致可以从以下方面来理解。

从文件系统方面来讲,我们知道linux的文件系统是典型的树型结构,在使用软链接的时候,软链接本质上还是一个文件,但硬链接则是在文件系统本质上的一个指向,这严重的破坏了系统的文件结构。因为软链接有单独的inode是一个新的文件,对于电脑来说只是一个普通的文件来对待的,但是系统无法分别硬链接的两个文件哪个是原文件、哪个是新创建的链接文件,而目录是一个树的非叶子节点。当然对于目录不能创建硬链接,还有很多其他方面的诸多因素,对于这些因素并没有绝对的说法,在这里我们就不再一一分析列举,感兴趣的同学可以自行查阅相关资料深入研究。

虽然说目录不能创建硬链接,但当我们使用ls -l命令来查看目录文件的时候会发现,目录文件的硬链接数并不是1,并且当我们在目录下创建新子目录的时候会发现,目录的硬链接数增加了。这究竟是怎么回事呢???其实当你使用ls -ali 来查看目录下的内容的时候就会发现,每个目录下有两个特殊的目录指向 “.”和“..”。因此当一个目录被创建的时候,除了自身的链接数1之外,还有目录下面的一个“.”是指向该目录本身的,而在目录下创建子目录的时候,子目录中的“..”指向其父目录,也是指向该目录的。并且你会发行这些特殊目录的inode编号与目录的inode编号是相同的,也就是说他们都是目录的一个硬链接。

8、如何看一个文件是硬链接还是软链接

以上我们已经为大家辨析了什么是硬链接、什么是软链接以及两者之间有什么异同,知道通过软链接和硬链接我们都可以很方便的直接访问到原文件,但我们如何知道一个链接文件是软链接还是硬链接呢?

A、使用ls -i,如果两个文件的inode编号相同,则可以知道这两个文件是硬链接文件。

B、使用ls -l,如果文件类型位置是”l”,则该文件是一个软链接文件,在文件名的位置我们同时能够看到链接文件指向的原文件位置。

原创文章,作者:M21-张国辉,如若转载,请注明出处:http://www.178linux.com/53142

(2)
M21-张国辉M21-张国辉
上一篇 2016-10-20 22:05
下一篇 2016-10-20 23:04

相关推荐

  • Linux的哲学思想

    2018-03-03

    Linux干货 2018-03-03
  • rsyslog配置详解,结合mysql+loganalyzer展现

        环境:Centos7.2 前言:系统日日夜夜不停地运行着,有这么一个守护进程,兢兢业业地不断记录它运行产生的日志,有不起眼的闲言碎语,值得管理员撇一眼的系统报错,也默默地接收来自进程的严厉警告,甚至在内核崩溃前夕,同样不遗余力记录着当时发生的情形。他是无言的记录者,没有特别的修辞,但他的记录的文字却掷地有声。本…

    系统运维 2016-10-25
  • 网络知识点

    1. 实现异地搭建局域网的方法1>. 让运行商拉专线,这是相当昂贵的。2>.  VPN (Virtual PrivateNetwork)  虚拟专用网络 2. VPN的隧道协议主要有三种:PPTP、L2TP和IPSec。其中PPTP和L2TP协议工作在OSI模型的第二层,又称为二层隧道协议;IPSec是第三层隧道协议。 2. …

    Linux干货 2016-09-01
  • MySQL常用命令

    本文大纲 MySQL命令             (0%) 交互式CLI工具     服务端命令 mysqld服务器程序 数据类型 DDL语句                 &n…

    Linux干货 2017-02-16
  • CentOS启动流程及Shell脚本编程练习

    一、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情) 第一步:POST加电自检 主要实现的功能是检测各个外围硬件设备是否存在而且能够正常运行起来,实现这一自检功能的是固化在主板上的ROM(主要代表为CMOS)芯片上的BIOS(Basic Input/Output System)程序。 第二步:Boot Sequence(选择启动设备以加…

    2017-11-26
  • 马哥教育网络班20期+第2周课程练习

    1、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示 文件管理命令:ls、cd、pwd、mkdir、rmdir、cp、rm.、mv、touch、cat、more、less、head、tail 1)ls命令:显示目录文件   -a 显示所有文件,包括隐藏文件  ~]# ls -a /etc.  &n…

    Linux干货 2016-06-23