符号链接背后有什么?

时间:2013-06-04 08:25:00

标签: linux unix linux-kernel symlink inode

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

在Windows中,答案是reparse point

问题:

UNIX / Linux中的答案是inode吗?

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

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

2 个答案:

答案 0 :(得分:20)

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

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

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

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

所以,

  

答案是UNIX / Linux中的inode吗?

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

  

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

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

  

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

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

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

目录是指向内核的文件(由inode中的标志区分),“将此文件作为file-nameinode_number的地图处理”。硬链接只是映射到同一inode的文件名。因此,如果目录文件包含:

file_a: 1000
file_b: 1001
file_c: 1000

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

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

这是符号链接的主要区别,其中file_b(inode 1001)的inode可以具有内容“file_a”,并且标志意味着“这是符号链接”。在这种情况下,file_b将是指向file_a的符号链接。

答案 1 :(得分: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

-i的{​​{1}}选项显示第一列中的inode编号。您可以看到符号链接具有不同的inode编号,而硬链接具有相同的编号。您还可以使用ls命令:

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 [...] 系统调用查找有关符号链接本身的信息(其inode编号等),而lstat(2)显示有关的信息符号链接的目标(如果存在)。 Python中的示例:

stat(2)