链接是将文件和目录放在您希望的位置的另一种方法。
除了我们在本系列的上一节中详细分析的cp和mv之外,链接是将文件和目录放置在您希望的位置的另一种方法。它的优点是允许您同时在多个位置显示单个文件或目录。
如前所述,在物理磁盘级别,文件和目录之类的东西并不存在。文件系统是为了方便人类使用并虚构化它们。但是在磁盘级别,有一个叫分区表的分区表,它位于每个分区的开头,然后数据分散在磁盘的其余部分。
虽然存在不同类型的分区表,但分区开头的表包含分配每个目录和文件的开头和结尾的数据。分区表就像一个索引:当从磁盘加载文件时,操作系统搜索表中的条目,分区表告诉文件它在磁盘上的起始和结束位置。然后,磁头移动到起始点并读取数据,直到它到达终点。你看:这是你的文件。
硬链接
硬链接只是分区表中的一个条目,指向磁盘上的某个区域,表示该区域已分配给文件。换句话说,固定链接指向已被另一个条目索引的数据。让我们看看它是如何工作的。
打开终端,创建一个实验目录,然后转到:
Mkdir test_dir
Cd test_dir
通过触摸创建文件:
触摸test.txt
要获得更多体验(?),请在文本编辑器中打开test.txt并添加一些单词。
现在通过运行以下命令创建硬链接:
Ln test.txt hardlink_test.txt运行ls,您将看到您的目录现在包含两个文件,或者它看起来像这样。当你阅读之前,你真正看到的是同一个文件的两个名字:hardlink_test.txt包含无填充更多的磁盘空间相同的内容(你可以用大文件试试),并使用相同的inode的test.txt:
ls的-i选项显示文件的“inode值”。 “inode”是分区表中的信息块,其中包含上次修改时磁盘、上的文件或目录的位置以及其他数据。如果两个文件使用相同的inode,则无论它们在目录树中的位置如何,它们实际上都是同一个文件。
软链接
灵活链接(也称为符号链接符号链接)与物理链接不同:灵活链接实际上是一个单独的文件,它在磁盘上有自己的inode及其小片段。但它只包含一小部分数据,它将操作系统指向另一个文件或目录。
您可以使用ln的-s选项创建灵活的链接:
Ln -s test.txt softlink_test.txt
这将在当前目录中创建一个软链接softlink_test.txt,该链接指向test.txt。
再次运行ls -li,您可以看到两个链接之间的区别:
$ ls -li
总计8
16515846 -rw-r - r-- 2 paul paul 14 Oct 12 09:50 hardlink_test.txt
16515855 lrwxrwxrwx 1 paul paul 8 Oct 12 09:50 softlink_test.txt - >
的test.txt
16515846 -rw-r - r-- 2 paul paul 14 Oct 12 09:50 test.txtHardlink_test.txt和test.txt包含文本并且字面上占据相同的空间。它们使用相同的inode值。同时,softlink_test.txt占用的内容要少得多,并且具有不同的inode值,这标志着它是一个完全不同的文件。使用ls的-l选项还会显示灵活链接指向的文件或目录。
为什么要使用链接?
它们适用于具有自己环境的应用程序。您的Linux发行版通常不附带您需要的最新版本的应用程序。以优秀的Blender 3D设计软件为例。 Blender允许您在3D和动画电影中创建静态图像,每个人都希望将它们放在自己的机器中。问题是Blender的当前版本至少是一个优于任何发行版本的版本。
幸运的是,Blender提供开箱即用的下载。除了程序本身,这些包还包含Blender需要运行的复杂库和依赖框架。所有这些数据和块都在它们自己的目录层次结构中。
每次要运行Blender时,您都可以复制下载它的文件夹并运行它:
./blender
但这非常不方便。如果您可以从文件系统中的任何位置执行blender命令,例如桌面命令启动器,那将是很好的。
执行此操作的方法是将Blender可执行文件链接到bin /目录。在许多系统上,您可以通过将blender命令链接到文件系统中的任何位置(例如此位置)来使其成为可用。
Ln -s / path / to / blender_directory / blender / home // bin
必须链接的另一种情况是软件需要一个过时的库。如果使用ls -l列出/ usr / lib目录,您将看到许多将闪存的软件链接文件。仔细观察,您会发现软链接的名称通常与它们链接的原始文件类似。您可能会看到libblah链接到libblah.so.2,您甚至可能会注意到libblah.so.2链接到原始的libblah.so.2.1.0文件。这是因为应用程序通常需要安装早于安装版本的库。问题是,即使新版本与以前的版本(通常情况下)仍然兼容,如果程序无法找到你正在寻找的版本,程序会出现问题。要解决这个问题,分布一般会创建一个链接,要求最苛刻的应用程序认为你已经找到了以前的版本,其实只是找到了一个链接,并最终使用的库的更新版本。
有些与从源代码编译的自己的程序有关。您自己编译的程序通常安装在/ usr / local中。程序本身以/ usr / local / bin结尾,它在目录/ usr / local / bin中查找所需的库。但是假设你的新程序需要libblah,但是libblah位于/ usr / lib中,这是所有其他程序都能找到它的地方。您可以通过执行以下操作将其链接到/ usr / local / lib:
Ln -s / usr / lib / libblah / usr / local / lib
或者如果您愿意,可以cd / usr / local / lib:
Cd / usr / local / lib
然后使用链接:
Ln -s ../lib/libblah