Linux 如何使用符号链接?

Linux 如何使用符号链接?

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

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

程序是否缓存绝对路径?

它会失败并出错,因为符号链接已更改,还是会正常工作,就像什么都没发生一样?

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

答案1

符号链接指向真实文件的名称(索引节点)在文件系统中。当系统解析该符号链接以查找实际文件并打开它时,它会查找并使用该文件的索引节点。此时,您用于获取该文件的路径并不重要。操作系统不缓存的内容,它通过其索引节点从文件中读取。据我了解,您可以开始通过硬链接读取文件并删除该硬链接(只要该文件仍然从其他地方链接),并且只要文件已被解析(名称字符串->inode)。

答案2

A象征性的链接是一个小文件,其中包含地点目标文件的(即路径和文件名),目录条目中有一个标志表明它是符号链接。

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

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

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


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

(2) 阅读symlink(7):符号链接处理更多细节。man 7 symlink

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

答案3

这对于 Linux 来说几乎是透明的,并且它与您使用的文件系统的关系比与操作系统的关系更大。

它不是一个常规文件,也不是一个非常小的文件,因为您无法在 VFAT 分区中创建工作符号链接,例如仅将符号链接本身复制到其中,因为它是由文件系统直接记录的。

符号链接与硬链接的区别在于,指定的是硬链接,而不是像硬链接那样指向数据扇区。

例子:

测试1:

echo 'data' >file.txt

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

测试2:

现在如果呢?

ln file.txt file_2.txt

这创建了一个硬链接 file_2.txt 指向扇区 10 到 20(与 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,都没有关系。

相关内容