目录
Linux 终端概念和类型的理解
接触Linux有一段时间,但是对终端一直没有很好地理解,近日花费一些时间进行学习和理解,总结如下。
查询正在使用的终端命令
可以使用 tty
查看当前所在的终端
[root@CentOS8 ~]# tty
/dev/pts/0
查看当前连接计算机的终端设备
[root@CentOS8 ~]# who
root tty1 2022-10-02 11:59
root pts/0 2022-10-02 12:00 (10.0.0.1)
root pts/1 2022-10-02 12:28 (10.0.0.1)
root tty3 2022-10-02 12:54
root tty2 2022-10-02 12:54
root tty6 2022-10-02 13:04
查看当前正在连接的终端设备和正在使用的程序
[root@CentOS8 ~]# w
13:07:47 up 1:08, 6 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - 11:59 13:23 0.15s 0.03s -bash
root pts/0 10.0.0.1 12:00 1.00s 0.03s 0.00s w
root pts/1 10.0.0.1 12:28 38:41 0.07s 0.07s -bash
root tty3 - 12:54 13:38 0.04s 0.02s -bash
root tty2 - 12:54 3:37 0.06s 0.02s -bash
root tty6 - 13:04 2:34 0.04s 0.02s -bash
终端的概念
要理解终端这个概念,最好从计算机发展历史来理解。最初的计算机是非常大的,要占据三个车间,有一个操作台进行控制,总体而言,需要有两个电缆连接计算机,一根用于向计算机发送指令,另一根用于接收计算机的输出,这个具有输入和输出的一套工具就是终端。开始时只支持单用户单任务,后来开发出多用户多任务分时系统,一台计算机可以连接多个终端,这时需要进行登录认证,一个用户绑定一个终端。因此,所谓终端就是与计算机主机连接的输入输出的一套设备。
tty 全程是 TeleTypewriter,也即是电传打字机。它通过两根电缆连接计算机,一根用于向计算机发送指令,另一根用于接收计算机的输出,输出结果是打印在纸上的。由于历史原因,Linux 保留了 tty,上述的输入和输出两个电缆,可以简单地理解为键盘输入和显卡输出。
Linux 终端类型
终端的类型是根据与计算机主机连接的方式来进行分类的。
按照是否与计算机主机进行物理连接,可以分为:物理终端和伪终端。
-
与计算机主机进行物理连接的方式有两种:即一种是使用VGA连接显示器,使用PS/2或USB连接键盘,这样的一套显示器/键盘组合就是一个本地终端,我们家中的个人电脑就是这种类型。另一种是通过串口线把主机与另外一台有显示器和键盘的主机相连接,通过运行一个终端模拟程序,使这台有终端的主机的显示器和键盘成为远程主机的输入和输出设备。
-
通过互联网 TCP/IP 协议连接的输入和输出设备组合就是伪终端。例如,使用SSH、Telnet连接的。
本地终端
在Linux中,通过查询 /dev 目录可以看到有多达64个本地物理终端,目前我不知道为什么有怎么多个,如何使用。
[root@CentOS8 ~]# ls /dev/tty*
/dev/tty /dev/tty20 /dev/tty33 /dev/tty46 /dev/tty59
/dev/tty0 /dev/tty21 /dev/tty34 /dev/tty47 /dev/tty6
/dev/tty1 /dev/tty22 /dev/tty35 /dev/tty48 /dev/tty60
/dev/tty10 /dev/tty23 /dev/tty36 /dev/tty49 /dev/tty61
/dev/tty11 /dev/tty24 /dev/tty37 /dev/tty5 /dev/tty62
/dev/tty12 /dev/tty25 /dev/tty38 /dev/tty50 /dev/tty63
/dev/tty13 /dev/tty26 /dev/tty39 /dev/tty51 /dev/tty7
/dev/tty14 /dev/tty27 /dev/tty4 /dev/tty52 /dev/tty8
/dev/tty15 /dev/tty28 /dev/tty40 /dev/tty53 /dev/tty9
/dev/tty16 /dev/tty29 /dev/tty41 /dev/tty54 /dev/ttyS0
/dev/tty17 /dev/tty3 /dev/tty42 /dev/tty55 /dev/ttyS1
/dev/tty18 /dev/tty30 /dev/tty43 /dev/tty56 /dev/ttyS2
/dev/tty19 /dev/tty31 /dev/tty44 /dev/tty57 /dev/ttyS3
/dev/tty2 /dev/tty32 /dev/tty45 /dev/tty58
# 备注以上包含了四个 ttyS# 终端
在windows10上安装 vmware 虚拟机软件,然后在虚拟机上安装 CentOS 8 为例,如果直接在虚拟机上登录,这是使用 tty 可以查询到当前正在使用的终端是什么。
[root@CentOS8 ~]# tty
/dev/tty1
通过组合键:ctrl+alt+F1 ~ ctrl+alt+F6,可以产生6个本地终端。
例如,ctrl+alt+F2,会出现登录状态,登录后
[root@CentOS8 ~]# tty
/dev/tty2
那么,如果你登录了多个本地终端,最终只能出现在一个终端中,这个正在使用的终端,就是焦点终端。这个焦点终端会被内核记录为全局变量,只要有键盘输入,就会把输入的字符交给焦点终端。/dev/console 就是那个全局变量。
[root@CentOS8 ~]# echo hello > /dev/console
hello
# 这个输出信息就会出现在焦点终端上
系统中还有一个全局变量,代表所有的终端,即 /dev/tty。
[root@CentOS8 ~]# echo hello > /dev/tty
hello
# 这个全局变量在伪终端还是本地终端上都能代表
串口终端
这是通过主机上的串口连接出来的终端,从前面的查询可知,表示为在CentOS6~8中 /dev/ttyS0 ~ /dev/ttyS3,在Ubuntu22.04中到/dev/ttyS0 ~ /dev/ttyS31。我这里没有这种设备,无法实现。
伪终端
如果主机是一台服务器,一般来说,不会使用物理终端来连接,特别外网服务器,可能远在天边,只能使用伪终端了。伪终端是通过网络连接的,我们知道网络连接是分层的,上层只是调用接口,而不管下层如何实现这个功能。因此可以使用程序模拟虚拟的终端设备,只需实现它的 write 和 read 等回调即可。对于物理连接的显示器而言,write 其实就是刷新显存,对于伪终端而言,write 是将数据写入到一个用户态的程序中(例如,SSH中)。
在windows 10中,安装 xshell 等软件就可以进行网络连接到Vmware中的CentOS 8 系统中了。
pty(pseudo-tty 伪终端),是 Linux 设计出一对虚拟设备: ptmx (pseudo-terminal master,主伪终端),pts (pseudo-terminal slave 从伪终端) ,即 /dev/ptmx 和 /dev/pts/#(# 代表1,2, 3,…)。简单来说,当有SSH客户端连接后,sshd 会 fork 一个进程,并在子进程中打开一个 /dev/pts/1(或 2, 3, 4, …)的设备,然后与 sshd进程的 /dev/ptmx 配对,这样在 ptmx 和pts之间构成了一条管道,数据就可以写入到sshd中,然后通过网络发送 ssh 客户端。
# 这是登录Ubuntu桌面版后右击在桌面进入终端后
xxx@Ubutu:~$ tty
/dev/pts/0
# 如果是非桌面登录后
xxx@Ubutu:~$ tty
/dev/tty1
主要参考
彻底理解Linux的各种终端类型以及概念