Linux 终端(TTY)

TTY 是 Teletype 或 Teletypewriter 的缩写,原来是指电传打字机,后来这种设备逐渐键盘和显示器取代。不论是电传打字机仍是键盘显示器,都是做为计算机的终端设备存在的,因此 TTY 也泛指计算机的终端(terminal)设备。为了支持这些 TTY 设备,Linux 实现了一个叫作 TTY 的子系统。因此 TTY 既指终端,也指 Linux 的 TTY 子系统,固然 TTY 还有更丰富(混乱)的含义,本文试图把它们解释清楚。本文中演示部分使用的环境为 ubuntu 18.04。html

硬件终端 terminal(TTY)

早期的终端(terminal) 是一台独立于计算机的机器(teletype 即, TTY),大概像下面的样子:shell

它终端经过线缆与计算机链接,并完成计算机的输入输出功能:ubuntu

如今物理终端实际上已经灭绝了,咱们看到的全部 TTY 都是模拟视频终端,即软件仿真出来的终端。能够经过 toe -a 命令查看系统支持的终端类型,不要奇怪,这是一个挺长的列表。segmentfault

控制台 console

提到终端就不能不提控制台 console。控制台的概念与终端含义很是相近,其实如今咱们常常用它们表示相同的东西,可是在计算机的早期时代,它们确实是不一样的东西。
一些数控设备(好比数控机床)的控制箱,一般会被称为控制台,顾名思义,控制台就是一个直接控制设备的面板,上面有不少控制按钮。 在计算机里,把那套直接链接在电脑上的键盘和显示器就叫作控制台。而终端是经过串口链接上的,不是计算机自身的设备,而控制台是计算机自己就有的设备,一个计算机只有一个控制台。计算机启动的时候,全部的信息都会显示到控制台上,而不会显示到终端上。这一样说明,控制台是计算机的基本设备,而终端是附加设备。计算机操做系统中,与终端不相关的信息,好比内核消息,后台服务消息,均可以显示到控制台上,但不会显示到终端上。好比在启动和关闭 Linux 系统时,咱们能够在控制台上看到不少的内核信息(下图来自 vSphere Client 中的 "Virtual Machine Console"):异步

如今终端和控制台都由硬件概念,逐渐演化成了软件的概念。简单的说,能直接显示系统消息的那个终端称为控制台,其余的则称为终端(控制台也是一个终端)。或者咱们在平时的使用中压根就不区分 Linux 中的终端与控制台。ide

下面的例子是经过 /dev/console 文件向控制台发送消息,这个这个例子咱们能够看到控制台与终端的一点点不一样之处。
打开 vSphere Client 中的 "Virtual Machine Console"(即控制台),默认显示的是 tty1:spa

经过其余的终端向 /dev/console 中写入字符串 "hello world":
root@esearch:~# echo "hello world" > /dev/console操作系统

字符串显示在了控制台中。而后经过 Ctrl + Alt + F2 把控制台中的终端切换到 tty2,再次向 /dev/console 写入字符串:
root@esearch:~# echo "hello world" > /dev/console.net

此次字符串写到了 tty2 中,这说明 Linux 老是把写入 /dev/console 的内容会显示在控制台中当前的虚拟终端(tty1-tty6)里。unix

TTY 设备

从历史上看,终端刚开始就是终端机,配有打印机,键盘,带有一个串口,经过串口传送数据到主机端,而后主机处理完交给终端打印出来。电传打字机(teletype)能够被看做是这类设备的统称,所以终端也被简称为 TTY(teletype 的缩写)。
以下图所示(下图来自互联网):

UART 驱动
如上图所示,物理终端经过电缆链接到计算机上的 UART(通用异步接收器和发射器)。操做系统中有一个 UART 驱动程序用于管理字节的物理传输。

行规范
上图中内核中的 Line discipline(行规范)用来提供一个编辑缓冲区和一些基本的编辑命令(退格,清除单个单词,清除行,从新打印),主要用来支持用户在输入时的行为(好比输错了,须要退格)。

TTY 驱动
TTY 驱动用来进行会话管理,而且处理各类终端设备。

UART 驱动、行规范和 TTY 驱动都位于内核中,它们的一端是终端设备,另外一端是用户进程。由于在 Linux 下全部的设备都是文件,因此它们三个加在一块儿被称为 "TTY 设备",即咱们常说的 TTY。

从软件仿真终端到伪终端

后来的终端慢慢演变成了键盘 + 显示器。若是咱们要把内容输出到显示器,只要把这些内容写入到显示器对应的 TTY 设备就能够了,而后由 TTY 层负责匹配合适的驱动完成输出,这也是 Linux 控制台的工做原理(下图来自互联网):

上图中,TTY 驱动和行规范的行为与前面的示例相似,但再也不有 UART 或物理终端。相反,软件仿真出视频终端,并最终被渲染到 VGA 显示器。注意,这里出现了软件仿真终端,它们是运行在内核态的。显示器和 vSphere Client "Virtual Machine Console" 中的 tty1-tty6 都是软件仿真终端

/dev/tty1-/dev/tty6 是这些仿真终端在文件系统中的表示,程序经过对这些文件的读写实现对仿真终端的读写。

若是咱们在用户空间也进行终端仿真,状况会变得更加灵活,下图是 xterm 及其克隆的工做方式(下图来自互联网):

为了便于将终端仿真移入用户空间,同时仍保持 TTY 子系统(TTY 子系统指 TTY 驱动和行规范)的完整,伪终端被发明了出来(pseudo terminal 或 pty)。伪终端在内核中分为两部分,分别是 master side 和 在 TTY 驱动中实现的 slave side。注意上图中的 xterm,这是一个运行在用户态的终端仿真程序,好比 Ubuntu Desktop 中的 GNOME Terminal:

当建立一个伪终端时,会在 /dev/pts 目录下建立一个设备文件:

若是是经过 PuTTY 等终端仿真程序经过 SSH 的方式远程链接 Linux,那么终端仿真程序经过 SSH 与 PTY master side 交换数据。

终端与伪终端的区别

至此咱们能够得出这样的结论:如今所说的终端已经不是硬件终端了,而是软件仿真终端(终端模拟软件)。
关于终端和伪终端,能够简单的理解以下:

  • 真正的硬件终端基本上已经看不到了,如今所说的终端、伪终端都是软件仿真终端(即终端模拟软件)
  • 一些链接了键盘和显示器的系统中,咱们能够接触到运行在内核态的软件仿真终端(tty1-tty6)
  • 经过 SSH 等方式创建的链接中使用的都是伪终端
  • 伪终端是运行在用户态的软件仿真终端

总结

经过本文咱们能够了解到,真正的硬件终端基本上已经看不到了。在一些链接了键盘和显示器的系统中(固然也包括一些 vsphere 等虚拟环境),咱们能够接触到运行在内核态的软件仿真终端。而咱们使用最多的则是伪终端。

参考:
解密TTY
Linux TTY/PTS概述
The TTY demystified
What is stored in /dev/pts files and can we open them?
终端、虚拟终端、shell、控制台、tty的区别

相关文章
相关标签/搜索