Linux的Console、Terminal和串口
dev目录下的各种tty,ptmx,pts/X(X是1,2,3等数字),console 等等这些是令人混淆的根源,其实理解这些是有窍门的,记住它们只是操作某种终端设备的设备文件而已,这是UNIX风格的延续,这些设备文件对应的真实设备也就那么几种,比如显示器键盘套件,串口对面的超级终端,伪终端对面的SSH,Telnet等等。最后,解释一下伪终端。终端,是用来显示或者输入的设备,比如早期的VGA显示器
1先来一个思维导图

在Linux系统中,Console和串口实际上不是一个东西,但是,我这里说但是,因为早期的Linux系统都是使用串口作为Console的输出口,所以很多时候,很多人就会傻傻不清楚什么是Console,什么是串口。
除了上面那两个,我们还有一个东西经常看到的,叫做——Terminal

2 什么是Terminal (终端)
终端,是用来显示或者输入的设备,比如早期的VGA显示器,当然了,现在我们很多用的是电脑的显示器,比如是笔记本电脑,HDMI线,串口终端,SSH终端等等。
我们早期的显示器和键盘是使用VGA做显示器,然后PS/2接口做鼠标键盘的连接口。

本地终端
用VGA连接主机和显示器,用PS/2或者USB连接主机和键盘,这样的一个显示器/键盘组合就是一个本地终端。
用串口连接的远程终端
通过串口线把主机接到另外一个有显示器和键盘的主机,通过运行一个终端模拟程序,比如“Windows超级终端”来将这台主机的显示器和键盘借给串口对端的主机。
用TCP/IP承载的远程终端
类似Telnet,SSH这般。
3 什么是Console?
终端大多是以物理设备的形式展示给我们,那什么是Console呢?
Console是控制台的意思
显示系统消息的终端就叫控制台,Linux 默认所有虚拟终端都是控制台,都能显示系统消息。
另外,对于那些专门用来模拟终端设备的程序,我们也可以称之为控制台Console,像gnome-terminal,urxvt,mlterm,xterm等软件,都可以称之为控制台,
总结:控制台是终端的特例,是终端的真子集,它是虚拟的终端,
终端与控制台的区分
物理终端:直接连接在主机上的显示器、键盘鼠标统称。在实际机架式服务器部署中,一般是多台服务器共享一套终端,简称KVM(Keyboard键盘,video显示器,mouse鼠标)
虚拟终端(tty):附加在物理终端之上,用软件方式虚拟实现,CentOS默认启用6个虚拟终端,可以通过快捷键来切换,切换方式:Ctrl-Alt-F[1--6], 对应的文件是/dev/tty#。
可以同过tty命令来查看当前的虚拟终端号。tty是teletype writer的简称。
伪终端(pty):两种应用场景,
1第一在图形界面下打开的命令行接口,我们经常使用Ctrl+Alt+T打开的那个实际上就是一个 伪终端
2 第二基于ssh协议或telnet协议等远程打开的命令行界面,是运维工程师用的最多的一种连接服务器的方式。pts(pseudo-terminal slave)是pty的实现方法。
4 tty命令
使用tty命令可以查看当前终端的设备,比如我们登录一个ssh服务器,服务器是ubuntu系统,当我们打开一个tty,就会连接到一个虚拟的终端设备。


既然是设备,就会有创建设备的时候,比如这样

