Cum se utilizează comanda init în Linux

Init este părintele tuturor proceselor. Rolul său principal este de a crea procese dintr-un script stocat în fișierul / etc / inittab (a se vedea inittab (5)). Acest fișier are, de obicei, intrări care provoacă init pentru a genera getty s pe fiecare linie pe care utilizatorii se pot log in. De asemenea, controlează procese autonome cerute de orice sistem anume.

runlevels

Un nivel de execuție este o configurație software a sistemului care permite să existe doar un grup selectat de procese. Procesele generate de init pentru fiecare dintre aceste runlevels sunt definite în fișierul / etc / inittab . Init poate fi în una din opt runlevels: 0-6 și S sau s . Nivelul de execuție este modificat prin faptul că are un utilizator privilegiat de a rula telinit , care trimite semnale adecvate la init , spunându-i la care runlevel să se schimbe.

Nivelurile de rulare 0 , 1 și 6 sunt rezervate. Nivelul de execuție 0 este utilizat pentru a opri sistemul, nivelul de execuție 6 este folosit pentru a reporni sistemul, iar nivelul de execuție 1 este folosit pentru a scoate sistemul în modul de utilizator unic. Runlevel S nu este menit să fie folosit direct, ci mai mult pentru scripturile care se execută la intrarea la nivelul 1. Pentru mai multe informații despre acest lucru, consultați manualele de închidere (8) și inittab (5).

Nivelurile de rulare 7-9 sunt, de asemenea, valide, deși nu sunt într-adevăr documentate. Acest lucru se datorează faptului că variantele tradiționale de Unix nu le utilizează. În cazul în care sunteți curios, runlele S și s sunt de fapt aceleași. Pe plan intern sunt aliasuri pentru același nivel de execuție.

Bootare

După ce init este invocat ca ultima etapă a secvenței de boot a kernel-ului, ea caută fișierul / etc / inittab pentru a vedea dacă există o intrare de tipul initdefault (vezi inittab (5)). Intrarea inițială determină nivelul inițial de rulare al sistemului. Dacă nu există o astfel de intrare (sau nu / etc / inittab deloc), trebuie introdus un nivel de execuție la consola de sistem.

Runlevel S sau s aduc sistemul la un singur mod de utilizator și nu necesită un fișier / etc / inittab . În modul de utilizator unic, pe / dev / consolă se deschide o coajă rădăcină.

La intrarea în modul de utilizator unic, init citește stările ioctl (2) ale consolei din /etc/ioctl.save . Dacă acest fișier nu există, inițializează linia la 9600 baud și cu setările CLOCALE . Când init lasă un singur mod de utilizator, acesta stochează setările ioctl ale consolei în acest fișier, astfel încât să le poată reutiliza pentru următoarea sesiune de utilizatori.

Când introduceți pentru prima dată un mod multi-utilizator, init efectuează intrările de boot și bootwait pentru a permite instalarea sistemelor de fișiere înainte ca utilizatorii să se poată loga. Apoi, toate intrările care se potrivesc nivelului de execuție sunt procesate.

Când începe un nou proces, init verifică mai întâi dacă fișierul / etc / initscript există. Dacă da, utilizează acest script pentru a începe procesul.

De fiecare dată când un copil termină, init înregistrează faptul și motivul pentru care a murit în / var / run / utmp și / var / log / wtmp , cu condiția ca aceste fișiere să existe.

Schimbarea nivelurilor de execuție

După ce a dat naștere tuturor proceselor specificate, init așteaptă ca unul din procesele descendente să moară, un semnal de putere sau până când este semnalat de telinit pentru a schimba nivelul de rulare al sistemului. Când apare una dintre cele trei condiții de mai sus, ea reexaminează fișierul / etc / inittab . Noile înregistrări pot fi adăugate în acest fișier în orice moment. Cu toate acestea, init încă așteaptă să apară una dintre cele trei condiții de mai sus. Pentru a oferi un răspuns instantaneu, comanda telinit Q sau q poate să treacă init pentru a reexamina fișierul / etc / inittab .

Dacă init nu este în modul de utilizator unic și primește un semnal powerfail (SIGPWR), acesta citește fișierul / etc / powerstatus . Apoi pornește o comandă bazată pe conținutul acestui fișier:

F (AIL)

Puterea eșuează, UPS furnizează energia. Executați intrările powerwait și powerfail .

O.K)

Puterea a fost restabilită, executați intrările powerokwait .

SCĂZUT)

Puterea este defectă și UPS-ul are o baterie descărcată. Executați intrările powerfailnow .

Dacă / etc / powerstatus nu există sau conține altceva decât literele F , O sau L , init se va comporta ca și cum ar fi citit litera F.

Utilizarea SIGPWR și / etc / powerstatus este descurajată. Cineva care dorește să interacționeze cu init ar trebui să utilizeze canalul de control / dev / initctl - vedeți codul sursă al pachetului sysvinit pentru mai multe informații despre acest lucru.

Când se solicită inițializarea modificării nivelului de execuție, el trimite semnalul de avertizare SIGTERM la toate procesele nedefinite în noul nivel de execuție. Apoi așteaptă 5 secunde înainte de a termina cu forța aceste procese prin semnalul SIGKILL . Rețineți că init presupune că toate aceste procese (și descendenții acestora) rămân în același grup de proces pe care inițial l-au creat pentru ei. Dacă orice proces modifică afilierea grupului de procese, acesta nu va primi aceste semnale. Astfel de procese trebuie terminate separat.

telinit

/ sbin / telinit este legat la / sbin / init . Este nevoie de un argument de un caracter și semnalează init pentru a efectua acțiunea corespunzătoare. Următoarele argumente servesc drept direcții pentru a finaliza :

0 , 1 , 2 , 3 , 4 , 5 sau 6

spune init să treacă la nivelul de rulare specificat.

a , b , c

spuneți init să proceseze numai acele intrări ale fișierului / etc / inittab care au runlevel a , b sau c .

Q sau q

spuneți init să reexamineze fișierul / etc / inittab .

S sau s

spuneți init să treacă la un singur mod de utilizator.

U sau u

spune init să se re-execute (păstrând statul). Nu se face reexaminarea fișierului / etc / inittab . Nivelul de execuție ar trebui să fie unul dintre Ss12345 , în caz contrar solicitarea va fi ignorată în tăcere.

telinit poate indica, de asemenea, init cât trebuie să aștepte între trimiterea proceselor semnalele SIGTERM și SIGKILL. Valoarea implicită este de 5 secunde, dar aceasta poate fi modificată cu opțiunea -t sec .

telinit pot fi invocate numai de către utilizatori cu privilegii corespunzătoare.

Verificările binare inițiale dacă sunt init sau telinit privindu- se id-ul procesului ; id-ul procesului real al initului este întotdeauna 1 . Din aceasta rezultă că, în loc de a apela telinit, se poate folosi și init ca o scurtătură.