在我的Archlinux上,/dev/pts
是由devpts挂载的,那么谁创建了 /dev/pts/ptmx
设备节点呢?这个节点的目的是什么?它与 相同(Major=5 Minor=2)设备节点相同/dev/ptmx/
,但访问模式不同,为了什么?
答案1
旧的 AT&T System 5 伪终端从设备机制是它们是普通的执着的下的字符设备节点/dev
。有一个多路复用器掌握设备/dev/ptmx
。旧的 4.3BSD 伪终端设备机制有并行的普通执着的下的主从设备节点/dev
。这些是普通磁盘文件系统上的特殊设备节点。
在 OpenBSD 上,其中一些现在仍然适用。 /dev
仍然是一个磁盘卷,从设备仍然是真正的磁盘节点。然而,它们是根据需要创建的。当PTMGET
对设备发出 I/O 控制时,内核会在内部发出相关调用来创建新的设备节点/dev/ptm
。
在 FreeBSD 上,这一切都不再正确。甚至不再有多路复用器设备。 /dev
根本不是光盘卷。它是一个devfs
文件系统。从设备出现在devfs
其pts/
目录下的文件系统中以响应posix_openpt()
系统调用,这是一个彻底的系统调用,而不是包装ioctl()
在某些“多路复用器”设备的打开文件描述符上。
有一段时间,在 Linux 上,伪终端从设备是持久设备节点。您所看到的是它的“新”devpts
文件系统(其中“新”意味着几年前引入的)以及devtmpfs
.这几乎允许与在 FreeBSD 上使用devfs
.
但也存在一些差异。特别是,还有一个“多路复用器”设备。
- 在里面较老的“新”
devpts
系统,这是ptmx
不同devtmpfs
文件系统中的设备,该devpts
文件系统仅包含自动创建/销毁的从设备文件。按照惯例,该设置是在 处/dev/ptmx
附带一个安装座。devpts
/dev/pts
- 但 Linux 人们想要拥有多个完全独立的文件系统的实例
devpts
,用于容器等,并且当存在时,同步(正确的)两个文件系统非常困难许多devtmpfs
和devpts
文件系统。所以在较新的“新”devpts
系统中的所有设备(多路复用器和从设备)都位于同一个文件系统中。为了向后兼容,默认情况下新
ptmx
节点不可访问,除非设置新的ptmxmode
挂载选项。在向后兼容模式下,人们仍然可以以较旧的单实例方式运行事物,并且默认情况下会这样做,除非newinstance
在安装devpts
. - 在里面甚至更新“新”
devpts
(自 2016 年以来一直存在)devpts
文件系统中的每个实例多路复用器设备现在是主多路复用器,并且ptmx
是devtmpfs
由内核提供的垫片,它尝试模拟符号链接、绑定安装或一个普通的老实际的符号链接到pts/ptmx
.现在的多实例方式是仅有的方式。
进一步阅读
- https://unix.stackexchange.com/a/470853/5132
- 解决这个 glibc 问题的最佳方法是什么?
- https://unix.stackexchange.com/a/214685/5132
Documentation/filesystems/devpts.txt
。 Linux 内核。- 丹尼尔·贝兰奇 (2009-05-20)。
/dev/pts
必须使用“newinstance”挂载标志以避免容器出现安全问题。红帽错误#501718。 - 埃里克·比德曼 (2015-12-11)。 devpts:明智的 /dev/ptmx 并强制新实例。 Linux 内核邮件列表。
- 埃里克·比德曼 (2016-04-08)。 devpts:教导 /dev/ptmx 通过路径查找找到关联的 devpts。 Linux 内核邮件列表。