PTY 和 TTY 是什么意思?

评论 0 浏览 0 2022-09-06

一、简介

在最底层,大多数 Linux 系统交互都使用文本界面。有许多机制可以使系统在用户触手可及的情况下提供尽可能多的信息。甚至在使用具有方便的窗口和控件的复杂图形用户界面 (GUI) 之前,就有命令行界面 (CLI) 工具来利用这些机制。

在本教程中,我们将阐明 Linux 术语 TTY 和 PTY。首先,我们浏览一下终端的层次结构。接下来,我们探讨什么是 TTY。之后,我们进入 PTY。最后,我们看看终端仿真器和其他 PTY 应用程序。

我们在 Debian 11 (Bullseye) 上使用 GNU Bash 5.1.4 测试了本教程中的代码。它应该可以在大多数 POSIX 兼容环境中工作。

2. 终端、终端、终端

什么是终端?事实上,我们已经深入研究了 终端 是什么以及它是如何形成的。简而言之,终端是向系统提供输入和从系统获取输出的方式

现在,让我们从最低到最高级别浏览基本的终端抽象:

  • 硬件终端,即电传打字机、硬拷贝、视频显示单元 (VDU) 等
  • 软件终端,即虚拟TeleTYpe(TTY),是Linux操作系统的主界面
  • 软件伪终端,即 PseudoTeletYpe (PTY),它允许模拟 TTY
  • 软件终端模拟器,基于之前的想法,但通常通过实际或 CLI 模拟的 GUI 来增强它们

当然,我们将跳过硬件终端,因为它们不一定与 Linux 相关。另一方面,终端模拟器实际上并没有在较低层次上引入新的想法,而是为了方便而添加了更多功能。

让我们从下往上开始。

3. 什么是 TTY?

TTY 是teletypeteletypewriter 的缩写。从本质上讲,TTY 是能够远距离(远程)打字(打字打字机)的设备。

在现代操作系统 (OS) 中,该概念直接适用。 Linux 使用设备文件来表示虚拟 TTY,它通过处理输入(通常是键盘)和操作系统来实现与操作系统的交互输出(通常是屏幕)。

虽然 Linux 系统可以有多个 TTY,但它们的数量通常受到配置的限制。实际上,我们可以通过修改/etc/init/tty*.conf/etc/securetty/etc/systemd/logind.conf来改变这一点。 em> 或类似的配置文件,具体取决于 Linux 发行版。

事实上,TTY 的默认数量通常为 7。然而,在最近的发行版中,还有更多:

$ find /dev -regex '.*/tty[0-9]+'
/dev/tty63
/dev/tty62
[...]
/dev/tty1
/dev/tty0

在这里,我们通过过滤find命令看到了64个基本的tty设备。尽管如此,我们可以使用 /sys 虚拟文件系统来列出所有串行设备:

$ find /sys/class/tty/ | sort -V
/sys/class/tty/
/sys/class/tty/console
/sys/class/tty/ptmx
/sys/class/tty/tty
/sys/class/tty/tty0
/sys/class/tty/tty1
[...]
/sys/class/tty/tty63
/sys/class/tty/ttyS0
/sys/class/tty/ttyS1
/sys/class/tty/ttyS2
/sys/class/tty/ttyS3

在这种情况下,我们看到其他几个相关设备:

事实上,我们已经讨论了前两个。重要的是,在最近的 Linux 发行版中,systemd 生成了[email protected],用于生成、提供和监控/ dev/tty* 设备。这样,我们可以使用如下命令来重置有问题的终端:

$ systemctl restart [email protected]

此外,device 文件,例如 /dev/ttyS#/dev/ttyUSB# 和类似文件可以由 [电子邮件受保护],旨在成为与 COM、USB 和其他设备通信的通道设备

