一些容易混淆的概念:ptmx 和 tty

一些容易混淆的概念:ptmx 和 tty

以下所有命令都在我的 debian 终端中运行。

ls /dev |grep ptmx
/dev/ptmx

ls  /dev/pts
0  1  ptmx 

/dev/ptmx 和 和有什么区别/dev/pts/ptmx

ls  /dev/tty* |sort
/dev/tty
/dev/tty0
/dev/tty1
/dev/tty10

/dev/tty 和 /dev/tty0 (/dev/tty1....) 之间有关系吗?
/dev/tty 控制所有其他 /dev/tty[number] ?

答案1

/dev/ptmx是标准的,/dev/pts/ptmx是为软件容器(Docker 等)以及需要devpts文件系统的多个实例的其他情况添加的。

设备节点的性质

您应该意识到设备节点的“魔力”不在于它的名称,而在于它的主要和次要设备号它的创建是为了体现。

例如,如果您具有适当的权限,则可以mknod在任何 Unix 风格的文件系统中创建一个具有任意名称的主设备 1 和次设备 3 的字符设备节点,并且 - 除非文件系统具有nodev挂载选项 - 它将表现得完全一致就像/dev/null,因为无论出于何种意图和目的,它的另一种实现/dev/null

同样,/dev/pts/ptmx/dev/ptmx都是字符设备,主设备号为 5,次设备号为 2。因此,它们将提供对内核中完全相同的功能的访问。

$ ls -l /dev/ptmx /dev/pts/ptmx
crw-rw-rw- 1 root tty  5, 2 Jun 12 20:14 /dev/ptmx
c--------- 1 root root 5, 2 Jun 12 12:26 /dev/pts/ptmx

设备节点的类型(字符或块)以及主设备号和次设备号一起定义设备节点与哪个内核设备驱动程序接口。内核不关心名称 - 它提供默认名称udev,但如果您愿意,您可以完全重新设计设备命名方案。/dev如果需要,您可以在外部创建设备节点。

在 Debian 9 中,默认/dev/pts/ptmx权限设置为 000,因此预计不会使用它。 RHEL 7.5 中也是如此。

4.17内核源码中的注释说:

/*
 * ptmx is a new node in /dev/pts and will be unused in legacy (single-
 * instance) mode. To prevent surprises in user space, set permissions of
 * ptmx to 0. Use 'chmod' or remount with '-o ptmxmode' to set meaningful
 * permissions.
 */

“单实例模式”是指作为符合UNIX98和Single Unix规范v1标准的系统使用。所以向后兼容性非常重要。

多实例能力是devpts为了容器支持而开发的。这可以通过阅读来确认<Linux kernel source>/Documentation/filesystems/devpts.txt2009 年左右的旧版本:

为了支持容器,我们现在允许 devpts 文件系统的多个实例,这样在一个实例中分配的 pty 索引独立于在其他 devpts 实例中分配的索引。

为了保持向后兼容性,仅在以下情况下才启用对多个实例的支持:

  • CONFIG_DEVPTS_MULTIPLE_INSTANCES=y,并且
  • 挂载 devpts 时指定了“-o newinstance”挂载选项

IOW,devpts 现在支持单实例和多实例语义。

当容器在使用时,它们通常会为伪 TTY 初始化一个全新的命名空间,并且可能会devpts在容器内挂载文件系统的另一个实例(如果不需要容器内的伪 TTY 支持,甚至可以省略)。文件系统ptmx中条目的存在devpts可能有助于最大限度地减少初始化容器内环境所需的工作。

相关内容