Textové terminály v systému Linux

14.1 Getty (používá se v souboru / etc / inittab)

Úvod do Getty

Aby byl při spuštění počítače spuštěn přihlašovací proces na sériovém portu (a připojeném terminálu), musí být do souboru / etc / inittab vložen příkaz getty. Spuštění getty z příkazového řádku může způsobit problémy (viz Pokud se getty spustí z příkazového řádku: Programy se zastaví a zjistí proč). Getty získá GTA TTY (terminál). Každý terminál potřebuje vlastní příkaz getty. K dispozici je také alespoň jeden příkaz getty pro konzolu v každém souboru / etc / inittab. Najděte to a dejte příkazy getty pro skutečné terminály vedle něj. Tento soubor může obsahovat ukázkové řádky getty pro textové terminály, které jsou komentovány tak, že stačí je odkomentovat (odstranit přední #) a změnit několik argumentů.

Argumenty, které jsou povoleny, závisí na tom, který getty používáte:
Dvě gettys nejlepší pro přímo připojené terminály jsou:

Dva gettys nejlepší pro dial-in modemy (vyhnout se přímo připojeným terminálům) jsou:

Jednoduché gettys použít, pokud nepoužíváte skutečný text-terminál. Většina uživatelů Linuxu používá jednu z nich na svém monitoru:

Distribuce systému Linux se může dodat s ps_getty nebo agetty pro textové terminály. Některé distribuce neposkytují ani jeden. Bohužel je to často nazývá "getty", takže možná budete muset určit, který z nich máte, jelikož argumenty, které jste zadali v / etc / inittab, se liší. Debian používá agetty (v balíčku util-linux). RedHat a Fedora používají ps_getty, který je na adrese: ps_getty

Jako poslední možnost, abyste se pokusili zjistit, který getty máte, můžete se podívat na jeho spustitelný kód (obvykle v / sbin). ps_getty má / etc / gettydefs vložený do tohoto kódu. Chcete-li ji vyhledat, přejděte na / sbin a zadejte:
řetězce getty grep getty
Pokud je getty skutečně agetty, výsledkem bude nic. Nicméně pokud máte typování agetty:
getty -h
by měly zobrazit možnosti [-HiLmw].

Pokud nemáte getty, který chcete, zkontrolujte ostatní distribuce a cizí program pro konverzi mezi balíčky RPM a Debian. Zdrojový kód lze stáhnout ze softwaru Getty.

Pokud nepoužíváte modemové řídicí linky (například pokud používáte pouze minimální počet 3 vodičů: vysílací, přijímací a společnou signální zem), měli byste to nechat know-how pomocí "místní" vlajky. Formát toho závisí na tom, který getty používáte.

Getty se po přihlášení dostanou (a mohou respawn)

Po přihlášení zjistíte, že proces getty již není spuštěn (pomocí příkazu "top", "ps -ax" nebo "ptree"). Co se tomu stalo? Proč se zase zase restartuje, pokud je váš shell zabit? Zde je důvod.

Po zadání uživatelského jména se dostane getty a zavolá přihlašovací program, který mu oznámí vaše uživatelské jméno. Proces getty je nahrazen procesem přihlášení. Přihlašovací proces vyžaduje zadání hesla, kontroluje jej a spustí jakýkoliv proces zadaný v souboru s heslem. Tento proces je často bash shell. Pokud tomu tak je, bash spustí a nahradí proces přihlášení. Všimněte si, že jeden proces nahrazuje jiný proces a že proces bash shellu byl původně zahájen jako proces getty. Důsledky této skutečnosti budou vysvětleny níže.

Nyní v souboru / etc / inittab, getty má být respawn (restart), pokud je zabit. Říká to tak na linii, která volá getty. Ale pokud je bash shell (nebo přihlašovací proces) zabit, getty respawns (restarts). Proč? No jak přihlašovací proces, tak bash jsou náhražky pro getty a dědictví

* Textový terminál Rejstřík How-To

signálovým spojením stanoveným jejich předchůdci. Ve skutečnosti, pokud pozorujete detaily, zjistíte, že proces nahrazování bude mít stejný procesní ID jako původní proces. Takže bash je trochu getty v přestrojení se stejným identifikačním číslem procesu. Pokud je bash zabit, je to stejně jako Getty byl zabit (i když Getty už neběží). To vede k tomu,

Když se někdo odhlásí, všechny procesy na tomto sériovém portu jsou zabity, včetně shell bash. To se může také stát (pokud je povoleno), pokud je vysílaný signál vyslán do sériového portu kvůli poklesu napětí DCD modemem. Buď odhlášení nebo pokles v DCD bude mít za následek gay respawning. Jeden může donutit getty k respawn ruční zabíjení bash (nebo přihlásit) buď stiskem k klíče, atd., Zatímco v "horní" nebo s "zabít" příkaz. Bude pravděpodobně třeba ji zabít se signálem 9 (což nelze ignorovat).

Pokud se getty spustí z příkazového řádku: Programy se zastaví

Obvykle byste měli spustit getty ze souboru / etc / inittab a ne z příkazového řádku, jinak by některé programy běžící na terminálu mohly být neočekávaně pozastaveny (zastaveny). Zde je důvod, proč (přeskočte na další část, pokud pro vás není pro vás důležité). Pokud začnete getty pro say ttyS1 z příkazového řádku jiného terminálu, řekněme tty1, pak bude mít tty1 jako "řídicí terminál", i když skutečný terminál, na němž běží, je ttyS1. Má tedy nesprávný řídící terminál. Pokud je však spuštěn uvnitř souboru inittab, bude mít ttyS1 jako řídicí terminál (správný).

I když je kontrolní terminál špatný, přihlášení na ttyS1 funguje dobře (protože jste zadali ttyS1 jako argument pro getty). Standardní vstup a výstup jsou nastaveny na ttyS1, přestože řídicí svorka zůstává tty11. Jiné programy běžící na ttyS1 mohou dědit tento standardní vstup / výstup (který je připojen k ttyS1) a vše je v pořádku. Některé programy však mohou učinit chybu v pokusu číst z jejich řídícího terminálu (tty1), což je špatné. Nyní může tty1 myslet, že tyto programy běží na pozadí tty1, takže pokus číst z tty1 (měl by to být ttyS1) má za následek zastavení procesu, který se pokoušel číst. (Proces pozadí není povolen číst z jeho řídícího terminálu.). Může se vám zobrazit zpráva " [1] + Zastavení " na obrazovce. V tomto okamžiku jste uvízli, protože nemůžete komunikovat s procesem, který se s vámi snaží komunikovat prostřednictvím špatného terminálu. Samozřejmě, že uniknete z tohoto, můžete jít na jiný terminál a zabít proces atd.

agetty (může být pojmenována getty)

Ukázkový řádek v souboru / etc / inittab:

S1: 23: respawn: / sbin / getty -L 19200 ttyS1 vt102

S1 je z ttyS1. 23 znamená, že getty je spuštěn po zadání úrovně běhu 2 nebo 3. respawn znamená, že pokud getty (nebo proces, který ho nahradil jako bash) je zabit, getty se automaticky spustí (respawn) znovu. / sbin / getty je příkaz getty. -L znamená lokální (ignorujte modemové řídicí signály). -h (nezobrazeno v příkladu) umožňuje řízení toku hardware (stejně jako stty crtscts). 19200 je přenosová rychlost. ttyS1 znamená / dev / ttyS1 (COM2 v systému MS-DOS). vt102 je typ terminálu a tato getty nastaví proměnnou prostředí TERM na tuto hodnotu. Neexistují žádné konfigurační soubory. Zadejte "init q" na příkazovém řádku po úpravě getty a měli byste vidět výzvu k přihlášení.

Agettyovu automatickou detekci paritních problémů

Agetty program se pokusí o automatické zjištění parity v terminálu (včetně žádné parity). Nepodporuje 8bitové datové bajty a 1bitovou paritu. Viz 8bitové datové bajty (plus parita). Pokud použijete stty k nastavení parity, agetty ji automaticky zruší, protože zpočátku chce, aby paritní bit přišel jako by byl datový bit. Je to proto, že potřebujete získat poslední bit (pravděpodobně bit parity) při zadávání přihlašovacího jména tak, aby mohl automaticky detekovat paritu. Pokud tedy používáte paritu, povolte ji pouze uvnitř textového terminálu a nechte agetty automaticky ji detekovat a nastavit na počítači. Pokud váš terminál podporuje přijatou paritu, přihlašovací výzva bude vypadat zkresleněně, dokud nezadáte něco takového, aby mohla getty detekovat

parita. Zkrácená výzva odradí návštěvníky atd. Od pokusu o přihlášení. To může být přesně to, co chcete.

Někdy je problém s automatickou detekcí parity. K tomu dojde, protože po prvním zadání přihlašovacího jména začne agnet spustit přihlašovací program a dokončí přihlášení. Bohužel přihlašovací program nemůže zjistit paritu, takže pokud program getty nedokázal určit paritu, pak přihlášení nebude schopen určit to buď. Pokud se pokusíte o první pokus o přihlášení, přihlašovací údaje vám umožní zkusit znovu, apod. (Všechny s nesprávnou sadou parity). Nakonec po několika neúspěšných pokusech o přihlášení (nebo po uplynutí časového limitu) se agetty opět spustí a znovu spustit přihlašovací sekvence. Jakmile je Getty opět spuštěn, může být schopen detekovat paritu na druhém pokusu, takže vše může fungovat správně.

Se špatnou paritou nemůže přihlašovací program správně číst, co zadáte a nemůžete se přihlásit. Pokud váš terminál podporuje přijatou paritu, budete i nadále zobrazovat zkreslený obraz. Pokud getty nerozpoznává paritu, soubor / etc / issue se obvykle objevuje na obrazovce těsně před příkazem před příkazem, takže na obrazovce se mohou objevit další zkreslené slova.

Proč nemůže agetty detekovat paritu prvního napsaného písmena? Zde je příklad: Předpokládejme, že detekuje 8bitový bajt s paritním bitem 0 (high-order bit) as lichým počtem 1 bitů. Jaká je parita? Podivné číslo 1 bitů znamená, že je to lichá parita. Ale mohlo by to být jen 8-bitový znak bez parity. Zatím neexistuje žádný způsob, jak určit co. Ale zatím jsme vyloučili možnost parity. Detekce parity tak probíhá procesem eliminace.

Pokud je další zadaný byte podobný prvnímu a zároveň vylučuje možnost rovnoměrné parity, je stále nemožné určit paritu. Tato situace může trvat neomezeně a ve výjimečných případech se přihlášení nezdaří, dokud nezměníte přihlašovací jméno. Pokud agetty nalezne paritní bit 1, předpokládá, že se jedná o paritní bit a nikoliv bit s vysokým pořadím 8-bitového znaku. Předpokládá se tedy, že ve vašem uživatelském jméně nepoužíváte meta-znaky (vysoká bitová množina) (tj. Že vaše jméno je v ASCII).

Jeden se může dostat do "přihlašovací smyčky" různými způsoby. Předpokládejme, že zadáte pouze jedno nebo dvě písmena pro své přihlašovací jméno a poté stiskněte návrat. Pokud tato písmena nejsou dostatečná k detekci parity, přihlašuje se přihlášení předtím, než je zjištěna parita. Někdy se k tomuto problému dojde, pokud nemáte terminál zapnutý a / nebo připojený při prvním spuštění agetty.

Pokud se v této "přihlašovací smyčce" ujmete, je to způsob, jak je několikrát stisknout tlačítko návratu, dokud neobdržíte příkaz getty pro přihlášení. Jiným způsobem je jen čas vypršet minutu. Následně se na obrazovce zobrazí program getty a dostanete se znovu k přihlášení.

8bitové datové bajty (plus parita)

Bohužel tato agita nemůže rozpoznat tuto paritu. Od konce roku 1999 nemá možnost zakázat automatické zjišťování parity, a tak zjistí nesprávnou paritu. Výsledkem je zkreslení přihlašovacího procesu a nesprávná parita. Zdá se tedy nemožné pokusit se použít 8bitové datové bajty s paritou.

getty (část getty_ps)

(Většina z toho je ze starého Serial-HOWTO od Greg Hankins)
Pro tento getty je třeba zadat položky do konfiguračního souboru a přidat položku do / etc / inittab . Zde jsou některé příklady, které chcete použít pro váš terminál, který jste vložili do konfiguračního souboru / etc / gettydefs .

# 38400 bps Vstup dluhového terminálu DT38400 # B38400 CS8 CLOCAL # B38400 SANE -ISTRIP CLOCAL # @ S @L přihlášení: # DT38400 # 19200 b / s Vstupní položka dluhového terminálu DT19200 # B19200 CS8 CLOCAL # B19200 SANE -ISTRIP CLOCAL # @ S @ # DT19200 # 9600 bps Položka drobného terminálu DT9600 # B9600 CS8 CLOCAL # B9600 SANE -ISTRIP CLOCAL # @ S @L login: # DT9600

Všimněte si, že DT38400, DT19200 atd. Jsou jen štítky a musí být stejné, jaké používáte v souboru / etc / inittab .

Pokud chcete, můžete do přihlašovacího banneru udělat zajímavý náhled. Ve svých příkladech mám název systému a sériovou linku vytištěnou. Můžete přidat další věci: [blockquote

odstín = ano] @B Proud (vyhodnocen v okamžiku, kdy je vidět @B) rychlost bps. @D Aktuální datum v MM / DD / YY. @ L Sériová linka, ke které je připojen getty. @S Název systému. @T Aktuální čas, v HH: MM: SS (24 hodin). @U Počet aktuálně přihlášených uživatelů. Toto je počítání počtu položek v souboru / etc / utmp, které obsahují pole s nenulovým názvem ut_name. @V Hodnota VERSION, jak je uvedena v souboru výchozích hodnot. Chcete-li zobrazit jediný znak '@', použijte buď '\ @' nebo '@@'.

Jakmile dokončíte úpravu / etc / gettydefs , můžete ověřit správnou syntaxi:

linux # getty -c / etc / gettydefs

Ujistěte se, že pro sériový port, ke kterému je váš terminál připojen, neexistuje žádný jiný konfigurační soubor getty nebo uugetty (např. /etc/default/{uu}getty.ttySN nebo /etc/conf.{uu}getty.ttyS N ) , protože to pravděpodobně narušuje běh getty na terminálu. Odstraňte taková konfliktní soubory, pokud skončí.

Upravte soubor / etc / inittab a spusťte getty na sériovém portu (nahrazuje správné informace o vašem prostředí - port, rychlost a výchozí typ terminálu):

S1: 23: respawn: / sbírka / getty ttyS1 DT9600 vt100 init linux # init q

V tomto okamžiku byste měli vidět na terminálu přihlašovací příkaz. Možná budete muset zasáhnout zpět, abyste získali pozornost terminálu.

mgetty

"M" znamená modem. Tento program je určen především pro modemy a od poloviny roku 2000 bude vyžadovat kompilování pro jeho použití pro textové terminály (pokud nepoužíváte řízení toku hardware - a to obvykle vyžaduje ruční kabel). Pro dokumentaci pro přímo připojené terminály viz část "Přímá" příručky: mgetty.texi.

Podívejte se na poslední řádky /etc/mgetty/mgetty.config a uvidíte příklad konfigurace pro terminál. Pokud neříkáte "toggle-dtr no", bude si myslet, že máte modem a odhodit (zrušit) pin DTR na PC v marném pokusu o resetování neexistujícího modemu. Na rozdíl od ostatních getty, mgetty se nepřipojí k terminálu, dokud někdo nenapadne nějaký klíč tohoto terminálu, takže uvidíš? pro terminál v horní části nebo ps, dokud se to nestane. Záznamy v adresáři / var / log / mgetty / mohou zobrazovat několik varovných zpráv, které jsou použitelné pouze pro modemy, které můžete ignorovat.

Zde je příklad jednoduché linky, kterou jste vložili do souboru / etc / inittab:

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