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