为什么特殊设备文件有 inode?

为什么特殊设备文件有 inode?

设备文件本身并不是文件。它们是在类 Unix 操作系统中使用设备的 I/O 接口。它们不使用磁盘上的空间,但是,它们仍然使用命令所报告的索引节点stat

$ stat /dev/sda
      File: /dev/sda
      Size: 0               Blocks: 0          IO Block: 4096   block special file
Device: 6h/6d   Inode: 14628       Links: 1     Device type: 8,0

设备文件是否使用身体的文件系统中的 inode 以及为什么它们需要它们?

答案1

简而言之,只有当您有物理文件系统支持时,它才会起作用/dev(如果您使用的是现代 Linux 发行版,则可能没有)。

长答案如下:

这一切都可以追溯到最初的 UNIX 哲学:一切皆文件。这种理念是 UNIX 如此通用的部分原因,因为您可以直接从用户空间与设备交互,而无需在应用程序中使用特殊代码来直接与物理硬件对话。

最初,/dev它只是另一个具有众所周知名称的目录,用于放置设备文件。一些 UNIX 系统仍然采用这种方法(我相信 OpenBSD 仍然这样做),并且您通常可以判断一个系统是否是这样的,因为它会有很多系统实际上没有的设备的设备文件(例如,每个系统的文件)每个可能的磁盘上可能的分区)。这节省了内存空间和启动时间,但代价是使用更多的磁盘空间,这对于早期系统来说是一个很好的权衡,因为它们通常内存非常有限并且速度不是很快。这通常被称为具有静态/dev

在现代 Linux 系统上(我相信还有 FreeBSD,可能还有最新版本的 Solaris),/dev是由内核填充的临时内存文件系统(如果您使用 Systemd,则为 udev,因为它们不信任内核可以执行几乎任何操作) 。这可以节省一些磁盘空间,但代价是一些内存(通常小于几MB)和非常小的处理开销。它还具有许多其他优点,其中最大的优点之一是更容易检测热插拔硬件。这通常被称为具有动态性/dev

不过,在这两种情况下,设备节点都是通过常规 VFS 层访问的,这根据定义意味着它们必须有一个索引节点(即使它是一个刚刚存在的虚拟索引节点,以便像stat()它应该的那样工作。从实际角度来看,这对使用动态的系统影响为零/dev,因为它们只是将 inode 存储在内存中或根据需要生成它们,而/dev静态的影响几乎为零,因为 inode 占用的磁盘空间几乎为零,并且大多数文件系统都没有上限他们或提供的东西比任何人可能需要的都多。

答案2

设备文件也有权限,并且这些权限存储在 inode 中。

答案3

目录只是从文件名到 inode 的映射,因此名称所引用的所有内容(文件、符号链接、设备、FIFO、套接字)都必须位于 inode 中,没有其他地方可以放置它。

有关设备的信息存储在 inode 中。主要和次要设备号都在那里,权限、时间戳等也在那里。类型字段表示它是块或字符设备而不是常规文件存储在那里。

设备的索引节点根本不使用包含文件块映射的字段。

答案4

如果没有索引节点,您将只有文件名来保存有关设备的所有信息。这意味着“好的”设备名称/dev/sda是不可能的:您需要一个可以与特定驱动程序绑定的名称,例如/dev/ohci/sda.

更重要的是,所有依赖 inode 的工具(例如statls)都必须进行修改,以便/dev以特殊方式处理下面的路径。与目前的情况相比,这将是一项巨大的工作量,而且没有明显的好处。

相关内容