文件/目录如何从 ls -a 隐藏,同时在 POSIX 兼容系统中仍然可以访问?

文件/目录如何从 ls -a 隐藏,同时在 POSIX 兼容系统中仍然可以访问?

例如,在 FreeBSD 和 ZoL 下的 ZFS 中,.zfs每个 zpool 挂载点内部都有一个 magic 目录,您可以使用该目录zfs set snapdir=visible使该.zfs目录可见。

让我好奇的是:如果该设置设置为“隐藏”,dir 实际上是如何.zfs从输出中隐藏的ls -a或 shell 路径自动完成,同时仍然可以访问(您仍然可以cd访问它或调用stat它)?

我无法真正理解这个事实,因为我以某种方式认为,如果有东西存在并且可以访问,它就应该被列出ls -a——即使它本质上只是魔法/虚拟的。

有人能解释一下这是如何工作的吗?是否有一种符合 POSIX 标准的方法可以隐藏目录,ls -a同时仍然可以访问?你怎么做呢?

答案1

嗯,如何做到这一点很简单:ls从名为 的系统调用(或者,在 Linux 上,libc 函数)获取其列表readdir。更改目录是通过单独的系统调用chdir.stat也是一个不同的系统调用,就像大多数其他文件操作一样。

简而言之,“这个目录里有什么?”和“访问此目录”是完全独立的内核请求,因此它们可以通过编程以不同的方式工作。

因此,要创建一个不出现在 中的目录ls -a,只需让内核从 的结果中忽略它即可readdir。但它仍然适用于chdir(etc),因为这是一个不同的系统调用。

这与拥有一个您拥有权限的目录没有什么不同+x,但是不是 -r:您可以访问其中的文件和目录,cd进入其中等,但ls会失败。我相信其他事物也使用了这种安排,例如(这是来自模糊记忆,无需查找)AFS 有一种全局/afs命名空间,您可以通过cd“输入其名称”来连接到任何 AFS 服务器;不过ls,on不会/afs显示世界上所有的服务器。我见过 FUSE 文件系统做类似的事情(例如,cd连接到匿名 FTP 服务器)。

(我不确定zfs的安排是否严格遵守POSIX)。

相关内容