一、Linux下的两种连接文件及创建方式
在Linux下面的连接文件有两种——软连接和硬连接,虽然都是连接文件,但两者却有很大的区别。一种是类似于Windows的快捷方式功能的文件(或目录),这种连接称为软连接;另一种则是通过文件系统的inode连接来产生新文件名,而不是产生新文件,这种称为硬连接。
创建连接文件的方法非常简单,就是使用ln命令,ln file1 file2,则创建硬连接,file2为file1的硬连接,ln -s file1 file2,则创建软连接,file2为file1的软连接。

二、详述硬连接
为了让大家更好地了解这两种连接的差别,这里先说说硬连接吧,因为它比软连接要难理解一些。

我们知道,在Linux下,每个文件都会占用一个inode,文件内容由inode的记录来指向,而想要读取文件,必须要经过目录记录的文件名来指向正确的inode号码才能读取,也就是说,其实文件名只与目录有关,但是文件的内容则与inode有关。

那什么硬连接呢?就是在某个目录下新建一条文件名连接到某inode号码的关联记录而已,简单来说,就是有多个文件名对应到同一个inode号码,注意,是多个文件名,不是多个文件。

看到这里可能你也是一头雾水,那么请看下面的例子吧



在这里我创建了一个硬连接,并查看了相关文件的inode,从结果可以看出,这两个文件的inode是完全相同的(394220),而文件连接数则不是1而是2,而且crontab的文件类型是“-”而不是“l”,即它不是一个连接文件,这是因因为有两个文件连接到了同一个文件/etc/crontab啊。为什么会如此神奇,就用下面的图来解释一下吧




从图中可以看到,你可以通过1或2的目录inode所指定的block找到两个不同的文件名,而不管使用哪个文件名均可以找到real这个inode,并通过这个inode去读取到最终的数据。

一般来说,使用硬连接(hard link)设置连接文件,磁盘的空间与inode的数目是不会变的,它只是在某个目录下的block多写入一个关联数据而已,既不会耗用inode也不会耗用block数量。

可能你会反驳说,不对,建立/root/crontab的那个文件不也需要一个inode和blocks吗?如图中的inode1不就是建立这个连接所要用的一个inode吗?其实不是这样理解的,因为/root这个目录早已在,而它里面的内容也早已记录在这个block中,即无论你添加还是不添加一个硬连接inode1和它所指向的那个目录的block都已经存在了,你建立的硬连接只是在这个inode1所指向的block中添加一条文件名的记录而已,在这个例子中,就是添加/root/crontab这条记录。所以没有增加inode和block的耗用。

三、详述软连接
相对于硬连接,软连接(symbolic link)就更好理解了,基本上软连接就是在创建一个独立的文件,而这个文件会让数据的读取指向指向它连接的那个文件的文件名。即只是利用文件来作为指向的操作,所以,当源文件被删除后,软连接会“打不开”,出现的情况就像大家熟悉的Windows中那样,提示“无法打开某个文件”。

请看下面的例子



我创建了一个软连接,从输出的结果中,我们可以看出它与硬连接的确是非常的不同。首先,这两个文件的inode号码并不相同,再者在文件类型方面,/etc/crontab为“-”,即普通的文件,而/root/crontab_sl则为“l”,即连接文件。

那软连接文件,即此例子中的crontab_sl文件里面的内容是什么呢?大家可以看到它的大小只12B,其实它的内容就是“/etc/crontab”这12个字符而已。

还不是很明白?那就用下面的图来说明吧



上图表示,由inode1读取到连接文件的内容仅有文件名,根据文件名连接到正确的目录去取得目标文件的inode,最终就能够读取到正确的数据了。

从上面的输出结果中,大家应该已经看到软连接是要耗用inode和block的(因为inode号与源文件的inode不相同),对应上图就是耗用了inode1和它所指向的block,它与硬连接的不同之处在于,inode1在创建这个软件文件之前是没有被使用的inode,它不指任何的block,也是说图中它所指向的block也不没有被利用的。当要创建软连接时,inode1和它所指向的block才被利用了。而且这个block不是用来记录文件名的,而是真真正正的一个文件,用来记录文件信息,例如这里它的信息是“/etc/crontab”这12个字,它是放在目录/root下的文件。

四、软连接与硬连接优缺点分析
1、硬连接
硬连接比较安全,因为即使某一个目录下的关联数据被删除了也没有关系,只要有任何一个目录下存在着关联数据,那么该文件就不会被删除,而且硬连接还不需要耗用inode和block,但是硬连接也有其限制,就是不能跨文件系统也不能连接到目录。

注:在硬连接中,删除文件时,只有当连接数为0时,才能文件真正删除,否则只会把文件的连接数减1。

2、软连接
软件连接比较灵活,可以连接到文件和目录,但是它会耗用inode和block,不过这对于系统来说其实不算什么,但是如果目标文件被删除了,从最后一幅图可以看出,整个环节就会无法继续下去,会发生无法通过连接文件读取的问题。其实软连接就你Windows中的快捷方式一样。

