TTY 是 Teletype 或 Teletypewriter 的縮寫,原來是指電傳打字機,後來這種設備逐漸鍵盤和顯示器取代。不論是電傳打字機仍是鍵盤顯示器,都是做爲計算機的終端設備存在的,因此 TTY 也泛指計算機的終端(terminal)設備。爲了支持這些 TTY 設備,Linux 實現了一個叫作 TTY 的子系統。因此 TTY 既指終端,也指 Linux 的 TTY 子系統,固然 TTY 還有更豐富(混亂)的含義,本文試圖把它們解釋清楚。本文中演示部分使用的環境爲 ubuntu 18.04。html
早期的終端(terminal) 是一臺獨立於計算機的機器(teletype 即, TTY),大概像下面的樣子:shell
它終端經過線纜與計算機鏈接,並完成計算機的輸入輸出功能:ubuntu
如今物理終端實際上已經滅絕了,咱們看到的全部 TTY 都是模擬視頻終端,即軟件仿真出來的終端。能夠經過 toe -a 命令查看系統支持的終端類型,不要奇怪,這是一個挺長的列表。segmentfault
提到終端就不能不提控制檯 console。控制檯的概念與終端含義很是相近,其實如今咱們常常用它們表示相同的東西,可是在計算機的早期時代,它們確實是不一樣的東西。
一些數控設備(好比數控機牀)的控制箱,一般會被稱爲控制檯,顧名思義,控制檯就是一個直接控制設備的面板,上面有不少控制按鈕。 在計算機裏,把那套直接鏈接在電腦上的鍵盤和顯示器就叫作控制檯。而終端是經過串口鏈接上的,不是計算機自身的設備,而控制檯是計算機自己就有的設備,一個計算機只有一個控制檯。計算機啓動的時候,全部的信息都會顯示到控制檯上,而不會顯示到終端上。這一樣說明,控制檯是計算機的基本設備,而終端是附加設備。計算機操做系統中,與終端不相關的信息,好比內核消息,後臺服務消息,均可以顯示到控制檯上,但不會顯示到終端上。好比在啓動和關閉 Linux 系統時,咱們能夠在控制檯上看到不少的內核信息(下圖來自 vSphere Client 中的 "Virtual Machine Console"):異步
如今終端和控制檯都由硬件概念,逐漸演化成了軟件的概念。簡單的說,能直接顯示系統消息的那個終端稱爲控制檯,其餘的則稱爲終端(控制檯也是一個終端)。或者咱們在平時的使用中壓根就不區分 Linux 中的終端與控制檯。ide
下面的例子是經過 /dev/console 文件向控制檯發送消息,這個這個例子咱們能夠看到控制檯與終端的一點點不一樣之處。
打開 vSphere Client 中的 "Virtual Machine Console"(即控制檯),默認顯示的是 tty1:spa
經過其餘的終端向 /dev/console 中寫入字符串 "hello world":
root@esearch:~# echo "hello world" > /dev/console操作系統
字符串顯示在了控制檯中。而後經過 Ctrl + Alt + F2 把控制檯中的終端切換到 tty2,再次向 /dev/console 寫入字符串:
root@esearch:~# echo "hello world" > /dev/console.net
此次字符串寫到了 tty2 中,這說明 Linux 老是把寫入 /dev/console 的內容會顯示在控制檯中當前的虛擬終端(tty1-tty6)裏。unix
從歷史上看,終端剛開始就是終端機,配有打印機,鍵盤,帶有一個串口,經過串口傳送數據到主機端,而後主機處理完交給終端打印出來。電傳打字機(teletype)能夠被看做是這類設備的統稱,所以終端也被簡稱爲 TTY(teletype 的縮寫)。
以下圖所示(下圖來自互聯網):
UART 驅動
如上圖所示,物理終端經過電纜鏈接到計算機上的 UART(通用異步接收器和發射器)。操做系統中有一個 UART 驅動程序用於管理字節的物理傳輸。
行規範
上圖中內核中的 Line discipline(行規範)用來提供一個編輯緩衝區和一些基本的編輯命令(退格,清除單個單詞,清除行,從新打印),主要用來支持用戶在輸入時的行爲(好比輸錯了,須要退格)。
TTY 驅動
TTY 驅動用來進行會話管理,而且處理各類終端設備。
UART 驅動、行規範和 TTY 驅動都位於內核中,它們的一端是終端設備,另外一端是用戶進程。由於在 Linux 下全部的設備都是文件,因此它們三個加在一塊兒被稱爲 "TTY 設備",即咱們常說的 TTY。
後來的終端慢慢演變成了鍵盤 + 顯示器。若是咱們要把內容輸出到顯示器,只要把這些內容寫入到顯示器對應的 TTY 設備就能夠了,而後由 TTY 層負責匹配合適的驅動完成輸出,這也是 Linux 控制檯的工做原理(下圖來自互聯網):
上圖中,TTY 驅動和行規範的行爲與前面的示例相似,但再也不有 UART 或物理終端。相反,軟件仿真出視頻終端,並最終被渲染到 VGA 顯示器。注意,這裏出現了軟件仿真終端,它們是運行在內核態的。顯示器和 vSphere Client "Virtual Machine Console" 中的 tty1-tty6 都是軟件仿真終端:
/dev/tty1-/dev/tty6 是這些仿真終端在文件系統中的表示,程序經過對這些文件的讀寫實現對仿真終端的讀寫。
若是咱們在用戶空間也進行終端仿真,狀況會變得更加靈活,下圖是 xterm 及其克隆的工做方式(下圖來自互聯網):
爲了便於將終端仿真移入用戶空間,同時仍保持 TTY 子系統(TTY 子系統指 TTY 驅動和行規範)的完整,僞終端被髮明瞭出來(pseudo terminal 或 pty)。僞終端在內核中分爲兩部分,分別是 master side 和 在 TTY 驅動中實現的 slave side。注意上圖中的 xterm,這是一個運行在用戶態的終端仿真程序,好比 Ubuntu Desktop 中的 GNOME Terminal:
當建立一個僞終端時,會在 /dev/pts 目錄下建立一個設備文件:
若是是經過 PuTTY 等終端仿真程序經過 SSH 的方式遠程鏈接 Linux,那麼終端仿真程序經過 SSH 與 PTY master side 交換數據。
至此咱們能夠得出這樣的結論:如今所說的終端已經不是硬件終端了,而是軟件仿真終端(終端模擬軟件)。
關於終端和僞終端,能夠簡單的理解以下:
經過本文咱們能夠了解到,真正的硬件終端基本上已經看不到了。在一些鏈接了鍵盤和顯示器的系統中(固然也包括一些 vsphere 等虛擬環境),咱們能夠接觸到運行在內核態的軟件仿真終端。而咱們使用最多的則是僞終端。
參考:
解密TTY
Linux TTY/PTS概述
The TTY demystified
What is stored in /dev/pts files and can we open them?
終端、虛擬終端、shell、控制檯、tty的區別