【问题标题】:Can root reliably determine the per-mount ("bind mount") flags e.g. for a FUSE filesystem?root 是否可以可靠地确定每个挂载(“绑定挂载”)标志,例如对于 FUSE 文件系统?
【发布时间】:2019-02-03 01:29:32
【问题描述】:

非 root 用户挂载的 FUSE 文件系统,root 无法访问(除非在挂载时使用 allow_other)。

作为root,我想查询每个挂载的标志,例如nosuid,以便我可以使用mount()MS_REMOUNT|MS_BIND|... 来添加每个挂载的MS_RDONLY 标志。我在大多数使用statvfs() 查询现有挂载标志的文件系统上都取得了成功。但是有没有一种方法可以处理像 FUSE(和带有 root_squash 的 NFS)这样的情况?

【问题讨论】:

  • Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super UserUnix & Linux Stack Exchange 会是一个更好的提问地点。
  • ...为了在 systemd 中为 C 代码编写补丁,我需要回答的关于 Linux API 的问题与编程或开发无关?如果 Q 需要移动,我对 U&L 非常满意,但我不明白为什么。

标签: linux mount fuse


【解决方案1】:

是的。 statvfs() 也适用于这种情况。同时避免了FUSE文件系统的阻塞。

$ mkdir mnt
$ bindfs --no-allow-other mnt mnt
$ stat -f mnt
  File: "mnt"
    ID: 0        Namelen: 255     Type: fuseblk
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 78150265   Free: 8223357    Available: 4722313
Inodes: Total: 19857408   Free: 18558102

$ strace stat -f mnt
...
statfs("mnt", {f_type=FUSE_SUPER_MAGIC, f_bsize=0, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={val=[0, 0]}, f_namelen=0, f_frsize=0, f_flags=ST_VALID|ST_NOSUID|ST_NODEV|ST_RELATIME}) = 0
...

  File: "mnt"
    ID: 0        Namelen: 0       Type: fuseblk
Block size: 0          Fundamental block size: 0
Blocks: Total: 0          Free: 0          Available: 0
Inodes: Total: 0          Free: 0
+++ exited with 0 +++

statvfs() 被明确记录为不需要访问目标目录,只需要访问父目录。

EACCES (statvfs()) 的组件的搜索权限被拒绝 路径的前缀。 (另见 path_resolution(7)。)

不幸的是,您的重新挂载过程确实存在竞争条件,如果您无法打开目标目录,则无法修复。注意O_PATH 允许您打开目录而不需要对目录本身的任何权限。 (O_PATH fds 然后可以使用/proc/self/fd/%d 寻址为路径,包括mount())。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2021-06-21
    • 2015-03-03
    • 2016-07-15
    • 2022-08-20
    相关资源
    最近更新 更多