/dev/null 的实际机制是什么?

/dev/null 的实际机制是什么?

我最近正在进一步学习 bash shell 的深入机制,而 /dev/null 刚刚于昨天出现。

所以我理解,当您想要立即丢弃输出时,/dev/null 是一个转储文件。我想知道它是如何做到这一点的?我认为最简单的方法是将数据写入存储驱动器,然后不映射它/立即取消映射它,但这意味着频繁使用 /dev/null 最终可能会悄无声息地降低 SSD 的性能。

所以我想我的问题是:这些数据在被丢弃之前会去哪里?过度使用 /dev/null 会随着时间的推移降低 SSD 的性能吗?出于这个原因,我应该将我的主要开发操作系统安装在 HDD 上吗?

答案1

不,最简单的方法是根本不写在任何地方。数据在被丢弃之前不需要去某个地方——它可以被丢弃它去那里。

一般来说,当您读取或写入文件时,您并不是直接访问磁盘,而只是要求操作系统内核读取或写入文件,因此内核有权决定是否将该文件存储在磁盘上。对于 /dev/null 之类的文件,写入操作没有理由最终进入实际存储 - 如果内核识别出您正在写入特殊的“null”设备,它可以在写入操作发生之前就丢弃它们。

有多种方法可以实现此目标:

  • 您可以保留操作系统可以识别的文件名。

    在 Linux 中几乎从未发生过这种情况,但 Windows 和 MS-DOS 中等效NUL文件的工作方式正是如此。每当 Windows 中的程序尝试写入名为“nul”的文件时,这些写入都会在到达文件系统驱动程序之前被丢弃,更不用说到达实际磁盘了。

  • 您可以拥有激活特定处理的特殊文件属性。

    在 Linux(和其他 Unix 系统)上,/dev 中的大多数项目都有自己独特的类型 - 它们不是常规文件,但是设备文件,Unix 特殊文件类型1之一。它们确实存在于磁盘上,但只是作为名称存在 - 从未为它们分配任何实际存储;当打开设备文件时,内核使用自定义处理程序进行读/写操作(而不是让文件系统执行此操作)。

    如果您运行ls -l /dev,您将看到第一列显示bc作为项目类型(“块”或“字符”子类型),并且大小列被一对“主要、次要”值替换,这些值告诉内核如何处理对该设备的访问。该mknod命令可用于创建此类对象。

    例如,在 Linux 中,/dev/null 的主设备号为 1,由驱动程序/char/mem.c。在该文件中,次要编号 3 通过表进行处理null_fops。在此结构中,“写入”处理程序设置为write_null,它实际上什么也不做。

    所有其他 /dev 节点都以相同的方式实现其特殊行为。例如,/dev/ttyS0与从物理串行端口读取的“fops”函数相关联。(在 Linux 源代码中,查找“register_chardev”和“misc_register”函数;在 BSD 源代码中,查找列举每种主要类型的巨型“cdevsw”列表。)

    1还有更多特殊文件类型 - 符号链接(ln -s);命名管道(mkfifo);套接字;门(Solaris);whiteouts(NetBSD) - 所有这些都经过特殊处理并且不占用任何磁盘存储空间。

  • 您还可以整个文件系统它的作用与将文件存储在磁盘上不同。

    通常,您可以在不同的文件系统路径上安装不同的磁盘(例如,/C:\您的 SSD,/dataD:\您的 HDD,/media/sandiskE:\您的 USB 记忆棒),操作系统将每个位置与特定的文件系统驱动程序和特定的物理设备相关联。

    然而,操作系统也可能支持以下虚拟文件系统类型:使用物理设备。

    例如,在 Linux 上,整个系统/dev通常从临时文件文件系统,其行为类似于普通文件系统,但仅使用 RAM 作为存储。即使您在 /dev 中创建完全常规的文件并开始向其中写入数据,数据也只会存储在 RAM 中,而不会存储在任何磁盘上。有时/tmp也是 tmpfs。

    (过去,通过安装常规文件系统但为其提供“RAM 磁盘” - 即仅仅是 RAM 的专用区域 - 作为存储设备,可以实现类似的结果。您仍然可以找到适用于 Windows 的 ramdisk 软件,它没有 tmpfs 等效项。)

    /proc和目录/sys还挂载了特殊的文件系统,因此 /proc 的所有内容都是完全虚拟的。(因此,即使它们像常规文件而不是设备文件一样,它们仍然表现出各种不规则行为。)

答案2

数据不会被存储然后丢弃,而只是被丢弃。

pg@TREX:~$ ls -l /dev/null
crw-rw-rw- 1 root root 1, 3 Sep 18 08:09 /dev/null

如您所见,/dev/null 是一个字符设备。数据以无缓冲的方式逐个字符地流向那里,并立即逐个字符地丢弃。它不包含任何内容,因此如果您尝试从中读取,它唯一返回的是 EOF =>cat /dev/null > filename创建一个零字节文件。

由于数据从未被存储,使用 /dev/null 不会降低您的驱动器性能。

一些关于或涉及 /dev/null 的文章:

相关内容