硬链接和软链接的区别

硬链接和软链接在文件系统实现上的区别决定了两者之间功能上的不同,也就是说硬链接和软链在文件系
统上两者实现的方式不同,让其各自具有不同的功能和特色,也决定了各自的优点和缺点。接下同文件系统上创建硬链接和软链接看各自的特点。

一文件系统上创建硬链接

下面命令是在文件系统上创建一个硬链接:

~]# ln test /testdir/test.h     #在/testdir目录下创建一个test.h的硬链接                                 #他指向的原文件为test

创建test.h硬链接文件实际上是在/testdir目录(在文件系统目录也是一个文件,用一个唯一的inode标
识)数据区添加一个条目。这个条目记录着test.h这个文件名对应着的inode,而test.h是一个硬链接文
件故其inode为指向原文件的inode,即test和test.h的inode一样。

~]# ls -i test /testdir/test.h              #查看test和test.h的inode 202766542 test  202766542 /testdir/test.h

我们可以看到test和test.h对应的inode相同,也就是说test和test.h指向的数据相同(使用的都是同一
个inode中的数据指针,指针相同指向的数据区数据相同)。这也表明两个文件大小实际在数据区只占一
个文件大小
。通过下列命令看到数据大小也一样都是4个字节(字节相同并不能证明数据相同,这只是简单说明一
下)

~]# ls -l test /testdir/test.h   
202766542 -rw-r--r--. 2 root root 7 10月 20 08:04 test 
202766542 -rw-r--r--. 2 root root 7 10月 20 08:04 /testdir/test.h

当我们删除其中一个文件时,还会有另一个文件通过inode找到指向的数据区数据,也就是表明硬链接
文件和原文件相互无影响

~]# rm test                                      #删除原文件 
~]# ls -l /testdir/test.h                        #查看硬链接文件,可以看文件依然存在,也可以看 
-rw-r--r--. 1 root root 7 10月 20 08:04 /testdir/test.h ~]# cat /testdir/test.h          #查看文本内容依然可见,文本内容为abcdef acdefg

从上面的命令我们可以看到当删除原文件后硬链接个数减少了一,也就是说硬链接能增加元数据中硬链
接的数
。如下图可以看每增加一次硬链接,硬链接数就加一

~]# ln /testdir/test.h ./test.h2            #在当前文件夹下创建一个指向/testdir/test.h的硬链 接文件test.h2 
~]# ls -l /testdir/test.h                   #查看到硬链接数从1变成了2 -rw-r--r--. 2 root root 7 10月 20 08:12 /testdir/test.h

我们在回过头来看,硬链接在文件系统上的创建过程对其产生的影响,前面提到过硬链接文件的inode是
原文件的inode,而inode只在本分区文件系统下唯一,所以硬链接不能跨分区。举个简单的例子说明
为什么不能跨分区,原文件在test在分区f1上,inode为25535。而我们在另一个分区文件系统f2上
创建硬链接文件test.h,由于硬链接和原文件inode一样,故test.h的inode为25535。当我们查看test.h
文件时看的是f2分区上inode为25535的对应的数据,而不是f1文件系统上inode为25535对应的数据区
数据,因为f1和f2分区中元数据和数据是独立的。下面我们用命令查看能否创建不同分区的硬链
接

~]# df                                                #可以看出/根目录和/dev是两个分区 
文件系统                   1K-块    已用     可用 已用% 挂载点 
/dev/mapper/centos-root 41922560 1161516 40761044    3% / 
devtmpfs                  490216       0   490216    0% /dev 
~]# touch /test                                       #在根目录下创建一个test文件 
~]# ln /test /dev/test.h                              #试图在另一个分区/dev下创建硬链接test.h文件 
ln: 无法创建硬链接"/dev/test.h" => "/test": 无效的跨设备连接   #从报错信息可看出原因

硬链接还有一个特点是目录不能创建链接文件,因为容易形成循环,例如创建硬链接文件在原目录下,这
样就形成了一个循环。本着只说不做等于耍流氓,下面用命令证明一下。

~]# ln /testdir/ test.h3 ln: "/testdir/": 不允许将硬链接指向目录

总结:
  

    1.各个硬链接与原文件共用一个inode
  

    2.硬链接会增加硬链接数
  

    3.多个硬链接在数据区只占用一个文件大小
  

    4.各硬链接文件相互不影响(删除其他的另外的也能使用)
  

    5.硬链接不能跨文件系统
  

    6.目录不能创建硬链接

