5

彻底明白Linux硬链接和软链接

 2 years ago
source link: https://os.51cto.com/article/702714.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
彻底明白Linux硬链接和软链接-51CTO.COM
彻底明白Linux硬链接和软链接
2022-02-28 09:44:09
在Linux系统下,有两种链接文件,一种是硬链接(Hard Link),一种是软链接,也称为符号链接(Symbolic Link)。

a8f4da49570e70fd7ef28833e395bdf71c52b2.jpg

什么是硬链接和软链接,要想知道什么是硬链接和软链接的话,让我带你研究。看完这篇文章,让你彻底明白什么是硬链接,什么是软链接!!!

首先,在Linux系统下,有两种链接文件,一种是硬链接(Hard Link),一种是软链接,也称为符号链接(Symbolic Link)。

在Linux系统下可以使用ln命令创建硬链接:

ln [参数] [源文件或目录] [目标文件或目录]

82d179d3471caf15973463be8c1079263aa822.jpg

在文件系统里,每一个文件都会有一个索引节点(Inode Index),这个索引节点用来标识这个文件,硬链接就是通过这个索引节点进行链接。只有在同一文件系统中的文件之间才能创建硬链接,不能对目录进行创建,但是这个硬链接又可以建立多个,也就是可以有多个文件指向同一个索引节点,或者说一个文件可以拥有多个路径名,因此一个文件可以对应多个文件名。

我们可以使用ls命令来查看源文件和我们刚刚创建的硬链接的索引节点:

d8041de580ded8e7db26012644690bae102d62.jpg

从图中我看可以看到源文件和硬链接文件的索引节点是相同的,所以源文件和硬链接文件是指向同一个索引节点的。

那么,为什么目录就不能创建硬链接?我们来试一下。

a848dec5925a2c0ae26256d446c6bbbd53860c.jpg

如上图一样,是不允许用户给目录去创建硬链接的,目录树大家知道吧,如果给目录创建硬链接,我们仔细想一想,这样的话那目录树是不是就变成环形的了,当我们要定位这个目录下的文件的时候,就不能通过名字去定位了。

硬链接相当于创建了源文件的副本,如果硬链接文件的内容修改了,那么源文件的内容也会改变。

我们在Linux系统下开发的时候,是不是遇到过有时候误删了一些文件,然后想找回来又无能为力,怎么办?

如果不知道怎么恢复,那就吃一堑,长一智呗,下次我就多建立几个硬链接,这样这个文件就有了多个链接,即使删除了其中一个链接也没事,另外的源文件或其他的硬链接文件仍然可以用,只是删除其中一个链接对索引节点和其他链接并不影响,因为只是删除了文件到索引节点的链接,只要不是把最后唯一的一个链接也删除了就好,最后一根稻草还是要留着的。

我们尝试删除硬链接看看:

69726891706c9e56eab8271c1acae8f88cf22d.jpg

然而,在Linux系统中,都会包含多个文件系统,这些文件系统都会位于不同的磁盘或者分区,就如前面所说的,硬链接只能在同一文件系统下创建,这是不是有点不太方便?

是的,硬链接只能是这样了,但是我们聪明的人类怎么能只能是这样了,这时候软链接就上场了,那么软链接又发生了什么?

在Linux系统下,软链接可以实现文件或者目录的共享,它就像Windows下的快捷方式一样。

我们可以简单把软链接的内容当成是一个链接或一个路径,当我们使用软链接的时候就是通过软链接的内容去访问这个链接或这个路径的内容,就像我们使用www.baidu.com这个链接访问百度,或者在Ubuntu下使用sudo vim /etc/network/interfaces 去访问/etc/network/interfaces这个路径里的内容。

前面提到硬链接只能在同一文件系统下创建,那么软链接就不会有这个限制,可以理解为软链接的产生就是为了摆脱这个限制的。

软链接文件可以是指向任意一个文件系统下的任意文件或目录,不仅如此,软链接还可以指向一个不存在的文件,但是不能对不存在的文件创建硬链接哦!

讲到这里,应该知道什么是软链接了吧!

在Linux系统下使用ln命令创建软链接,和创建硬链接的命令差不多,我们来试一试:

1. 创建软链接:

18c1e01015ecbb43cf13140af4e3ea65acb426.jpg

2. 删除软链接:

23554ab273e901d88dd045f2ec0b7c1ac9f956.jpg

从上图我们可以看到,当源文件被删除后,软链接文件名字依然显示在目录里面,但是我们真正查看软链接文件的时候,其实它已经不存在了,变成了死链接,只是还显示在目录里面了,其实这个不难理解,我们想一想在Windows里面快捷方式,它也是这样的,当我们把安装在Windows下的某一个APP的源文件全部删除了,它的快捷方式还是在桌面显示着,但当我们鼠标点击这个快捷方式的时候就会弹出文件已经不存在的窗口。

e8f78b5416718d8fde2738566ea77d6c19772f.jpg

当我们不想要Windows桌面下的快捷方式的时候,我们直接删除这个快捷方式就行,软链接也是一样,我们直接删除软链接就行了。

在我们创建软链接的时候要注意一个小问题,不要和我一样使用相对路径,就是一定要用绝对路径,不能用相对路径,相对路径创建的软链接无法访问,访问会报错:

Too many levels of symbolic links.

当你看到这行报错的时候,改用绝对路径就解决了这个问题。

下面我简单说两个我在实际场景中使用到软链接的地方:

   1. 有时候我们总是需要执行很多的命令,而且执行的这些命令又是对应不同的目录的路径,有些路径真是又长有难记,敲出整个路径真是费劲,效率也变低了,这时候软链接的作用就体现出来了,把这些又长又臭的路径创建一个软链接到当前的路径下,是不是路径简单多了。

   2. 我在虚拟机里面安装了好多种交叉编译器,然后不同的编译器有可能就会用到不同的第三方库,做法肯定是将头文件放到编译器的路径下,编译程序的时候就会自动找到头文件,但是这个库文件会比较大,如果每一种编译器都要用的话,每个都搬过去比较占空间,这时候软链接的作用就来了,通过创建软链接的方式,我们创建软链接放过去,将这个库文件共享,这样不也可以减少磁盘空间的占用嘛。

软链接的作用还有很多的,需要我们在不同的场景下灵活运用好软链接的作用,最终可能使我们的工作更加简便,或者可以提高工作效率。

在实际应用中,硬链接使用较少,软链接会使用的多。

责任编辑:庞桂玉 来源: 良许Linux
zanpc.bd208a1.pngzanpchover.fdd60ba.png
weixin.23cd8b3.png 分享到微信
weibo.16d6b4f.png 分享到微博

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK