我尝试使用 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)