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

dir*_*obs 12 filesystems stat devices inode

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

$ 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
Run Code Online (Sandbox Code Playgroud)

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

Aus*_*arn 16

简短的回答是,只有当您有物理文件系统支持时才/dev会这样做(如果您使用的是现代 Linux 发行版,则可能没有)。

长答案如下:

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

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

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

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

  • *小心地举手。*我参与了一个项目,该项目的服务器的 inode 已用完。最后是我们团队需要说服管理层投资更换后端系统的危机,该系统在我们任何人到达那里之前就已经设计好了(很糟糕,正如你所想象的!)。 (3认同)

Hau*_*ing 15

设备文件也有权限,它们存储在 inode 中。

  • 不仅是权限,还有文件类型和其他元数据。传统上,目录本身只包含名称和 inode 编号——在您读取 inode 之前,没有任何迹象表明该文件是一个设备。 (5认同)

Bar*_*mar 12

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

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

设备的 inode 根本不使用包含文件块映射的字段。