当前位置: 首页 > 科技观察

理解Linux硬链接和软链接(二)

时间:2023-03-18 01:56:49 科技观察

让我们继续这个系列,看看一些你不知道的细微之处。在本系列的第一篇文章中,我们了解了硬链接和软链接,知道链接在很多情况下是非常有用的。链接看起来比较简单,但也有一些微妙奇怪的地方需要注意。这就是我们将在本文中讨论的内容。例如,查看我们在上一篇文章中创建的libblah的链接。请注意我们是如何从目标文件夹创建链接的。cd/usr/local/libln-s/usr/lib/libblah有效,但以下示例无效。cd/usr/libln-slibblah/usr/local/lib也就是说,从原始文件夹到目标文件夹的链接将不起作用。发生这种情况的原因是ln将其视为您在/usr/local/lib中创建了到/usr/local/lib的链接,并在/usr/local/lib中创建了从libblah到libblah的链接。这是因为所有链接文件都获取文件名(`libblah),而不是文件路径,最终结果将是断开的链接。但是,请看下面的这种情况。cd/usr/libln-s/usr/lib/libblah/usr/local/lib有效。奇怪的是,无论你在文件系统的任何地方执行这个命令,它都会正常工作。使用绝对路径,即指定整个完整路径,从根目录(/)开始到需要的文件或文件夹,是最好的实现方式。另一件需要注意的事情是,只要/usr/lib和/usr/local/lib在同一个分区上,像这样创建一个硬链接:cd/usr/liblnlibblah/usr/local/lib也可以工作,因为硬链接不依赖于指向文件系统中的文件来工作。如果硬链接不起作用,那么您可能想要跨分区创建硬链接。比如你在A分区上有一个文件fileA,把这个分区挂载到/path/to/partitionA/directory目录下,你想从fileA链接到B分区上的/path/to/partitionB/directory目录下,这是行不通的。ln/path/to/partitionA/directory/file/path/to/partitionB/directory我们之前说过,硬链接是分区表中指向同一个分区数据的表项。你不能把一个分区表的入口点指向另一个分区上的数据。这种情况只能选择创建软链接:ln-s/path/to/partitionA/directory/file/path/to/partitionB/directory另一个软链接可以做的,硬链接不能做的是link到一个目录。ln-s/path/to/some/directory/path/to/some/other/directory这将在/path/to/some/other/directory中创建到/path/to/some/directory的链接,没有任何问题。当你使用硬链接做同样的事情时,你会得到一个错误提示,说它是不允许的。并且不允许这样做的大量原因导致无休止的递归:如果您在目录A中有一个目录B,然后您将A链接到目录B,并且在目录A中,目录A包含目录B,则会发生同样的事情,其中包含A,其中包含B,依此类推。当然你可以在递归中使用软链接,但你为什么要这样做呢?我应该使用硬链接还是软链接?通常,您可以在任何地方使用符号链接来做任何事情。事实上,有些情况只能使用软链接。话虽如此,硬链接的效率稍微高一些:它们占用的磁盘空间更少,访问速度更快。在大多数机器上,你可以忽略这一点小差异,因为:在磁盘空间越来越大,访问速度越来越快的今天,空间和速度的差异可以忽略不计。但是,如果您在具有小内存和低功耗处理器的嵌入式系统上使用Linux,您可能需要考虑使用硬链接。使用硬链接的另一个原因是硬链接不容易损坏。假设你有一个软链接,你不小心移动或删除了它指向的文件,那么你的软链接就会坏掉,指向不存在的东西。硬链接不会出现这种情况,因为硬链接直接指向磁盘上的数据。事实上,直到指向它的最后一个硬链接将其从文件系统中擦除,磁盘上的空间才会被标记为空闲。另一方面,软链接可以比硬链接做更多的事情,并且可以指向任何东西,无论是文件还是目录。它还可以指向不在同一分区上的文件和目录。只有这两个不同,我们才能做出唯一的选择。