![文件/目录如何从 ls -a 隐藏,同时在 POSIX 兼容系统中仍然可以访问?](https://linux22.com/image/101527/%E6%96%87%E4%BB%B6%2F%E7%9B%AE%E5%BD%95%E5%A6%82%E4%BD%95%E4%BB%8E%20ls%20-a%20%E9%9A%90%E8%97%8F%EF%BC%8C%E5%90%8C%E6%97%B6%E5%9C%A8%20POSIX%20%E5%85%BC%E5%AE%B9%E7%B3%BB%E7%BB%9F%E4%B8%AD%E4%BB%8D%E7%84%B6%E5%8F%AF%E4%BB%A5%E8%AE%BF%E9%97%AE%EF%BC%9F.png)
例如,在 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)。