总之:本人觉得硬连接与软连接的一大区别就是硬连接不会创建一个新的文件,而软连接则会创建一个新的文件来,这个文件用来记录它所连接的文件的文件名。

初窥Linux 之 区分硬连接和软连接的更多相关文章

  1. Linux文件系统的硬连接和软连接

    title: Linux文件系统的硬连接和软连接 date: 2018-02-06T20:26:25+08:00 tags: ["文件系统"] categories: [" ...

  2. linux中的硬连接和软连接

    linux中的硬连接和软连接 linux中的硬连接和软连接 背景 连接 硬连接 软连接 example reference 背景 linux中的文件主要分3块, - 真正的数据 - 索引节点号(ino ...

  3. linux文件的硬连接和软连接

    建立软连接:ln -s 原路径 目标路径 原理示意图: 特点: 1.     相当于win中的快捷方式 2.     删除链接文件,源文件不受影响 3.     删除源文件,链接文件失效 4.     ...

  4. linux系统文件属性-硬连接、软连接

    1 硬链接概念 硬链接是指通过索引节点(Inode)来进行链接,在Linux(ext2,ext3)文件系统中,保存在磁盘分区中的文件不管是什么类型都会给它分配一个编号,这个编号被称为索引节点编号(In ...

  5. 硬连接与软连接,inode与links

    硬连接和软连接,第一感觉就像是window的快捷方式,实则不然 要说硬连接和软连接,那就必须了解inode和block以及分区了 EXT文件系统在创建分区的时候,就划分了两块区域,inode tabl ...

  6. Linux 硬连接和软连接的原理 (in使用)

    引子 目前,UNIX的文件系统有很多种实现,例如UFS(基于BSD的UNIX文件系统).ext3.ext4.ZFS和Reiserfs等等. 不论哪一种文件系统,总是需要存储数据.硬盘的最小存储单位是扇 ...

  7. 【Linux】Shell学习笔记之四——文件和目录管理(硬连接和软连接)

    在这节将要学习linux的连接档,在之前用"ls -l" 查看文件属性的命令时, 其中第二个属性是连接数.那么这个连接数是干什么的?这就要理解inode. 先说一下文件是怎么存储的 ...

  8. linux ------ 硬连接和软连接(软连接也叫符号连接)

    在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号 (Inode Index).在Linux中,多个文件名指向同一索引节点是存在的.一般这种连接就是硬连接 ...

  9. linux 硬连接与软连接

    1.linux中文件占用一个inode,inode指向文件内容.2.文件名可以认为是一个指针,指向inode.硬连接相当于指针的整体拷贝,并不是对文件内容的拷贝.两个文件名(两个指针)都能修改文件,删 ...

随机推荐

  1. 【译】在Asp.Net中操作PDF - iTextSharp - 利用列进行排版

    原文 [译]在Asp.Net中操作PDF - iTextSharp - 利用列进行排版 在使用iTextSharp通过ASP.Net生成PDF的系列文章中,前面的文章已经讲述了iTextSharp所涵 ...

  2. WPF Multi-Touch 开发:基础触屏操作(Raw Touch)

    原文 WPF Multi-Touch 开发:基础触屏操作(Raw Touch) 多点触控(Multi-Touch)就是通过与触屏设备的接触达到人与应用程序交互的操作过程.例如,生活中经常使用的触屏手机 ...

  3. What’s new in Spark 1.2.0

    What's new in Spark 1.2.0 1.2.0 was released on 12/18, 2014 在2014年5月30日公布了Spark 1.0 和9月11日公布了Spark1. ...

  4. 一个带动画效果的颜色选择对话框控件AnimatedColorPickerDialog

    android4.4的日历中选择日程显示颜色的时候有一个颜色选择对话框非常漂亮,模仿他的界面我实现了一个类似的对话框,而且带有动画效果. 代码的实现可讲的地方不多,主要是采用了和AlertDialog ...

  5. WCF技术剖析之十七:消息(Message)详解(下篇)

    原文:WCF技术剖析之十七:消息(Message)详解(下篇) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话)]]< ...

  6. Server-side Sessions with Redis | Flask (A Python Microframework)

    Server-side Sessions with Redis | Flask (A Python Microframework) Server-side Sessions with Redis By ...

  7. 配置开源项目 SlidingMenu 的问题

    最近想研究一下开源项目 SlidingMenu,单是配置项目就花了好长的时间,断断续续的尝试,终于配置成功了,写下来和大家分享一下经验. Step 1:导入依赖的项目和例子 打开项目 File -&g ...

  8. Andorid时间控件和日期控件

      

  9. MySQL存储引擎:InnoDB和MyISAM的差别/优劣评价/评测/性能测试

    InnoDB和MyISAM简介 MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的 顺序访问方法) 的缩写 ...

  10. Swift - final关键字的介绍,以及使用场景

    final关键字在大多数的编程语言中都存在,表示不允许对其修饰的内容进行继承或者重新操作.Swift中,final关键字可以在class.func和var前修饰. 通常大家都认为使用final可以更好 ...