/dev/ptmx is the standard one,
/dev/pts/ptmx is added for software containers (Docker etc.) and other cases when you need multiple instances of the
The nature of device nodes
You should realize that the "magic" of a device node is not in its name, but in the major & minor device numbers it's created to embody.
For example, if you have the appropriate privilege, you can use
mknod to create a character device node with major 1 and minor 3 with any name, in any Unix-style filesystem, and - unless the filesystem has the
nodev mount option - it will behave exactly like
/dev/null, because for all intents and purposes, it will be another realization of
/dev/ptmx are character devices with major number 5 and minor number 2. So they will provide access to the exact same functionality within the kernel.
$ 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
The type of the device node (character or block) and the major & minor device numbers together define which kernel device driver that device node interfaces with. The kernel doesn't care about names - it provides default names for
udev, but you're free to completely redesign the device naming scheme if you feel like it. You can create device nodes outside
/dev, if you need to.
In Debian 9, the
/dev/pts/ptmx has permissions set to 000 by default, so it is not expected to be used. Likewise in RHEL 7.5.
The comment in 4.17 kernel source says:
* 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
"single-instance mode" refers to usage as a system conforming to UNIX98 and Single Unix Specification v1 standards. So it's pretty important backwards compatibility.
The multi-instance capability for
devpts was developed for container support. This can be confirmed by reading the old versions of
<Linux kernel source>/Documentation/filesystems/devpts.txt from year 2009 or so:
To support containers, we now allow multiple instances of devpts
filesystem, such that indices of ptys allocated in one instance are
independent of indices allocated in other instances of devpts.
To preserve backward compatibility, this support for multiple
instances is enabled only if:
- CONFIG_DEVPTS_MULTIPLE_INSTANCES=y, and
- '-o newinstance' mount option is specified while mounting devpts
IOW, devpts now supports both single-instance and multi-instance
When containers are in use, they will typically initialize an entirely new namespace for pseudo-TTYs, and may mount another instance of the
devpts filesystem within the container (this could even be omitted if pseudo-TTY support within the container is not needed). The presence of a
ptmx entry within the
devpts filesystem may be useful in minimizing the work needed to initialize the in-container environment.