Textové terminály v systéme Linux

14.1 Getty (používa sa v / etc / inittab)

Úvod do Getty

Aby sa proces spúšťania spustil na sériovom portu (a pripojený terminál), keď sa počítač spustí (alebo prepne úrovne spustenia), príkaz getty musí byť vložený do súboru / etc / inittab. Spúšťanie getty z príkazového riadku môže spôsobiť problémy (pozri Ak sa getty spustí z príkazového riadku: Programy sa zastavia, aby zistili, prečo). Getty získal TTY (terminál). Každý terminál potrebuje vlastný príkaz getty. K dispozícii je tiež aspoň jeden príkaz getty pre konzolu v každom súbore / etc / inittab. Nájdite to a zadajte príkazy getty pre skutočné terminály vedľa neho. Tento súbor môže obsahovať vzorové riadky getty pre textové terminály, ktoré sú komentované, takže všetko, čo musíte urobiť, je odkomentovať ich (odstrániť vedúce #) a zmeniť niekoľko argumentov.

Argumenty, ktoré sú povolené, závisia od toho, ktorý getty používate:
Dve gettys najlepšie pre priamo pripojené terminály sú:

Dve gettys najlepšie pre dial-in modemy (vyhnúť sa priamo pripojené terminály) sú:

Jednoduché gettys na použitie, ak nepoužívate skutočný textový terminál. Väčšina používateľov systému Linux používa jeden z týchto programov na svojom monitore:

Vaša distribúcia Linuxu môže obsahovať buď ps_getty alebo agetty pre textové terminály. Niektoré distribúcie neposkytujú ani jednu. Bohužiaľ, často to nazývajú "getty", takže možno budete musieť určiť, ktorý z nich máte, pretože argumenty, ktoré ste zadali v / etc / inittab, sa líšia. Debian používa agetty (v balíku util-linux). RedHat a Fedora používajú ps_getty, ktorý je na adrese: ps_getty

Ako posledná možnosť sa pokúsite zistiť, ktorý getty máte, môžete si skontrolovať jeho spustiteľný kód (zvyčajne v / sbin). ps_getty má / etc / gettydefs vložené do tohto kódu. Ak chcete vyhľadávať, prejdite na / sbin a zadajte:
reťazce getty grep getty
Ak je getty skutočne agetty vyššie uvedené povedie k ničomu. Ak však zadávate agetty:
getty -h
by mali zobraziť možnosti [-hLmw].

Ak nemáte getty, ktoré chcete, skontrolujte ostatné distribúcie a cudzí program na konverziu medzi balíčkami RPM a Debian. Zdrojový kód je možné stiahnuť zo softvéru Getty.

Ak nepoužívate riadky riadenia modemu (napríklad ak používate iba minimálny počet 3 vodičov: vysielanie, príjem a bežnú signalizačnú zem), mali by ste sa o tom dozvedieť pomocou "miestneho" príznaku. Formát toho závisí od toho, ktorý getty používate.

Getty sa po prihlásení (a môže respawn)

Po prihlásení si všimnete (pomocou "top", "ps -ax" alebo "ptree"), že proces getty už nie je spustený. Čo sa s tým stalo? Prečo sa znova reštartuje, ak je váš shell zabitý? Tu je dôvod.

Po zadaní svojho užívateľského mena sa dostane getty a zavolá prihlasovací program s oznámením vášho užívateľského mena. Getty proces je nahradený prihlasovací proces. Prihlasovací proces vyžaduje zadanie hesla, kontroluje ho a spustí akýkoľvek proces určený v súbore vášho hesla. Tento proces je často bash shell. Ak áno, bash spustí a nahradí proces prihlasovania. Všimnite si, že jeden proces nahrádza iný proces a že proces bash shell začal pôvodne ako proces getty. Dôsledky tohto riešenia budú vysvetlené nižšie.

Teraz v súbore / etc / inittab, getty má byť respawn (reštart), ak je zabitý. Hovorí to tak na linku, ktorá volá getty. Ale ak je bash shell (alebo prihlasovací proces) zabitý, getty respawns (reštartuje). Prečo? No, prihlasovací proces aj bash sú náhrady za getty a dedenie

* Textový terminál How-To Index

signálové spojenia vytvoria ich predchodcovia. V skutočnosti, ak pozorujete podrobnosti, všimnete si, že proces výmeny bude mať rovnaké ID procesu ako pôvodný proces. Takže bash je trochu getty v prestrojení s rovnakým identifikačným číslom procesu. Ak je bash zabitý, je to ako Getty bol zabitý (aj keď Getty už nebeží). To má za následok revolúciu.

Keď sa odhlási, všetky procesy na tomto sériovom porte sú zabité, vrátane bash shell. To sa môže tiež vyskytnúť (ak je povolené), ak je vysielač zavesený na sériový port kvapkou DCD napätia modemom. Buď odhlásenie alebo pokles v DCD bude mať za následok revolúciu. Jeden môže donútiť getty k respawn manuálne zabíjanie bash (alebo prihlásenie) buď stlačením klávesu k atď, zatiaľ čo v "hornej", alebo s "zabiť" príkaz. Pravdepodobne budete musieť zabiť so signálom 9 (ktorý nemožno ignorovať).

Ak sa getty spustí z príkazového riadku: Programy sa zastavia

Normálne by ste mali spustiť getty z priečinka / etc / inittab a nie z príkazového riadka, inak niektoré programy spustené na termináli môžu byť neočakávane pozastavené (zastavené). Tu je dôvod, prečo (prečo nie je pre vás dôležité) (preskočte na ďalšiu časť). Ak začnete getty pre say ttyS1 z príkazového riadku iného terminálu, povedzme tty1, potom bude mať tty1 ako "riadiaci terminál", hoci skutočný terminál, na ktorom beží, je ttyS1. Má teda nesprávny riadiaci terminál. Ak je však spustený vo vnútri súboru inittab, bude mať ttyS1 ako riadiaci terminál (správny).

Napriek tomu, že riadiaci terminál je nesprávny, prihlásenie na ttyS1 funguje správne (pretože ste dali ttyS1 ako argument pre getty). Štandardný vstup a výstup sú nastavené na ttyS1 aj keď riadiaca svorka zostáva tty11. Ostatné programy spustené na ttyS1 môžu zdediť tento štandardný vstup / výstup (ktorý je pripojený k ttyS1) a všetko je v poriadku. Ale niektoré programy môžu urobiť chybu pri pokuse o čítanie z ich riadiaceho terminálu (tty1), čo je nesprávne. Teraz tty1 môže myslieť, že tieto programy bežia na pozadí tty1, takže pokus čítať z tty1 (mal by to byť ttyS1) vedie k zastaveniu procesu, ktorý sa pokúšal čítať. (Správanie na pozadí nie je dovolené čítať z riadiaceho terminálu.). Môže sa zobraziť hlásenie, napríklad: " [1] + Zastavil " na obrazovke. V tomto momente ste uviazli, pretože nemôžete komunikovať s procesom, ktorý sa snaží komunikovať s vami cez nesprávny terminál. Samozrejme, že sa vám podarí uniknúť, môžete ísť na iný terminál a zabiť proces, atď.

agetty (môže sa nazvať getty)

Príkladový riadok v / etc / inittab:

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

S1 je z ttyS1. 23 znamená, že getty je spustený pri vstupe do úrovne run 2 alebo 3. respawn znamená, že ak getty (alebo proces, ktorý ho nahradil ako bash) je zabitý, getty sa automaticky spustí (respawn) znova. / sbin / getty je príkaz getty. -L znamená lokálne (ignorujte modemové riadiace signály). -h (nezobrazuje sa v príklade) umožňuje riadenie toku hardvéru (rovnako ako stty crtscts). 19200 je prenosová rýchlosť. ttyS1 znamená / dev / ttyS1 (COM2 v MS-DOS). vt102 je typ terminálu a tento getty nastaví premennú prostredia TERM na túto hodnotu. Neexistujú žiadne konfiguračné súbory. Zadajte príkaz "init q" na príkazovom riadku po úprave getty a uvidíte výzvu na prihlásenie.

Agettyho auto-detekcia paritných problémov

Agetty program sa pokúsi o automatické zistenie parity v termináli (bez parity). Nepodporuje 8-bitové dátové bajty a 1-bitovú paritu. Pozrite si 8bitové dátové bajty (plus parita). Ak použijete stty na nastavenie parity, aget sa automaticky zruší , pretože pôvodne chce paritný bit prísť cez akoby bol dátový bit. Je to preto, lebo potrebujete získať posledný bit (pravdepodobne bit parity) pri zadávaní prihlasovacieho mena, aby mohol automaticky detekovať paritu. Ak teda používate paritu, povoľte ju iba v rámci textového terminálu a nechajte agetty automaticky ho rozpoznať a nastavte na počítači. Ak váš terminál podporuje prijatú paritu, prihlasovací riadok bude vyzerať skreslený, kým nezadáte niečo tak, aby to mohol detegovať

parity. Zmazaná výzva odradí návštevníkov atď. Od pokusu o prihlásenie. To by mohlo byť práve to, čo chcete.

Tam je niekedy problém s automatickou detekciou parity. Stáva sa to preto, že po prvom zadaní prihlasovacieho mena sa agetty spustí prihlasovací program, aby ste dokončili prihlásenie. Bohužiaľ prihlasovací program nedokáže rozpoznať paritu, takže ak program getty nedokáže určiť paritu, potom prihlásenie nebude schopné určiť to buď. Ak sa prvý pokus o prihlásenie zlyhá, prihlásenie vás nechá skúsiť znova, atď. (Všetko s nesprávnym nastavením parity). Nakoniec po niekoľkých neúspešných pokusoch o prihlásenie (alebo po uplynutí časového limitu) sa agetty opäť spustia a znova spustia prihlasovacie sekvencie. Akonáhle je Getty opäť spustený, môže byť schopný zistiť paritu na druhej skúške, takže všetko potom môže fungovať OK.

Pri nesprávnej parite nemôže prihlasovací program správne čítať, čo zadávate a nemôžete sa prihlásiť. Ak váš terminál podporuje prijatú paritu, budete naďalej vidieť skomolenú obrazovku. Ak getty nerozpozná paritu, súbor typu / etc / issue sa zvyčajne vyhodí na obrazovku tesne pred príkazom pred príkazom, takže na obrazovke sa môžu objaviť ďalšie skreslené slová.

Prečo nemôže agetty zistiť paritu prvým napísaným písmenom? Tu je príklad: Predpokladajme, že detekuje 8-bitový bajt s paritným bitom 0 (bit s vysokým poradím) as nepárnym počtom 1-bitov. Aká je parita? No, nepárne číslo 1 bitov znamená, že je to nepárna parita. Ale môže to byť aj 8-bitový znak bez parity. Teraz neexistuje žiadny spôsob, ako určiť, ktoré. Ale zatiaľ sme eliminovali možnosť paritnej rovnováhy. Detekcia parity teda prebieha procesom eliminácie.

Ak je zadaný ďalší bajt podobný prvému a zároveň vylučuje možnosť rovnomernej parity, je stále nemožné určiť paritu. Táto situácia môže trvať neobmedzene a v zriedkavých prípadoch sa prihlásenie zlyhá dovtedy, kým nezmeníte prihlasovacie meno. Ak agetty nájde paritný bit 1, predpokladá sa, že ide o paritný bit a nie bit s vysokým poradím 8-bitového znaku. Predpokladá sa teda, že v používateľskom mene nepoužívate meta-znaky (vysoký počet bitov) (tj, že vaše meno je v ASCII).

Jeden sa môže dostať do "prihlasovacej slučky" rôznymi spôsobmi. Predpokladajme, že pre svoje prihlasovacie meno zadáte iba jedno alebo dve písmená a potom stlačíte návrat. Ak tieto písmená nie sú dostatočné na detekciu parity, prihlásenie sa spustí predtým, ako je zistená parita. Niekedy sa vyskytuje tento problém, ak nemáte terminál zapnutý a / alebo pripojený pri prvom spustení agetty.

Ak sa v tejto "prihlasovacej slučke" uviažete, cesta z nej je niekoľkokrát stlačiť spätný kľúč, kým nedostanete výzvu na prihlásenie getty. Ďalšou cestou je len čakať minútu alebo tak nejaký časový limit. Následne sa príkaz Getty prihlási na obrazovku programom getty a môžete sa pokúsiť znova prihlásiť.

8 bitové dátové bajty (plus parita)

Bohužiaľ agetnosť túto paritu nedokáže rozpoznať. Od konca roka 1999 nemá možnosť deaktivovať automatickú detekciu parity a tak zistí nesprávnu paritu. Výsledkom je, že prihlasovací proces bude skomolený a parita bude chybná. Preto sa nezdá byť možné pokúsiť sa používať 8-bitové dátové bajty s paritou.

getty (časť getty_ps)

(Väčšina z toho je zo starého Serial-HOWTO od Grega Hankinsa)
Pre tento getty treba vložiť položky do konfiguračného súboru a pridať položku do / etc / inittab . Tu sú niektoré príklady, ktoré sa majú použiť pre váš terminál, ktorý ste vložili do konfiguračného súboru / etc / gettydefs .

# 38400 bps Vstup duny Terminál DT38400 # B38400 CS8 CLOCAL # B38400 SANE -ISTRIP CLOCAL # @ S @L prihlásenie: # DT38400 # 19200 bps Vstup dunové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 @ login: # DT9600

Upozorňujeme, že DT38400, DT19200 atď. Sú len štítky a musia byť rovnaké ako tie, ktoré používate v / etc / inittab .

Ak chcete, môžete do prihlasovacieho banneru urobiť zaujímavé zaujímavosti. V mojich príkladoch mám názov systému a sériovú linku vytlačenú. Môžete pridať ďalšie veci: [blockquote

odtieň = áno] @B Aktuálny (hodnotený v čase, keď je zobrazené @B) rýchlosť bps. @ D Aktuálny dátum v MM / DD / YY. @ L Sériová linka, ku ktorej je pripojený getty. @S Názov systému. @T Aktuálny čas, v HH: MM: SS (24 hodín). @U Počet momentálne prihlásených používateľov. Toto je počet počtu položiek v súbore / etc / utmp, ktoré majú pole bez null ut_name. @V Hodnota VERSION, ako je uvedená v predvolenom súbore. Ak chcete zobraziť jeden znak '@', použite buď '\ @' alebo '@@'.

Keď dokončíte úpravu / etc / gettydefs , môžete skontrolovať správnosť syntaxe:

linux # getty -c / etc / gettydefs

Uistite sa, že pre sériový port, ku ktorému je váš terminál pripojený, neexistuje žiadny iný súbor getty alebo uugetty (napríklad /etc/default/{uu}getty.ttyS N alebo /etc/conf.{uu}getty.ttyS N ) , pretože to pravdepodobne naruší bežiacu prevádzku getty na termináli. Odstráňte takéto konfliktné súbory, ak skončia.

Upravte súbor / etc / inittab, aby ste mohli bežať na sériovom portu getty (nahrádza správne informácie o vašom prostredí - port, rýchlosť a predvolený typ terminálu):

S1: 23: odpoveď: / sbin / getty ttyS1 DT9600 vt100 init linux # init q

V tomto okamihu by ste mali vidieť prihlasovací riadok na vašom termináli. Možno budete musieť vrátiť späť, aby ste získali pozornosť terminálu.

mgetty

"M" znamená modem. Tento program je určený predovšetkým pre modemy a od polovice roka 2000 bude vyžadovať kompiláciu pre jeho použitie pre textové terminály (pokiaľ nepoužívate hardvérové ​​riadenie toku - a to zvyčajne vyžaduje ručný kábel). Pre dokumentáciu pre priamo pripojené terminály si pozrite časť "Priama" v príručke: mgetty.texi.

Pozrite sa na posledné riadky príkazu /etc/mgetty/mgetty.config pre príklad jeho konfigurácie pre terminál. Pokiaľ nepoviete "toggle-dtr no", bude si myslieť, že máte modem a zrušíte (zrušíte) pin DTR na počítači v márnom pokuse obnoviť neexistujúci modem. Na rozdiel od iných gettys, mgetty sa nebude pripájať k terminálu, kým niekto nezapadne na ľubovoľný kľúč tohto terminálu, takže uvidíte? pre terminál v hornej časti alebo ps, kým sa to nestane. Záznamy v / var / log / mgetty / môžu zobrazovať niekoľko varovných správ, ktoré sa vzťahujú iba na modemy, ktoré môžete ignorovať.

Tu je príklad jednoduchého riadku, ktorý ste vložili do súboru / etc / inittab:

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