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


11

设备文件本身不是文件。它们是一个I / O接口,用于在类似Unix的操作系统中使用设备。它们不使用磁盘上的空间,但是,它们仍然使用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

设备文件是否在文件系统中使用物理索引节点,为什么它们根本需要它们?


2
索引节点和数据就是文件。没有索引节点,就没有文件。(设备文件没有任何数据)
user253751 '17

Answers:


16

简短的答案是,只有在有物理文件系统支持的情况下它才起作用/dev(如果您使用的是现代Linux发行版,则可能没有)。

长答案如下:

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

最初,/dev它只是另一个具有众所周知名称的目录,您可以在其中放置设备文件。某些UNIX系统仍然采用这种方法(我相信OpenBSD仍然采用这种方法),通常您可以判断系统是否像这样,因为它将为该系统实际上没有的设备提供很多设备文件(例如,每个设备的文件每个可能的磁盘上的可能分区)。这样可以节省内存空间和启动时的时间,但要占用更多的磁盘空间,这对于早期系统来说是一个很好的折衷方案,因为它们通常受到内存的限制并且速度不是很快。通常将其称为具有static /dev

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

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


3
谨慎地举起手。我一直在一个项目,该项目的服务器用尽了inode。最终是危机,我们的团队需要说服管理层投资来替换后端系统,该系统在我们中的任何一个都尚未到达那里之前就已经设计出来了(您可能想不到!)。
KRyan

@KRyan可能会发生,但是如今,除非管理员在创建文件系统时显式减少数量,否则这种情况很少见。实际上,许多现代文件系统(至少是NTFS,BTRFS和ZFS,我认为XFS可能也是如此)实际上是动态分配inode的,因此在许多更新的系统上,实际上是不可能用完的。
奥斯汀·

@KRyan我也遇到了这个问题。而且它实际上是一个设计良好的系统,如果要过时并花点时间(每笔交易都需要一个独立的日志,该日志保存在磁盘上,最终它只填充了很小的小inode)
十七年

1
Od和docker因恰好导致此inode问题而闻名。
coteyr

@AustinHemmelgarn ext系列以其静态inode数(随后耗尽)而臭名昭著。顺便说一句,它也是最常用的Linux文件系统(可能在很大的程度上(在XFS之外存储大量数据,而ZFS和BTRFS相对较新)的场景),并且是大多数发行版的默认文件系统。当然,在现代系统中,默认的最大索引节点比您将拥有的设备文件数大多个数量级。
鲍勃


12

目录只是从文件名到索引节点的映射,因此名称所指事物(文件,符号链接,设备,FIFO,套接字)的所有内容都必须位于索引节点中,无处可放。

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

设备的inode根本不利用包含文件块图的字段。


0

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

更重要的是,必须修改所有依赖inode的工具(如statls等等)/dev,以特殊方式处理路径。与当前的状态相比,这将是大量工作,并且没有明显的好处。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.