硬链接和软链接
一、硬链接
硬链接是指通过索引节点(Inode)进行的链接。在CentOS6及以前的Linux(ext2、ext3、ext4)默认文件系统中,存在于在磁盘分区中的文件不管是什么类型都会为它分配一个唯一的编号,这个编号就称为索引节点编号(Index Inode),简称Inode,各个文件对应的这个索引节点编号就类似于我们生活中的身份证号码,在Linux同一文件系统中该编号是唯一的。
在Linux系统中,多个文件名指向同一个索引节点(Inode号相同)(Inode)是正常且被允许的。这种情况下的两个文件就称作互为硬链接文件,本质上就是相同文件的两个名字(类似一个人的全名和小名一样)。在同一个分区/文件系统中,Inode号码相同的文件一定是硬链接文件。(注意:硬链接不能跨文件系统创建)
硬链接文件就相当于是原始文件的另外一个访问入口。硬链接的作用之一是允许一个文件拥有多个有效的文件名(多个访问入口,类似于超市的多个入口),这样用户就可以建立硬链接到重要的文件上,为避免“误删”源数据加一份保险(很多硬件存储的快照功能就应用了这个原理,增加一个快照就多了一个硬链接,多了一个硬链接就会增加一层数据的安全)。
因为文件系统(ext)的原理是,只要文件的索引节点(Inode Index)还有一个以上的硬链接,那么,只删除其中的一个硬链接(即仅仅删除了该文件的链接指向)并不会影响索引节点本身和其他的链接(即数据文件实体并未被删除),只有在文件的最后一个硬链接被删除之后,此时如果有新数据要存储到硬盘上,或者系统通过类似的fsck做磁盘检查的时候,被删除文件的数据块及目录的链接才会被释放,空间将被新数据占用并覆盖。当然,这样一来,数据就再也无法找回了。
也就是说,在Linux系统中,删除静态文件(没有进程调用的文件)的条件是与之相关的所有硬链接文件均被删除(暂时这样理解即可,后文会进一步介绍其与进程的占用也有关)。一个静态文件被彻底删除的条件就是该文件的硬链接数量为零。
硬链接的图解说明:
硬链接总结
1、具有相同Inode节点号的多个文件互为硬链接文件,本质上是相同文件的不同文件名。 2、删除硬链接文件或者删除源文件任意之一,文件实体并未被删除。 3、只有删除了源文件及与源文件对应的所有硬链接文件,文件实体才会被删除。 4、待所有的硬链接文件及源文件均被删除之后,再存放新的数据时,新数据会占用这个文件的空间。磁盘进行fsck检查的时候,删除的数据就会被系统回收(养成删除及使用多套环境测试的好习惯)。 5、硬链接文件就是文件的另一个入口(相当于超市的前门、后门)。 6、可以通过对文件设置硬链接文件,来防止重要文件被误删。 7、通过执行命令“ln源文件硬链接文件”,即可完成硬链接的创建。 8、硬链接文件是普通文件,因此可以使用rm命令删除。 9、对于静态文件(没有进程正在调用的文件)来讲,当对应的硬链接数为0(i_link)时,文件就被删除。i_link的查看方法是执行ls-lhi,然后查看结果的第三列。 10、创建硬链接只能针对文件,不能针对目录。
实验案例:
在/tmp目录下创建一个原始文件test.log,并添加数据信息www.nihao.com
[root@node1 tmp]# echo www.nihao.com > test.log [root@node1 tmp]# cat test.log www.nihao.com
创建硬链接
[root@node1 tmp]# ln test.log test_hard.log [root@node1 tmp]# ls -ihl total 8.0K 33554505 -rw-r--r-- 2 root root 14 Sep 25 18:31 test_hard.log 33554505 -rw-r--r-- 2 root root 14 Sep 25 18:31 test.log [root@node1 tmp]# cat test_hard.log www.nihao.com #可以看到硬链接的inode号一样,访问硬链接的内容与源文件一样
删除源文件
[root@node1 tmp]# rm -f test.log [root@node1 tmp]# ls -ihl total 4.0K 33554505 -rw-r--r-- 1 root root 14 Sep 25 18:31 test_hard.log [root@node1 tmp]# cat test_hard.log www.nihao.com #硬链接的任然可以正常访问
在/tmp下创建一个/tmp/data目录,并创建硬链接
[root@node1 tmp]# mkdir /tmp/data [root@node1 tmp]# ln /tmp/data /tmp/data_hard_link ln: ‘/tmp/data’: hard link not allowed for directory #硬链接不支持目录
在/boot下创建/tmp/test_hard.log的硬链接
[root@node1 tmp]# ln /tmp/test_hard.log /boot/test.log ln: failed to create hard link ‘/boot/test.log’ => ‘/tmp/test_hard.log’: Invalid cross-device link #硬链接不能跨文件系统创建
二、软链接
软链接(Soft Link)也称为符号链接(Symbolic Link,symlink)。Linux里的软链接文件就类似于Windows系统中的快捷方式。软链接文件实际上是一个特殊的文件,文件类型用字母l表示。可以将它理解为一个文本文件,这个文件中包含有软链接,其指向的是另一源文件的位置信息内容,因此,通过访问这个“快捷方式”就可以迅速定位到软链接所指向的源文件实体。
软链接的创建方法为:执行命令“ln-s源文件软链接文件”。
要想创建软链接,那么目标文件将是不能存在的,这个文件是要用ln命令创建的,创建软链接必须要有源文件,即针对哪个文件做软链接。
软连接总结
1、软链接类似于Windows的快捷方式(可以通过readlink查看其指向)。 2、软链接类似于一个文本文件,里面存放的是源文件的路径,指向源文件实体。 3、删除源文件,软链接文件依然存在,但是无法访问指向源文件路径的内容了。 4、失效的时候一般是白字红底闪烁提示。 5、执行命令“ln-s源文件软链接文件”,即可完成软链接的创建(目标不能存在)。 6、软链接和源文件是不同类型的文件,也是不同的文件,Inode号也不相同。 7、软链接文件的文件类型为字母(l),可以用rm命令删除。 8、软链接文件不仅可以针对文件,还可以针对目录(企业中常用)。
实验案例:
在/tmp目录中创建测试文件test.log和测试目录data
[root@node1 tmp]# mkdir /tmp/data [root@node1 tmp]# echo www.nihao.com > test.log
在/tmp和/boot目录中创建软链接test1_soft.log和test2_soft.log
[root@node1 tmp]# ln -s /tmp/test.log /tmp/test1_soft.log [root@node1 tmp]# ln -s /tmp/test.log /boot/test2_soft.log [root@node1 tmp]# ls -ihl /tmp total 4.0K 101604690 drwxr-xr-x 2 root root 6 Sep 25 18:43 data 33875544 lrwxrwxrwx 1 root root 13 Sep 25 18:46 test1_soft.log -> /tmp/test.log 33554505 -rw-r--r-- 1 root root 14 Sep 25 18:44 test.log [root@node1 tmp]# ls -ihl /boot/test2_soft.log 78 lrwxrwxrwx 1 root root 13 Sep 25 18:46 /boot/test2_soft.log -> /tmp/test.log [root@node1 tmp]# cat /tmp/test.log www.nihao.com [root@node1 tmp]# cat /tmp/test1_soft.log www.nihao.com [root@node1 tmp]# cat /boot/test2_soft.log www.nihao.com #可以发现软链接的inode号与源文件不一样,软链接可以跨文件系统创建,创建的软链接指向源文件。
创建/tmp/data目录的软链接
[root@node1 tmp]# ln -s /tmp/data /tmp/data_soft1 [root@node1 tmp]# ln -s /tmp/data /boot/data_soft2 [root@node1 tmp]# ls -ihl /tmp total 4.0K 101604690 drwxr-xr-x 2 root root 6 Sep 25 18:43 data 33971386 lrwxrwxrwx 1 root root 9 Sep 25 18:50 data_soft1 -> /tmp/data 33875544 lrwxrwxrwx 1 root root 13 Sep 25 18:46 test1_soft.log -> /tmp/test.log 33554505 -rw-r--r-- 1 root root 14 Sep 25 18:44 test.log [root@node1 tmp]# ls -ihl /boot/data_soft2 79 lrwxrwxrwx 1 root root 9 Sep 25 18:50 /boot/data_soft2 -> /tmp/data #可以创建目录的软链接,也可以跨文件系统创建
删除源文件/tmp/test.log
源文件被删除后,软链接文件还存在,但已经无法访问其中的内容了。