我最近发现 Linux 上有一些特殊的隐藏目录,这些目录是无法用ls -a
命令显示的。即我遇到的是.reiserfs_priv目录位于 reiserfs 文件系统的根目录中。我可以调用ls -ld .reiserfs_priv
它并cd
进入目录(作为 root),但它没有用ls -a
命令显示(find ./ -name *reiser*
也没有找到它)。
问题:
- 我如何实际检测这种目录?
- 我可以自己创建它们吗?
- 他们用什么样的机制留下来隐身为什么
ls -a
看不到他们? - 也可以是文件吗?
- 这些类型的目录通常用在什么地方?
答案1
通常您无法检测或创建此类文件。它们存在只是因为文件系统报告不一致的数据。
在没有对文件系统进行修改的情况下,获取有关该文件系统上的文件的信息的各种方法之间存在冗余。例如,权限允许:
- 如果报告了文件名,
readdir
则调用lstat
该名称将会成功。 - 如果
lstat
不报告该文件是符号链接,则调用stat
和open
也会成功。 - 如果
stat
成功那就open
成功`。 - 如果
open
成功,那么就这样做stat
和lstat
。 - 如果
stat
报告文件是目录则cd
成功,反之亦然。
等等。当 Reiserfs 文件系统省略.reiserfs_priv
目录列表中的条目,但通过直接访问它的系统调用将其报告为目录时,文件系统将报告不一致的信息。
这些信息并没有错,只是不一致。这只是违反惯例,而不是规则。如果有一个非常快的妖精在您运行cd
or之前创建了该目录ls .reiserfs_priv
,并在您运行之前将其删除,则可以观察到相同的行为find
。
对于文件系统来说,报告不一致的数据是一种不好的形式,因为这会让一些应用程序和用户感到困惑,所以只有在有充分理由的情况下才应该这样做。就 Reiserfs 而言,原因是使一些信息相当隐藏,特别是不被文件搜索和索引遍历。这很有用,因为 的内容.reiserfs_priv
不是“真实”文件,它用于存储扩展文件属性,通过调用系统调用族来访问它们*xattr
。事实上,我根本不知道为什么它会被暴露——也许只是为了调试目的。
不报告存在的文件的另一个示例是允许以不同方式返回相同数据的文件系统。例如,CIOPFS呈现文件系统的不区分大小写的视图;如果您有一个名为 then 的文件Foo
,则目录列表将仅列出,Foo
但访问foo
、FOO
等将会成功。