转载: https://www.linuxdashen.com/%E4%BD%A0%E7%9C%9F%E7%9A%84%E7%9F%A5%E9%81%93%E4%BB
%80%E4%B9%88%E6%98%AF%E7%BB%88%E7%AB%AF%E5%90%97%EF%BC%9F
终端(Terminal)是Unix/Linux世界里的一个基本的、重要的概念。但很多人并不了解终端的真正含义。
80年代典型的终端
终端——人与机器交互的接口
人和机器是两个相互独立的实体。当人使用机器时,必须借助某种接口(interface)才能与机器交流信息。台式机的接口包括显示器、键盘、鼠标、扬声器、麦克风等。CPU、内存、硬盘、光驱、显卡、网卡等其他硬件属于主机(host)。Unix和Linux把这种使得人和机器可以交互的接口称为终端。
终端具有两个基本功能:向主机输入信息和向外部输出信息。所以终端可以分为输入设备和输出设备。台式机的输入设备通常包括键盘、鼠标、麦克风,输出设备包括显示器、扬声器等。
我们可以将上面的两段内容归纳为两个公式:
计算机 = 主机 + 终端
终端 = 输入设备 + 输出设备
台式机的主机和终端在物理上是分开的,笔记本电脑却是一个整体,但我们仍然可以将笔记本电脑的设备分为主机和终端。
人类也可以有终端。人类的终端,也就是人类与外部世界进行信息交流的接口。人类终端的输入设备包括感知器官,即眼睛、耳朵、嘴巴、鼻子等。输出设备包括嘴巴(发出声音)、四肢(改变外部世界)等。
综上所述,终端是人与机器交互的接口。人通过自身终端的输出设备(嘴巴或手)将信息传递给计算机终端的输入设备(键盘、鼠标等),后者将信息传递给计算机的主机。主机处理完信息后,将结果传递给计算机终端的输出设备,后者将结果传递给人类终端的输入设备,最后到达人类的大脑。
早期的终端
个人计算机是上世纪70年代末开始出现的。在那之前,人们只能在公司或大学里使用大型机(mainframe)和小型机(minicomputer)。这些计算机非常昂贵,Unix创始人肯•汤普逊和丹尼斯•里奇使用的PDP-7小型机当年的价格为72000美元,GE-45大型机价格高达1000万美元。
肯•汤普逊和丹尼斯•里奇想让Unix成为一个多用户系统。多用户系统意味着要给每个用户配置一个终端,每个用户都要有一个显示器、一个键盘。但当时所有的计算机设备(包括显示器)价格都非常昂贵,而且键盘和主机是集成在一起的,根本没有独立的键盘。
最后他们找到了一样东西,那就是ASR33电传打字机。ASR是英文Automatic Send-Receive的首字母缩写。虽然电传打字机的用途是在电报线路上收发电报,但是它也可以作为人与计算机的接口,而且价格低廉。ASR33打字机的键盘用来输入信息,打印纸用来输出信息。
所以他们把ASR33电传打字机作为终端,很多个ASR33连接到同一个主机,每个用户都可以在终端输入用户名和密码登录主机。这样他们创造了计算机历史上的第一个真正的多用户系统Unix,而ASR33成为第一个Unix终端。
什么是终端服务器(Terminal Server)?
当公司或大学的资金只能买一台大型机或小型机时,所有的终端都直接连到这台主机。随着时间的推移,主机价格逐渐下降,这时一个机构内部有多个主机。如何才能让每个终端都能连接到任何一个主机呢?在各个终端和主机之间牵一根线代价太大,而且线路容易搞混。这时候终端服务器就派上用场了。各个终端与终端服务器相连,各个主机也与终端服务器相连。当终端启动时,终端服务器询问用户要登录哪个主机,用户指定主机后,再输入用户名和密码登录相应的主机。这种拓扑结构很像今天的家庭网络,终端服务器相当于路由器。
控制台(Console)又是个什么东西?
通常终端都是通过线路连接到主机。有一个终端却与众不同,它与主机是一体的,不需要连线。这个特殊的终端就是console,中文名为控制台。Console是用来管理主机的,只能给系统管理员使用,而且一个主机只有一个console。Console与一般终端在外表上没什么区别,但在功能上却大不相同,有些事情只能在console完成,而不能在终端完成。例如,当系统启动出现错误时,错误信息会显示在Console的显示器屏幕上,而不会显示在一般的终端上。这是因为系统还没有成功启动,用户是不能在一般的终端登录系统的。另外,当主机需要维护或修复问题时,Unix以单用户模式启动(single-user mode)。在单用户模式下,只有console才能连接到主机,其他终端没有权限访问主机。
个人计算机上的显示器和键盘既可以认为是Console,也可以是一般的终端。当你在管理系统时,它们是Console;当你在做一般的工作时(浏览网页、编辑office文档等),它们是终端。
现在,人们把console和Terminal看成是同义词,在使用时往往不区分它们原来的差别。这是因为在90年代中期以前,人们都是在公司或大学里通过终端访问Unix,有专门的系统管理员在console管理系统。而现在,人们可以拥有自己的Unix,在自己的电脑上使用Unix,这时候,console和终端是一体的,自己既是一般用户,也是系统管理员。
终端模拟程序
现在我们知道终端属于硬件。从前用户坐在真实的终端前面输入命令,现在输入命令时不能使用真正的终端。因为现在真实的终端是图形界面的终端。现在,用户要输入命令必须使用终端模拟程序(Terminal Emulation Program)。终端模拟程序就是我们平常在Linux桌面环境中打开的终端窗口(Terminal Window),它是个虚拟终端,但主机会认为它就是真正的终端。终端模拟程序也可以叫做终端模拟器(Terminal Emulator)。
如果你使用Unity或Gnome桌面,那么在终端里输入命令man gnome-terminal,在gnome-terminal的手册里你会看到对gnome-terminal的介绍。gnome-terminal是 一个终端模拟程序,它模拟的是xterm。xterm也是一个终端模拟程序,xterm模拟的是DEC公司制造的VT102终端。你会发现,终端模拟程序 不仅可以模拟真实的终端,也可以模拟其他的终端模拟程序。
终端模拟程序可以模拟任何终端,包括真实终端和虚拟终端。但实际上只有四种终端被作为模拟的对象。DEC公司1978年制造的VT100终端和xterm终端模拟程序是最常见的两个模拟对象。另外两个不太常见的模拟对象是DEC公司生产的VT220终端和用于IBM大型机的3270终端。
字符终端和图形终端
字符终端(Character Terminal)也叫文本终端(Text Terminal),是只能接收和输出文本信息的终端。图形终端(Graphics Terminal)不但可以接收和输出文本信息,也可以输出图形图像。DEC公司1978制造的型号为VT100的终端,由于设计非常良好,成为史上最流 行的字符终端,并且为其他字符终端设立了永久的标准。事实上,现在Linux系统上很多的终端模拟程序把DEC公司VT100系列终端作为模拟对象。图形 终端有另外一个标准,那就是X Window,它是大多数Unix-like系统GUI界面的基础。xterm是Unix世界里最著名的图形终端模拟程序,现在你依然可以在Linux系 统上找到xterm这个程序。xterm模拟的图形终端是Tektronix 4014。
终端窗口和虚拟控制台(Terminal Window and Virtual Console)
实际上,终端模拟程序分为两种。在上面提到的终端窗口是其中一种,另外一种是虚拟控制台(Virtual Console)。在上世纪七八十年代,在公司和大学里,一般人们只可以使用一个终端。但有一些重量级人物可以使用很多个终端,因为他们需要在同一时间内使用主机做不同的事,所以在他们的办公桌上会有四五个甚至六七个终端。
现在,我们不需要在桌上摆上这么多个终端。Unix允许用户在自己电脑上使用多个终端,其中有一个是图形终端,其他六个是字符终端。这七个终端使用同一个显示器和键盘。如果我们需要从一个终端切换到另外一个终端,只需按一下快捷键。一般情况下当我们启动Linux系统时,图形界面自动启动。但有一件事你可能不知道,实际上Linux会同时启动七个不同的终端模拟程序。这七个特殊的终端模拟程序叫做虚拟控制台。
第一个到第六个虚拟控制台是全屏的字符终端,第七个虚拟控制台是图形终端,用来运行GUI程序。从图形终端切换到字符终端,我们只需按快捷键CTRL+ALT+F1,或CTRL+ALT+F2…….CTRL+ALT+F6。要切换回图形终端,只需按快捷键CTRL+ALT+F7。当图形终端崩溃时,我们可以按快捷键切换到这六个字符终端的其中一个,然后输入命令修复问题或重启系统。
Unix系统在诞生之初就被设计成一个单主机-多终端模式的多用户系统。现在我们仍然可以在自己家中组建一个”单主机-多终端”的计算机系统,也就是说我们可以把一台硬件强大的主机放在家中,主机安装Linux系统,然后在各个房间部署一个显示器、一个键盘鼠标,这样各个房间都有了自己的终端,各个终端连接到主机,供家人使用。实际上,我们可以在任何终端上通过互联网登录到世界任何地方的Unix主机,只要你有权限访问那台Unix主机。比如我们可以购买国外的VPS,然后在自己的Linux系统上打开一个终端模拟程序,用SSH登录VPS。
注意windows系统虽然号称是多任务多用户系统,但windows对多用户的定义是可以创建多个账号。在windows系统上,同一时间只能登录一个用户账号。Unix-like系统允许多个账号同时登录,是真正的多用户系统
再来一个:http://www.cnblogs.com/dkblog/archive/2009/07/16/1980729.html
环境变量TERM设置为终端机,这里的vt100,vt220等是说明仿真的产品类型。
终端是一个很重要的外设,用过终端设备的人都知道如果设备类型不对就会有乱字符,也可用仿真终端软件如netterm试验一下,linux的终端信息放在 /usr/share/terminfo下,在这个目录的子目录v下就有许多的如vt100,vt102,vt200等,你看一下就知道了。
用例:
如在ssh终端上先执行:
TERM=linux
才能用top命令
查看终端模拟的终端类型名,即查看TERM变量:
# export | grep TERM
declare -x TERM="xterm"
====================================
终端概念常见问题
摘录自:FAQ:终端和控制台
作者:吴晋
由于在很多朋友对终端的概念一直不是很清楚,因此写了这个FAQ,希望能够帮助大家理解这些概念。不妥之处,还请大家来信指出。
Q:/dev/console是什么?
A:/dev/console即控制台,是与操作系统交互的设备,系统将一些信息直接输出到控制台上。目前只有在单用户模式下,才允许用户登录控制台。
Q:/dev/tty是什么?
A:tty设备包括虚拟控制台,串口以及伪终端设备。/dev/tty代表当前tty设备,在当前的终端中输入:echo "hello" > /dev/tty,都会直接显示在当前的终端中。
Q:/dev/ttyS*是什么?
A:/dev/ttyS*是串行终端设备。
Q:/dev/pty*是什么?
A:/dev/pty*即伪终端,所谓伪终端是逻辑上的终端设备,多用于模拟终端程序。例如,我们在X Window下打开的终端,以及我们在Windows使用telnet或ssh等方式登录Linux主机,此时均在使用pty设备,准确的说应该是pty从设备(/dev/pts/*)。
Q:/dev/tty0与/dev/tty1 - /dev/tty63是什么?它们之间有什么区别?
A:/dev/tty0代表当前虚拟控制台,而/dev/tty1等代表第一个虚拟控制台,例如:当使用ALT+F2进行切换时,系统的虚拟控制台为/dev/tty2,当前的控制台则指向/dev/tty2。
Q:如何确定当前所在的终端(或控制台)?
A:使用tty命令可以确定当前的终端或者控制台。
Q:/dev/console是到/dev/tty0的符号链接吗?
A:目前的大多数文本中都称/dev/console是到/dev/tty0的链接(包括《Linux内核源代码情景分析》),但是这样说是不确切的。根据内核文档,在2.1.71之前,/dev/console根据不同系统的设定可以链接到/dev/tty0或者其他ttyn上,在2.1.71版本之后则完全由内核控制。目前,只有在单用户模式下可以登录/dev/console,可以在单用户模式下输入tty命令进行确认。
Q:/dev/tty0与/dev/fb*有什么区别?
A: 在Framebuffer设备没有启用的系统中,可以使用/dev/tty0访问显卡。
Q:关于终端和控制台的区别可以参考哪些文本?
A:可以参考内核文档中的:Documents/devices.txt 中关于"TERMINAL DEVICES"的章节。
另外,《Linux内核源代码情景分析》的8.7节,以及《Operating Systems : Design and Implementation》中的3.9节(第3版中为3.8节)都对终端设备的概念和历史做了很好的介绍。
另外在《Modern Operating System》中也有对终端设备的介绍,由于与《Operating Systems : Design and Implementation》的作者相同,所以文本内容也大致相同。需要注意的一点是《Operating Systems : Design and Implementation》中将终端设备分为3类,而《Modern Operating System》将终端硬件设备分为2类,差别在于前者将X Terminal作为一个类别。
====================================
tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘与显示器取代,所以现在叫终端比较合适。
但是如果我们远程telnet到主机或使用xterm时不也需要一个终端交互么?是的,这就是虚拟终端pty(pseudo-tty)
pts(pseudo-terminal slave)是pty的实现方法,与ptmx(pseudo-terminal master)配合使用实现pty。
终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。tty是Teletype的缩写。Teletype是最早出现的一种终端设备,很象电传打字机(或者说就是?),是由Teletype公司生产的。在Linux系统的设备特殊文件目录/dev/下,终端特殊设备文件一般有以下几种:
1、串行端口终端(/dev/ttySn)
串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。有段时间这些串行端口设备通常被称为终端设备,因为那时它的最大用途就是用来连接终端。这些串行端口所对应的设备名称是/dev/tts/0(或/dev/ttyS0), /dev/tts/1(或/dev/ttyS1)等,设备号分别是(4,0), (4,1)等,分别对应于DOS系统下的COM1、COM2等。若要向一个端口发送数据,可以在命令行上把标准输出重定向到这些特殊文件名上即可。例如,在命令行提示符下键入:echo test > /dev/ttyS1会把单词”test”发送到连接在ttyS1(COM2)端口的设备上。可接串口来实验。
2、伪终端(/dev/pty/)
伪终端(Pseudo Terminal)是成对的逻辑终端设备(即master和slave设备, 对master的操作会反映到slave上),例如/dev/ptyp3和/dev/ttyp3(或者在设备文件系统中分别是/dev/pty/m3和 /dev/pty/s3)。它们与实际物理设备并不直接相关。如果一个程序把ptyp3(master设备)看作是一个串行端口设备,则它对该端口的读/写操作会反映在该逻辑终端设备对应的另一个ttyp3(slave设备)上面。而ttyp3则是另一个程序用于读写操作的逻辑设备。
这样,两个程序就可以通过这种逻辑设备进行互相交流,而其中一个使用ttyp3的程序则认为自己正在与一个串行端口进行通信。这很象是逻辑设备对之间的管道操作。对于ttyp3(s3),任何设计成使用一个串行端口设备的程序都可以使用该逻辑设备。但对于使用ptyp3的程序,则需要专门设计来使用ptyp3(m3)逻辑设备。
例如,如果某人在网上使用telnet程序连接到你的计算机上,则telnet程序就可能会开始连接到设备ptyp2(m2)上(一个伪终端端口上)。此时一个getty程序就应该运行在对应的ttyp2(s2)端口上。当telnet从远端获取了一个字符时,该字符就会通过m2、s2传递给 getty程序,而getty程序就会通过s2、m2和telnet程序往网络上返回”login:”字符串信息。这样,登录程序与telnet程序就通过“伪终端”进行通信。通过使用适当的软件,就可以把两个甚至多个伪终端设备连接到同一个物理串行端口上。
在使用设备文件系统(device filesystem)之前,为了得到大量的伪终端设备特殊文件,使用了比较复杂的文件名命名方式。因为只存在16个ttyp(ttyp0—ttypf)的设备文件,为了得到更多的逻辑设备对,就使用了象q、r、s等字符来代替p。例如,ttys8和ptys8就是一个伪终端设备对。不过这种命名方式目前仍然在RedHat等Linux系统中使用着。
但Linux系统上的Unix98并不使用上述方法,而使用了”pty master”方式,例如/dev/ptm3。它的对应端则会被自动地创建成/dev/pts/3。这样就可以在需要时提供一个pty伪终端。目录 /dev/pts是一个类型为devpts的文件系统,并且可以在被加载文件系统列表中看到。虽然“文件”/dev/pts/3看上去是设备文件系统中的一项,但其实它完全是一种不同的文件系统。
即: TELNET ---> TTYP3(S3: slave) ---> PTYP3(M3: master) ---> GETTY
--------------------------------------
实验:
1、在X下打开一个或N个终端窗口
2、#ls /dev/pt*
3、关闭这个X下的终端窗口,再次运行;比较两次输出信息就明白了。
在RHEL4环境下: 输出为/dev/ptmx /dev/pts/1存在一(master)对多(slave)的情况
3、控制终端(/dev/tty)
如果当前进程有控制终端(Controlling Terminal)的话,那么/dev/tty就是当前进程的控制终端的设备特殊文件。可以使用命令”ps -ax”来查看进程与哪个控制终端相连。对于你登录的shell,/dev/tty就是你使用的终端,设备号是(5,0)。使用命令”tty”可以查看它 具体对应哪个实际终端设备。/dev/tty有些类似于到实际所使用终端设备的一个联接。
4、控制台终端(/dev/ttyn, /dev/console)
在Linux系统中,计算机显示器通常被称为控制台终端(Console)。它仿真了类型为Linux的一种终端(TERM=Linux),并且有一些设备特殊文件与之相关联:tty0、tty1、tty2等。当你在控制台上登录时,使用的是tty1。使用Alt+[F1-F6]组合键时,我们 就可以切换到tty2、tty3等上面去。tty1-tty6等称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名,系统所产生的信息会发送到该终端上。因此不管当前正在使用哪个虚拟终端,系统信 息都会发送到控制台终端上。 你可以登录到不同的虚拟终端上去,因而可以让系统同时有几个不同的会话期存在。只有系统或超级用户root可以向/dev/tty0进行写操作 即下例:
1、# tty(查看当前TTY)
/dev/tty1
2、#echo "test tty0" > /dev/tty0
test tty0
5、其它类型
Linux系统中还针对很多不同的字符设备存在有很多其它种类的终端设备特殊文件。例如针对ISDN设备的/dev/ttyIn终端设备等。这里不再赘述。