Terminale text pe Linux

14.1 Getty (folosit în / etc / inittab)

Introducere în Getty

Pentru ca un proces de conectare să funcționeze pe un port serial (și terminalul conectat la acesta) atunci când computerul pornește (sau comută niveluri de execuție), trebuie introdusă o comandă getty în fișierul / etc / inittab. Rularea getty din linia de comandă poate provoca probleme (vedeți dacă getty rulează din linia de comandă: programele se opresc pentru a vedea de ce). Getty primește un TTY (terminal). Fiecare terminal are nevoie de propria comandă getty. Există, de asemenea, cel puțin o comandă getty pentru consola în fiecare fișier / etc / inittab. Găsiți acest lucru și puneți comenzile getty pentru terminalele reale de lângă acesta. Acest fișier poate conține eșantioane de linii getty pentru terminalele de text care sunt comentate, astfel încât tot ce trebuie să faceți este să le dezcomentați (eliminați numărul de conducere #) și să schimbați câteva argumente.

Argumentele care sunt permise depind de ce getty folosiți:
Două gettys cele mai bune pentru terminalele conectate direct sunt:

Cele două cele mai bune gettys pentru modemurile dial-in (evitați pentru terminalele conectate direct) sunt:

Simple gettys de utilizat dacă nu utilizați un terminal text real. Majoritatea utilizatorilor Linux folosesc unul dintre acestea la monitorul lor:

Distribuția dvs. Linux poate să apară fie cu ps_getty, fie agetty pentru terminalele de text. Unele distribuții nu furnizează niciunul. Din păcate, ele adesea o numesc "getty", astfel încât ar putea fi necesar să determinați ce dintre ele aveți, deoarece argumentele pe care le puneți în / etc / inittab diferă. Debian folosește agetty (în pachetul util-linux). RedHat și Fedora au folosit ps_getty care este la: ps_getty

Ca o ultimă soluție, încercați să determinați ce getty aveți, ați putea verifica codul executabil (de obicei în / sbin). ps_getty are / etc / gettydefs încorporat în acest cod. Pentru ao căuta, accesați / sbin și tastați:
siruri de caractere grep getty
În cazul în care getty este de fapt agetty de mai sus va duce la nimic. Cu toate acestea, dacă aveți tastatură agetty:
getty -h
ar trebui să afișeze opțiunile [-hiLmw].

Dacă nu aveți getty pe care doriți să verificați alte distribuții și programul extraterestru pentru a converti între pachetele RPM și Debian. Codul sursă poate fi descărcat de la software-ul Getty.

Dacă nu utilizați linii de control modem (de exemplu, dacă utilizați doar numărul minim de 3 conductori: transmiteți, primiți și semnalele comune de semnal), ar trebui să lăsați-o pe getty să știe acest lucru folosind un steag "local". Formatul acestui lucru depinde de ce getty utilizați.

Getty iese după conectare (și poate respawn)

După ce vă conectați, veți observa (prin utilizarea "top", "ps -ax" sau "ptree") că procesul getty nu mai rulează. Ce s-a intamplat cu el? De ce reluarea getty se repeta dacă shell-ul tău este ucis? Iata de ce.

După ce introduceți numele de utilizator, getty îl primește și solicită programul de conectare să-i spună numele de utilizator. Procesul getty este înlocuit de procesul de conectare. Procesul de autentificare solicită parola, verifică-l și pornește orice proces este specificat în fișierul de parolă. Acest proces este de multe ori shell-ul bash. Dacă da, bash începe și înlocuiește procesul de autentificare. Rețineți că un proces înlocuiește altul și că procesul shell-ului bash a început inițial ca proces getty. Implicațiile acestui lucru vor fi explicate mai jos.

Acum, în fișierul / etc / inittab, getty se presupune că respawn (restart) dacă este ucis. Se spune așa pe linia care cheamă getty. Dar dacă shell-ul bash (sau procesul de conectare) este ucis, getty respawns (repornește). De ce? Ei bine, atât procesul de conectare, cât și bash-ul sunt înlocuiri pentru getty și moștenire

* Text-Terminal Cum-To Index

conexiunile de semnal stabilită de predecesorii lor. De fapt, dacă observați detaliile, veți observa că procesul de înlocuire va avea același ID de proces ca și procesul inițial. Astfel, bash este un fel de getty în deghizare cu același ID de proces. Daca bash-ul este ucis, este la fel ca ghetoul a fost ucis (chiar daca getty nu mai functioneaza). Acest lucru are drept rezultat respirația getty.

Când se deconectează, toate procesele de pe portul serial sunt ucise, inclusiv shell-ul bash. Acest lucru se poate întâmpla (dacă este activat) dacă un semnal suspendat este trimis la portul serial printr-o picătură de tensiune DCD de către modem. Ori deconectarea sau scăderea în DCD va avea ca rezultat reacția getty respawning. Se poate forta getty să respawn prin uciderea manuală bash (sau login), fie prin lovirea tasta k, etc în timp ce în "sus" sau cu "kill" comanda. Probabil că va trebui să o omori cu semnalul 9 (care nu poate fi ignorat).

Dacă rulează getty din linia de comandă: Programele se opresc

Ar trebui să rulați în mod normal getty din interiorul / etc / inittab și nu din linia de comandă sau altfel unele programe care rulează pe terminal pot fi suspendate în mod neașteptat (oprit). Iată de ce (treceți la următoarea secțiune dacă motivul nu este important pentru dvs.). Dacă începeți getty pentru say ttyS1 din linia de comandă a unui alt terminal, spuneți tty1, atunci va avea tty1 ca "terminal de control", chiar dacă terminalul real pe care rulează este ttyS1. Astfel are un terminal greșit de control. Dar dacă a început în interiorul fișierului inittab, acesta va avea ttyS1 ca terminal de control (corect).

Chiar dacă terminalul de control este greșit, login-ul la ttyS1 funcționează bine (din moment ce ai dat ttyS1 ca argument pentru getty). Intrarea și ieșirea standard sunt setate la ttyS1 chiar dacă terminalul de control rămâne tty11. Alte programe care rulează la ttyS1 pot moșteni această intrare / ieșire standard (care este conectată la ttyS1) și totul este OK. Dar unele programe pot face greșeala de a încerca să citească de la terminalul de control (tty1), care este greșit. Acum, tty1 poate crede că aceste programe se execută în fundal de către tty1, astfel încât o încercare de a citi de la tty1 (ar fi trebuit să fie ttyS1) duce la oprirea procesului care a încercat să citească. (Un proces de fundal nu este permis să citească de la terminalul său de control.). Este posibil să vedeți un mesaj ca: " [1] + Oprit " de pe ecran. În acest moment, sunteți blocat, deoarece nu puteți interacționa cu un proces care încearcă să comunice cu dvs. prin terminalul greșit. Desigur, pentru a scăpa de acest lucru, puteți merge la alt terminal și puteți ucide procesul etc.

agetty (poate fi numit getty)

O linie de exemplu în / etc / inittab:

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

S1 este de la ttyS1. 23 înseamnă că getty se execută la intrarea în nivele de rulare 2 sau 3. respawn înseamnă că dacă getty (sau un proces care la înlocuit ca bash) este ucis, getty va porni automat (respawn) din nou. / sbin / getty este comanda getty. -L înseamnă Local (ignorarea modemului de control). -h (nu este prezentat în exemplu) permite controlul debitului hardware (același lucru cu stty crtscts). 19200 este rata baud. ttyS1 înseamnă / dev / ttyS1 (COM2 în MS-DOS). vt102 este tipul de terminal și acest getty va seta variabila de mediu TERM la această valoare. Nu există fișiere de configurare. Introduceți "init q" pe linia de comandă după editarea getty și ar trebui să vedeți un prompt de conectare.

Detectarea automată de către Agetty a problemelor de paritate

Programul agetty va încerca să detecteze automat setul de paritate din interiorul terminalului (inclusiv nici o paritate). Nu suportă octeți de date pe 8 biți și paritate pe 1 biți. Vedeți octeți de date pe 8 biți (plus paritate). Dacă utilizați stty pentru a seta paritatea, agetty va dezactiva automat, deoarece inițial dorește ca bitul de paritate să vină ca și cum ar fi fost un bit de date. Acest lucru se datorează faptului că trebuie să obțineți ultimul bit (posibil un bit de paritate) pe măsură ce tastați numele de conectare, astfel încât acesta să poată detecta automat paritatea. Astfel, dacă utilizați paritatea, activați-o numai în interiorul terminalului de tip text și lăsați agetty să-l detecteze automat și să-l setați la calculator. Dacă terminalul dvs. acceptă paritatea primită, promptul de autentificare va arăta eronat până când tastați ceva, astfel încât getty să poată detecta

paritate. Prognoza deformată va împiedica vizitatorii, etc. să încerce să se autentifice. Asta ar putea fi exact ceea ce vrei.

Există uneori o problemă cu detectarea automată a parității. Acest lucru se întâmplă deoarece, după ce introduceți mai întâi numele de conectare, agetty pornește programul de conectare pentru a vă încheia înregistrarea. Din păcate, programul de autentificare nu poate detecta paritatea, astfel încât dacă programul getty nu a reușit să determine paritatea, atunci login-ul nu va fi capabil să determine fie ea. Dacă prima încercare de conectare nu reușește, conectarea vă va permite să încercați din nou, etc. (toate cu setarea parității greșite). În cele din urmă, după o serie de încercări eșuate de conectare (sau după o perioadă de expirare), agetty va porni din nou și va porni din nou secvențele de autentificare. Odată ce getty rulează din nou, poate fi capabil să detecteze paritatea pe a doua încercare, astfel încât totul poate funcționa OK.

Cu o paritate greșită, programul de autentificare nu poate citi corect ce introduceți și nu vă puteți conecta. Dacă terminalul acceptă paritatea primită, veți continua să vedeți un ecran deformat. Dacă getty nu reușește să detecteze paritatea, un fișier / etc / issue este, de obicei, aruncat pe ecran chiar înainte de prompt, astfel încât pe ecran pot apărea mai multe cuvinte greșite.

De ce nu poate detecta agetty paritatea prin introducerea primei litere? Iată un exemplu: Să presupunem că detectează un octet de 8 biți cu bitul său de paritate 0 (biți de înaltă ordine) și cu un număr impar de 1 biți. Care este paritatea? Ei bine, imparatul număr de 1 biți implică faptul că este o paritate ciudată. Dar ar putea fi doar un caracter de 8 biți fără paritate. Nu există nici un fel de până acum pentru a determina care. Dar până acum am eliminat posibilitatea parității. Detecția parității se realizează printr-un proces de eliminare.

Dacă următoarea byte tastată este similară cu cea din primul octet și, de asemenea, elimină doar posibilitatea de paritate parțială, este încă imposibil să se determine paritatea. Această situație poate continua pe termen nelimitat și, în cazuri rare, conectarea va eșua până când nu vă schimbați numele de conectare. Dacă agetty găsește un bit de paritate de 1, va presupune că acesta este un bit de paritate și nu un bit de ordin înalt al unui caracter de 8 biți. Se presupune că nu utilizați meta-caractere (setul de biți înalt) în numele dvs. de utilizator (adică numele dvs. este în ASCII).

Se poate ajunge într-o "buclă de conectare" în diverse moduri. Să presupunem că introduceți doar o singură literă sau două pentru numele dvs. de conectare și apoi apăsați retur. Dacă aceste litere nu sunt suficiente pentru detectarea parității, atunci conectarea rulează înainte ca paritatea să fi fost detectată. Uneori, această problemă se întâmplă dacă nu aveți terminalul activat și / sau conectat când pornește pentru prima oară.

Dacă rămâneți blocat în această "buclă de conectare", o cale de ieșire din ea este să apăsați tasta de revenire de mai multe ori până când primiți promptul de autentificare getty. O altă modalitate este să așteptați doar un minut pentru un timp de expirare. Apoi, promptul de conectare getty va fi pus pe ecran de programul getty și puteți încerca din nou să vă conectați.

8 octeți octeți de date (plus paritate)

Din păcate, agetty nu poate detecta această paritate. Începând cu sfârșitul anului 1999, nu are opțiunea de a dezactiva detectarea automată a parității și, astfel, va detecta o paritate incorectă. Rezultatul este că procesul de conectare va fi eronat și paritatea va fi setată greșit. Astfel, nu pare fezabil să încerci să folosești octeți de date pe 8 biți cu paritate.

getty (parte din getty_ps)

(Cele mai multe dintre acestea sunt de la vechiul serial-HOWTO de Greg Hankins)
Pentru acest getty trebuie să introduceți intrări într-un fișier de configurare și să adăugați o intrare în / etc / inittab . Iată câteva exemple de intrări de utilizat pentru terminalul pe care le-ați pus în fișierul de configurare / etc / gettydefs .

# 38400 bps Intrare dud terminal DT38400 # B38400 CS8 CLOCAL # B38400 SANE -ISTRIP CLOCAL # @ S @ login: # DT38400 # 19200 bps Dump entry terminal DT19200 # B19200 CS8 CLOCAL # B19200 SANE -ISTRIP CLOCAL # @ S @ login: # DT19200 # 9600 bps Înregistrare dud terminal DT9600 # B9600 CS8 CLOCAL # B9600 SANE -ISTRIP CLOCAL # @ S @ login: # DT9600

Rețineți că DT38400, DT19200, etc. sunt doar etichete și trebuie să fie aceleași pe care le utilizați în / etc / inittab .

Dacă dorești, poți face lucruri interesante de tip getty în banner-ul de conectare. În exemplele mele, am imprimat numele sistemului și linia serială. Puteți adăuga alte lucruri: [blockquote

umbra = yes] @B Curentul (evaluat la momentul în care se vede @B) rata bps. @ D Data curentă, în MM / DD / YY. @ L Linia serial la care getty este atașat. @S Numele sistemului. @T Timpul curent, în HH: MM: SS (24 de ore). @U Numărul de utilizatori conectați în prezent. Acesta este un număr al numărului de intrări din fișierul / etc / utmp care au un câmp non-null ut_name. @V Valoarea VERSION, așa cum este prezentată în fișierul implicit. Pentru a afișa un singur caracter "@", utilizați fie '\ @', fie '@@'.

Când ați terminat de editat / etc / gettydefs , puteți verifica dacă sintaxa este corectă, făcând:

linux # getty -c / etc / gettydefs

Asigurați-vă că nu există niciun alt fișier de configurări getty sau uugetty pentru portul serial pe care terminalul dvs. este atașat, cum ar fi ( /etc/default/{uu}getty.ttySN sau /etc/conf.{uu}getty.ttyS N ) , deoarece acest lucru probabil va interfera cu rularea getty pe un terminal. Eliminați aceste fișiere în conflict dacă părăsesc acestea.

Editați fișierul / etc / inittab pentru a rula getty pe portul serial (înlocuind informațiile corecte pentru mediul dvs. - port, viteză și tip terminal implicit):

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

În acest moment, ar trebui să vedeți un prompt de conectare pe terminalul dvs. S-ar putea să fiți nevoiți să reveniți pentru a obține atenția terminalului.

mgetty

"M" înseamnă modem. Acest program este destinat în primul rând modemurilor, iar la jumătatea anului 2000 va necesita o recompilare pentru utilizarea acestuia pentru terminalele de tip text (cu excepția cazului în care utilizați controlul fluxului hardware - și de obicei necesită un cablu manual). Pentru documentația pentru terminalele conectate direct, consultați secțiunea "Direct" a manualului: mgetty.texi.

Uită-te la ultimele linii de /etc/mgetty/mgetty.config pentru un exemplu de configurare pentru un terminal. Cu excepția cazului în care spui "toggle-dtr no", va crede că ai un modem și lăsați (negați) pinul DTR de la PC într-o încercare zadarnică de resetare a modemului inexistent. Spre deosebire de alte gettys, mgetty nu se va atașa la un terminal până când cineva nu lovește nici o cheie a acelui terminal, așa că o să vezi? pentru terminalul din partea superioară sau ps până când se întâmplă acest lucru. Jurnalele din / var / log / mgetty / pot afișa câteva mesaje de avertizare care se aplică numai modemurilor pe care le puteți ignora.

Iată un exemplu al liniei simple pe care ați pus-o în / etc / inittab:

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