TTY、PTY、PTS、PTM 都是什么?

详细解释:

  • 1、什么是终端 ( terminal ) ,这里先解释硬件终端

    • 最初的计算机由于价格昂贵,因此,一台计算机一般是由多个人同时使用的。

      在这种情况下一台计算机需要连接上许多套键盘和显示器来供多个人使用。

      在以前专门有这种可以连上一台电脑的设备,只有显示器和键盘,还有简单的处理电路,本身不具有处理计算机信息的能力,他是负责连接到一台正常的计算机上(通常是通过串口) ,然后登陆计算机,并对该计算机进行操作。

      当然,那时候的计算机操作系统都是多任务多用户的操作系统。

      这样一台只有显示器和键盘能够通过串口连接到计算机的设备就叫做 终端。 (此特指硬件终端)

  • 2、什么是控制台 ( console ),它和终端有什么联系? (历史时期的控制台概念)

    • 提到终端就不能不提控制台 console。控制台的概念与终端含义非常相近,其实现在我们经常用它们表示相同的东西,但是在计算机的早期时代,它们确实是不同的东西。

      学过机电的同学都知道,一些数控设备(比如数控机床 )的控制箱,通常会被称为控制台,顾名思义,控制台就是一个直接控制设备的面板,上面有很多控制按钮。

      在计算机里,把那套直接连接在电脑上的键盘和显示器就叫做控制台

      终端和控制台的区别就是:

      终端是通过串口连接上的,不是计算机自身的设备,而控制台是计算机本身就有的设备,一个计算机只有一个控制台。

      计算机启动的时候,所有的信息都会显示到控制台上,而不会显示到终端上。

      这同样说明,控制台是计算机的基本设备,而终端是附加设备。

      计算机操作系统中,与终端不相关的信息,比如内核消息,后台服务消息,都会显示到控制台上,但不会显示到终端上。比如在启动和关闭 Linux 系统时,我们可以在控制台上看到很多的内核信息(下图来自 vSphere Client 中的 “Virtual Machine Console”):

      image-20211209143453296

    • 以上是控制台和终端的历史遗留区别。

  • 3、什么是虚拟终端(包含虚拟控制台)?

    • 刚才我们解释了硬件终端,自然的就有虚拟终端。由于计算机硬件越来越便宜,通常都是一个人独占一台计算机操作,不再连接以前那种真正意义上的“硬件终端设备”了

      因此,终端和控制台的概念也慢慢演化了。

      终端和控制台由硬件的概念,演化成了软件的概念。

    • 现在说的终端,比如 linux 中的虚拟终端,都是软件的概念,他用计算机的软件来模拟以前硬件的方式。

      比如在 linux 中,用 alt+f1~f6 可以切换六个虚拟终端,就好比是以前多人公用的计算机中的六个终端设备,这就是为什么这叫“虚拟终端”的原因。

    • 而虚拟控制台在如今的定义简单而言就是,能直接显示系统消息的那个终端称为控制台,其他的则称为终端(控制台也是一个终端)。

      或者我们在平时的使用中压根就不区分 Linux 中的终端与控制台。

      举个例子:

      首先我们按下 alt + F1 (或者 ctr + alt + F1 )进入第一个虚拟终端(即默认它为虚拟控制台 console,它的虚拟终端名也默认为 tty1 )

      然后打下面的命令:

      echo “hello world” > /dev/console

      表示把 hello world 输出到 /dev/console 控制台上,那么 hello world 就正常地出现在 console 这个虚拟控制台 tty1 上(which is quite normal)

      image-20211209145417882

      但是如果我们 alt + F2 进入另一个虚拟终端

      然后同样打上一条命令,会发现,竟然在当前虚拟终端显示了 hello world

      image-20211209145638878

      .

      所以,在linux中,你无论在哪个虚拟终端下执行这条命令,字符hello,world都会显示在当前的虚拟终端下。也就是说,linux把当前的终端当作控制台来看待。

      可见,linux中已经完全淡化了控制台和终端的区别。

      所以,现在不必严格区分这两者的不同。

  • 4、什么是 TTY ?

    • 从历史上看,终端(硬件终端)刚开始就是终端机,配有打印机,键盘,带有一个串口,通过串口传送数据到主机端,然后主机处理完交给终端打印出来。

      电传打字机(teletype)可以被看作是这类设备的统称,主要由键盘、印字机和收发报机等组成。可以输入也可以输出。因此终端也被简称为 TTY (teletype 的缩写)。

    • 那么现在的 TTY 又是什么意思呢?

      之前我们 alt + F1-7 的时候,出来的虚拟终端名字就叫做 tty1-7 ,那么 TTY 是不是和虚拟终端是一个概念?

      其实是的,但是具体细节是这样的:

      前面我们讲随着时代发展,硬件终端逐渐变成了虚拟终端,但其实这里是怎么变成虚拟终端的,大有来头,且其中就包含了现在的 TTY 的概念。

      我们先回到上古时代,即使用硬件终端的年代

      人们通过硬件终端连接主机的底层原理概念图如下:

      image-20211209160000751

      • Terminal 就是各种各样的 teletype (指的是那个年代的电传打印机 )
      • 物理线路两边用上了Modem,就是我们常说的“猫”,暂时理解成网络连接工具
      • UART可以理解为将teletype的信号转换成计算机能识别的信号的设备

      上面的图解释了个大概,但还有个问题,那么多厂家的 teletype ,电脑主机是如何适配的呢?

      于是就有了为了适配不同 teletype 而出现的 TTY 子系统

      我们进一步扩展上面的原理概念图:

      Kernel 即上图 Computer 中的系统内核

      image-20211209160540935

      • UART driver对接外面的UART设备
      • Line discipline主要是对输入和输出做一些处理,可以理解它是TTY driver的一部分
      • TTY driver用来处理各种终端设备(即 teletype)
      • 用户空间的进程通过TTY driver来和终端打交道

      所以,当多个终端连接主机的时候,

      原理概念图如下:(不再单独把 UART driver 和 Line discipline 列出来,可以认为是 TTY driver 的一部分)

      image-20211209161220733

      好了,说这么多其实就像表达一个意思:

      在上古时代,主机为了适配不同的 teletype 终端,在物理层面上设计出了 TTY 子系统。不同的终端只要有对应的 TTY 子系统就可以被主机适配,并操作主机。

      而到了今天,这个概念也被沿用了

      你想,现在我们电脑往往只有一个硬件终端(键盘和显示器),但不同的键盘不同的显示器对于同一个操作系统(主机)来说,要怎么适配呢?

      同样是使用 TTY 子系统这个概念,不同键盘显示器,操作系统内核都会有一个专门适配他们的 TTY 子系统。加上 linux 系统一切皆为文件的思想,这个 TTY 子系统早都被抽象为一个文件系统了,所以理论上,你想要创建一个虚拟终端,无非就是多创建一个 TTY 文件

      这也是为啥 TTY 也有虚拟终端的含义

      即通过一些虚拟化技术与 TTY 子系统即可创建出虚拟终端,所以虚拟终端也称为 TTY

      补充一点

      虚拟终端也叫做 软件仿真终端

    • 总结一下,到底什么是 TTY ?

      • 具体而言应该是 TTY 子系统
      • 但是现今人们对 TTY 的概念指的是 虚拟终端,或者说是 软件仿真终端
    • 此外,现在我们通过键盘显示器和操作系统交互,实际上是通过硬件终端连上虚拟终端,然后再和操作系统进行交互

      • 即 键盘显示器硬件终端 -- 虚拟终端 -- 操作系统
  • 5、什么是 PTY?

    • 即 伪终端 ,PTY / pseudo tty / pseudo terminal

    • 为什么会出现伪终端?

      • 之前我们说的虚拟终端(软件仿真终端),它其实有一个特点,即运行于内核空间。

        关于这个概念不用理解太深,只需要知道它的移植性不好即可。因为虚拟终端,虽然我们说是虚拟,但是它本质上还是以来我们的键盘显示器(这类直接连接系统的硬件终端),比如我们直接从键盘输入信息,然后交给内核处理,再由内核把信息返回给显示器。

        这样的运行逻辑,显然是高度依赖硬件和内核的,故可移植性差

      • 所以为了让虚拟终端变得更加灵活,人们就想办法把它移到用户空间(和内核空间相对)

        为了将虚拟终端移到用户空间,同时保持 TTY 子系统的完整,伪终端 PTY 就被发明出来了

      • 移到用户空间有什么好处呢?

        你发现没有,之前我们说的那些虚拟终端什么的,是不是都是没有图形界面的?

        所以,到了上世纪80年代,随着【图形界面】的兴起,就出现某种需求——想在图形界面下使用“【文本】终端”。于是就出现了“伪终端”的概念

        通俗地说,“伪终端”就是用某个图形界面的软件来模拟传统的“文本终端”的各种行为。

    • 哪些属于伪终端?

      其实日常中我们接触的大部分都是伪终端

      • ssh等方式建立的连接是伪终端

      • 什么 PUTTY,MobaXTERM,Xshell 这些连接服务器的图形界面软件。它们都为伪终端

      • 平时在 linux 上打开的命令行,什么 Konsole,tmux,Qterminal,这些其实就是伪终端

      • 注意:

        区别什么是伪终端,有些自己的经验

        比如要带有完整的操作交互功能(ctrl+c ,ctrl + z )

        就像之前提到的稳定的 shell

        而类似 nc 这种连接建立的 反弹 shell 之类的,就不属于伪终端。

        因为 ctr + c ,nc 会断开连接,而不是像我们在本地打开伪终端再 ctrl + c 那样(只是取消操作)

        还有一个就是 su 命令,如果可以使用 su 命令那么至少是个伪终端

    • 伪终端可以用来干什么?

      • 最显著的用处就是可以用来远程用户登录,因为原来虚拟终端是通过硬件终端获取输入信息和通过硬件终端输出信息的,是处于“内核状态”。不可能说有别人想用这台电脑,还要到电脑面前开个虚拟终端。所以伪终端就很好地处理了这个问题,通过所谓的“用户态”从而实现了远程用户登录
      • 第二个就是图形界面,伪终端可以在图形界面中使用从而适应图形化时代。
  • 6、什么是 PTS , PTM ?

    • 伪终端分为主和从两个部分,与终端模拟器交互的部分是主(PTM,Pseudo TTY Master),与用户进程交互的部分是从(PTS,Pseudo TTY Master)。

    • 伪终端(pseudo terminal,有时也被称为 pty)是指伪终端 master 和伪终端 slave 这一对字符设备。

      其中的 slave 对应 /dev/pts/ 目录下的一个文件,而 master 则在内存中标识为一个文件描述符(fd)。

      伪终端由终端模拟器提供,终端模拟器是一个运行在用户态的应用程序。

      Master 端是更接近用户显示器、键盘的一端,slave 端是在虚拟终端上运行的 CLI(Command Line Interface,命令行接口)程序。Linux 的伪终端驱动程序,会把 master 端(如键盘)写入的数据转发给 slave 端供程序输入,把程序写入 slave 端的数据转发给 master 端供(显示器驱动等)读取。请参考下面的示意图(此图来自互联网):

      image-20211209201714944

      我们打开的终端桌面程序,比如 GNOME Terminal,其实是一种终端模拟软件。当终端模拟软件运行时,它通过打开 /dev/ptmx 文件创建了一个伪终端的 master 和 slave 对,并让 shell 运行在 slave 端。当用户在终端模拟软件中按下键盘按键时,它产生字节流并写入 master 中,shell 进程便可从 slave 中读取输入;shell 和它的子程序,将输出内容写入 slave 中,由终端模拟软件负责将字符打印到窗口中。

.

.


参考文章:

.

.

/