什么是符号链接?了解符号链接的结构

6 ubuntu symlink apache-httpd phpmyadmin

我使用 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
Run Code Online (Sandbox Code Playgroud)

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

  1. 为什么甚至需要 cd 导航?我们不能从根(计算机)文件夹中指定我们要处理哪些文件,仅此而已吗?

  2. 为什么 -s 在 ln 之后?

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

PSk*_*cik 7

符号链接

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

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

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

指针/C++参考类比

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

悬空符号链接

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

相对符号链接

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


-s 标志和硬链接

-s标志用于“创建s ymlinks”。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`)
Run Code Online (Sandbox Code Playgroud)

目录硬链接

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


符号链接和硬链接——大图概述:

echo 'file data' > fileName 
ln fileName fileName2 #hardlink
ln -s "$PWD/fileName" absoluteSymlinkTofileName 
ln -s fileName relativeSymlinkTofileName 
Run Code Online (Sandbox Code Playgroud)

在同一个物理文件系统上,lnfile data(ln将在文件系统中失败)创建另一个名称。您可以删除fileNamefileName2并且只要至少保留一个名称,就会继续file data存在。

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

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


gar*_*ead 6

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

    ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf-enabled/phpmyadmin.conf
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. -s选项指定您正在创建软链接而不是硬链接在这里阅读更多。

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