问题 符号链接背后有什么?


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

在Windows中,答案是答案 reparse point

问题:

答案是答案吗? inode 在UNIX / Linux中?

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

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


11481
2018-06-04 08:24


起源



答案:


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

通常,符号链接只是文件(顺便说一句,目录也是文件),它们具有:

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

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

所以,

答案是UNIX / Linux中的inode吗?

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

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

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

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

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

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

目录是告诉内核的文件(由inode中的标志区分),“将此文件作为地图处理 file-name 至 inode_number“。硬链接只是映射到它们的文件名 inode。所以如果目录文件包含:

file_a: 1000
file_b: 1001
file_c: 1000

上述方法,在此目录中,是3个文件:

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

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


14
2018-06-04 09:22





您也可以自己轻松探索:

$ 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

-i 选项 ls 显示第一列中的inode编号。您可以看到符号链接具有不同的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

2
2018-06-19 17:16



和 readlink() 允许你在给定的符号链接中找到存储为路径名的内容 - 但是当一个符号链接中的路径名遍历的一个元素本身就是一个符号链接时,生活变得非常有趣。内核用aplomb处理它;人不一定。还有 realpath() 它确定给定文件的无符号链接绝对路径。 - Jonathan Leffler


答案:


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

通常,符号链接只是文件(顺便说一句,目录也是文件),它们具有:

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

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

所以,

答案是UNIX / Linux中的inode吗?

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

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

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

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

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

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

目录是告诉内核的文件(由inode中的标志区分),“将此文件作为地图处理 file-name 至 inode_number“。硬链接只是映射到它们的文件名 inode。所以如果目录文件包含:

file_a: 1000
file_b: 1001
file_c: 1000

上述方法,在此目录中,是3个文件:

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

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


14
2018-06-04 09:22





您也可以自己轻松探索:

$ 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

-i 选项 ls 显示第一列中的inode编号。您可以看到符号链接具有不同的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

2
2018-06-19 17:16



和 readlink() 允许你在给定的符号链接中找到存储为路径名的内容 - 但是当一个符号链接中的路径名遍历的一个元素本身就是一个符号链接时,生活变得非常有趣。内核用aplomb处理它;人不一定。还有 realpath() 它确定给定文件的无符号链接绝对路径。 - Jonathan Leffler