侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

console、tty、pts、pty、Terminal、Physical console、Virtual console、Pseudo Terminal关系解析

2023-11-05 星期日 / 0 评论 / 0 点赞 / 50 阅读 / 22113 字

前言: 为什么想到写这个话题,其实源于客户在排查用户登录,问到与用户登录相关的tty格式?有哪些,有什么区别?原以为10多年小机系统管理经验,回答应该so easy,突然发现解释起来有点乱,所以梳

前言:

    为什么想到写这个话题,其实源于客户在排查用户登录,问到与用户登录相关的tty格式?有哪些,有什么区别?原以为10多年小机系统管理经验,回答应该so easy,突然发现解释起来有点乱,所以梳理了一下,分享给大家,也帮忙多指正一二。

.

console、tty、pts、pty、Terminal、Physical console、Virtual console、Pseudo Terminal

.

列出这些一堆乱七八糟的东西,其实都是一个东西(与终端相关),连接多任务多用户系统的连接方式。为什么会觉得乱?对于解释不清楚的东西,习惯会说是历史原因.....

 

A console's story

Console,或许是上面一堆名词里面认知度最高的了,那我们就从最熟悉的说起:

参照 Wikipedia 的定义, a system console is "a physical device to operate a computer".

Console是一个物理设备,什么样的物理设备?

几经更迭,现在部分已经不使用单独的硬件了(利用软件模拟),直接解释当前的console,朋友们会听起来莫名其妙。其实,主要是本人文字功底有限,解释不清楚,那就从long time ago的硬件说起:

TTY

不是说计算机的console吗?怎么把传统打字机、《永不消逝的电波》弄出来了......

A typewriter

从打字机(typewriter)说起,其实打字机就是计算机console的最早的原型,打字机的作用可以记录输入和接收输出。后来发明了Morse码和电报机,伴随升级,解决信号传输和文字传输问题;由于二战期间需要破译电报,所以电传打字机(Teletype)也就顺势诞生了。

.

Computer

计算机基本分类普及:

  • Computer:泛指超级计算机,比如中国的银河计算机(房子那么大)
  • Mainframe Computer:大型机,一般银行或事金融行业会用到的专属设备(车床那么大)
  • Mini-computer:小型机,用于企业级计算,是UNIX系统的硬件平台。(冰箱那么大)
  • Workstation:工作站,其实也就是比我们PC配置稍高的低端服务器。
  • Micro-computer:微机,也就是我们日常使用PC或laptop

从计算机时间发展先后,从宏观体积,从单机处理能力,都是从上往下顺序依次排列。

.

        第一代计算机的发明---(那要追溯到1946年,二战刚结束,中国也结束了耻辱的抗日战争,又再次拖入国内战争;人民还在水深火热中挣扎时,欧帝已经研制出可能影响百年的电子怪兽了,咱们还处于没有“人民解放“时期)。那时,计算机已经具备处理能力,需要解决与计算机的交互问题,二战时期发明的电传打字机自然就解决了这个问题。使用类似发电报的打字机来连接这个庞然大物,用来吩咐这个怪兽帮人类干活。它就是 Teletype(或者TeletypeWriter)的缩写,中文翻译:电传打字机。简称tty

tty作用:不执行计算的任务,负责将用户的输入发送到主计算机去处理,然后再把计算结果返回给用户。

tty,名副其实的成为最早的控制台(console)

 

Terminal

随着计算机的发展,从电子管提升到晶体管,处理能力也有了提升,这个时期的计算机特点就是体积大,超级运算能力(根人工比),价格昂贵。为了充分使用计算机提供的计算资源,希望更多的用户能够同时驱使这个怪兽。那么怎么能让计算机支持多任务和多用户呢?

软件方面:

1965年,Multics系统出现了,她----告别了批处理时代,真正的多任务多用户管理系统。有了软件系统,使其能够支持管理多个用户的访问。

硬件方面:

与此同时,连接计算机的console也需要进行提升,monitor和键盘替代了原有的电传打字机,这时候使用了新的设备,通过串口(通常是RS232)和计算机相连。主要有两种类型的设备:

  • 哑终端(dumb terminal):只依赖于主机才能进行处理的终端。哑终端没有处理器、硬盘或软盘,只有键盘、显示器和到主机的通信途径(通常通过一些类型的控制器)。
  • 智能终端(start terminal):有自己的处理器、存储设备以及软件程序。

Terminal名字的由来:

以前计算机只有一个进行交互的控制台,使用的是tty设备,所以就叫tty,独一份,也不用分类,也不用命名。后来,这个控制台不再仅仅用电传机了,有了新的设备,而且利用多路复用分频设备,支持多个用户连接。这时,终端(terminal)这个名字产生了,相应通过硬件连接计算机的设备,也称为终端设备。电传打字机(tty)也就成了最早的终端设备了,后来虽然被显示器和键盘取代,大家习惯的认为tty是终端的总称。

