能否可靠地确定每个安装(“绑定安装”)标志,例如一个FUSE文件系统?

时间:2018-08-28 12:04:17

标签: linux mount fuse

由非root用户装载的FUSE文件系统,不能由root用户访问(除非在装载中使用allow_other)。

以root身份,我想查询诸如nosuid之类的按装标志,以便可以将mount()MS_REMOUNT|MS_BIND|...一起使用,以按装量添加MS_RDONLY旗。在大多数使用statvfs()来查询现有安装标志的文件系统上,我都取得了成功。但是,有没有一种方法可以处理诸如FUSE(以及带有root_squash的NFS)之类的情况呢?

1 个答案:

答案 0 :(得分:0)

是的。 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(包括/proc/self/fd/%dmount() fds寻址为路径)。