题记:最近闲得无聊,抽空找了一本讲树莓派的书在看。本以为这本书讲的会是树莓派的硬件设计和软件架构,读完前半部分才发现这本书其实是用树莓派做引入,讲的主体还是Linux系统。不过反正闲着也是闲着,就坚持看了下去。昨晚在看到讲文件部分的时候,忽然间顿悟,一个不同于Windows系统的文件结构在我的脑袋里慢慢展开。瞬间觉得有必要把这番图景记录下来,供以后把玩。

前言

Linux系作为全世界最具代表性的开源操作系统类别,受到无数程序员的追捧。与我们常用的Windows相比,两者在诸多方面有所不同,其中比较典型的就是它们文件系统的差异。本博客将从硬链接和软链接切入,讨论Linux独特而高效的文件系统。你好啊,文件😊

image-20210210141551885

硬链接与软链接

在使用Windows系统时,我们常常需要给一个文件(或程序)创建一个快捷方式,以方便我们的操作。但在Linux操作系统下,是不存在“快捷方式”的概念的,我们又如何操作文件呢?说来羞耻,当年在对Linux的硬连接和软连接不甚了解的时候,我都是一层层进入目录,然后手动打开原文件的。那时的我甚至一度对Linux居然没有“快捷方式”感到不可思议。

image-20210210121327079

直到后来我了解到了Linux的文件系统的架构让它拥有了两个比快捷方式还要厉害的连接形式——硬链接和软链接。

在讨论硬链接和软链接之前,有必要先了解一下Linux的文件组织形式:文件树。

文件树

我们知道Linux的所有程序、文档、目录、外设都是以文件形式储存的,所有文件的母目录都是根目录\

其他文件(夹)都是在根目录之下的。

image-20210210122150345

这样就构成了一个独特的树状结构,在我们要find一个文件时,Linux系统实质上就是通过树来一层层查找目标文件的。Linux系统中有一个有趣的程序叫做tree,我们可以用tree [目录]指令生动地看到某目录的树状结构。

image-20210210123318027

实质上,Linux所有的东西都是以文件形式储存的。也就是说,目录(或者叫文件夹)本身也是个特殊的文件。当我们使用vim编辑器打开目录时,可以看到除了说明信息以外,还有以下信息:

image-20210210125708955

这说明了目录文件里存储的信息有:

  • 母目录的路径../
  • 当前目录的路径./
  • 子目录的路径test1/test2/
  • 当前目录的文件tree_file1.txttree_file2.txt

这是个仔细思考之后,会觉得很有趣的事情。一方面,目录本身就是个文件,所以我们可以通过修改目录文件来修改该目录的母目录和子目录;另一方面,文件的存在依靠目录的“记载”,那么我们可以通过将“记载”的信息删除,来对目录中的文件进行控制;再一方面,我们之所以能使用相对路径来进行操作的根本原因就是目录文件中存储了子母文件的信息。

硬链接

前文提到,目录文件的信息可以对目录中的文件进行控制。那么当多个目录的目录文件信息中都有相同的一个文件时会发生什么呢?

事实上,当目录文件中增加一个文件条目时,就建立了一个指向文件的硬链接。一旦有了对应于文件的硬链接,这个文件就被纳入了文件系统。而当一个文件同时出现在多个目录时,它就拥有了多个硬链接。文件拥有的硬链接数目,被称为文件在整个文件系统的链接数。当文件的链接数等于0时,说明没有目录“收留”它了,那么它将被Linux删除。

我们可以使用linkunlink命令来建立或删除硬链接。

image-20210210132434348

需要注意的是,当文件的链接数为1时,若删除硬链接则会导致文件被删除,此时unlink的作用等同于rm

image-20210210131848494

建立硬链接后的两个文件将被文件系统看作是一个文件。这就是说,linkcp不同,修改复制的文件只会影响其本身,而当我修改与之建立了硬链接的文件时原文件也会被同时修改。

软链接

硬链接会破坏文件系统的树状结构,所以Linux不鼓励使用硬链接,而提供了一个新的链接方式:软链接。与硬链接类似,你可以在不同目录下建立对同一个文件的链接,但其又与硬链接不同,建立软链接并不影响文件的链接数。软链接本质是一个特殊的链接文件,读写该文件时,Linux会根据软链接文件记载的绝对路径把相关操作导向软链接所指的原文件。这与Windows的“快捷方式”几乎一模一样。

我们可以通过ln -s的方式来建立软链接。

image-20210210135839109

使用file命令我们可以看到:

image-20210210135927712

tree_file1_link.txt是一个指向tree_file1.txt的软链接文件。

总结

Linux的文件系统很有趣,树状结构散发出一种独特的美学气息,让我不禁想起了《三体》里描绘的未来世界里,人们生活在树状城市的场景之中。Linux拥有的“万物皆文件”的文件系统,让人们有了很大的操作空间,自由地发挥Linux系统的最大能力。