链接的概念
在linux系统中,链接可分为两种:一种为硬链接(Hard Link),另一种为软连接或符号链接(Symbolic Link or Soft link)。我们在前面讲解过ln这个命令就是创建链接文件的,在默认不带参数的情况下,执行ln命令创建的链接是硬链接。
第2章 硬链接
- 硬链接是指通过索引节点(Inode)来进行连接。在Linux(ext2,ext3,ext4)文件系统中,保存在磁盘分区中的文件不管是什么类型都会给它分配一个编号,这个编号被称为索引节点编号(Index Inode)简称Inode,即在系统中文件的编号。
- 在Linux文件系统中,多个文件名指向同一个索引节点(inode号相同)是正常且允许的。这种情况的文件就称为硬链接。
- 提示:硬链接文件就相当于文件的另外一个入口。硬链接的作用之一是允许一个文件拥有多个有效路径名(多个入口),这样用户就可以建立硬链接到重要的文件,以防止“误删除”源数据(很多硬件存储,如netapp存储中的快照功能就应用了这个原理,增加一个快照就多了一个硬链接)。为什么一个文件建立了硬链接就会防止数据误删呢?
- 因为文件系统(ext2)的原理是,只要文件的索引节点(Inode Index)还有一个以上的硬链接。只删除其中一个硬链接(即仅仅删除了该文件的链接指向)并不影响索引节点本身和其他的链接(即数据文件实体并未被删除),只有当文件的最后一个链接被删除后,此时如果有新数据要存储到硬盘上时或者系统通过类似fsck做磁盘检查的时候。被删除文件的数据块及目录的链接才会被释放,空间被新数据占用并覆盖。此时,数据就再也无法找回了。
- 也就是说,在linux系统中,删除静态文件(没有进程调用)(目录也是文件)的条件是与之相关的所有硬链接文件均被删除(暂时这样理解即可,后文会讲和进程的占用也有关)
- 下面给出一个文件多个链接的形象图帮助大家理解:
- 硬链接示意图:如果使用ln -s 创建链接则为软链接,前面文件类型为1(字母L)的是软链接。
硬链接:ln 源文件 目标文件
软链接:ln -s 源文件 目标文件(目标文件不能事先存在
硬链接的创建
直接执行命令“ln 源文件 硬链接文件”,即可完成创建硬链接。
2.1 硬链接知识小结
1,如何创建及含义:
- 通过执行命令“ln 源文件 硬链接文件”,即可完成创建硬链接。
- 具有相同inode节点号的多个文件是互为硬链接文件。
2,硬链接与删除
- 删除硬链接文件或者删除源文件任意之一,文件实体(block 数据 文件内容)并未被删除。
- 只有删除了源文件及所有对应的硬链接文件,文件实体(block 数据 文件内容)才会被删除
- 当所有的硬链接文件及源文件被删除后,再存放新的数据会占用这个文件的空间,或者磁盘fsck检查的时候,删除的数据也会被系统回收(养成删除及多套环境测试的好习惯)
3,硬链接文件就是文件的另一个入口(相当于超市的前门,后门一样)。
4,可以通过给文件设置硬链接文件,来防止重要文件被误删。
5,硬链接文件是普通文件,因此可以用rm命令删除
6,文件彻底删除:
对于静态文件(没有进程正在调用的文件)来讲,当对应硬链接数为0(i_link),文件就被删除。 i_link的查看方法(ls -lhi结果的第三列就是)
7,查看文件的硬链接数ls -lhi/stat,i_link的查看方法(ls -lhi结果的第三列就是)
2.2 软连接
- 软连接(Soft Link)也称为符号链接(Symbolic Link)。linux里的软链接文件就类似于Windows系统中的快捷方式。linux里的软链接文件实际上是一个特殊的文件,文件类型是l。软链接文件实际上可以理解为一个文本文件,这个文件中包含有软链接指向另一个源文件的位置信息内容,因此,通过访问这个“快捷方式”就可以迅速定位到软链接所指向的源文件实体。
- 下面给出一个软连接文件的形象图帮助大家理解:
查看软链接的value:
[root@chensiqi1 ~]# ll annn
lrwxrwxrwx. 1 root root 15 12月 30 07:48 annn -> anaconda-ks.cfg
[root@chensiqi1 ~]#
软链接的创建
- 执行命令“ln -s 源文件 软链接文件”,即可完成创建软链接。
- 误区:创建软链接的源文件是需要存在的,要创建的软链接文件是不能存在的,是要用ln命令创建的
2.3 企业面试题
在配置apache时,执行了./configure --prefix=/application/apache2.2.17来编译apache,在make install 完成后,希望用户的访问路径更简单,需要给/application/apache2.2.17目录做一个软链接/application/apache,使得内部开发或管理人员通过/application/apache就可以访问到apache的安装目录/application/apache2.2.17下的内容,请你给出实现的命令。(提示:apache为一个httpd web服务)
思路:
软件的安装位置
/application/apache2.2.17
给开发人员使用的位置
/application/apache2.2.17
升级软件,新的软件的安装位置
/application/apache2.4.17
思考:如何给别人使用的始终是一个路径,即使更新了软件
所以,我们要做软链接,这样不论软件如何更新,通过修改软链接的指向就可以,然后软链接的路径始终不变。
1,创建软链接
2,软件更新了,重新创建软链接
3,如图软链接的地址始终不变,不会影响开发人员的使用,这就是实际工作中软链接的意义
软链接知识小结
1,软链接类似windows的快捷方式(可以通过readlink查看指向)
2,软链接类似一个文本文件,里面存放的是源文件的路径(ls -l),指向源文件实体。
3,删除源文件,软链接文件依然存在,但是无法访问指向的源文件路径内容。
4,失效的时候一般是白字红底闪烁提示。
5,执行命令“ln -s 源文件 软链接文件”,即可完成创建软链接(目标不能存在)
6,软链接和源文件是不同类型的文件,也是不同的文件。inode号也不相同
7,软链接文件的文件类型为“1(字母1)”,可以用rm命令删除
2.4 示例演示
2.4.1 文件软硬链接示例
目录的软链接在实际生产场景中经常用到,硬链接用的不多。
思考:下图为何不能创建硬链接
分析:
- 硬链接的本质其实就是有多个入口,都可以看到目标文件的内容。这些入口就是门,也就是硬链接。
- 硬链接其实也就相当于做备份--超市A ---超市A.bak
- 软链接就相当于windows的快捷方式,这就如同超市并没有多开新的门,仍旧用的旧门,只不过告诉你通过多条路都可以来到这个门而已。
- 因此,对linux来说,硬链接需要系统将目标文件做备份,删除其中的任何一个,文件内容都不会消失,只不过是删除了其中的一份备份而已;而软链接并没有做备份,他只是多增加了一条来到门前的通路而已。
- 故,假如linux允许给目录做硬链接的话,他就同时需要给目录下的所有文件在做一个硬链接,这样会导致系统不断的进行遍历,拖慢系统的运行速度。
测试
通过软硬链接都能看到目标内容,因此,对其中的一个的内容做出改变,所有都改变。
当删除源文件后,硬链接的文件不受影响,但是软链接文件失效
测试结论:
- 软链接和硬链接都指向相同的文件内容,因此其中一个的文件内容发生改变,所有的链接文件内容都发生改变
- 当源文件chensiqi被删除,软链接受到影响,进入失效状态,因为软链接是通过源文件作为入口才能看到文件内容的,入口没了,软链接自然失效。
- 而源文件被删除,硬链接不受影响,是因为,硬链接单独开辟了一个能够看到文件内容的入口,源文件的入口没了,不影响硬链接的入口的正常使用。
2.6 链接总结
2.6.1 软硬链接小结
通过测试,我们可以得到以下几个结论:
1,删除软链接,对源文件和硬链接文件无影响
2,删除硬链接,对源文件和软链接无影响
3,删除源文件,对硬链接无影响,但是软链接失效
4,同时删除源文件和硬链接,整个文件就会真正的被删除
5,源文件和硬链接文件具有相同的索引节点号,可以认为是同一个文件或一个文件的多个入口。
6,源文件和软链接文件索引节点号不同,是不同的文件,软链接相当于源文件的快捷方式,含有源文件的位置指向。
2.6.2 有关目录链接小结
1,对于目录,不可以创建硬链接,但可以创建软链接
2,对于目录的软链接是生产场景运维中常用的技巧
3,目录的硬链接不能跨越文件系统(从硬链接原理可以理解)
4,每个目录下面都有一个硬链接“.”号,和对应上级目录的硬链接“..”
5,再父目录里创建一个子目录,父目录的链接数增加1(每个子目录里都有..来指向父目录)
但是在父目录立创建文件,父目录的链接数不会增加。
2.6.3 企业面试题
描述linux下软链接和硬链接的区别
解答:
1,默认不带参数情况下,ln命令创建的是硬链接,带-s参数的ln命令创建的事软链接
2,硬链接文件与源文件的inode节点号相同,而软链接文件的inode节点号与源文件不同。
3,ln命令不能对目录创建硬链接,但可以创建软链接,对目录的软链接会经常被用到。
4,删除软链接文件,对源文件及硬链接文件无任何影响
5,删除文件的硬链接文件,对源文件及软链接文件无任何影响
6,删除链接文件的源文件,对硬链接文件无影响,会导致其软链接失效
7,同时删除源文件及硬链接文件,整个文件才会被真正的删除
8,软链接可以跨文件系统,硬链接不可以跨文件系统
2.6.4 链接知识扩展
李小龙说过一句话,他不怕一千个动作只练一遍的人,而怕一个动作练一千遍的人
简单的事情重复做就是高手,不断重复下去就是专家
综上:请千万记得,正在使用当中的文件,即便你删除了i_nlink(硬链接数),文件实际上也并没有被删除,因为,文件还正在处于读写状态。只有i_count的数也为零时,文件才会被彻底删除。
再生产环境中,有时会遇到apache等类似服务,磁盘满了的情况,会要求你去删掉些日志,如果此时你去删除了,你会发现磁盘空间占用没有改变,还是满的,而且查询不到。这是因为,后台进程仍旧在占用着被删掉了的日志文件,因此linux并没有将内容删除(block),你的删除只是清除了inode和文件名而已。解决这个问题就需要重新启动apache
较好的处理方案,清空日志而不删除日志>/app/logs/access_log