23

UNIX/Linux 系统内部如何管理符号链接。众所周知,即使没有实际的目标文件(悬空链接),符号链接也可能存在。那么在内部代表符号链接的是什么。

在 Windows 中,答案是reparse point.

问题:

答案是inode在 UNIX/Linux 中吗?

如果是,那么目标和链接的 inode 编号是否相同?

如果是,链接 inode 是否可以拥有与目标 inode 不同的权限(如果存在)?

4

2 回答 2

24

它不是关于 UNIX/Linux 而是关于文件系统实现 - 但是,是的,Unix/Linux 在内核级别使用 inode,而文件系统实现具有 inode(至少是虚拟的)。

一般来说,符号链接只是文件(顺便说一句,目录也是文件),具有:

  • “inode”中的标志 file-type告诉系统这个文件是一个“符号链接”
  • 文件内容:目标的路径 - 换句话说:符号链接只是一个文件,其中包含一个文件名和 inode 中的标志。

虚拟文件系统也可以有符号链接,因此,请检查 FUSE 或其他一些文件系统实现源。(ext2/ext3/ufs..等)

所以,

答案是 UNIX/Linux 中的 inode 吗?

取决于文件系统实现,但是是的,通常 inode 包含“文件类型”(以及所有者、访问权限、时间戳、大小、指向数据块的指针)。有些文件系统没有inodes(在物理实现中),但只有“虚拟 inode”以保持与内核的兼容性。

如果是,那么目标和链接的 inode 编号是否相同?

没有。通常,符号链接是一个具有自己的 inode 的文件,(具有文件类型、自己的数据块等)

如果是,链接inode 是否可以拥有与目标inode 不同的权限(如果存在)?

这是关于符号链接文件的处理方式。通常,内核不允许更改符号链接权限 - 符号链接始终具有默认权限。您可以编写自己的文件系统,允许符号链接具有不同的权限,但您会遇到麻烦,因为常见的程序chmod不会更改符号链接本身的权限,因此无论如何制作这样的文件系统都是毫无意义的)

要了解硬链接和符号链接之间的区别,您应该首先了解目录。

目录是告诉内核“将此文件作为 to 的映射处理”的文件(由 inode 中的标志区分file-nameinode_number。硬链接只是映射到相同inode. 因此,如果目录文件包含:

file_a: 1000
file_b: 1001
file_c: 1000

上面的意思是,在这个目录中,有 3 个文件:

  • 由 inode 1000 描述的 file_a
  • 由 inode 1001 描述的 file_b 和
  • file_c 再次由 inode 1000 描述(因此它是与 file_a 的硬链接,而不是file_a硬链接- 因为无法分辨哪个文件名先出现 - 它们是相同的)。

这是符号链接的主要区别,其中file_b(inode 1001)的 inode 可以具有内容“file_a”和一个表示“这是一个符号链接”的标志。在这种情况下,file_b将是一个指向file_a.

于 2013-06-04T09:22:40.383 回答
3

您也可以轻松地自行探索:

$ touch a
$ ln -s a b
$ ln a c
$ ls -li
total 0
95905 -rw-r--r-- 1 regnarg regnarg 0 Jun 19 19:01 a
96990 lrwxrwxrwx 1 regnarg regnarg 1 Jun 19 19:01 b -> a
95905 -rw-r--r-- 2 regnarg regnarg 0 Jun 19 19:01 c

在第一列中显示 inode 编号的-i选项。ls您可以看到符号链接具有不同的 inode 编号,而硬链接具有相同的索引节点编号。您还可以使用以下stat(1)命令:

$ stat a
  File: 'a'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 28h/40d Inode: 95905       Links: 2
[...]

$ stat b
  File: 'b' -> 'a'
  Size: 1           Blocks: 0          IO Block: 4096   symbolic link
Device: 28h/40d Inode: 96990       Links: 1
[...]

如果您想以编程方式执行此操作,您可以使用lstat(2)系统调用来查找有关符号链接本身的信息(其 inode 编号等),同时stat(2)显示有关符号链接目标的信息(如果存在)。Python 中的示例:

>>> import os
>>> os.stat("b").st_ino
95905
>>> os.lstat("b").st_ino
96990
于 2016-06-19T17:16:42.077 回答