linux如何使用符号链接?


11

我的意思是某些进程想要读取符号链接时发生了什么?在读取甚至写入过程中某些东西更改了符号链接时,会发生什么情况?

例如:我有2个巨大的类似100G文件,/mnt/1并且/mnt/2/mnt/1可通过symlink获得/home/user/file。某些程序A开始读取/home/user/file。一段时间后,链接从更改/mnt/1/mnt/2,但A仍在读取文件。

程序是否缓存绝对路径?

它会因为符号链接被更改而失败并出错,或者像什么都没发生一样,它会正常工作吗?

如果/home/user/file链接到块设备(例如2个复制的iscsi磁盘),情况会有所不同吗?

Answers:


9

符号链接指向文件系统中实际文件的名称(inode)。当系统解析该符号链接以找到实际文件并打开它时,它将查找并使用文件的索引节点。此时,您用来获取文件的路径无关紧要。操作系统不缓存的内容是它通过其inode从文件中读取的内容。据我了解,您可以开始通过硬链接读取文件并删除该硬链接(只要文件仍然从其他位置链接),并且只要文件已解决就不会引起问题(名称字符串-> inode)。


4
您可以删除指向该文件的所有链接,并在打开文件后仍继续阅读它。这就是为什么您可以升级软件包而无需像在Windows上那样重新启动的原因。因为即使程序可执行文件正在运行,您也可以对其进行管理。
psusi 2011年

1
@psusi我知道数据和inode仍然存在,只是不再指向它,但是一旦文件被删除,系统就可以覆盖磁盘上的该位置了,对吗?因此,如果文件太大而无法容纳在文件缓存中,例如所涉及的100GB文件,如果在结束之前覆盖其中的一部分会发生什么?对于关键的系统文件而言,这不是问题,因为它们已加载到缓存中并保存在其中,但是100GB足够大,我认为这可能是一个问题。
凯文

2
凯文(Kevin),直到使用文件的上一个进程死掉,文件才从磁盘上删除。您始终可以在proc中找到当前正在使用的所有文件。但是您的回答似乎解释了我的问题。谢谢。

2
这个答案错过了一个关键点,即符号链接包含目标文件的名称
基思·汤普森

6

一个符号链接是包含一个小文件位置的目标文件(即路径和文件名),在表明它是一个符号链接的目录项的标志。

当您打开符号链接时,操作系统将按照该位置查找目标文件。如果目标本身是符号链接,它也会遵循其位置(1)(2),直到该位置指向不是符号链接的文件为止(我们将其称为FinalFile)。然后,操作系统获取FinalFile的索引节点索引节点包含元数据,例如修改时间,并且还具有指向文件数据的指针)。最后,FinalFile的索引节点打开。从现在开始,该进程使用该inode读取/写入文件。结果是更改符号链接名称或路径,删除符号链接,更改路径或FinalFile的名称,甚至删除FinalFile(3)对过程无影响;它仍在从同一inode读取。

在大多数情况下,对符号链接的文件数据操作将影响FinalFile(例如,对Symbollink的读取和写入将对FinalFile进行读取/写入),但也有例外:readlink()系统调用读取符号链接本身的内容。

另一方面,文件元数据操作(如重命名或删除)通常会影响符号链接。但是这里也有例外:lstat()系统调用类似于stat(),不同之处在于它返回符号链接本身而不是FinalFile(2)上的信息。


(1)级别数是有限制的,如果符号链接中的位置是相对路径,则事情会变得更加复杂。

(2)阅读symlink(7):符号链接处理以获取更多详细信息。man 7 symlink

(3)该rm命令或unlink()系统调用不会物理删除文件。它删除指向文件的索引节点的目录条目。仅当以下两种情况都删除文件本身:a)不再有引用其索引节点的目录条目(硬链接),并且b)没有进程打开文件。


1

对于Linux而言,这几乎是透明的,与操作系统相比,它与您正在使用的文件系统的关系更大。

它不是常规文件,也不是很小的文件,因为您不能在VFAT分区中创建有效的符号链接,例如,仅通过将符号链接本身复制到该文件即可,因为它是由文件系统直接记录的。

与硬链接的符号链接的不同之处在于,任命是针对硬链接的,而不是像硬链接那样对数据扇区进行配置。

例:

测试1:

echo 'data' >file.txt

这将创建指向扇区10到20 *(*数字仅用于说明)的硬链接file.txt。

测试2:

现在如果呢?

ln file.txt file_2.txt

这创建了一个指向扇区10到20的硬链接file_2.txt(与file.txt相同),因此,如果删除file.txt,扇区10到20仍然保留,并且您可以在file_2.txt中看到数据。 。(file.txt和file_2.txt都像原始文件一样)

测试3:

ln -s file.txt file_sym.txt 

将符号链接file_sym.txt指向硬链接file.txt,因此,当您尝试访问file_sym.txt时,将看到file.txt,但是如果删除file.txt,file_sym将不再找到目标。

这些由文件系统管理,例如由linux的ext4模块管理(或者如果它是在内核上编译的),则不管您使用的是Linux还是其他Unix。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.