博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
软链接文件和硬链接文件
阅读量:5851 次
发布时间:2019-06-19

本文共 2566 字,大约阅读时间需要 8 分钟。

hot3.png

1、软链接文件

 

软链接文件和硬链接文件都属于链接文件。软链接类似于 windows 的快捷方式。

见下图例子,

04ad450db204520b697a1be53ca37338c62.jpg

上图红色框框中的 /bin 就是一个软链接文件,真正指代的是 usr/bin 。所以命令其实应该是写成 ls -l /usr/bin ,/bin/ls 其实就是 /usr/bin/ls ,几个命令都可以执行,结果也是一样的。

0380951e14526575fbf551d184914e7fb50.jpg

软链接说白了,就是在一个文件里存放另一个文件的路径,软链接的大小和路径是有关系的,路径越长,软链接占用的内存越大。来看一下在哪个文件下面软链接比较多。见下图,

8918fa897e15c88a61c1812ef04fc82858c.jpg

这些粉绿色的文件就是软链接文件,它真正的文件就是后面指代的文件。软链接在拷贝文件的时候比较好用,可以大量节省空间。见下图,

0bbc20046d86b2e044ce33f79831ba16821.jpg

将目录 /tmp/ 下的文件 yum.log 做个软链接到目录 /root/111/yum.log ,一开始显示权限不够,是因为有 i 或 a 权限,使用 chattr 命令将 i 和 a 权限去掉以后,就可以执行命令 ln -s /tmp/yum.log /root/111/yum.log ,将文件 /tmp/yum.log 做软链接到 /root/111/yum.log ,执行命令 ls -l /root/111/ ,就可以查看到文件 yum.log 的软链接文件和后面指代的真正文件。

综上,软链接命令就是, ln -s + 源文件 + 软链接文件 。

软链接不仅可以链接文件,也可以链接目录。见下图,

9c4e69c5d287d5281f02def13023e81e860.jpg

048202c88ceee24e7ea81d88fa5ad8fbd60.jpg

上图中,粉绿色的目录就是软链接目录,后面指代的真正目录比较特殊,是绝对路径,以根 / 开头。跟上面查看的目录 /lib64/ 不一样,目录 /lib64/ 里面的路径都是相对路径。

现在做一个实验,把 yum.log 文件做一个软链接,命名为 lyslinux.log 。见下图,

27deae4c43a4097581af83f4ef462a517e0.jpg

4bb52bec0d9f8795cd3992ca7cf6a6fb05e.jpg

上图中的软链接就是相对路径,设置的这个软链接仅仅是在当前目录下,不过这样做会有一些弊端,如果换一台服务器之后,这个相对路径就会失效,软链接文件会打不开。所以,工作中要尽量使用绝对路径来设置软链接。

来举个例子,见下图,

9d41192fc118d6f03e4120939b06a46fd57.jpg

110466ea6f7446d137ab6148d9a6b8d67be.jpg

上图中创建了一个 root 下不存在的文件 lyslinux.log ,然后设置软链接,查看的时候,文件变成红色的,还一直在闪,这说明这个文件是不存在的。因为这个软链接文件是当前目录下不存在的文件,见下图,

00aea259a0406917661bc36c47e35fea142.jpg

红色就是不存在的文件,接着用命令 touch 在目录 123 下面新建一个 yum.log 文件,再来查看,就恢复正常了,lyslinux.log 就变成软链接文件了。

以上,就是为了说明,做软链接的时候,要使用绝对路径。

37cb26251838174c1e5d63b768afd18e3d2.jpg

 

有个工作中经常用到的例子,见下图,

2fb15f77c0a8c1bf92bb93350caea64d0bc.jpg

df -h 这个命令是用来查看磁盘分区的,以后会讲到。现在来假设 /boot/ 磁盘的空间即将使用完全,如果空间不足,会造成很多问题,也会导致系统不能正常使用。现在就需要清理空间,才可以继续正常使用。我们可以把即将装满的磁盘 /boot/ 上的日志或文件移动到其他内存较大且使用量很少的磁盘上去,比如 / 根。但是这个操作是有前提的,不能动这个文件的路径。 

我们的思路是:先将文件内容拷贝到空间较大的磁盘目录里,然后将原目录下的文件删除,这样就可以释放原目录的磁盘空间,接着做一个软链接操作将拷贝的文件软链接到原目录下,这样一来,服务在执行的时候,还是将内容写到原目录下的,但实际上是软链接到拷贝的目录上去。磁盘空间得到有效释放。

 