5 Linux下关于终端的一些设备文件
Linux下一切皆文件。
/dev/ttyX 设备文件
tty是最令人熟悉的了,在Linux中,/dev/ttyX代表的都是上述的物理终端,其中,/dev/tty1~/dev/tty63代表的是本地终端,也就是接到本机的键盘显示器可以操作的终端。事实上Linux内核在初始化时会生成63个本地终端,通过键盘上的Fn-Alt-FX(X为1,2,3…)可以在这些终端之间切换,每切换到一个终端,该终端就是当前的焦点终端,比如说,你按下了Fn-Alt-F4组合键,那么此时第4个终端就是焦点终端,即/dev/tty4就是焦点终端设备。
/dev/console 设备文件
系统中有没有什么变量可以表示焦点终端呢?当然有了,那就是/dev/console,不管你在哪里往/dev/console里写东西,这些东西总会出现在系统当前的焦点终端上!
本质上/dev/console其实就是一个全局变量,指代当前的焦点终端,如果当前的焦点是/dev/tty4,那么/dev/console指的就是/dev/tty4,当然这一切都是由内核来维护的。
那么系统中有没有一个叫做自己的全局变量呢?当然有,那就是/dev/tty,也就是说,无论你在哪个终端下工作,当你往/dev/tty里写东西的时候,它总是会马上出现在你的眼前。
总结:/dev/tty1~/dev/tty63我们知道了它们是什么,/dev/tty表示自己,/dev/console表示焦点终端这些我们也知道了,
串口终端 ttyS
开头的就是串口连接的终端,比如ttyS0,ttyS1,ttyS2…
最后,解释一下伪终端。其实也很好解释,只要你理解TUN/TAP虚拟网卡的原理就行,它们如出一辙!类似Telnet,SSH不是没有实际的物理设备吗?简单,给它模拟一个不就得了?系统是分层的,执行流只管调用接口,并不管具体实现。
模拟一个虚拟的终端设备,实现它的write,read等回调即可。对于VGA连接的显示器而言,write其实就是将显存刷新,而对于伪终端而言,write其实是想将数据导入到一个用户态的程序中(不然又能去哪里呢?它下面又没有任何物理的东西),这简直跟很多VPN的原理非常类似。
桌面系统虚拟终端tty2-tty6,又称之为控制台终端
在Linux系统中,计算机显示器通常被称为控制台终端(Console)。它仿真了类型为Linux的一种终端,并且有一些设备特殊文件与之相关联:tty0、tty1、tty2等。当你在控制台上登录时,使用的是tty1。使用Alt+[F1—F6]组合键时,我们就可以切换到tty2、tty3等上面去。tty1 –tty6等称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名,系统所产生的信息会发送到该终端上。因此不管当前正在使用哪个虚拟终端,系统信息都会发送到控制台终端上。你可以登录到不同的虚拟终端上去,因而可以让系统同时有几个不同的会话期存在。只有系统或超级用户root可以向/dev /tty0进行写操作。
(备注:这个地方跟3.1中的有所重复,还有一些小的细节没搞清楚,比如tty2-tty6称之为虚拟终端,那tty7-tty63指的又是什么,又有什么作用呢?还不是很清楚,望有大佬告知!)
伪终端
前面说过伪终端的两种情况:
第一是在Xwindows(桌面GUI环境之下)模式下的启动的终端称之为伪终端;
第二是在远程如果用telnet远程登录的话,也是创建的一个伪终端
Linux设计出一对虚拟终端设备,即/dev/ptmx和/dev/pts/X。这就跟TUN/TAP网卡的网卡与字符设备之前的对应关系一致。
简单来讲,当有ssh客户端连接后,sshd会fork一个进程,然后在子进程中打开一个叫做/dev/pts/1(或者2,3,4,5…)的设备,然后和sshd进程的/dev/ptmx配对,这样在ptmx与pts之间就构成了一条管道,数据可以顺利被导入到sshd,然后通过TCP/IP封装发往ssh client所在的机器。
总结
/dev目录下的各种tty,ptmx,pts/X(X是1,2,3等数字),console 等等这些是令人混淆的根源,其实理解这些是有窍门的,记住它们只是操作某种终端设备的设备文件而已,这是UNIX风格的延续,这些设备文件对应的真实设备也就那么几种,比如显示器键盘套件,串口对面的超级终端,伪终端对面的SSH,Telnet等等。
看网上有人总结的内容,大家可以用这个来理解
● terminal = tty = text input/output environment
● console = physical terminal
● shell = command line interpreter

更多推荐
所有评论(0)