Înțelegeți / etc / inittab
On februarie 12, 2021 by admin Folosesc următorul fișier /etc/inittab
(systemv):
# /etc/inittab: init(8) configuration. # $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $ # The default runlevel. id:5:initdefault: # Boot-time system configuration/initialization script. # This is run first except when booting in emergency (-b) mode. si::sysinit:/etc/init.d/rcS # What to do in single-user mode. ~~:S:wait:/sbin/sulogin # /etc/init.d executes the S and K scripts upon change # of runlevel. # # Runlevel 0 is halt. # Runlevel 1 is single-user. # Runlevels 2-5 are multi-user. # Runlevel 6 is reboot. l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 # Normally not reached, but fallthrough in case of emergency. z6:6:respawn:/sbin/sulogin S0:12345:respawn:/sbin/getty -L 115200 ttyS0
Pentru a înțelege cum funcționează lucrurile într-adevăr, voi aprecia dacă răspunsurile tale la 1-3 vei distinge între două situații:
- M-am conectat la sistemul meu folosind un port serial.
- Am un computer desktop „obișnuit”.
Întrebări:
-
Dacă voi adăuga o altă linie getty, odată ce Linux va porni, voi vedea două terminale separate?
-
Dacă deschid mai multe linii getty, cum am atribuit careia getty va rula comanda mea
si::sysinit:/etc/init.d/rcS
și care getty va rula celelalte comenzi ale scriptului? (cei care rulează scripturi în funcție de nivelul de rulare al sistemului)în alte cuvinte: în fișierul
/etc/inittab
– pot atribui comenzi diferite unor gettys diferite? (mă refer la terminalele care se vor deschide cu aceste gettys) -
ultimul script din folderul /etc/init.d/rc5 rulat următoarea comandă:
su nobody -c /bin/sh
și ieșirea este:
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell sh-4.3$ whoami nobody
Așa că am verificat că nu sunt nimeni, dar de ce scrie primele două rânduri? de asemenea, de ce promptul este sh-4.3 $ și nu nimeni @ …
-
Folosesc conexiunea serială. Pot schimba fișierul / etc / inittab și ultimul script care va rula prin init pentru a:
- rula un program înainte de conectare ca utilizator cu privilegii reduse (procesul de inițiere va aștepta terminarea)
- odată ce programul iese, obține regulat prompt de conectare la sistemul meu
- care este cel mai bun mod de a crea un utilizator cu privilegii reduse și lăsați-l să ruleze acest program în timpul procesului de inițiere (dacă nu vreau să folosesc utilizatorul nimănui)
Răspuns
Întrebarea 1:
Da, adăugând mai multe getty
liniile puteți obține mai multe terminale în paralel. Doar un getty
poate fi asociat cu un dispozitiv terminal la un moment dat, deci este posibil doar un singur getty
pentru fiecare port serial. Pe un computer desktop obișnuit, nucleul Linux definește o serie de console virtuale, accesibile folosind combinațiile de taste Control + Alt + FX și corespunzătoare /dev/ttyX
dispozitive (X = un număr). Configurarea exactă poate varia între distribuții, dar, de obicei, pe distribuțiile principale, primele 6 dispozitive /dev/ttyX
au getty
s configurate pentru ele sistemul funcționează normal. Puteți utiliza comenzile openvt
și deallocvt
pentru a adăuga sau a elimina console virtuale și a începe procese (care pot fi orice procese, nu neapărat getty
s) pe ele.
/dev/tty0
este special: se referă la oricare dintre consolele virtuale selectate în prezent. /dev/console
este un dispozitiv special similar, care indică orice dispozitiv TTY este definit ca consola de sistem primară la nivel de nucleu. Pe sistemele desktop, este efectiv un alias la /dev/tty0
în mod implicit, dar utilizând opțiunea de pornire console=
, puteți trece la un serial port. Pe de ex. unele arhitecturi încorporate ar putea fi implicit un port serial. Utilitățile precum xconsole
pot acționa și ca o ieșire suplimentară pentru /dev/console
.
Pe vremea când computerele erau lucruri mari cu mai multe cabinete în sălile de calculatoare dedicate, trimiterea unui mesaj către /dev/console
ar fi fost o modalitate de a ajunge la operatorul de serviciu de serviciu fizic în apropierea computerului, ceea ce ar fi putut fi util pentru solicitări de ex schimbați casetele sau pachetele de discuri. Pe sistemele moderne, mesajele trimise în mod special către /dev/console
sunt de obicei mesaje de pornire / oprire sau, eventual, un canal de ultimă instanță pentru alarme urgente cu privire la condițiile de eșec care ar putea afecta accesul la rețea sau la stocare, sau chiar implică o blocare a nucleului: „o persoană responsabilă de hardware-ul fizic trebuie să vadă acest lucru, iar fișierele jurnal obișnuite sunt inutilizabile din anumite motive.”
Întrebarea 2:
„Mă tem că aveți o concepție greșită aici. Linia sysinit
și alte linii /etc/inittab
nu sunt asociate cu getty
procesează deloc. Fiecare comandă executată de la inittab
, dacă nu se specifică altfel, are fluxurile sale standard de intrare, ieșire și eroare asociate cu /dev/console
.
Liniile getty
specifică de fapt dispozitivul TTY pe care îl vor folosi și procesul getty
are cod încorporat care va atribui acel dispozitiv TTY pentru ei înșiși și toate procesele lor copil, cu excepția cazului în care / până când utilizatorul rulează un shell și alege să redirecționeze aceste fluxuri în alt mod.Aceasta și inițializarea setărilor dispozitivului TTY reprezintă cea mai mare parte a scopului getty
„: afișarea /etc/issue
și promptul de conectare, acceptând numele de utilizator, setarea variabilei de mediu TERM și pornirea următorului pas al procesului de autentificare TTY (de obicei /bin/login
dar personalizabil) sunt efectiv doar părți minore.
Rețineți că există este o convenție care pentru dispozitivele TTY, câmpul ID cu două caractere din prima coloană a liniei inittab
ar trebui să se potrivească cu numele dispozitivului TTY în cauză după /dev/tty
prefix, deci /dev/ttyS0
va primi un ID linie inittab de S0
și așa mai departe. Pentru lucruri care nu este neapărat asociat cu niciun TTY (sau doar transmite lucruri de urgență la / dev / consolă dacă este necesar), ID-ul poate fi orice lucru care nu intră în conflict cu ID-urile de linie ale dispozitivului TTY.
(Înapoi în ziua în care terminalele atașate în serie erau nr rm, obținerea corectă a setărilor dispozitivului TTY pentru terminalul de la celălalt capăt al liniei și resetarea acelui terminal la o stare cunoscută pentru conectare au fost sarcini non-banale, deoarece existau multe standarde de tip terminal concurente.)
Dacă configurați o linie inittab
pentru a rula un script, puteți, de exemplu, să vedeți dacă o anumită consolă virtuală /dev/ttyX
dispozitivul există. În caz contrar, puteți utiliza openvt -c X <command>
pentru a crea consola virtuală și a porni o comandă pe aceasta; dacă dispozitivul consolei virtuale există deja, puteți porni pur și simplu orice comandă doriți cu intrarea, ieșirea și eroarea standard redirecționate către acesta. De exemplu, puteți specifica o linie inittab ca aceasta:
6:345:respawn:/usr/local/sbin/myscript
și apoi /usr/local/sbin/myscript
cu ceva de genul acesta ( disclaimer: nu a fost testat, nu am un sistem cu SysVinit la îndemână acum, nu ezitați să editați dacă puteți îmbunătăți acest lucru):
#!/bin/sh if [ -c /dev/tty6 ]; then exec <some command> </dev/tty6 >/dev/tty6 2>&1 else exec openvt -c 6 -w <some command> fi
respawn
din linia inittab
se asigură că procesul va fi repornit automat dacă moare din orice motiv. 345
este lista nivelurilor de rulare SysVinit pe care ar trebui să ruleze acest proces. Dacă aveți nevoie de el pentru a rula pe toate nivelurile de rulare obișnuite, introduceți 12345
.
Notă, acest lucru funcționează conform intenției numai dacă linia inittab este plasată după linia sysinit
, astfel încât inițializarea udev
poate fi presupusă a fi completă. dacă doriți să faceți acest lucru la începutul procesului de inițiere, poate fi necesar să vă ocupați de crearea nodurilor dispozitivului propriu-zis pentru dispozitivele care au driverele deja încărcate mai întâi; odată ce udev
rulează, acesta ar trebui să creeze automat noduri de dispozitiv pe măsură ce sunt inițializate driverele de dispozitiv.
Dacă utilizați un port serial, openvt
comanda nu se va aplica.
Deci da, cu siguranță puteți atașa comenzi diferite la diferite dispozitive TTY. Vă ajută dacă comenzile au facilități încorporate pentru așa cum fac getty
s, dar o puteți face și cu scripturi.
(Dacă configurați ceva mai complicat decât un simplu tail -f
pentru a vizualiza permanent o jurnal într-o consolă virtuală altfel neutilizată, ar trebui să citiți și vedeți dacă este aplicabil pentru ceea ce planificați.)
Întrebarea 3:
Există mai multe pentru inițializarea unei sesiuni TTY pentru un anumit utilizator non-root decât doar pornirea unui shell cu su
.
Mesajele de eroare
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell
sunt probabil cauzate de asocierea shell-ului de către dispozitivul /dev/console
mai degrabă decât de un dispozitiv TTY specific. Deoarece /dev/console
este doar un alias pentru orice este consola de sistem actuală, nu va avea la dispoziție setul complet de funcții ioctl de control TTY.
Dacă nu există un script de conectare pentru a atribui o valoare mai utilă variabilei de mediu PS1
, promptul implicit pentru /bin/sh
poate fi pur și simplu sh-<version>$
.
Întrebarea 4:
Da, puteți. Ar trebui să specificați „ultimul script” ca linie de tip wait
în inittab
și să îl plasați înainte linia getty
corespunzătoare liniei dvs. seriale.
Fără a cunoaște mai multe detalii despre mediul dvs., va fi foarte dificil să spuneți care ar fi cel mai bun mod de a crea un utilizator cu privilegii reduse pentru astfel de scopuri.
Comentarii
- mulțumesc! mic q plz: când procesul init invocă alte procese în conformitate cu scripturile de nivel de rulare adecvate, pot vedea asta! dacă ‘ voi rula programul dintr-unul dintre aceste scripturi
îl voi vedea executându-se. Din înțelegerea mea – dacă o pot vedea (în interiorul terminalului) trebuie să existe un getty care mi-a deschis acest prim terminal.Cred că getty ttys0 este cel care mi-a deschis această primă știre. Ce ‘ este legătura dintre / dev / console și asta? și dacă scriu 4 scripturi, același nivel de execuție, dar vreau ca fiecare să ruleze în getty diferit (dar procesul inițial este cel care rulează aceste scripturi) cum pot face asta?
getty
este un proces; ceea ce vorbiți este un dispozitiv TTY . Nucleul a deschis primul pentru dvs. și pentru scripturile init; /dev/console
este un alias pentru ” primul dispozitiv TTY care a fost deschis și utilizat de nucleu „. Dacă contul dvs. de utilizator are permisiunile pentru accesul de citire + scriere la un dispozitiv TTY, puteți începe să îl utilizați (nu este necesar getty
), dar ar putea fi o idee bună să setați Variabila TERM corect: TERM=linux top </dev/tty8 >/dev/tty8 2>&1 &
sau TERM=vt100 top </dev/ttyS1 >/dev/ttyS1 2>&1 &
va porni comanda top
pe a 8-a consolă virtuală sau al doilea port serial. getty
pe el, acesta va face o mizerie de ieșirea de intrare &, deoarece cele două procese vor lupta pentru intrare și ieșirile lor se vor amesteca împreună. Procesele getty
sunt pornite numai după /etc/init.d/rc 5
și orice scripturi începute de acesta au terminat . Răspuns
-
Da, presupunând linia i se oferă un identificator unic și linia de terminal configurată este disponibilă:
S1:12345:respawn:/sbin/getty -L 115200 ttyS1
va deschide un terminal pe portul serial atașat la
ttyS1
. -
Liniile din
inittab
nu sunt secvențiale sau legate de o autentificare. Fiecare linie descrie o acțiune care trebuie întreprinsă într-un set dat de niveluri de rulare. Astfel,si::sysinit:/etc/init.d/rcS
specifică faptul căinit
ar trebui să ruleze/etc/init.d/rcS
atunci când gestionează inițializarea sistemului; acest lucru se întâmplă înainte ca autentificările să fie posibile. (Consultați pagina de manualinittab(5)
pentru detalii).Pentru a atribui diferite comenzi diferitelor
getty
s pe terminale specifice, ați configura invocareagetty
în sine, de exemplu schimbândlogin
programul pornește (opțiunea-l
în majoritateagetty
implementări):S0:12345:respawn:/sbin/getty -L 115200 -l /bin/my-t0-login ttyS0 S1:12345:respawn:/sbin/getty -L 115200 -l /bin/my-t1-login ttyS1
-
/etc/init.d/rc 5
rulează înainte de a fi posibilă conectarea, iar programele pe care le rulează nu sunt conectate la un terminal („corect”, care este ceea ce facegetty
– deschide terminalul pentru tine și conectează programele la care începe), deci atunci când este invocatsu nobody -c /bin/sh
, shell nu găsește configurarea terminalului pe care o așteaptă și, prin urmare, dezactivează controlul lucrărilor. Solicitareash-4.3$
este solicitarea implicită a lui Bash 4.3 atunci când este rulată ca/bin/sh
. -
Dacă programul dvs. ar trebui să ruleze numai după ce un utilizator începe să se conecteze, îl puteți conecta la secvența de conectare utilizată de
getty
; dar un astfel de program ar rula ca root. În funcție de ceea ce urmărești exact, ar fi mai bine să folosești un initscript, mai degrabă decât personalizarea/etc/inittab
sausudo
și scripturile de pornire ale shell-ului.
Comentarii
- vă mulțumim pentru reluarea dvs. Pot cere o lămurire cu privire la sec.2? cum pot edita comanda de conectare pentru fiecare getty diferit?
- Gata, vedeți actualizarea.
- vă mulțumesc! doar pentru a verifica dacă am înțeles corect: în mod implicit procesul getty va rula comanda / bin / login care execută procesul responsabil pentru conectarea la sistem. Acum, Getty va rula o comandă diferită, fiecare comandă pe care o voi alege ‘ și nu va apela la procesul de conectare la sistem ca înainte … am dreptate?
- Da, așa este. Cheia este ca
getty
să deschidă TTY pentru dvs.; comportamentul său normal este să aștepte un nume de autentificare, apoi să rulezelogin
, conectat la TTY;login
așteaptă parola, o verifică și pornește shell-ul, conectat și la TTY. Dacă înlocuiți partealogin
, va trebui să vă asigurați că programul dvs. de înlocuire se comportă calogin
. - De exemplu, dacă vreau să omit faza de conectare – să îmi pot deschide sistemul cu utilizator root fără a introduce niciun nume de utilizator sau parolă. Pot folosi: S0: 12345: respawn: / sbin / getty -L 115200 -l – / bin / sh ttyS0 sau să folosesc: S0: 12345: respawn: / sbin / getty -L 115200 -l [my_script_path] ttyS0 și în interior scriptul ‘ voi executa comanda – / bin / sh și altele?
Răspunde
Chiar acum o secundă (lungă!) răspunsul a fost postat. Trebuie să spun că primul explică destul de bine. În acest moment vreau să comentez punctul trei: Este mai puțin o chestiune de sincronizare, ci de procese care controlează un tty „real virtual” și nu doar un „manechin de consolă”.
Înainte de a putea începe un shell „cu controlul jobului”, trebuie să configurați adică să deschideți un ttyN. Comanda „generică” este getty
. Din acest tty-ceva pe care îl obțineți, puteți începe un shell, nu doar după asta.
Este ca și cum ai încerca să pornești mai întâi un manager de ferestre, apoi xorg, în loc să le „bootezi” împreună cu xinit. Cred. „șef de sesiune”.
Din cauza
xx:12:...:program
și, dimpotrivă:
aa:1:...:pr_1 bb:1:...:pr_2
… ai o relație N: M (ai și o mizerie dacă abuzezi – multe RL-uri fiecare cu multe programe diferite). Puteți merge departe cu asta, dar de când au luat stăpânire diferite tipuri de „standarde” RC. „Runcoms”. Cu ele, inittab pare simplu, dar toată complexitatea este în aceste scripturi.
Dar inittab dvs. arată simplu și corect – doar ultimul comentariu și intrarea „z6” …
Poate că „nimeni” tău nu are nevoie doar de un „getty … ttyN” înainte / în jur. su
în loc de login
și fără respawn. Ar trebui să ofere cel puțin un alt mesaj de eroare decât „inadecvat”.
Concluzie (după ce ați citit al doilea răspuns): nu aveți nevoie de un sistem init.d
complicat, inittabul brut este suficient de flexibil. Trebuie doar să obțineți conceptul și detaliile sunt corecte.
Puteți configura trei niveluri de execuție: unul cu ttyNs, unul cu ttySN și unul RL care pornește ambele. Este un parametru de boot pe care îl puteți adăuga cu boot loader-ul. „5” în cazul dvs. este doar implicit. Alegeți un nucleu, o rădăcină = și un nivel de execuție în care să inițiați.
Acțiunea „respawn” este ceea ce sysvinit a fost / este de fapt necesar pentru Mult mai mult nu face, și ar fi fost posibil să se implementeze mai puțin într-un script. Dar dacă ieșiți (sau blocați) ultimul nivel de shell, aveți nevoie de o plasă de siguranță.
sysvinit can chiar detectați o configurare greșită eronând „reproducerea prea repede – ignorând timp de 5 minute …”.
Lasă un răspuns