![Linux 文件的一致性](https://linux22.com/image/24165/Linux%20%E6%96%87%E4%BB%B6%E7%9A%84%E4%B8%80%E8%87%B4%E6%80%A7.png)
如果您位于一个包含各种文件的文件夹中——图片、二进制可执行文件、脚本、甚至目录、zip 文件,几乎所有内容——为什么当您点击 时ls -l
,您会得到类似的输出(到表格)所有文件?
这就像文件本身放置在统一的超级文件中,并且附加了元数据,有点像进程的控制块结构。
为什么您认为与 Unix 或 Linux 无关的文件不会出现问题?是否有类似文件系统预处理器来处理来自 Windows 世界的文件?或者是跨平台的文件没有必要? (那会是一些东西!)
有没有办法可以看这个隐藏(?)层? (即使是 HTML(更不用说 Lisp 等)仅仅阅读它也很难理解。但是当你看到它时,你立即就明白了。)
答案1
你已经找到了几乎完全正确的答案。您只需要填写一些详细信息。
在大多数情况下(特殊文件除外),每个文件都被完全相同地对待,目录(也称为“文件夹”)实际上可以作为文件实现。文件实际上只是一系列磁盘块。您写入的“元数据”称为“索引节点”(请参阅什么是超级块、索引节点、目录项、文件, 和什么是索引节点在此网站上)。目录(或“文件夹”)只是将文件名与索引节点匹配的一种方式。除了名称(文件类型、权限、所有权等)之外,元数据还存在于索引节点中。元数据采用二进制形式,主要是为了紧凑性和访问速度:解析 XML 或任何其他文本格式会花费太长时间。
您可以使用以下命令查看文件元数据的文本表示stat
:stat /bin/cat
您会感兴趣。stat
是一个 GNU 命令,因此它不会普遍可用,但大多数 Linux 发行版应该都有它。
就“外国”文件而言,文件/索引节点/目录的概念来自操作系统的可变性远比今天大得多的时代。 Unix 及其原始文件系统的设计者对今天被认为非常奇怪的操作系统和文件系统拥有丰富的经验。文件/索引节点/目录概念几乎肯定体现了他们的所有经验,因此当今更同质的操作系统提供的“什么是文件”的轻微变化并不是真正的问题。要了解 20 年前的情况,请参阅文件系统属于内核。有关最近的一些内容,请参阅丑陋的名字。这是 Russ Cox 的博客文章,也请阅读博客文章引用的 Rob Pike 论文。你会从中得到启发。
答案2
所有文件本质上都是字节序列。它们里面有什么并不重要。系统只需要知道文件中有多少字节,并安排一个地方来存储这些字节。无论文件的内容是什么,它都是一堆字节。
对于每个文件,系统还存储一些元数据。元数据独立于文件内容;事实上,您可以说内容是这些元数据项之一(但通常单独考虑,因为内容的大小可变并且可能非常大)。存储什么元数据取决于文件系统类型。 Unix 文件系统通常提供您所看到的内容ls
:权限、修改时间等等。文件的名称也是一段元数据,具有某种特殊的地位:它是唯一的,即不能有两个文件具有相同的名称(在同一目录中)。
文件组织在目录。目录可以包含常规文件、子目录和一些特殊文件类型,例如符号链接。有一个目录叫根目录所有目录都是其子目录n次删除。
文件的路径表示如何从根目录开始找到它。每个要遍历的目录都是从根向下依次给出的,/
每个目录名称后面都带有斜杠字符。例如,/usr/bin/env
表示从根目录开始/
,转到usr
那里的子目录,转到bin
那里的子目录,然后查找env
该子目录中的条目。
当您列出目录的内容时,核心(包括文件系统驱动程序)的工作是读取表示磁盘上目录的字节,并将其转换为文件名、元数据和内容位置的列表。该ls
程序调用一个名为opendir
打开目录,然后重复调用依次readdir
读取目录中的每个条目,即获取该目录中的文件名列表(包括子目录和其他特殊文件)。使用 时ls -l
,ls
程序需要有关文件的更多信息而不仅仅是名称,因此它还调用stat
检索每个文件的元数据。
某些操作系统允许您使用任何文本查看程序(例如cat
. Linux 不让你这么做。您可以使用该debugfs
程序来探索文件系统(仅在只读模式下使用它!)。