UNIX/Linux 系统内部如何管理符号链接。众所周知,即使没有实际的目标文件(悬空链接),符号链接也可能存在。那么在内部代表符号链接的是什么。
在 Windows 中,答案是reparse point
.
问题:
答案是inode
在 UNIX/Linux 中吗?
如果是,那么目标和链接的 inode 编号是否相同?
如果是,链接 inode 是否可以拥有与目标 inode 不同的权限(如果存在)?
UNIX/Linux 系统内部如何管理符号链接。众所周知,即使没有实际的目标文件(悬空链接),符号链接也可能存在。那么在内部代表符号链接的是什么。
在 Windows 中,答案是reparse point
.
问题:
答案是inode
在 UNIX/Linux 中吗?
如果是,那么目标和链接的 inode 编号是否相同?
如果是,链接 inode 是否可以拥有与目标 inode 不同的权限(如果存在)?
它不是关于 UNIX/Linux 而是关于文件系统实现 - 但是,是的,Unix/Linux 在内核级别使用 inode,而文件系统实现具有 inode(至少是虚拟的)。
一般来说,符号链接只是文件(顺便说一句,目录也是文件),具有:
file-type
告诉系统这个文件是一个“符号链接”虚拟文件系统也可以有符号链接,因此,请检查 FUSE 或其他一些文件系统实现源。(ext2/ext3/ufs..等)
所以,
答案是 UNIX/Linux 中的 inode 吗?
取决于文件系统实现,但是是的,通常 inode 包含“文件类型”(以及所有者、访问权限、时间戳、大小、指向数据块的指针)。有些文件系统没有inode
s(在物理实现中),但只有“虚拟 inode”以保持与内核的兼容性。
如果是,那么目标和链接的 inode 编号是否相同?
没有。通常,符号链接是一个具有自己的 inode 的文件,(具有文件类型、自己的数据块等)
如果是,链接inode 是否可以拥有与目标inode 不同的权限(如果存在)?
这是关于符号链接文件的处理方式。通常,内核不允许更改符号链接权限 - 符号链接始终具有默认权限。您可以编写自己的文件系统,允许符号链接具有不同的权限,但您会遇到麻烦,因为常见的程序chmod
不会更改符号链接本身的权限,因此无论如何制作这样的文件系统都是毫无意义的)
要了解硬链接和符号链接之间的区别,您应该首先了解目录。
目录是告诉内核“将此文件作为 to 的映射处理”的文件(由 inode 中的标志区分file-name
)inode_number
。硬链接只是映射到相同inode
. 因此,如果目录文件包含:
file_a: 1000
file_b: 1001
file_c: 1000
上面的意思是,在这个目录中,有 3 个文件:
这是符号链接的主要区别,其中file_b
(inode 1001)的 inode 可以具有内容“file_a”和一个表示“这是一个符号链接”的标志。在这种情况下,file_b
将是一个指向file_a
.
您也可以轻松地自行探索:
$ 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