Linux基础学习 | 软链接和硬链接

1,668 阅读5分钟

前言

在Linux中文件的链接分为俩种,一种是被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link),也叫作软链接

正文

首先我们可以通过ll命令查看当面目录文件的详细信息时,其中就有一个是该文件的硬链接数量,比如下面:

image.png

这个红框里面的数字就是该文件的硬链接数量,所以这里我们就需要搞清楚什么是硬链接以及为什么一个文件有这么多硬链接。

索引节点

索引节点是类Unix文件系统中的一种数据结构每个索引节点保存了文件系统中的一个文件系统对象的元信息数据,但是不包括数据内容或者文件名

可以使用stat命令查看一个文件的inode信息,关于Linux中众多命令,当不知道如何使用,可以使用man命令来查看其文档,比如"man stat"查看stat命令的作用:

image.png

这里可以知道stat命令就是显示一个文件或者文件系统的状态,我们使用"stat a"查看a文件的信息:

image.png

从这里我们知道一个文件的inode信息包含如下:

  • 文件的大小,即字节数;
  • 文件的inode号
  • 文件的拥有者的User ID;
  • 文件的Group ID;
  • 文件的时间戳有3个,分别是最近访问、最近更改和最近改动。
  • 硬链接数;
  • 文件数据block的位置。

这里我们并没有说文件名,因为在Linux系统内部不使用文件名而是使用inode号来识别文件。对于系统来说,文件名只是inode号便于识别的别称或者绰号。表面上,用户通过文件名打开文件,实际上系统内部是首先找到这个文件名对应的inode号,然后通过inode号获取inode信息,最后通过inode信息找到文件数据所在的block,读出数据。

硬链接

既然我们知道Linux中文件是以inode号来识别的,那就会出现多个文件名指向同一个inode号的情况,这种情况就可以使用不同的文件名访问同样的内容。对文件内容进行修改,会影响到所有文件名,但是删除一个文件名,不影响其他文件名的访问,这种情况就是硬链接(hard link)

简单来说,硬链接就是同一个文件使用了多个别名(他们有共同的inode)。在Linux中,多个文件名可以指向同一索引节点,这样的作用就是允许一个文件拥有多个有效路径名,这样用户可以建立硬链接到重要文件,以防止"误删"。原因如下,当一个文件索引节点有1个以上的硬链接,只删除一个硬链接并不影响索引节点本身以及其他硬链接,只有最后一个硬链接被删除后,文件的数据块才真会被释放。

软链接

另一种链接称为符号链接,也叫作软链接。它非常好理解,软链接文件类似于Windows的快捷方式,它实际上是一个特殊的文件,在符号链接中,文件其实是一个文本文件,其中包含的是另一个文件的位置信息

ln命令

为一个文件建立硬链接或者软链接的命令就是ln,使用也非常简单,下面的test目录是新创建的,现在执行如下命令:

image.png

这里先创建了一个测试文件f1,然后创建了f1的硬链接文件f2,f1的软链接文件f3,然后使用"ls -li"可以显示文件的inode信息:

image.png

从这里我们可以看出硬链接f2与原文件f1的inode相同,而符号链接文件f3的inode节点不同

接下来我们继续来看软硬链接的区别,操作如下:

image.png

这里我们先对f1文件进行修改,发现f2和f3都可以访问,内容一样;然后把f1文件删除,由于f2是硬链接,所以f2依旧可以查看内容,而符号链接f3则查看文件无效,这也就是软硬链接最大的区别。

默认的硬链接

搞明白硬链接的含义之后,我们来看一个简单问题,我们进行如下操作:

image.png

这里我们在test目录下创建了d1目录、d2目录和t3文件,同时在d1目录里面又创建了子目录的d11,这里可以使用tree命令来查看文件和目录结构,这时我们使用ls -l命令查看文件的硬链接数,会发现t3是文件,它有一个硬链接就是t3这个名字,很容易理解。那为什么d2的硬链接有2个,而且d1的硬链接是3个呢,多的是什么?

其实我们进入文件夹,使用ll -li查看所有文件详细信息就明白了:

image.png

原来是因为创建目录时默认会创建上级目录的硬链接..和当前目录的硬链接.,从上面信息我们可知d1的inode为395954,进入d1目录,./的inode也是395954,再进入d11目录,../的inode也是395954,这也就解释了为什么d1会有3个硬链接的原因了。

总结

本篇文章介绍了Linux中文件的软链接和硬链接,简单来说硬链接就是文件的别名,软链接相当于快捷方式,删除原文件时,硬链接不受影响,软链接文件会受到影响,只有一个文件的所有硬链接都被删除时,才会真正释放。本篇文章涉及了stat、ln和tree命令的使用,目录在创建时会默认创建./和../硬链接。

笔者水平有限,文中有问题,欢迎指正。最后记录一下Flag。# 一个Android开发的学习Flag记录贴