由于 FUSE 权限而无法访问的子安装在访问时会消失。如何?

由于 FUSE 权限而无法访问的子安装在访问时会消失。如何?

我尝试使用 FUSE 文件系统设计一个测试用例sshfs。我的想法是sshfs,与涉及 NFS 的原始问题。但我的想法并没有完全按照我的预期进行。

这里发生了什么?

$ mkdir /tmp/alan
$ sudo mkdir /root/mnt
$ sudo sshfs alan@localhost:/tmp/alan /root/mnt
$ mkdir /tmp/alan/mnt
$ sudo mount --bind /root/mnt/mnt /root/mnt/mnt
$ chmod a-rwx /tmp/alan
$ findmnt | grep mnt
  /root/mnt        alan@localhost:/tmp/alan  fuse.sshfs  ...
    /root/mnt/mnt  alan@localhost:/tmp/alan  fuse.sshfs  ...

$ mount -oremount,bind,ro /root/mnt/mnt
mount: /root/mnt/mnt: cannot mount (null) read-only.

$ findmnt | grep mnt
  /root/mnt        alan@localhost:/tmp/alan  fuse.sshfs  ...

底座消失了。

如果我重新运行此命令并mount -oremount在命令中添加前缀sudo strace -e trace=mount,则表明系统调用因“权限被拒绝”而失败,因此该部分似乎按预期工作。

mount("none", "/root/mnt/mnt", 0x55b13233d620, MS_MGC_VAL|MS_RDONLY|MS_REMOUNT|MS_BIND, NULL) = -1 EACCESS (Permission denied)

答案1

您可以将该mount -oremount命令替换为sudo ls /root/mnt/mnt.您会收到相同的EACCESS(“权限被拒绝”)错误,并且安装点仍然消失。

ls /tmp/alan/mnt也会失败,因为EACCESS.请注意,EACCESS即使/tmp/alan/mnt已删除或替换为非目录文件,也会出现错误。

通常,如果/tmp/alan/mnt已被删除或替换为非目录,则子挂载/root/mnt/mnt将不再有效,并且会自动删除。在这种情况下,当内核询问sshfs是否/root/mnt/mnt仍然作为目录存在时,sshfs只需告诉它“权限被拒绝”。内核将此视为失败,就像“没有这样的文件或目录”一样。

我不知道实际情况是否如此。

ls当子安装返回ENOTCONN“传输端点未连接”时,子安装似乎也不会消失。当您终止父挂载的 FUSE 进程时,会发生此错误。 (看https://github.com/systemd/systemd/issues/9872

相关内容