由非root用户装载的FUSE文件系统,不能由root用户访问(除非在装载中使用allow_other
)。
以root身份,我想查询诸如nosuid
之类的按装标志,以便可以将mount()
与MS_REMOUNT|MS_BIND|...
一起使用,以按装量添加MS_RDONLY
旗。在大多数使用statvfs()
来查询现有安装标志的文件系统上,我都取得了成功。但是,有没有一种方法可以处理诸如FUSE(以及带有root_squash的NFS)之类的情况呢?
答案 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/%d
将mount()
fds寻址为路径)。