Jak používat příkaz Init v systému Linux

Init je rodič všech procesů. Jeho primární úlohou je vytvářet procesy ze skriptu uloženého v souboru / etc / inittab (viz inittab (5)). Tento soubor obvykle obsahuje položky, které způsobí, že init spouští getty s každým řádkem, který se uživatelé mohou přihlásit. Rovněž řídí autonomní procesy vyžadované kterýmkoli konkrétním systémem.

Úrovně chodu

Správa hladiny je softwarová konfigurace systému, která umožňuje, aby existovala pouze vybraná skupina procesů. Procesy vytvořené init pro každou z těchto úrovní runlevel jsou definovány v souboru / etc / inittab . Init může být v jedné z osmi runlevels: 0-6 a S nebo s . Řídící úroveň se změní tím, že má privilegovaný uživatel běží telinit , který vysílá příslušné signály na inicializaci a říká, který runlevel se má změnit.

Úrovně chodu 0 , 1 a 6 jsou vyhrazeny. Runlevel 0 se používá k zastavení systému, úroveň 6 se používá k restartování systému a úroveň 1 se používá k tomu, aby se systém dostal do režimu jednoho uživatele. Runlevel S není určen pro použití přímo, ale více pro skripty, které se provádějí při vkládání úrovně runlevel 1. Další informace o tom naleznete v manuálech pro vypnutí (8) a inittab (5).

Roviny 7 až 9 jsou také platné, i když nejsou skutečně zdokumentovány. Je to proto, že "tradiční" varianty Unixu je nepoužívají. V případě, že jste zvědaví, provozní úrovně S a s jsou ve skutečnosti stejné. Vnitřně jsou to aliasy pro stejnou úroveň.

Zavádění

Po inicializaci init jako posledního kroku spouštěcí sekvence jádra hledá soubor / etc / inittab a zjistí, jestli existuje položka typu initdefault (viz inittab (5)). Initdefault položka určuje počáteční hladinu systému. Pokud takový záznam neexistuje (nebo ne / etc / inittab vůbec), musí být zadána úroveň řízení na systémové konzoli.

Runlevel S nebo s přenese systém do režimu jednoho uživatele a nevyžaduje soubor / etc / inittab . V režimu jednoho uživatele se na / dev / konzoli otevře kořenový shell.

Při zadávání režimu jednoho uživatele init přečte stavy konzoly ioctl (2) z /etc/ioctl.save . Pokud tento soubor neexistuje, init inicializuje linku v síti 9600 baud a s nastavením CLOCAL . Když init opouští režim jednoho uživatele, ukládá nastavení ioctl konzoly do tohoto souboru, aby je mohl znovu použít pro další relaci jednoho uživatele.

Při prvním zadání režimu pro více uživatelů inicializuje init boot a bootwait položky, aby umožňovaly připojování souborových systémů předtím, než se uživatelé mohou přihlásit. Pak se zpracují všechny záznamy odpovídající úrovni řízení.

Při spuštění nového procesu init nejprve zkontroluje, zda soubor / etc / initscript existuje. Pokud ano, použije tento skript k zahájení procesu.

Pokaždé, když dítě končí, init zaznamená skutečnost a důvod, proč zemřel v / var / run / utmp a / var / log / wtmp za předpokladu, že tyto soubory existují.

Změna provozních úrovní

Poté, co splnil všechny uvedené procesy, init čeká na jeden ze svých následných procesů, aby zemřel, signál přerušeného napájení nebo dokud nebyl signalizován telinitem, aby změnil provozní úroveň systému. Když nastane jedna z výše uvedených tří podmínek, přezkoumá soubor / etc / inittab . Do tohoto souboru můžete kdykoli přidat nové položky. Init však stále čeká na to, aby nastala jedna z výše uvedených tří podmínek. Pro zajištění okamžité odpovědi může příkaz telinit Q nebo q probudit init, aby znovu přezkoumal soubor / etc / inittab .

Pokud init není v režimu jednoho uživatele a přijímá signál PowerFail (SIGPWR), čte soubor / etc / powerstatus . Potom spustí příkaz založený na obsahu tohoto souboru:

SELHAT)

Napájení selhalo, UPS poskytuje napájení. Proveďte položky Powerwait a powerfail .

OK)

Napájení bylo obnoveno, spustit položky powerokwait .

NÍZKÝ)

Napájení selhalo a napáječ má nízkou baterii. Proveďte položky powerfailnow .

Pokud / etc / powerstatus neexistuje nebo obsahuje cokoliv jiného než písmena F , O nebo L , init se chová jako písmeno F.

Použití SIGPWR a / etc / powerstatus je odrazeno. Někdo, kdo chce interagovat s init, by měl použít kanál / dev / initctl - viz zdrojový kód balíčku sysvinit pro další dokumentaci.

Když je inicializován požadavek na změnu úrovně běhu, odešle varovný signál SIGTERM do všech procesů, které nejsou definovány v nové úrovni. Poté čeká 5 sekund před násilným ukončením těchto procesů pomocí signálu SIGKILL . Všimněte si, že init předpokládá, že všechny tyto procesy (a jejich potomci) zůstávají ve stejné skupině procesů, které původně vytvořily pro ně. Pokud nějaký proces změní přidružení skupiny procesů, neobdrží tyto signály. Takové procesy je třeba ukončit zvlášť.

Telinit

/ sbin / telinit je propojen s / sbin / init . Vyžaduje jeden znakový argument a signalizuje init, aby provedl příslušnou akci. Následující argumenty slouží jako směrnice k telinitu :

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

řekněte init pro přepnutí na zadanou úroveň běhu.

a , b , c

řekněte init, aby zpracoval pouze ty položky souboru / etc / inittab s úrovní run avel, b nebo c .

Q nebo q

řekněte init, že znovu zkontrolujte soubor / etc / inittab .

S nebo s

řekněte init, že chcete přepnout do režimu jednoho uživatele.

U nebo u

řekněte init, že se znovu provede (zachování stavu). Neexistuje re-examining souboru / etc / inittab . Spustit úroveň by měla být jeden z Ss12345 , jinak žádost by byla mlčky ignorována.

telinit také může říct, jak dlouho má čekat mezi odesíláním signálů SIGTERM a SIGKILL. Výchozí hodnota je 5 sekund, ale to lze změnit pomocí volby -t sec .

telinit lze vyvolat pouze uživatelé s příslušnými oprávněními.

Init binární kontroluje, zda je init nebo telinit tím, že se podívá na jeho id procesu ; skutečný ID procesu je vždy 1 . Z toho vyplývá, že namísto volání telinitu lze místo toho použít zkratku init .