最后一个设备类型是 /dev/ptmx,我们接下来将深入研究它。纯 TTY 确实允许通信,但它们不提供太多灵活性,因为 TTY 的至少一端是内核(通过键盘、鼠标或其他输入设备)。另一方面,PTY 可以链接到两端的任何应用程序。

4. 什么是 PTY?

PTY 是pseudo-TTY 的缩写。 名称​​PTY源自这样一个事实:它的行为类似于 TTY,但适用于任意两个端点。这一微小的差异使得多个 PTY 能够在同一 TTY 的上下文中共存。

事实上,PTY 的双方都有一个名称:

  • 从机,/dev/pts,由 /dev/pts/# 中的文件表示
  • master,ptm,仅作为进程的文件描述符存在,该进程请求 PTY

这就是伪终端多路复用器设备 /dev/ptmx 的用武之地。实际上,建立和使用 PTY 有几个步骤:

  1. 进程打开 /dev/ptmx
  2. 操作系统返回一个主ptm文件描述符
  3. 操作系统创建相应的/dev/pts/#从属伪设备
  4. 从此时起,从机输入进入主机,而主机输入进入从机

要知道master和slave之间的对应关系,我们可以调用ptsname 函数。

基本上,PTY 支持类似于管道的双向通信。与管道不同,它为任何需要它的进程提供终端接口。

我们用这个力量做什么?

5. 终端仿真器

PTY 的主要功能之一是支持终端仿真器的存在,例如 xtermGNOME 终端 Konsole

本质上,终端仿真器从操作系统请求尽可能多的 PTY,通常将它们呈现为 GUI 中的选项卡或窗口。让我们了解一下它是如何工作的以及它如何与 TTY 和 PTY 的概念联系起来。

首先,Linux 启动至 TTY。我们可以通过 tty 命令确认这一点以及当前的终端后端:

$ tty
/dev/tty1

在本例中,我们位于/dev/tty1,通常是第一个 TTY,用于登录和 GUI。事实上,我们通常可以用startx来启动X Window System。现在,我们在 /dev/tty1 上运行了一个 GUI。

从那里,我们可以打开任何终端模拟器应用程序并检查其终端:

$ tty
/dev/pts/0

输出显示我们处于第一个伪 TTY 从站中。

事实上,我们甚至可以跳过 GUI 步骤,因为 CLI 中有终端模拟器。

6.PTY应用

当然,我们使用 PTY 在现有终端内创建更多终端。为什么要这么做?原因之一是避免TTY 过载。另一个是纯粹的便利。

6.1. CLI 中的 GUI

如果没有 GUI,请使用诸如 tmuxscreen 之类的软件 通常是退而求其次的。

这两个应用程序都是终端多路复用器,它们或多或少在 CLI 中模拟 GUI

$ tty              $ tty               
/dev/pts/0         /dev/pts/1          
                                       
   0 bash              1 bash          
$ tty              $ tty               
/dev/pts/2         /dev/pts/3          
                                       
                                       
   2 bash              3 bash          

当然,screen(如上所示)和tmux 都提供了许多其他增强功能。例如,terminal 多路复用器支持长时间运行的进程,而不依赖于terminal中的作业,我们不需要触及任何其他内容。

通常,这种能力在远程使用系统时发挥作用。

6.2.远程连接

通信协议,例如sshtelnet 依赖终端仿真与操作系统交互

由于它们是应用程序而不是硬件,因此 PTY 提供它们的终端连接:

$ ssh ssh.example.com
$ tty
/dev/pts/0

在这里,我们看到 tty 返回负责为 SSH 会话提供服务的伪终端从属编号。

七、总结

在本文中,我们研究了 TTY、PTY 以及它们之间的差异。基本上,两者都是双向通道,但 TTY 是主操作系统终端,而 PTY 可以根据请求分配。

总之,PTY 与 TTY 非常相似,但具有更大的灵活性,可以开发方便的用户态应用程序和协议。

最后更新2023-07-13
0 个评论
标签