符号链接

符号链接

我使用 Ubuntu 15.10,对 Linux 还很陌生。阅读维基百科后一般而言,什么是符号链接,在 Ubuntu Unix-bash 终端中执行符号链接创建命令后,我应该更好地理解我在创建(和“破坏”)Ubuntu 学习环境时多次使用的符号链接的结构。

我每次安装 PHPmyadmin (PMA) 服务时都会运行一个简短的语法。如果不运行它,该服务就无法工作。根据我收集的信息,以下语法创建了一个符号链接,将 Apache 连接到某个包含 conf 方向的 PMA 文件。

这是我每次运行的语法:

cd /etc/apache2/conf-enabled/
sudo ln -s /etc/phpmyadmin/apache.conf phpmyadmin.conf
service apache2 restart

我想更好地了解这里实际做了什么,例如:

  1. 为什么还需要 CD 导航?我们不能指定要处理根(计算机)文件夹中的哪些文件吗?

  2. 为什么ln后面要加-s?

  3. 我在 ln 命令中导航到两个目录,但在其中都找不到 phpmyadmin.conf - 那么,系统如何知道它在哪里(假设没有系统范围内的搜索)。

答案1

符号链接

自动取消引用文件名的引用

符号链接实际上是一个由内核特殊处理的文本文件,其内容是另一个文件/目录的路径。

您可以使用 读取符号链接文件的内容readlink,如果您标准地打开符号链接文件,系统将打开符号链接内容引用的文件/目录。

指针/C++引用类比

如果您熟悉 C/C++,那么符号链接的行为有点像 C++ 引用或大多数上下文中的自动解引用指针(并非全部:例如,rmmv直接在符号链接上工作,而不是在目标上)。不同之处在于,真正的 C++ 引用绑定到内存地址,而符号链接绑定到文件系统地址。

悬空符号链接

符号链接的内容不必是有效的文件路径引用 --> 那么您就有一个悬空符号链接(如悬空指针或悬空引用)。

相对符号链接

如果符号链接中的文件路径不是绝对路径(以 开头/),则相对文件路径相对于符号链接的位置进行解析(在非符号链接上下文中,相对路径相对于 进行解析$PWD)。


-s 标志和硬链接

-s标志是“创建symlinks”。ln也可以创建硬链接。硬链接在另一个级别上运行,该级别更接近文件系统的实现(因此,您无法跨不同文件系统创建硬链接)。

Unix 文件系统分别存储文件名(/目录名称)和文件内容(目录内容),名称只是指向其内容的自动解引用引用计数指针。硬链接为相同内容创建另一个名称,同时增加引用计数。

$ echo 'the contents' > f1
$ ls -l f1 
  * 1 * #the 2nd column is the reference count
$ ln f1 f2 #create another name for the contents of f1
$ ls -l f1
   * 2 * #the contents of f1 has two named references to it
$ rm f1  #the contents of f1 lives on (in f2) #
         # because rm only removes the reference to the data block
         #and this isn't the only reference
         #(rm ivokes a system call literally named `unlink`)

目录硬链接

您无法创建目录硬链接,但...是为您隐式创建的目录硬链接。因此,目录的硬链接计数反映了它有多少个子目录(每个子目录都带有一个..到父目录的硬链接)。


符号链接和硬链接——总体概述:

echo 'file data' > fileName 
ln fileName fileName2 #hardlink
ln -s "$PWD/fileName" absoluteSymlinkTofileName 
ln -s fileName relativeSymlinkTofileName 

在同一物理文件系统上,ln创建另一个名称file dataln跨文件系统将失败)。您可以删除fileName或删除其中一个fileName2,只要至少保留一个名称,file data就会继续存在。

absoluteSymlikTofileName是对该名称的自动取消引用fileName。只要该路径解析为某些内容,符号链接就有效。如果删除目标,符号链接就会悬空。这是一个绝对符号链接,因此您可以将其移动到其他位置而不改变其有效性。

relativeSymlinkToFileNamefileName指的是与 的目录在同一目录中调用的名称relativeSymlinkToFileName。如果将其移动到另一个也有名为 的文件(或目录)的目录fileName,那么它将指向该目录。

答案2

  1. ln如果未指定目录,该命令将在当前目录中创建符号链接。因此,phpmyadmin.conf被放入/etc/apache2/conf-enabled/.你也可以这样做

    ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf-enabled/phpmyadmin.conf
    

    这是几乎所有 Unix 命令的标准行为。

  2. -s选项指定您正在创建一个软链接硬链接在这里阅读更多内容。

  3. 我不太明白这个问题(“系统如何知道它在哪里?”)。phpmyadmin.conf在当前目录中创建(在本例中为/etc/apache2/conf-enabled/)。

答案3

ln -s /etc/phpmyadmin/apache.conf phpmyadmin.conf

3. 该命令在位置 处创建一个符号链接/etc/apache2/conf-enabled/phpmyadmin.conf,其目标是/etc/phpmyadmin/apache.conf。此后,打开文件/etc/apache2/conf-enabled/phpmyadmin.conf相当于打开/etc/phpmyadmin/apache.conf.如果/etc/phpmyadmin/apache.conf存在,则/etc/apache2/conf-enabled/phpmyadmin.conf具有相同的内容。如果/etc/phpmyadmin/apache.conf不存在则打开/etc/apache2/conf-enabled/phpmyadmin.conf失败,就像/etc/apache2/conf-enabled/phpmyadmin.conf不存在一样。

   符号链接只是文本。链接本身保持存在并指向同一目标,无论该目标是否存在。例如,这允许指向可移动驱动器的符号链接保持存在,无论驱动器是否存在,或者替换符号链接恰好指向的文件(目标可能暂时停止存在的事实不会影响符号链接)关联)。当目标不存在时,符号链接被称为破碎的

1. 无需更改当前目录即可创建链接。当然,必须更改命令以包含所需链接的完整路径。

   ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf-enabled/phpmyadmin.conf

   当符号链接是绝对的(即其目标是绝对路径)时,在创建链接之前更改到目录没有任何优势。当符号链接是相对的时,有一个优点,因为第一个参数是链接的目标,并且它是相对于链接的位置进行解释的,而不是相对于命令运行ln -s时的当前目录。ln例如,可以像这样建立相对链接:

   ln -s ../../phpmyadmin/apache.conf /etc/apache2/conf-enabled/phpmyadmin.conf

   但如果当前目录不是,/etc/apache2那么通常../../不是/etc,所以../../phpmyadmin/apache.conf不是现有目标;例如,它不会被 shell 完成所拾取。

2. 该ln命令在符号链接之前就存在。它最初创建的是硬链接,其用例明显狭窄,因此使用不多。尽管ln -s比 plain 更常用ln,但 plain 的含义ln不能更改,因为这会破坏向后兼容性。

答案4

  1. cd命令实际上是可选的;它只是使后续命令的实际语法ln更简单一些。
  2. 开关-s指示ln它创建一个象征性的链接而不是硬链接。两种类型的链接之间存在一些差异,但足以说明符号链接本质上是文件系统上的一个标记,表示“您正在查找的文件实际上已经结束”这里.”。
  3. 您可以创建一个指向实际上不存在的目标的链接;这通常称为“孤立”链接。

相关内容