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