.

注:Multics系统(1965年),对于操作系统发展具有划时代的意义,算是所有操作系统的鼻祖,后来才有了UNIX,Windows、Mac OX,以及UNIX的“北鼻”Linux系统。<提前剧透,打算另开一帖,介绍计算机和操作系统发展演义,有兴趣童鞋可以观摩一下>

. .

1965,预示着新的IT行业诞生,这一年,在中国那个动乱的年代,能够让人印象深刻,并有影响全世界的大事件:65式军服

65式军服充满了传奇色彩,绿色军装,绿色军帽,红五星,红领章,“一颗红星头上戴,革命的红旗挂两边”,那些难忘的记忆!

.

PS:是否能让你觉得 “红兵小将” 也有美的一面......

 

Pysical Terminal & Pyhsical console

基于上面的介绍,以上的连接方式,都是基于物理设备的连接,称为物理终端(Pysical Terminal),也可以称为物理控制台(Pyhsical console)

这时会有一个疑问?console和terminal有什么区别?

简单来看,console是计算机的原生上设备(因为那时还没有出现网络,TCP/IP协议),所谓的terminal是附加的设备,通过串口或事其他设备连接。也就是说console(原生设备)只有一个,但是terminal(附加设备)可以有多个。

Virtual Console & Virtual Terminal

随之PC的普及,硬件价格也越来越便宜,通常都是一个人独占一台计算机操作。显示器不再包含字符生成的硬件,所有的视频信号都是由位于PC内的显卡生成的。不再连接以前那种真正意义上的“终端设备了”,因此,终端和控制台的概念也慢慢演化了。终端和控制台由硬件的概念,演化成了软件的概念。

一个物理终端(物理控制台),可以支持多个虚拟终端(或虚拟控制台 virtual console):

  • HP-UX系统:通过console连接到系统,可以tsm程序,可以使一个物理console,变成多个console窗口单独操作,同时也避免单个console窗口hung,导致无法操作的尴尬。
  • Linux-RHEL7:在图形终端下,默认有模拟6个虚拟控制台。(通过键盘快捷键 Ctrl+Alt+F1~6进行切换)

以上为RHEL7 切换虚拟console的截图,显示的设备文件是:/dev/tty2 /dev/tty3

Terminal emulator

随着X视窗系统的广泛使用,虚拟控制台的使用需求也越来越少,控制台程序可以在终端模拟器(terminal emulator)中运行,这些被称为伪终端(Pseudo Terminal)

简单来说,可以使用个人电脑的登录软件模拟,或事unxi/linux系统本身模拟terminal。比如secuCRT,utty软件,xmanager......此类的软件

Pseudo Terminal-pty

pty - pseudoterminal interfaces
ptmx, pts - pseudoterminal master and slave

