![背景](https://linux22.com/image/150199/%E8%83%8C%E6%99%AF.png)
背景
Unix 中有很多类型的特殊文件,例如符号链接、设备文件和 proc 文件(在/proc
)。/proc
文件只是普通文件,甚至是文本文件。但对于其余的,我只知道如何使用它们,但我不知道它们的内部结构以及它们是什么(深入)。不幸的是,所有访问文件的方法都只能获取它们所代表的对象。换句话说,没有办法获得内部表示。
问题
对于符号链接,毫无疑问有一个字符串存储其目标的路径。但是,如果只有字符串,如何与明文文件区分开来呢?如果有一个由文件系统驱动程序指定的特殊标头,它是什么?有什么约定吗?谁能告诉我符号链接指向的二进制表示/usr/bin/bash
是什么?
对于设备文件(节点),它们的二进制结构和表示形式是什么?根据它们的行为,它们必须包含相关接口号和驱动程序的信息。但这会让它们的大小相差很大。谁能在二进制层面上解释这一点?
对于符号链接和设备文件的兼容性(我知道同一个设备文件不可能在两个不同的环境中工作,但我们可以发挥想象力做一个实验),这些文件的二进制内容强烈依赖于文件系统类型和操作系统的内核?例如,如果我复制(不通过cp
命令,只需写入相同的二进制内容)到不同的文件系统(例如从 ext4 到 xfs),该文件(符号链接或设备文件)是否仍然有效且有效?将它从 Linux 机器复制到 BSD 机器时怎么样?
或者它们不是文件,只是文件系统头部分的特殊记录?
答案1
“特殊”文件仍然是文件,像“常规”文件一样存储在文件系统中。目录、文件、符号链接等按其类型进行区分,这些类型明确存储在文件系统中。看了解 UNIX 权限和文件类型有关您可能遇到的各种文件类型的详细信息。
文件如何存储以及可以存储哪些文件取决于文件系统。一些文件系统支持 Unix 风格文件类型的子集;例如,FAT 不能存储除文件或目录(和卷标)之外的任何内容。这意味着“特殊”文件的存储取决于文件系统,并且您无法将表示文件的位按原样从一个文件系统复制到另一个文件系统。
符号链接存储其目标的文本表示。在大多数当前的 Unix 风格文件系统中,除了符号链接的“核心”信息(在其 inode 中)之外,还有短目标的空间;较长的链接需要分配数据块。
设备节点确实存储标识符,称为节点的主要和次要。这是两个具有固定存储要求的小数字,并且 inode 中有足够的空间容纳它们。这些数字是特定于操作系统的,因此您无法将节点从 Linux 复制到 BSD,同时保留其功能。
您可以在以下位置查看 Ext4 存储此信息的方式的详尽细节:内核的 Ext4 文档。特别查看i_mode
文件类型的存储方式。