2、硬链接文件

98a5f294819e8567e5311080de581bab87b.jpg

 

上图中红色框框内的数字,表示有几个文件使用了和这个文件相同的 inode 号。一般文件的话,通常这个数字都是 1 ,说明没有另外一个文件使用相同的 inode 号。但是目录比较特殊,下面会有子目录,包括目录 . 和目录 .. ,这些目录的数量就是红色框框里面的数字。

 

现在要介绍的硬链接和目录没有关系,也就是说硬链接不支持目录,只支持文件。现在对文件 1.txt 做硬链接和软链接,见下图,

6807b1c5a6739af511503c0a84909665565.jpg

上图中,我们是对文件 1.txt 做硬链接和软链接,软链接上面说过了,可以看到软链接占用的空间非常小,才 5 KB,而硬链接占用的内存 65 KB,且和原文件 1.txt 的空间大小是一样的,创建时间也是一样的。再看一下他们俩的 inode 号,都是 33582997 。也可以看到这俩文件前面的数字都是 2 ,这说明有两个文件使用了同一个 inode 号,但实际上这个不太好区分。想找一个文件的硬链接文件不好找,除非是自己创建的,不过不好找不代表找不到,使用 find 这个命令可以找出来,后面会说。

简单来说,就是创建一个文件,这个文件和另外一个文件的 inode 号一样,这两个文件相互为硬链接文件。这两个文件是一样的,没有像软链接那样有原文件和快捷方式之分。而软链接的原文件是不能删除的,否则软链接文件就失效了。硬链接呢?见下图例子,

d371c4fb88ba83b581403b282029e3c58ce.jpg

上图把文件 1.txt 删除掉,再查看,可以看到软链接文件显示红色,软链接后面指代的真正文件显示红色并且在闪。说明软链接文件失效,只剩下路径了。而硬链接文件还在,不受影响,只不过文件前面的 inode 号变成 1 了。所以,硬链接删不删原文件是不受影响的。 

我们可以理解为,硬链接的文件名只是一个门面,真正保存信息的文件在 inode 上,见下图,

de3b6ea1aa85f0ce173a480a0a6b9beda34.jpg

inode 是文件系统里的特殊存在,它会记录文件的属性。所以硬链接实际上就是多一个文件指向 inode ,真正的文件在 inode 里面。而且硬链接不会多占空间,因为 inode 就一个。真正占内存的就是 inode ,硬链接只是显示 inode 的一个存在,多几个都不会有什么影响。

不能对目录做硬链接,来试一下,见下图,

7413bec0485436cbdf584235f05cbc49c8e.jpg

硬链接只能针对文件,也是有前提的,不能跨分区,见下图,

上图中的解释是,这两个分区存在相同的 inode 文件。

 

总结:

1、可以对文件做硬链接,不能对目录做硬链接;

2、不能跨分区做硬链接,因为每个分区都存在相同的 inode 文件。

3、硬链接可以删除,因为还有其他的文件使用了一样的 inode ,但是不能把所有相同 inode 的文件都删除掉,总要留一份的。

转载于:https://my.oschina.net/u/3867265/blog/1827102

你可能感兴趣的文章
jQuery上传文件,含进度条。
查看>>
递归遍历目录的迭代器方式
查看>>
深刻理解Python中的元类(metaclass)
查看>>
oracle 内存分配和调优 总结
查看>>
实验二
查看>>
怎么利用javascript删除字符串中的最后一个字符呢?
查看>>
收发数字
查看>>
Redis之事务
查看>>
编译Win32动态库工程的两个链接错误的解决
查看>>
算法图解-贪婪算法
查看>>
【基础篇】Android手动卸载虚拟机程序
查看>>
CSS3秘笈:第九章
查看>>
Lind.DDD.Aspects通过Plugins实现方法的动态拦截~Lind里的AOP
查看>>
LINQ-to-SQL那点事~LINQ-to-SQL中的数据缓存与应对
查看>>
Drawing a circle
查看>>
ZooKeeper安装
查看>>
ssh(1)struts2
查看>>
SpringBoot整合Mybatis
查看>>
20145213《信息安全系统设计基础》实验四 外设驱动程序设计
查看>>
js 在<input type='file'/>的使用中,控制文件的后缀jpg gif等
查看>>