硬链接和软链接的区别

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

一文件系统上创建硬链接

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

~]# 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

相关推荐

  • 大话命令之–ss

    大话命令之—ss ss是Socket Statistics的缩写。顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。 优势: (1)显示更多更详细的有关TCP和连接状态的信息,(2)比netstat更快速更高效。 1 格式 格式:ss    [option]… &nbs…

    Linux干货 2017-05-15
  • 有趣的bash脚本

    1、编写脚本/root/bin/createuser.sh,实现如下功能:使 用一个用户名做为参数,如果指定参数的用户存在,就显示 其存在,否则添加之;显示添加的用户的id号等信息 #!/bin/bash read -p “Please input username: ” n if id $n &> /dev/null;then echo “T…

    Linux干货 2017-08-25
  • 分区”魔术师”的磁盘管理

    设备文件 I/O Ports: I/O设备地址 一切皆文件: open(), read(), write(), close() 设备类型: 块设备: block,存取单位“块”,磁盘 字符设备: char,存取单位“字符”,键盘 设备文件:关联至一个设备驱动程序,进而能够跟与之对应 硬件设备进行通信 设备号码: 主设备号: major number, 标识设…

    Linux干货 2016-08-29
  • Week5 grep和find命令及正则表达式练习

    1、显示当前系统上root、fedora或user1用户的默认shell;   cat /etc/passwd  | grep -E "^\<root\>|^\<fedora\>|^\<\user1\>" |&nb…

    Linux干货 2017-02-14
  • linux基础练习

    马哥教育23期网络班+第6周课堂练习 Linux 基础练习 一、linux基础练习题 1、复制/etc/rc.d/rc.sysinit 文件至/tmp 目录,将/tmp/rc.sysinit 文件中的以至少一个空白字符开头的行的行首加#; 2、复制/boot/grub/grub.conf 至/tmp目录中 删除/tmp/grub.conf 文件中的行首的空白…

    Linux干货 2016-11-01
  • linux添加用户

    今天给大家说一下linux添加用户,大家可能觉得添加用户很简单,’adduser 用户名’就这个命令搞掂了。那么大家知道这个命令帮我们完成了那些事情呢,今天就给大家普及一下 添加一个linux用户需要关系到以下几个文件: 保存用户组的/etc/group文件。 保存用户ID和密码的/etc/passwd文件。 在home目录下生产一个…

    Linux干货 2017-05-28