【问题标题】:Why can't files be manipulated by inode?为什么inode不能操作文件?
【发布时间】:2011-01-05 16:52:45
【问题描述】:

为什么你只知道文件的inode,而不搜索链接到该inode的文件,却无法访问该文件?文件的硬链接只包含一个名称和一个数字,告诉您在哪里可以找到包含有关文件的所有真实信息的 inode。当我被告知没有用户模式的方式可以直接使用 inode 号打开文件时,我感到很惊讶。

这似乎是系统提供的一种无害且有用的功能。为什么不提供?

【问题讨论】:

  • 这样做的用例是什么?
  • @user 这个问题的灵感来自这个问题。 stackoverflow.com/questions/4605851/… 我还可以看到它被用来将文件传递给另一个有权访问该文件但无权访问我的目录结构的用户。
  • 这正是不允许的原因。如果允许按 inode 编号访问文件,您可以简单地尝试每个 inode 编号并绕过所有目录权限。
  • 一个用例肯定会像其他已经打开文件的人一样打开同一个文件。 UNIX 上的文件名可能同时指向其他文件。
  • 但是如果你有文件名,你可以得到一个 inode - 这个用例仍然对你开放。因此,您可以比较 inode 并验证 -samefile(如果有)。但是你不能单独通过 inode 直接操作。无论如何,我认为这就是我要了解的要点。

标签: linux unix filesystems inode


【解决方案1】:

安全原因——要访问文件,您需要对该文件的权限以及从根目录搜索所有目录的权限,以获取该文件。如果您可以通过 inode 访问文件,则可以绕过对包含目录的检查。

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

【讨论】:

  • 按 inode 编号访问文件的假设功能可能被限制为 root
【解决方案2】:

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

它不是很有用的原因是您需要通过 *stat() 调用找到一个 inode 号,此时您已经拥有文件名(或打开的 fd)。 .或者你需要猜数字。

【讨论】:

  • 啊,但是如果你关闭文件然后想稍后重新打开它,你就不必统计它了。
  • @johnnycrash 这对你有什么影响?当您要在一些非常慢的存储介质上使用文件时,您不能谈论任何有意义的性能提升。
  • @johnnycrash 你不确定你实际上会打开同一个文件:同一个 inode 可能已经被文件系统破坏并重新用于新文件,你不会没有任何方法可以检查是否发生了这种情况。
  • 当您的文件系统变大时,这一点很重要。当您拥有 8 TB 磁盘和 1.5 亿个迭代文件时,它可以将速度提高百分之几。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    Btrfs 确实有一个 ioctl (BTRFS_IOC_INO_PATHS added in this patch),但是它不会尝试检查路径上的权限,而只是保留给 root。

    【讨论】:

      【解决方案5】:

      如果您已经通过路径查找过文件,您肯定不必一次又一次地查找吗?

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

      通过一个目录结构涉及两个拖网。这会通过不必要的字符串操作浪费 CPU 周期。是的,精心设计的文件系统缓存将隐藏大部分这种低效率的情况,不让普通的最终用户看到,但是无缘无故地重复工作即使不是愚蠢的,也是丑陋的。

      【讨论】:

      • 您将 inode 存储在数据库中并避免几个访问周期,这对于字符串操作来说是几十毫秒而不是纳秒。快 1000 倍,尤其是在对 inode 编号进行排序时。
      • 这给了我一些想法。 @Lothar 评论是正确的:如果您通过文件系统绕过名称的使用,您基本上必须使用数据库实现一些等效的。如果您一遍又一遍地打开相同的文件并且想要唯一真正的问题可能是避免一次又一次地解析同一目录中的数百万个文件......解决方案?只需硬链接到包含更少文件的目录中的这些文件。这将避免大多数 CPU 周期丢失,基本上与通过 inode 访问几乎相同。
      猜你喜欢
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 2013-05-10
      • 1970-01-01
      相关资源
      最近更新 更多