Linux上的文本終端

14.1 Getty(用於/ etc / inittab)

蓋蒂簡介

為了在計算機啟動時(或切換運行級別)在串行端口(以及與之連接的終端)上運行登錄進程,必須將getty命令放入/ etc / inittab文件中。 從命令行運行getty可能會導致問題(請參閱如果getty從命令行運行:程序停止以查看原因)。 蓋蒂獲得TTY(終端)。 每個終端都需要自己的getty命令。 每個/ etc / inittab文件中至少還有一個控制台的getty命令。 找到它並將真正終端的getty命令放在它旁邊。 該文件可能包含註釋掉的文本終端的示例getty行,以便您只需取消註釋(刪除前導#)並更改一些參數。

允許的參數取決於您使用的getty:
兩種最適合直接連接終端的gettys是:

兩個最適合撥入調製解調器的gettys(避免直接連接終端)是:

如果您不使用真正的文本終端,則使用簡單的gettys。 大多數Linux用戶在他們的顯示器上使用其中的一種:

您的Linux發行版可能帶有用於文本終端的ps_getty或agetty。 有些分配不提供。 不幸的是,他們經常把它稱為“getty”,所以您可能需要確定自從您在/ etc / inittab中放入的參數不同之後,您擁有哪一個。 Debian使用agetty(在util-linux軟件包中)。 RedHat和Fedora使用了ps_getty,它位於:ps_getty

作為嘗試確定您擁有哪個getty的最後手段,您可以查看其可執行代碼(通常位於/ sbin中)。 ps_getty在此代碼中嵌入了/ etc / gettydefs。 要搜索它,請轉到/ sbin並輸入:
字符串getty | grep getty
如果getty實際上是agetty,那麼上面的內容將不會導致任何結果。 但是,如果你有agetty輸入:
getty -h
應該顯示選項[-hiLmw]。

如果你沒有getty你想檢查其他發行版和外星人程序在RPM和Debian軟件包之間轉換。 源代碼可以從Getty軟件下載。

如果您不使用調製解調器控制線(例如,如果您只使用最少數量的3個導線:發送,接收和公共信號接地),您應該通過使用“本地”標誌讓getty知道這一點。 這種格式取決於你使用的getty。

Getty在登錄後退出(並可以重新生成)

登錄後,您會注意到(通過使用“top”,“ps -ax”或“ptree”)getty進程不再運行。 這是怎麼回事? 為什麼如果你的shell被殺死了,getty會重新啟動? 這是為什麼。

在你輸入用戶名後,getty接收並調用登錄程序,告訴它你的用戶名。 getty進程被登錄進程取代。 登錄過程要求輸入密碼,檢查密碼並啟動密碼文件中指定的任何過程。 這個過程通常是bash shell。 如果是這樣,bash開始並替換登錄過程。 請注意,一個進程會替換另一個進程,並且bash shell進程最初是作為getty進程啟動的。 這個的含義將在下面解釋。

現在在/ etc / inittab文件中,如果死掉,getty應該重新生成(重新啟動)。 它在調用getty的行上表示如此。 但是,如果bash shell(或登錄進程)被終止,getty重新生成(重新啟動)。 為什麼? 那麼,登錄過程和bash都是getty和inherit的替代品

* 文本終端如何索引

信號連接由其前任建立。 事實上,如果您觀察細節,您會注意到替換過程將具有與原始過程相同的過程ID。 因此,bash是一種偽裝成相同進程ID號的getty。 如果bash被殺害,它就像getty被殺(即使getty不再運行)。 這導致getty重新生成。

當一個註銷時,該串行端口上的所有進程都將被終止,包括bash shell。 如果調製解調器通過降低DCD電壓將掛斷信號發送到串行端口,也可能發生這種情況(如果啟用)。 註銷或丟棄DCD將導致getty respawning。 人們可以通過在“top”或“kill”命令中通過按下k鍵等手動殺死bash(或登錄)來強制getty重新生成。 你可能需要用信號9(這是不能忽略的)殺死它。

如果getty從命令行運行:程序停止

通常應該從/ etc / inittab中運行getty,而不是從命令行運行,否則一些運行在終端上的程序可能會意外暫停(停止)。 這就是為什麼(如果原因對你不重要,請跳到下一節)。 如果你從另一個終端的命令行啟動getty,比如說tty1,那麼它將把tty1作為它的“控制終端”,即使它運行的實際終端是ttyS1。 因此它有錯誤的控制終端。 但是,如果它是在inittab文件內部啟動的,那麼它將具有ttyS1作為控制終端(正確)。

即使控制終端是錯誤的,在ttyS1上的登錄工作正常(因為你給ttyS1作為getty的參數)。 即使控制終端保持tty11,標準輸入和輸出也會設置為ttyS1。 在ttyS1上運行的其他程序可以繼承這個標準輸入/輸出(連接到ttyS1)並且一切正常。 但是有些程序可能會犯錯誤,試圖從他們的控制終端讀取(tty1),這是錯誤的。 現在tty1可能會認為這些程序是由tty1在後台運行的,因此嘗試從tty1讀取(應該是ttyS1)會導致嘗試讀取的進程停止。 (後台進程不允許從其控制終端讀取)。 您可能會在屏幕上看到如下信息:“ [1] +停止 ”。 此時,由於您無法與正在嘗試通過錯誤的終端與您通信的進程進行交互,因此您被卡住了。 當然,為了逃避這一點,你可以去另一個終端並殺死進程等。

agetty(可能被命名為getty)

/ etc / inittab中的示例行:

S1:23:重生:/ sbin / getty -L 19200 ttyS1 vt102

S1來自ttyS1。 23表示getty在進入運行級別2或3時運行。respawn意味著如果getty(或替換它的進程,如bash)被殺死,getty將自動重新啟動(重新生成)。 / sbin / getty是getty命令。 -L表示本地(忽略調製解調器控制信號)。 -h(在示例中未顯示)啟用硬件流量控制(與stty crtsct相同)。 19200是波特率。 ttyS1表示/ dev / ttyS1(MS-DOS中的COM2)。 vt102是終端的類型,這個getty會將環境變量TERM設置為這個值。 沒有配置文件。 編輯getty後在命令行上鍵入“init q”,您應該看到一個登錄提示。

Agetty自動檢測奇偶校驗問題

agetty程序將嘗試自動檢測終端內的奇偶校驗集(包括無奇偶校驗)。 它不支持8位數據字節加1位奇偶校驗。 請參見8位數據字節(外加奇偶校驗)。 如果使用stty來設置奇偶校驗, agetty會自動取消設置,因為它最初希望校驗位通過,就好像它是數據位一樣。 這是因為您需要在輸入登錄名時獲取最後一位(可能是奇偶校驗位),以便它可以自動檢測奇偶校驗。 因此,如果您使用奇偶校驗,請僅在文本終端內啟用它,並讓agetty自動檢測並將其設置在計算機上。 如果您的終端支持收到奇偶校驗,登錄提示將顯示為亂碼,直到您輸入某些內容以便getty可以檢測到

平價。 亂碼提示會阻止訪問者等嘗試登錄。 這可能就是你想要的。

自動檢測奇偶校驗有時會出現問題。 發生這種情況的原因是,首次輸入登錄名後, agetty會啟動登錄程序以完成登錄。不幸的是, 登錄程序無法檢測到奇偶校驗,因此如果getty程序未能確定奇偶校驗, 登錄將無法確定它也是。 如果第一次登錄嘗試失敗,則登錄會讓您再次嘗試,等等(所有奇偶校驗設置錯誤)。 最終,在多次嘗試登錄失敗(或超時後)後, agetty將重新啟動並重新開始登錄序列。 一旦getty再次運行,它可能能夠在第二次嘗試中檢測到奇偶校驗,因此一切都可以正常工作。

如果校驗碼錯誤,則登錄程序無法正確讀取您鍵入的內容,並且無法登錄。如果您的終端支持收到奇偶校驗,您將繼續看到亂碼的屏幕。 如果getty無法檢測到奇偶校驗,則通常在提示符之前將/ etc / issue文件轉儲到屏幕上,因此屏幕上可能會出現更多亂碼文字。

為什麼agetty不能通過輸入的第一個字母檢測奇偶校驗? 這裡有一個例子:假設它檢測到一個8位的字節,其奇偶校驗位為0(高位),奇數個為1位。 它是什麼平等? 那麼,奇數的1位意味著它是奇數奇偶校驗。 但它也可能只是一個沒有奇偶校驗的8位字符。 目前還沒有辦法確定哪一個。 但到目前為止,我們已經消除了均等的可能性。 因此,平價檢測是通過消除過程來進行的。

如果下一個輸入的字節與第一個類似,並且僅消除偶校驗的可能性,則仍然不可能確定奇偶校驗。 這種情況可能會無限期地持續下去,並且在極少數情況下,登錄將會失敗,直到您更改登錄名。 如果agetty發現奇偶校驗位為1,它將假定這是一個奇偶校驗位,而不是8位字符的高階位。 因此,它假設您不使用用戶名中的元字符(高位集)(即您的名稱是ASCII)。

人們可能以各種方式進入“登錄循環”。 假設您只為您的登錄名輸入一個或兩個字母,然後按回車鍵。 如果這些字母不足以進行奇偶校驗檢測,則登錄在檢測到奇偶校驗之前運行。 有時如果在agetty首次啟動時沒有終端和/或連接,則會發生此問題。

如果你陷在這個“登錄循環”中,一種方法就是多次點擊返回鍵,直到你得到getty登錄提示。 另一種方法是等待一分鐘左右超時。 然後,getty程序會將getty登錄提示放在屏幕上,然後您可以再次嘗試登錄。

8位數據字節(加奇偶校驗)

不幸的是,agetty無法檢測到這種平價。 到1999年末,它無法禁用自動檢測奇偶校驗,因此會檢測到不正確的奇偶校驗。 結果是登錄過程將會出現亂碼,奇偶校驗會被設置錯誤。 因此,嘗試使用具有奇偶校驗的8位數據字節似乎不可行。

getty(getty_ps的一部分)

(其中大部分來自Greg Hankins的舊版Serial-HOWTO)
對於這個getty,需要將條目放入配置文件並在/ etc / inittab中添加一個條目。 以下是您在終端中使用的一些示例條目,您可以將它們放入配置文件/ etc / gettydefs中

#38400 bps啞終端條目DT38400#B38400 CS8 CLOCAL#B38400 SANE -ISTRIP CLOCAL#@ S @L登錄:#DT38400#19200 bps啞終端條目DT19200#B19200 CS8 CLOCAL#B19200 SANE -ISTRIP CLOCAL#@ S @L login: #DT19200#9600 bps啞終端條目DT9600#B9600 CS8 CLOCAL#B9600 SANE -ISTRIP CLOCAL#@ S @L登錄:#DT9600

請注意,DT38400,DT19200等僅僅是標籤,並且必須與您在/ etc / inittab中使用的相同。

如果你願意,你可以在登錄橫幅中使getty打印有趣的東西。 在我的例子中,我打印了系統名稱和串行線。 你可以添加其他的東西:[blockquote

遮陽= YES] @B當前(在看到@B時評估)bps速率。 @D當前日期,以MM / DD / YY表示。 @L getty所連接的串行線。 @S系統名稱。 @T當前時間,HH:MM:SS(24小時制)。 @U當前登錄用戶的數量。 這是/ etc / utmp文件中具有非空ut_name字段的條目數的計數。 @V VERSION的值,如默認文件中給出的。 要顯示單個'@'字符,請使用'\ @'或'@@'。

編輯完/ etc / gettydefs後 ,可以通過執行以下操作驗證語法是否正確:

linux#getty -c / etc / gettydefs

確保您的終端所連接的串行端口沒有其他gettyuugetty配置文件,例如( /etc/default/{uu}getty.ttyS N/etc/conf.{uu}getty.ttyS N ) ,因為這可能會干擾在終端上運行getty 。 如果它們退出,請刪除這些衝突的文件。

編輯/ etc / inittab文件以在串行端口上運行getty (替換環境的正確信息 - 端口,速度和默認終端類型):

S1:23:重生:/ sbin / getty ttyS1 DT9600 vt100 在裡面 linux#init q

此時,您應該在終端上看到登錄提示。 你可能不得不回到終端的注意。

mgetty的

“m”代表調製解調器。 這個程序主要用於調製解調器,到2000年中期,它需要重新編譯才能用於文本終端(除非你使用硬件流量控制 - 而且通常需要手工製作的電纜)。 有關直接連接終端的文檔,請參見手冊的“直接”部分: mgetty.texi。

查看/etc/mgetty/mgetty.config的最後一行,為終端配置一個例子。 除非你說“toggle-dtr否”,否則它會認為你有一個調製解調器並在PC上丟棄(取消)DTR引腳,妄圖重置不存在的調製解調器。 與其他gettys相比,mgetty不會將自己附加到終端,除非有人點擊該終端的任何鍵,以便您看到一個? 終端在頂部ps,直到發生這種情況。 / var / log / mgetty /中的日誌可能會顯示一些僅適用於您可能會忽略的調製解調器的警告消息。

以下是您在/ etc / inittab中放置的簡單行的示例

s1:23:respawn:/ sbin / mgetty -r ttyS1