伪终端-pseudoterminal(缩写“pty")是一对虚拟字符设备,可以提供一个双向通讯的通道。一个叫作master,另一个叫作slave。

Pseudoterminals are used by applications such as network  login  services  (ssh,  rlogin,  telnet),  terminal  emulators,   script ,screen , and expect.

从历史上看,两个pseudoterminal  API已经进化:BSD and System V。SUSv1(Single UNIX Specification v1-UNIX统一规范版本1)将System V 的pseudoterminal API作为标准,新的程序都使用这个API。

Linux提供两种风格的pseudoterminal。System V-style pseudoterminal通常叫作UNIX 98 pseudoterminals。从kernel 2.6.4后,BSD-style pseudoterminals也考虑废弃了,统一使用UNIX 98 pseudoterminal风格。

BSD-style 

slave                  

/dev/tty[p-za-e][o-9a-f].             

  master /dev/pty[p-za-e][0-9a-f]
Unix98  slave /dev/pts/N
  master /dev/ptmx

从RHEL4以后内核都是2.6.9了,所以现在能够遇到的系统基本都是2.6.9内核之后的,BSD风格的可以忽略不计,了解就行了。

 

区分/dev/tty、/dev/console、/dev/pts、/dev/ttyn

上面是对终端相关的名字做了个说明,那么在系统中是怎么使用的?根据linux的哲学思想,一切皆文件,对应到系统就是一个个文件(包括二进制命令文件、以及设备文件...)

名词描述解释:现在对于控制台和终端概念上,其实已经很模糊了,以下提到的终端,泛指所有的

# ll /dev/tty*crw-rw-rw-. 1 root tty     5,  0 Jun 21 22:22 /dev/ttycrw--w----. 1 root tty     4,  0 Jun 21 21:53 /dev/tty0crw--w----. 1 root tty     4,  1 Jun 21 21:53 /dev/tty1crw--w----. 1 root tty     4,  2 Jun 21 22:49 /dev/tty2cow--w----. 1 root tty     4,  3 Jun 21 22:31 /dev/tty3crw--w----. 1 root tty     4,  4 Jun 21 21:53 /dev/tty4crw--w----. 1 root tty     4,  5 Jun 21 21:53 /dev/tty5crw--w----. 1 root tty     4,  6 Jun 21 21:53 /dev/tty6crw--w----. 1 root tty     4,  7 Jun 21 21:53 /dev/tty7crw--w----. 1 root tty     4,  8 Jun 21 21:53 /dev/tty8crw--w----. 1 root tty     4,  9 Jun 21 21:53 /dev/tty9...crw--w----. 1 root tty     4, 60 Jun 21 21:53 /dev/tty60crw--w----. 1 root tty     4, 61 Jun 21 21:53 /dev/tty61crw--w----. 1 root tty     4, 62 Jun 21 21:53 /dev/tty62crw--w----. 1 root tty     4, 63 Jun 21 21:53 /dev/tty63crw-rw----. 1 root dialout 4, 64 Jun 21 21:53 /dev/ttyS0crw-rw----. 1 root dialout 4, 65 Jun 21 21:53 /dev/ttyS1crw-rw----. 1 root dialout 4, 66 Jun 21 21:53 /dev/ttyS2crw-rw----. 1 root dialout 4, 67 Jun 21 21:53 /dev/ttyS3

 

设备文件 描述 应用 备注
/dev/console

控制台,或是系统控制台,是与操作系统交互的设备,系统将一些信息直接输出到控制台上。
在用户层和内核都有一个console,分别对应PRintf和printk的输出。kernel下的console是输入输出设备driver中实现的简单的输出console,只实现write函数,并且是直接输出到设备。user空间下的console,实际就是tty的一个特殊实现,大多数操作函数都继承tty,所以对于console的读写,都是由kernel的tty层来最终发送到设备。

面向系统内核 特殊设备文件
/dev/tty

控制终端
当前进程的控制终端的特殊设备文件,设备号是(5,0),即当前用户正在使用的终端,是一个映射,指向当前所使用的终端(例如/dev/tty3,/dev/pts/2)。往/dev/tty下写数据总是写到当前终端。
特点:不指任何意义上的控制台,/dev/tty只是一个映射。比如,在默认控制台文本登录,/dev/tty对应的就是/dev/tty2 或tty1~6中的一个。如果是ssh登录/dev/tty映射的就是/dev/ptsN的一个。

此设备文件是程序(进程)应用的概念 特殊设备文件
/dev/tty0

当前active状态的virtual console别名。
在linux下,系统默认会启动虚拟终端(UNIX下没有virtual console概念),tty0也会默认启动,但是我们正在使用的仅是tty1~tty63中的一个。RHEL默认开启tty1~6,我们仅可能是1~6中的一个窗口。
验证环境:
RHEL7登录virtual console:/dev/tty2,使用ssh登录在伪终端:/dev/pts/1下进行操作
# echo "active tty" >/dev/tty2         ## tty2窗口会显示active tty字符
# echo "active tty" >/dev/tty0         ## tty2窗口会显示active tty字符
# echo "active tty" >/dev/console    ##tty2窗口会显示active tty字符
# echo "active tty" >/dev/tty           ##pts/1窗口会显示active tty字符
# echo "active tty" >/dev/pts/1       ##pts/1窗口会显示active tty字符

实验说明:

  1. 发给tty0的,tty2会收到信息,说明系统会自动识别active的虚拟终端
  2. 发给console的,tty2会收到信息,说明虚拟终端,内核认为也是控制台,而且自动识别active的那个(console-->tty0-->active tty)。
  3. 当前伪终端pts/1,发给tty的,pts/1会收到信息,说明tty会自动识别当前活动终端设备(console 、pts/N、ttyN)

特殊设备文件的用途:
对于程序和内核向终端发送信息比较简化,不需要关系运行程序的用户终端设备文件。这个的应用对于程序开发人员比较有价值,普通使用者体现的不太明显。

面向应用程序 特殊设备文件
/dev/ttyN 虚拟终端(其中tty0就是/dev/console,tty1,tty2就是不同的虚拟终端(virtual console)).通常使用热键ctrl+alt+Fn来在这些虚拟终端之间进行切换。所有的这些tty设备都是由linux/drivers/char /console.c和vt.c对应。    
/dev/ttySn 串行终端,串口设备对应的终端    
/dev/pts/n

pseudoterminal 伪终端,这是UNIX98的实现风格,slave为/dev/pts/n是,master一般为/dev/ptmx。例如网络登录的telnet就是使用pts。通过桌面环境打开的gnome-shell也是pts的。
        The Linux support for the above (known as UNIX 98 pseudoterminal naming)  is  done  using  the devpts file system, that should be mounted on /dev/pts.

       Before  this  UNIX  98  scheme,  master pseudoterminals were called /dev/ptyp0, ...  and slave pseudoterminals /dev/ttyp0, ...  and one needed lots of preallocated device nodes.

   
/dev/pty[p-za-e][0-9a-f] 伪终端,这是BSD的实现风格,slave一般使用/dev/tty[p-za-e][0-9a-f]这种格式,而master一般使用/dev/pty[p-za-e][0-9a-f]这种格式。    

 

 

  • /dev/tty 当前控制终端设备文件,名字听起来很绕口,即当前用户正在使用的终端,是一个映射,指向当前所使用的终端(例如/dev/tty3,/dev/pts/2)。往/dev/tty下写数据总是写到当前终端。
  • /dev/ttyN 虚拟终端(其中tty0就是/dev/console,tty1,tty2就是不同的虚拟终端(virtual console)).通常使用热键ctrl+alt+Fn来在这些虚拟终端之间进行切换。所有的这些tty设备都是由linux/drivers/char /console.c和vt.c对应。
    root@localhost ~]# dmesg |grep -i tty[    0.000000] console [tty0] enabled[    1.727706] 00:05: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A[ 1487.434322] Bluetooth: RFCOMM TTY layer initialized
    [root@localhost ~]# ps -ef|grep ttyroot       1260   1191  0 02:57 tty1     00:00:13 /usr/bin/Xorg :0 -background none -noreset -audit 4 -verbose -auth /run/gdm/auth-for-gdm-QAVH5i/database -seat seat0 -nolisten tcp vt1root       3120   3113  0 03:21 tty2     00:00:00 -bashroot       3176   3160  0 03:21 tty3     00:00:00 -bashroot       8534   4342  0 09:35 pts/0    00:00:00 grep --color=auto tty

    /dev/tty1 就是图形化登录的VC,/dev/tty2 /dev/tty3 是通过ctrl+alt+F#切换登录的窗口

  • /dev/pts/n 伪终端,例如网络登录的telnet就是使用伪终端。通过桌面环境打开的gnome-shell也是pts的。这是UNIX98的实现风格,slave为/dev/pts/n是,master一般为/dev/ptmx。
    [root@localhost ~]# ps -ef |grep pts/1root       8399   1205  0 09:30 ?        00:00:00 sshd: root@pts/1root       8405   8399  0 09:30 pts/1    00:00:00 -bashroot       8532   4342  0 09:34 pts/0    00:00:00 grep --color=auto pts/1

     

