2011-01-05 28 views
20

为什么当您只知道其inode时无法访问文件,而无需搜索链接到该inode的文件?一个到文件的硬链接只包含一个名字和一个数字,告诉你在哪里可以找到与该文件有关的所有 real信息的索引节点。当我被告知没有用户模式直接使用inode编号打开文件时,我感到很惊讶。为什么不能通过inode操作文件?

这似乎是这样一个无害和有用的系统提供的能力。为什么没有提供?

+2

这样做的用例是什么? – user562374 2011-01-05 16:57:44

+0

@user这个问题受到了这个问题的启发。 http://stackoverflow.com/questions/4605851/how-to-get-directory-name-by-inode-value-in-c我也可以看到它被用来传递一个文件给另一个有权访问的用户文件但没有访问我的目录结构。 – 2011-01-05 17:08:03

+3

这正是不允许的原因。如果通过inode编号访问文件是允许的,您可以简单地尝试每个inode编号并绕过所有目录权限。 – 2011-03-12 05:56:18

回答

15

某些操作系统有那个设施。例如,OS X需要它来支持Carbon File Manager,在Linux上可以使用debugfs。当然,您可以通过find -inum从命令行在任何UNIX上执行此操作,但无法通过inode访问文件的真正原因是它不是特别有用。它确实 kindof规避文件的权限,因为如果有一个文件,你可以读取一个文件夹,你不能读取或执行,然后打开inode让你发现它。

的原因,它是不是非常有用的是,你需要通过*stat()打电话找一个inode编号,此时你已经文件名(或开放FD)...或者你需要猜测inum。

+4

啊,但如果你关闭了文件,然后想重新打开它,那么你就不必去统计它了。 – johnnycrash 2011-06-30 22:51:28

+0

@johnnycrash这是什么让你?当你要在一些非常慢的存储介质上使用文件时,你无法谈论任何有意义的性能增益。 – 2012-03-25 10:15:37

+3

@johnnycrash你不能确定你会打开相同的文件:相同的inode可能已经被文件系统销毁并重新用于新文件,并且你不会有任何方法来检查那事发生了。 – pqnet 2014-08-06 06:14:16

17

安全原因 - 要访问文件,您需要文件权限AS WELL AS权限,以搜索所需文件所需的根目录中的所有目录。如果可以通过inode访问文件,则可以绕过包含目录上的检查。

这允许您创建一个文件,可以由一组用户(或一组组)访问,而不是其他人 - 创建只能由用户访问的目录(每个用户一个目录),然后将文件硬链接到所有这些目录中 - 文件本身可供任何人访问,但实际上只能由对其链接的目录之一拥有搜索权限的人访问。

+3

通过inode编号访问文件的假设功能可能被限制为“root”。 – 2014-09-25 22:47:36

4

回复您的评论:要“传递文件”,您可以通过SCM_RIGHTS(请参阅man 7 unix)使用通过AF_LOCAL套接字传递的fd。

3

Btrfs对此具有ioctl(BTRFS_IOC_INO_PATHS added in this patch),但它不会尝试检查沿路径的权限,并且仅保留给root用户。

2

当然,如果你已经通过一个路径查找文件,你不应该一次又一次地做这件事?

stat(f,&s); i=open(f,O_MODE); 

涉及两个拖网通过目录结构。这浪费了不必要的字符串操作的CPU周期。是的,精心设计的fs缓存将会消除临时终端用户的大部分低效率,但如果不是简单的愚蠢,重复无故的工作就是丑陋的。

+0

您可以将inode存储在数据库中,并避免一些访问周期,这是字符串操作的几毫秒而非纳秒级别。快1000倍,特别是如果您对inode编号进行排序。 – Lothar 2016-04-21 20:06:59

+0

这给了我一些想法。 @Lothar的评论是正确的:如果你绕过文件系统使用名字,你基本上必须使用数据库来实现一些等价物。如果您通过over打开相同的文件,并希望唯一真正的问题可能是避免一次又一次解析同一目录中的数百万文件......解决方案?只是硬链接到包含更少文件的目录中的这些文件。这将避免大部分丢失的CPU周期,基本上与inode访问基本相同。 – kriss 2018-01-25 10:50:52

相关问题