我使用 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
我想更好地了解这里实际做了什么,例如:
为什么还需要 CD 导航?我们不能指定要处理根(计算机)文件夹中的哪些文件吗?
为什么ln后面要加-s?
我在 ln 命令中导航到两个目录,但在其中都找不到 phpmyadmin.conf - 那么,系统如何知道它在哪里(假设没有系统范围内的搜索)。
答案1
符号链接
自动取消引用文件名的引用
符号链接实际上是一个由内核特殊处理的文本文件,其内容是另一个文件/目录的路径。
您可以使用 读取符号链接文件的内容readlink
,如果您标准地打开符号链接文件,系统将打开符号链接内容引用的文件/目录。
指针/C++引用类比
如果您熟悉 C/C++,那么符号链接的行为有点像 C++ 引用或大多数上下文中的自动解引用指针(并非全部:例如,rm
或mv
直接在符号链接上工作,而不是在目标上)。不同之处在于,真正的 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 data
(ln
跨文件系统将失败)。您可以删除fileName
或删除其中一个fileName2
,只要至少保留一个名称,file data
就会继续存在。
absoluteSymlikTofileName
是对该名称的自动取消引用fileName
。只要该路径解析为某些内容,符号链接就有效。如果删除目标,符号链接就会悬空。这是一个绝对符号链接,因此您可以将其移动到其他位置而不改变其有效性。
relativeSymlinkToFileName
fileName
指的是与 的目录在同一目录中调用的名称relativeSymlinkToFileName
。如果将其移动到另一个也有名为 的文件(或目录)的目录fileName
,那么它将指向该目录。
答案2
ln
如果未指定目录,该命令将在当前目录中创建符号链接。因此,phpmyadmin.conf
被放入/etc/apache2/conf-enabled/
.你也可以这样做ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf-enabled/phpmyadmin.conf
这是几乎所有 Unix 命令的标准行为。
该
-s
选项指定您正在创建一个软链接与硬链接。在这里阅读更多内容。我不太明白这个问题(“系统如何知道它在哪里?”)。
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
- 该
cd
命令实际上是可选的;它只是使后续命令的实际语法ln
更简单一些。 - 开关
-s
指示ln
它创建一个象征性的链接而不是硬链接。两种类型的链接之间存在一些差异,但足以说明符号链接本质上是文件系统上的一个标记,表示“您正在查找的文件实际上已经结束”这里.”。 - 您可以创建一个指向实际上不存在的目标的链接;这通常称为“孤立”链接。