区分终端设备文件的作用:

1、在登录使用方面,其实没有实际的意义。通过我们对于计算机的使用,只要能登录就行,至于叫什么?who care......

2、对于系统管理或事程序开发方面,那就有比较重要的作用。比如用户登录管理,可以通过查看wtmp utmp文件来确认正常登录的用户或是非法登录的用户,确认哪一种登录方式。对于程序开发,需要传递和显示message时也很有必要。

3、有一些基于网络的程序,在登录安全管控方面也会涉及tty的内容。

 

在系统运维方面的建议:

1、lan console,console是一个管理卡,作为主机设备的一部分;通常在安装部署时,需要确保分配相应的管理IP,以及连接网络到交换机,在异常情况发生时,可以通过网络远程登录到系统。比如,更改root密码(原密码丢失或不可用),如果不能登录console,也是无法完成的。

2、ilo口或此类的管理口,一般是通过java程序模拟的远程图形化的管理口,可以实现远程console管理的作用。在刀片服务已经很常见了,通过多次使用发现,对于java和登录时使用的浏览器版本有要求和依赖,有时往往在突发情况时,无法登录。基于这样的经验,准备一台专用的登录主机(不要轻易变动配置)也是相当有必要的。

3、虚拟化环境,这个就更随意了,可以在虚拟化软件为基础,达到console管理的。

 

相关命令:

w命令,显示当前系统有哪些用户,采用何种登录方式到系统

[root@localhost ~]# w 01:16:23 up  3:18,  4 users,  load average: 0.00, 0.01, 0.05USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHATxinghait :0       :0               22:18   ?xdm?   1:16   0.37s gdm-session-worroot     tty2                      22:16    2:26m  0.35s  0.35s -bashroot     tty3                      22:17    2:45m  0.27s  0.27s -bashxinghait pts/0    :0               22:31    7.00s  0.18s  2.05s /usr/libexec/gn

 

tty命令:显示回话登录情况

[root@localhost ~]# tty/dev/pts/0

 

stty命令:查看当前终端波特率

[root@localhost ~]# sttyspeed 38400 baud; line = 0;eol = M-^?; eol2 = M-^?; swtch = M-^?;ixany iutf8

 

 

 

广告 广告

评论区