【问题标题】:Presenting a virtual filesystem to a Linux process without root access将虚拟文件系统呈现给没有 root 访问权限的 Linux 进程
【发布时间】:2015-10-30 04:59:46
【问题描述】:

我正在寻找一种将用户空间文件系统呈现给特定 Linux 进程的方法,但我没有 root 访问权限。

显而易见的答案是 FUSE 但没有 root 访问权限我无法加载内核模块,因此 FUSE 似乎是不可能的(除非有办法 LD_PRELOAD 它?)。

下一个最好的东西似乎是 LD_PRELOAD,它可以拦截相关的 FS 调用,然后对其进行转换,就像 FUSE 在 VFS 层所做的那样。

所以我的问题是:

  1. 是否存在像 FUSE 这样的支持 LD_PRELOAD 的文件系统?
  2. 如果我 LD_PRELOAD 某个进程的某些 FS 调用拦截,是否有任何陷阱,例如 FS 拦截可能没有被分叉或子代继承?

【问题讨论】:

  • github.com/axw/mrhooker 到目前为止看起来是最有希望的,尤其是看到我的 Python 比我的 c.我会等几天看看是否有其他建议,如果没有,请尝试。

标签: linux filesystems ld fuse ld-preload


【解决方案1】:

AFAIK LD_PRELOAD 只能帮助您添加一些额外的库 (.so),这些库在默认路径中不存在于系统中(与文件系统无关)。

考虑到 linux 中的正常控制流程,所有这些系统调用(文件系统相关)最终都会进入内核空间,并最终到达指定的文件系统内核模块。 FUSE 将其路由回用户空间。我不认为你可以在 VFS 拦截而不干扰内核级代码。

根据您的要求,您可能需要对 libc 进行包装,它将这些文件视为特殊情况并绕过系统调用

【讨论】:

  • LD_PRELOAD 确实允许我自己“覆盖”文件系统调用(以及对共享库函数的任何其他调用),我已经知道这是可能的。我所追求的是已经写好的东西,并且确认没有任何问题。 tomaz.me/2014/01/08/… 有一个很好的工作示例,可以准确地完成您认为无法完成的事情。
  • 嗯,我从您的问题中了解到,您对处理数据不感兴趣,而只是对操作路径/权限感兴趣。一旦您使用路径进行系统调用,所有这些都在内核模块中的文件系统查找实现中完成。如果您希望完全控制数据和元数据,不妨看看 HDFS 实现。他们提供 api 来专门推送和检索数据。尽管用于不同的目的,但您可能会看到类似的行。
  • 文件系统调用在 libc 中并且可以重载。 gnu.org/software/libc/manual/html_node/… 仅记录了一些调用,您可以使用 LD_PRELOADed 库重载这些调用,以改变进程不仅打开而且读取、写入、查找等的方式。这提供了透明加密、压缩等的可能性,而不仅仅是简单的操纵路径。我正在寻找一个可以挂钩的 LD_PRELOADable 文件系统,以便将虚拟文件系统呈现给 linux 进程,而 HDFS 不是。
猜你喜欢
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
相关资源
最近更新 更多