如何通过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
在“inode”中告诉系统该文件是“符号链接”虚拟文件系统也可以具有符号链接,因此,请检查FUSE或其他一些文件系统实现源。 (EXT2 / EXT3 / ufs..etc)
所以,
答案是UNIX / Linux中的inode吗?
取决于文件系统实现,但是,通常inode包含“文件类型”(以及所有者,访问权限,时间戳,大小,指向数据块的指针)。有文件系统没有 inode
s(在物理实现中)但只有“虚拟inode”用于维护与内核的兼容性。
如果是,那么目标和链接的inode编号是否相同?
没有。通常,符号链接是具有自己的inode的文件(具有文件类型,自己的数据块等)
如果是,链接inode可以具有与目标的权限不同的权限 inode(如果存在)?
这是关于 怎么样 处理符号链接文件。通常,内核不允许更改符号链接权限 - 并且符号链接始终具有默认权限。你可以编写自己的文件系统,允许符号链接的不同权限,但你会遇到麻烦,因为常见的程序,如 chmod
不要更改符号链接本身的权限,所以制作这样的文件系统无论如何都是毫无意义的)
要理解硬链接和符号链接之间的区别,您应该首先了解目录。
目录是告诉内核的文件(由inode中的标志区分),“将此文件作为地图处理 file-name
至 inode_number
“。硬链接只是映射到它们的文件名 inode
。所以如果目录文件包含:
file_a: 1000
file_b: 1001
file_c: 1000
上述方法,在此目录中,是3个文件:
这是符号链接的主要区别,其中inode为 file_b
(inode 1001)可以有 内容 “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
该 -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
它不是关于UNIX / Linux而是关于文件系统实现 - 但是,Unix / Linux在内核级别使用inode而文件系统实现具有inode(至少是虚拟的)。
通常,符号链接只是文件(顺便说一句,目录也是文件),它们具有:
file-type
在“inode”中告诉系统该文件是“符号链接”虚拟文件系统也可以具有符号链接,因此,请检查FUSE或其他一些文件系统实现源。 (EXT2 / EXT3 / ufs..etc)
所以,
答案是UNIX / Linux中的inode吗?
取决于文件系统实现,但是,通常inode包含“文件类型”(以及所有者,访问权限,时间戳,大小,指向数据块的指针)。有文件系统没有 inode
s(在物理实现中)但只有“虚拟inode”用于维护与内核的兼容性。
如果是,那么目标和链接的inode编号是否相同?
没有。通常,符号链接是具有自己的inode的文件(具有文件类型,自己的数据块等)
如果是,链接inode可以具有与目标的权限不同的权限 inode(如果存在)?
这是关于 怎么样 处理符号链接文件。通常,内核不允许更改符号链接权限 - 并且符号链接始终具有默认权限。你可以编写自己的文件系统,允许符号链接的不同权限,但你会遇到麻烦,因为常见的程序,如 chmod
不要更改符号链接本身的权限,所以制作这样的文件系统无论如何都是毫无意义的)
要理解硬链接和符号链接之间的区别,您应该首先了解目录。
目录是告诉内核的文件(由inode中的标志区分),“将此文件作为地图处理 file-name
至 inode_number
“。硬链接只是映射到它们的文件名 inode
。所以如果目录文件包含:
file_a: 1000
file_b: 1001
file_c: 1000
上述方法,在此目录中,是3个文件:
这是符号链接的主要区别,其中inode为 file_b
(inode 1001)可以有 内容 “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
该 -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