终端、虚拟控制台与伪终端
生活随笔
收集整理的這篇文章主要介紹了
终端、虚拟控制台与伪终端
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
(1)在本機上登錄字符界面或者X11圖形界面均為tty終端
(2)通過telnet/ssh遠程登錄或者在X11中生成一個XTERM的終端,均為虛擬終端PTS。
如:
[lujinhong@localhost ~]$ who lujinhong tty2 2013-02-18 22:47 oracle tty1 2013-02-15 23:48 (:0) oracle pts/0 2013-02-15 23:48 (:0.0) lujinhong pts/1 2013-02-18 22:47 (192.168.183.1)此時幾個終端分別為:(1)在本機上登錄字符界面
(2)在本機上登錄圖形界面
(3)在圖形界面中打開了一個XTERM
(4)遠程TELNET連接
以下內容為轉載:
Linux上許多網絡服務應用,如l2tp、pptp、telnet,都用到了偽終端。有朋友在問這方面的概念,把偶知道的寫下來,以供討論。
一、終端要理解偽終端(Pseudo Terminal),先來看看什么是“終端”(Terminal)。
終端是一種字符型設備,它有多種類型,通常使用tty來簡稱各種類型的終端設備。
1、串行端口終端(/dev/ttySx)
串行端口終端(Serial Port Terminal)是使用計算機串行端口連接的終端設備。計算機把每個串行端口都看作是一個字符設備。這些串行端口所對應的設備名稱是/dev/ttyS0、/dev/ttyS1等,分別對應于DOS系統下的COM1、COM2等。
[root@Kendo ~]# ls -l /dev/ttyS* crw-rw---- 1 root uucp 4, 64 Jan 8 13:39 /dev/ttyS0 crw-rw---- 1 root uucp 4, 65 Jan 8 13:39 /dev/ttyS1 crw-rw---- 1 root uucp 4, 66 Jan 8 13:39 /dev/ttyS2 crw-rw---- 1 root uucp 4, 67 Jan 8 13:39 /dev/ttyS3
2、控制臺終端(/dev/ttyn, /dev/console)?
在Linux系統中,計算機顯示器通常被稱為控制臺終端(Console)。它仿真了類型為Linux的一種終端(TERM=Linux),與之相關聯的設備文件為:tty0、tty1、tty2……。當用戶從控制臺上登錄時,使用的是tty1。使用Alt+[F1—F6]組合鍵時,我們就可以切換到tty2、tty3……上面去。tty1 –tty6等稱為虛擬終端,而tty0則是當前所使用虛擬終端的一個別名,系統所產生的信息會發送到該終端上。因此不管當前正在使用哪個虛擬終端,系統信息都會發送到控制臺終端上。用戶可以登錄到不同的虛擬終端上去,因而可以讓系統同時有幾個不同的會話期存在。只有系統或超級用戶root可以向/dev/tty0進行寫操作。
作為一個測試例子,在控制臺終端下,運行命令:
#echo "write to ttyS0" > /dev/ttyS0 在串行端口終端中可以看到輸出:
# write to ttyS0
3、控制終端(/dev/tty)?
控制終端并不面對設備,而是面對進程,關于這個概念,《Unix環境高級編程》第9章有詳細論述。
二、從終端登錄簡述
Linux系統引導的時候,會運行init進程,它會執行/etc/inittab(這跟具體的init類型有關,我使用了busybox的init,但其本質是一樣的):
[root@SkyNet ~]# cat /etc/inittab ::sysinit:/etc/init.d/rcS ::respawn:/sbin/getty 9600 ttyS0
它會調用getty在指定波特率上打開ttyS0,即,串行端口終端。打開成功后,stdout,stdin,stderr都被設置到該備上,然后getty輸出:"login:"之類的提示符,等待用戶輸入。
當用戶鍵入用戶名后,getty就執行login程序,類似于:execle("login")。login可以調用getpass()以顯示Password:并讀入用戶口令。并且調用getpwnam進行口令驗證。如果成功,調用類似execle("shell")。這樣,登錄用戶就擁有了一個shell了。
三、偽終端
上述登錄過程,對于網絡用戶來說,卻不能完全實用。很顯然,網絡用戶并不需要一個串口,也不需要一個顯示器,他需要的是在他的本地顯示設備上,運行Linux的shell。以telnetd為例,它至少應該是這樣子的:
圖一:telnet登錄假想圖
這里,這個“某個終設備”,自然不可能是一個實際的物理終端設備,因為壓根沒有這樣的設備。這樣,偽終端的概念就被引入進來了。偽終端設備是一種特殊的終端驅動設備, 它并不驅動某個物理設備,而是用來將終端的輸出定向到應用程序中進行處理。偽終端設備之所以存在是為了提供在程序控制下的一種模擬串行終端行為的方法。
偽終端與前面說的終端在表現形式上,最大的不同,就是它總是成對出現,而不是單一的一個。它分為“偽終端主設備(/dev/ptyMN)”和“偽終端從設備”。(/dev/ttyMN)。其中,M與N的命名方式如下:
M: p q r s t u v w x y z a b c d e 共16 個
N: 0 1 2 3 4 5 6 7 8 9 a b c d e f 共16 個
這樣,默認支持最大是256個。
任何寫入到偽終端主設備的輸入,都會作為偽終端從設備的輸入,反之亦然。類似于管道,如下圖:
一個典型的偽終端進程結構如下圖:
這張圖的關鍵在于:如果把偽終端從設備想像為傳統的終端設備,把主設備看成進程讀寫數據的一個“接口”,那么它的工作原理,就跟傳統終端一樣了。
上述只是一個本地進程,把網絡引入進來,對應到telnetd上面來,應該是下面這個樣子:
?
同樣的登錄方式,就變成了這樣:
1、如果某人在網上使用telnet程序連接到本地服務器,則telnetd程序就可能會開始連接到設備ptyp2(m2)上(一個偽終端主設備上)。
2、telnetd產生一個子進程,進行getty程序,其打開一個對應的從設備對應的ttyp2(s2),并設置stdin\stdout\stderr;
3、telnetd通過內核tcp/ip協議棧從遠端獲取了一個字符時,該字符就會通過m2、s2傳遞給getty程序,而getty程序就會通過s2、m2和telnetd程序往網絡上返回”login:”字符串信息;
4、這樣,登錄程序與telnetd程序就通過“偽終端”進行通信;
四、偽終端的數量
對于Linux下的應用而言,知道偽終端的數量是一個關鍵的東東,或者它直接決定了最大支持用戶數,例如PPTP VPN的應用。(沒有多余的可以供打開的
偽終端設備了)。
對于2.6.X而言,在
Device Drivers ---> Character devices ---> [*] Legacy (BSD) PTY support(256) Maximum number of legacy PTY in use
可以設定。應該將它調整到足夠地大,以供支持應用。同時,/dev目錄下,應該有相應的設備文件:
#ls -l /dev/ptyp* crw-r--r-- 1 root root 2, 0 Dec 18 05:36 /dev/ptyp0 crw-r--r-- 1 root root 2, 1 Dec 18 05:36 /dev/ptyp1 crw-r--r-- 1 root root 2, 2 Dec 18 05:36 /dev/ptyp2 crw-r--r-- 1 root root 2, 3 Dec 18 05:36 /dev/ptyp3#ls -l /dev/ttyp* crw------- 1 root root 3, 0 Dec 18 05:36 /dev/ttyp0 crw------- 1 root root 3, 1 Dec 18 05:36 /dev/ttyp1 crw-r--r-- 1 root root 3, 2 Dec 18 05:36 /dev/ttyp2 crw------- 1 root root 3, 3 Dec 18 05:36 /dev/ttyp3
這樣命令方式,并且要指定數量的方式實在是讓人郁悶。因為它有一個數量上限的問題,最大256。
為了解決這個問題,Linux引入了一種新的命名方式:UNIX98_PTYS。關于這個東東,內核是這樣解釋的:
? ? ? ? Linux has traditionally used the BSD-like names /dev/ptyxx for?masters and /dev/ttyxx for slaves of pseudo terminals. This scheme?has a number of problems. The GNU C library glibc 2.1 and later,?however, supports the Unix98 naming standard: in order to acquire a?pseudo terminal, a process opens /dev/ptmx; the number of the pseudo?terminal is then made available to the process and the pseudo?terminal slave can be accessed as /dev/pts/<number>. What was?traditionally /dev/ttyp2 will then be /dev/pts/2, for example.
? ? ? ? All modern Linux systems use the Unix98 ptys. ?Say Y unless?you're on an embedded system and want to conserve memory.
這樣,可以通過訪問/dev/ptmx設備文件的形式,來訪問偽終端設備了,例如我的PPTP服務器,當有五個用戶撥入后:
# ls -l /dev/pts/ crw------- 1 root root 136, 0 Jan 8 12:18 0 crw------- 1 root root 136, 1 Jan 8 08:08 1 crw------- 1 root root 136, 2 Jan 8 14:10 2 crw------- 1 root root 136, 3 Jan 8 14:27 3 crw------- 1 root root 136, 4 Jan 8 08:29 4
總結
以上是生活随笔為你收集整理的终端、虚拟控制台与伪终端的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: syslog()的基本用法
- 下一篇: 关于VMware虚拟机的上网