以下所有命令都在我的 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] ?
/dev/ptmx
是标准的,/dev/pts/ptmx
用于软件容器(Docker 等)和其他需要多个文件系统实例的情况devpts
。设备节点的性质
您应该意识到,设备节点的“魔力”不在于其名称,而在于其创建以体现的主要和次要设备编号。
例如,如果您有适当的权限,您可以使用
mknod
任何名称在任何 Unix 样式的文件系统中创建一个具有任何名称的主要 1 和次要 3 的字符设备节点,并且 - 除非文件系统具有nodev
挂载选项 - 它的行为将完全一致就像/dev/null
,因为从所有意图和目的来看,这将是的另一种实现/dev/null
。同样,两者都是主设备号 5
/dev/pts/ptmx
和/dev/ptmx
次设备号 2 的字符设备。因此它们将提供对内核中完全相同功能的访问。设备节点的类型(字符或块)和主要和次要设备号一起定义了设备节点与哪个内核设备驱动程序接口。内核不关心名称 - 它为 提供默认名称
udev
,但如果您愿意,您可以完全重新设计设备命名方案。/dev
如果需要,您可以在外部创建设备节点。在 Debian 9 中,
/dev/pts/ptmx
默认情况下权限设置为 000,因此预计不会使用它。同样在 RHEL 7.5 中。4.17 内核源代码中的评论说:
“单实例模式”是指作为符合 UNIX98 和 Single Unix Specification v1 标准的系统使用。所以向后兼容非常重要。
devpts
为容器支持开发了多实例功能。这可以通过阅读2009 年左右的旧版本来<Linux kernel source>/Documentation/filesystems/devpts.txt
确认:当容器在使用中时,它们通常会为伪 TTY 初始化一个全新的命名空间,并且可能会在容器内挂载
devpts
文件系统的另一个实例(如果不需要容器内的伪 TTY 支持,这甚至可以省略)。ptmx
文件系统中的条目的存在devpts
可能有助于最小化初始化容器内环境所需的工作。