二文件系统上创建软连接

创建软连接的命令如下

~]# ln -s ./test /testdir/test.s

在文件系统中是现在testdir文件中增加一个条目,文件名是test.s,而inode是本文件系统分配的一个新的
inode,新inode所指向的元数据区中的指针数据区存放的不是数据指针,而是原文件路径。在本例中存的是
./test。软连接的大小就是指针数据区中数据的大小,即./test字符串的大小

~]# ls -l /testdir/test.s                  #大小为./test的大小6个字符 lrwxrwxrwx. 1 root root 6 10月 20 10:08 /testdir/test.s -> ./test  
~]# ls -i /testdir/test.s /testdir/test    #两个inode不同 1129 /testdir/test  1113 /testdir/test.s

那软连接如何查找到文件呢?当我们找到test.h软链接的inode时,得知指针数据区为./test,会到父目录
中查找文件名为test的文件。如果指针数据区是test,也是到父目录中查找文件名为test的文件,如果指
据区存放的是/path/to/file就会根据此绝对路径查找指定文件。这表明如果原文件是相当路径的话,则
这个相对是相对于软链接路径
。软链接的这种存在方式也决定了软链接能跨分区文件系统。我们删除
了原文件,软链接就会失效,因为找不到原文件了。下面证明一下

~]# rm /testdir/test                #删除原文件
~]# cat /testdir/test.s             #不能查看软链接,报错了
cat: /testdir/test.s: 没有那个文件或目录
~]# touch /testdir/test             #创了一个同名的文件,用nano写入了一些数据
~]# cat /testdir/test.s             #可以查看软链接了。
new /testdir/test file.

总结:
  

    1.软链接占用inode
   

    2.软连接文件大小为原文件路径大小
  

    3.原文件一旦删除,软链接就失效,而软链接的损坏不影响原文件
  

    4.可跨文件系统
  

    5.目录可以创建软连接

原创文章,作者:lirou,如若转载,请注明出处:http://www.178linux.com/53066

赞 (0)
liroulirou
上一篇 2016-10-29 21:03
下一篇 2016-10-29 21:03

相关推荐

  • N22-第一周作业

    1、描述计算机的组成及其功能    组成:        硬件:            CPU:运算器、控制器、寄存器、缓存     &nb…

    Linux干货 2016-08-15
  • Linux基础之正则表达式,用户、组管理

    Linux基础—正则表达式 正则表达式简单来说就是一种行字符串处理的方式,通过一些特殊符号的辅助,可达到搜索、删除、替换等某些特定字符串的处理方式 通配符(Globbing) 通配符与元字符类似,通配符主要用于文件名的匹配,而元字符则主要用在字符串的匹配上; 下面介绍几种常用的通配符: * 表示匹配任意位数的任意字符 ? 表示…

    Linux干货 2016-10-03
  • 设计模式 ( 十三 ) 命令模式Command(对象行为型)

    1.概述         在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。  例子1:电视机遥控器…

    Linux干货 2015-07-16
  • 魔术方法

    Edit 魔术方法 使用Python的魔术方法的最大优势在于他们提供了一种简单的方法来让对象可以表现的像内置类型一样。那意味着你可以避免丑陋的,违反直觉的,不标准的的操作方法。 特殊属性 属性 含义 __name__ 类、函数、方法等名字 __module__ 类定义所在的模块名? __class__ 对象或类所属的类 __bases__ 类的基类的元组,顺…

    Linux干货 2017-11-21
  • suid, sgid, sticky简介

    SUID属性 passwd命令可以用于更改用户的密码,一般用户可以使用这个命令修改自己的密码。但是保存用户密码的/etc/shadow文件的权限是000,也就是说只有文件的所有者root用户可以写入,那为什么其他用户也可以修改自己的密码呢?这就是由于Linux的文件系统中的文件有SUID属性。 [root@centos6 ~]# ll /etc/shadow…

    Linux干货 2017-07-27
  • Linux 第一周总结

    一、描述计算机的组成及其功能。 计算机组成是由软件和硬件组成的。 硬件部分由cpu、主板、存储器、输入输出设备组成 Cpu:主要是解释计算机指令以及处理计算机软件中的数据。 主板:是微机最基本的也是最重要的部件之一,一般有BIOS芯片、I/O控制芯片、键和面板控制开关接口、指示灯插接件、扩充插槽、主板及插卡的直流电源供电接插件等元件。 存储器:是存储程序和各…

    2017-07-02