? ? ?ttyS0~ ttyS3 (串行端口終端)指的是電腦的各個物理接口(這些都是串口,不是并口),外部的終端通過這些物理接口與電腦連接 ,從而實現和電腦進行交互。
? ? ?例如:dmesg |grep tty可以查看開啟的接口(串口)

? ? ? ? ?目前連接遠程服務器或者直接在服務器上面操作等都是通過創(chuàng)建虛擬終端的形式。比如pts/1 和tty1虛擬終端,其中tty表示直接登錄機器生成的而pts表示遠程連接生成的。其中遠程連接是通過sshd服務進行創(chuàng)建session會話和bash進程(所以可以看到有sshd進程,同時虛擬終端可以創(chuàng)建多個,這是依賴ptmx功能,sshd通過與ptmx通訊,ptmx在和相對應的pts通訊從而達到多個虛擬終端的效果)。

? ? ? ? 例如:在centos系統中的圖像界面中打開的terminal就是一個pts但是整個圖形界面是一個tty,centos切換到命令行界面后 輸入tty命令時輸出就是tty1或ttyn了,這時候的命令行界面與圖形界面的運行級別是一樣的,通過命令行創(chuàng)建的所有進程都是屬于tty1終端的。
? ? ? ? 注意: tty就是ttyS的虛擬版本,只是不需要通過外部線路進行連接了。遠程連接服務器需要sshd服務,sshd和tty沒有聯系,遠程連接是因為本地有終端模擬器,本機連接就需要內核直接模擬一個模擬器了,所有遠程是pts,本機是tty 。
? ? ?從上面的流程中可以看出來對用戶空間的程序來說它們沒有區(qū)別,都是一樣的;從內核角度來看pts的另一端連接的是ptmx,而tty的另一端連接的是內核的終端模擬器,ptmx和終端模擬器都只是負責維護會話和轉發(fā)數據包;再看看ptmx和內核終端模擬器的另一端,ptmx的另一端連接的是用戶空間的應用程序,如sshd、tmux等,而內核終端模擬器的另一端連接的是具體的硬件,如鍵盤和顯示器。
SSH遠程訪問---重點
這里的Terminal可能是任何地方的程序,比如windows上的putty,所以不討論客戶端的Terminal程序是怎么和鍵盤、顯示器交互的。由于Terminal要和ssh服務器打交道,所以肯定要實現ssh的客戶端功能。這里將建立連接和收發(fā)數據分兩條線路解釋,為了描述簡潔,這里以sshd代替ssh服務器程序:
建立連接:
1.Terminal請求和sshd建立連接。
2.如果驗證通過,sshd將創(chuàng)建一個新的session。
3.調用API(posix_openpt())請求ptmx創(chuàng)建一個pts,創(chuàng)建成功后,sshd將得到和ptmx關聯的fd,并將該fd和session關聯起來。
4.同時sshd創(chuàng)建shell進程,將新創(chuàng)建的pts和shell綁定。
收發(fā)消息:
1.Terminal收到鍵盤的輸入,Terminal通過ssh協議將數據發(fā)往sshd。
2.sshd收到客戶端的數據后,根據它自己管理的session,找到該客戶端對應的關聯到ptmx上的fd。
3.往找到的fd上寫入客戶端發(fā)過來的數據。
4.ptmx收到數據后,根據fd找到對應的pts(該對應關系由ptmx自動維護),將數據包轉發(fā)給對應的pts。
5.pts收到數據包后,檢查綁定到自己上面的當前前端進程組,將數據包發(fā)給該進程組的leader。
6.由于pts上只有shell,所以shell的read函數就收到了該數據包。
7.shell對收到的數據包進行處理,然后輸出處理結果(也可能沒有輸出)。
8.shell通過write函數將結果寫入pts。
9.pts將結果轉發(fā)給ptmx。
10.ptmx根據pts找到對應的fd,往該fd寫入結果。
11.sshd收到該fd的結果后,找到對應的session,然后將結果發(fā)給對應的客戶端。
SSH + Screen/Tmux
? ? ? 常用Linux的同學應該對screen和tmux不陌生,通過它們啟動的進程,就算網絡斷開了,也不會受到影響繼續(xù)執(zhí)行,下次連上去時還能看到進程的所有輸出,還能繼續(xù)接著干活。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?這種情況要稍微復雜一點,不過原理都是一樣的,前半部分和普通ssh的方式是一樣的,只是pts/0關聯的前端進程不是shell了,而是變成了tmux客戶端,所以ssh客戶端發(fā)過來的數據包都會被tmux客戶端收到,然后由tmux客戶端轉發(fā)給tmux服務器,而tmux服務器干的活和ssh的類似,也是維護一堆的session,為每個session創(chuàng)建一個pts,然后將tmux客戶端發(fā)過來的數據轉發(fā)給相應的pts。由于tmux服務器只和tmux客戶端打交道,和sshd沒有關系,當終端和sshd的連接斷開時,雖然pts/0會被關閉,和它相關的shell和tmux客戶端也將被kill掉,但不會影響tmux服務器,當下次再用tmux客戶端連上tmux服務器時,看到的還是上次的內容。