前言: 为什么想到写这个话题,其实源于客户在排查用户登录,问到与用户登录相关的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 | 控制台,或是系统控制台,是与操作系统交互的设备,系统将一些信息直接输出到控制台上。 | 面向系统内核 | 特殊设备文件 |
/dev/tty | 控制终端 | 此设备文件是程序(进程)应用的概念 | 特殊设备文件 |
/dev/tty0 | 当前active状态的virtual console别名。 实验说明:
特殊设备文件的用途: | 面向应用程序 | 特殊设备文件 |
/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的。 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