与计算世界中的许多事情一样,原因是历史和向后兼容性。
早在 2.4.* 内核中,在 Linux 中存在udev(当前的虚拟文件系统解决方案/dev)之前,有两种相互竞争的解决方案:将设备放在根文件系统上的真实目录中的“传统 Unix 方式”,以及devfs第一个虚拟文件系统。的文件系统解决方案/dev。
问题是,作者为devfs各种设备构建了一个全新的命名方案,人们对此有相当强烈的感觉:一些人希望迁移到新方案并废除旧方案,另一些人则认为没有迁移的必要。一些发行版使用旧的静态设备,其他发行版则选择devfs.
此时,安装时会创建固定数量的伪 TTY 设备。(顺便说一句,如果CONFIG_LEGACY_PTYS在编译内核时设置了该选项,这仍然是可能的。)
然后,引入了Unix98风格的动态分配PTY设备。在静态/dev目录上实现它们需要一个虚拟文件系统/dev/pts,这被称为devpts文件系统。此外,将其作为单独的文件系统可能也可以将其应用在动态之上devfs,而无需重复代码。
动态分配的 PTY 设备很快成为最受欢迎的选择,因为/dev数百个静态分配的 PTY 设备杂乱无章,其中大多数很可能在系统的生命周期中永远不会使用,这显然是荒谬的。
然后 Linux 2.6 随之而来udev。它很快就淘汰了静态/dev和devfs解决方案。出于向后兼容性的原因,devpts文件系统仍然存在,但现在相同的功能可以移回主/dev文件系统,因为它现在完全基于 RAM。
例如,今天,Debian 9 仍然挂载devpts文件系统以/dev/pts实现旧版兼容性,但/dev/pts/ptmx默认分配零权限 - 这表明该devpts文件系统可能已被弃用,并将在将来的某个时候被删除。
# ls -l /dev/ptmx /dev/pts/ptmx
crw-rw-rw- 1 root tty 5, 2 Nov 22 11:47 /dev/ptmx
c--------- 1 root root 5, 2 Nov 12 14:59 /dev/pts/ptmx
Run Code Online (Sandbox Code Playgroud)
如果某些程序仍然需要/dev/pts/ptmx,可以通过调整默认权限来允许,但这可以让人们知道哪些程序仍在使用旧的已弃用的设备名称。