Linux Boots


Jak se ukázalo, proces zavádění není moc:

1. Boot loader Najde obraz jádra na disku, načte do paměti, a spustí ji.
2. Jádro inicializovat zařízení a STI ovladače.
3. Jádro připojí kořen filesystem.
4. Jádro začne init Volat naplánovat.
5. init nastaví zbytek procesů v pohybu.
6. Poslední procesům, které init spustí jako součást zavádění systému vám umožní přihlášení.

Identifikace každé fáze procesu spouštění je neocenitelná při řešení problémů se spuštěním a porozumění system jako celek. Chcete-li začít, přihlaste se v zavaděči, což je úvodní obrazovka nebo výzva, která se zobrazí po provedení autotestu počítače při zapnutí, s dotazem, který operační systém system běžet. Jakmile si vyberete, zavaděč spustí jádro Linuxu a předá kontrolu nad system do jádra.

K dispozici je podrobná diskuse o jádra jinde v této knize, z nichž je výňatek tento článek. Tento článek se vztahuje na Jádro inicializace fáze, fáze, kdy jádro vytiskne spoustu zpráv o hardwaru přítomném na disku system. Jádro spustí init hned poté, co zobrazí zprávu, že jádro připojilo kořen filesystem:

VFS: Mounted kořen (ext2 filesystem) pouze ke čtení.

Brzy poté uvidíte zprávu o spuštění init, následovanou system zprávy o spuštění služby a nakonec se zobrazí nějaká výzva k přihlášení.

POZNÁMKA : On Red Hat Linux, úvodní poznámka je obzvláště zřejmá, protože vás „vítá“ v „Red Hat Linux“. Všechny zprávy poté ukazují úspěch nebo neúspěch v závorkách na pravé straně obrazovky.

Většina z této kapitoly se zabývá init, protože to je součástí spouštěcí sekvenci, kde máte největší kontrolu.
init

Na init není nic zvláštního. Je to program jako každý jiný v systému Linux system, a najdete jej v / sbin spolu s dalšími system binární soubory. Hlavním účelem init je spustit a zastavit další programy v určitém pořadí. Musíte jen vědět, jak tato sekvence funguje.

Existuje několik různých variant, ale většina linuxových distribucí používá System Styl V zde diskutován. Některé distribuce používají jednodušší verzi, která se podobá BSD init, ale je nepravděpodobné, že se s tím setkáte.

Runlevels

Kdykoli na Linuxu system, běží určitá základní sada procesů. Tento stav machine se nazývá jeho runlevel a označuje se číslem od 0 do 6. The system tráví většinu času na jediné úrovni běhu. Když však zavřete machine down, init přepne na jinou úroveň běhu, aby ukončil system služby řádným způsobem a říct jádru, aby skončilo. Ještě další úroveň běhu je pro režim pro jednoho uživatele, o níž bude pojednáno později.

Nejjednodušší způsob, jak získat popisovač na runlevels, je prozkoumat konfiguraci init file, / etc / inittab. Vyhledejte řádek, jako je následující:

ID: 5: initdefault:

Tento řádek znamená, že default runlevel na system je 5. Všechny řádky na kartě inittab file mít tuto formu, se čtyřmi poli oddělenými dvojtečkami vyskytujícími se v následujícím pořadí:
# Jedinečný identifikátor (krátký řetězec, například id v předchozím příkladu)
# Použitelné runlevel číslo (čísla)
# Akce, kterou by měl provést init (v předchozím příkladu je akcí nastavit default úroveň běhu na 5)
# Příkaz k provedení (volitelně)

V předchozím init není žádný příkaz k provedenídefault příklad, protože příkaz nedává smysl v kontextu nastavení default runlevel. Podívejte se na inittab trochu dále, dokud neuvidíte řádek jako tento:

l5: 5: wait :/ etc / rc.d / rc 5

Tento řádek spouští většinu z system konfigurace a služby prostřednictvím adresářů rc * .d a init.d. Vidíte, že init je nastaven na spuštění příkazu s názvem /etc/rc.d/rc 5, když je na úrovni runlev 5. Akce čekání říká, kdy a jak spustí příkaz init: spustit rc 5 jednou, když entering runlevel 5 a počkejte, až tento příkaz skončí, než uděláte cokoli jiného.

V systému je několik různých akcí addnávrh na zahájenídefault a počkejte, zejména pokud jde o správu napájení, a stránka manuálu inittab (5) vám o nich řekne vše. Ty, s nimiž se s největší pravděpodobností setkáte, jsou vysvětleny v následujících částech.

respawn

Akce respawn způsobí, že init spustí příkaz, který následuje, a pokud se příkaz dokončí, spustí se znovu. Pravděpodobně uvidíte něco podobného tomuto řádku na své inittab file:

1: 2345: respawn :/ sbin / mingetty tty1

Getty programy poskytují přihlásit výzvy. Předchozí linka je na první virtuální konzoli (/ dev / tty1), kterou vidíte-li klávesu ALT nebo CONTROL-ALT-F1 F1. Respawn akce přináší přihlašovací řádek zpět po odhlášení.

ctrlspol

Projekt ctrlaltdel akce řídí, co system dělá, když stisknete CONTROL-ALT-DELETE na virtuální konzole. Na většině systems, toto je nějaký druh restartu pomocí příkazu vypnutí.

sysinit

Akce sysinit je první věcí, kterou by měl init spustit, když se spustí, dříve enterv jakýchkoli běžných úrovních.

Jak procesy v runlevelů kdo

Nyní jste připraveni se naučit, jak zahájit system služby, těsně předtím, než vám umožní přihlášení. Připomeňte si tento řádek inittab z dřívějšího:

l5: 5: wait :/ etc / rc.d / rc 5

Tato malá linka vyvolá mnoho dalších programů. rc znamená rozběhu, a uslyšíte lidé se odkazují na příkazy jako skripty, programy nebo službami. Tak, kde jsou tyto příkazy, vlastně je?

Pro runlevel 5 jsou v tomto příkladu příkazy pravděpodobně buď v /etc/rc.d/rc5.d nebo /etc/rc5.d. Runlevel 1 používá rc1.d, runlevel 2 používá rc2.d atd. Můžete najít následující items v adresáři rc5.d:

S10sysklogd S20ppp S99gpm
S12kerneld S25netstd_nfs S99httpd
S15netstd_init S30netstd_misc S99rmnologin
S18netbase S45pcmcia S99sshd
S20acct S89atd
S20logoutd S89cron

Rc 5 příkaz spustí programy v tomto runlevelu adresáři spuštěním příkazů následujících:

S10sysklogd home
S12kerneld home
S15netstd_init home
S18netbase home
...
S99sshd home

Všimněte si, že počáteční tvrzení v každém příkazu. S v prostředku název příkazu, který by měl běžet na příkaz Start režimu, a počet (00 přes 99) určuje, kde v pořadí rc spustí příkaz.

* Rc. D příkazů je Obvyklé Start Programy, že Shell skripty v / sbin nebo / usr / sbin. Normálně, můžete zjistit, co jeden z příkazů skutečně se při pohledu na scénář s menším nebo pager Další programu.

Jednu z těchto služeb můžete spustit ručně. Například pokud chcete spustit program webového serveru httpd ručně, spusťte S99httpd start. Podobně, pokud někdy potřebujete zabít jednu ze služeb, když machine je zapnutý, můžete spustit příkaz v adresáři rc * .d s argumentem stop (například S99httpd stop).

Některé adresáře rc * .d obsahují příkazy, které začínají písmenem K (pro režim „kill“ nebo stop). V tomto případě rc spustí příkaz s argumentem stop místo startu. S největší pravděpodobností narazíte na příkazy K v úrovních run, které zavírají system dolů.

Addslužby a odebírání

Pokud chcete add, mazat nebo upravovat služby v adresářích rc * .d, musíte se blíže podívat na fileje uvnitř. Dlouhý výpis odhaluje strukturu jako je tato:

lrwxrwxrwx. . . S10sysklogd -> .. / init.d / sysklogd
lrwxrwxrwx. . . S12kerneld -> .. / init.d / kerneld
lrwxrwxrwx. . . S15netstd_init -> .. / init.d / netstd_init
lrwxrwxrwx. . . S18netbase -> .. / init.d / netbase
...

Příkazy v adresáři rc * .d jsou ve skutečnosti symbolickými odkazy files v adresáři init.d, obvykle v / etc nebo /etc/rc.d. Distribuce v systému Linux tyto odkazy obsahují, takže mohou používat stejné spouštěcí skripty pro všechny úrovně běhu. Tato úmluva není v žádném případě požadavkem, ale často organizaci trochu usnadňuje.

Chcete-li zabránit tomu, aby jeden z příkazů v adresáři init.d běžel na konkrétní úrovni běhu, můžete myslet na odebrání symbolického odkazu v příslušném adresáři rc * .d. To sice funguje, ale pokud uděláte chybu a budete někdy potřebovat odkaz vrátit na místo, můžete mít potíže s zapamatováním si přesného názvu odkazu. Proto byste neměli odstraňovat odkazy v adresářích rc * .d, ale spíše add podtržítko (_) na začátek názvu odkazu takto:

mv S99httpd _S99httpd

V době spuštění rc ignoruje _S99httpd, protože nezačíná na S nebo K. Kromě toho je původní název stále zřejmý a máte rychlý přístup k příkazu, pokud jste v nouzi a potřebujete jej spustit ručně.

Na add služba, musíte vytvořit skript jako ostatní v adresáři init.d a poté vytvořit symbolický odkaz ve správném adresáři rc * .d. Nejjednodušší způsob, jak napsat skript, je prozkoumat skripty, které jsou již v init.d, vytvořit kopii toho, kterému rozumíte, a upravit kopii.

Kdy addPokud chcete spustit službu, ujistěte se, že jste zvolili vhodné místo v bootovací sekvenci. Pokud se služba spustí příliš brzy, nemusí fungovat kvůli závislosti na jiné službě. U nepodstatných služeb nejvíce systems administrators preferují čísla v 90. letech, po většině služeb, které přišly s system.

Linuxové distribuce obvykle přicházejí s příkazem pro povolení a zakázání služeb v adresářích rc * .d. Například v Debianu je příkaz update-rc.d a v Red Hat Linuxu je příkaz chkconfig. K dispozici jsou také grafická uživatelská rozhraní. Používání těchto programů pomáhá udržovat spouštěcí adresáře konzistentní a pomáhá s aktualizacemi.

TIP: Jeden z nejběžnějších Linuxů installproblémem je nesprávně nakonfigurovaný server XFree86, který se rychle zapíná a vypíná, takže system nepoužitelný na konzole. Chcete-li toto chování zastavit, spusťte režim pro jednoho uživatele a změňte svou úroveň běhu nebo služby runlevel. Hledejte něco, co obsahuje xdm, gdm nebo kdm ve svých adresářích rc * .d nebo ve vašem / etc / inittab.

Ovládání init

Občas musíte zaslat init malému kopu, abyste řekli, aby přepnul běžecké úrovně, aby si znovu přečetl inittab file, nebo jen tak shut down ο system. Protože init je vždy první proces na a system, jeho ID procesu je vždy 1.

Můžete ovládat init s celerem. Například, pokud chcete přejít na runlevelu 3, použijte tento příkaz:

telinit 3

Při přepínání úrovní běhu se init pokusí zabít všechny procesy, které nejsou na kartě inittab file pro nový runlevel. Proto byste měli být opatrní při změně runlevelů.

Když potřebujete add nebo odstranit respawnující úlohy nebo provést jakoukoli jinou změnu na inittab file, musíte říct init o změně a způsobit, že ji znovu přečte file. Někteří lidé používají kill -HUP 1, aby to řekli init. Tato tradiční metoda funguje na většině verzí Unixu, pokud je zadáte správně. Můžete však také spustit tento příkaz telinit:

telinit q

Můžete také použít telinit s přepnout do single-user módu.

Vypínání

init také řídí, jak system vypne a restartuje. Správný způsob shut down a Linux machine je použít příkaz vypnutí.

Existují dva základní způsoby použití vypnutí. Pokud zastavíte system, zavírá to machine down a drží to dole. Chcete-li macokamžitě zastavte, použijte tento příkaz:

shutdown-h now

Na většině moderních machines s rozumně nedávnými verzemi Linuxu, zastavení zastaví napájení machine. Můžete také restartovat machine. Při restartu použijte místo -h místo -r.

Proces vypnutí trvá několik sekund. Nikdy byste neměli resetovat nebo vypínat a machine během této fáze.

V předchozím příkladu je nyní čas na shut down. Tento argument je povinný, ale existuje mnoho způsobů, jak jej specifikovat. Pokud chcete macChcete-li někdy v budoucnu spadnout, jedním ze způsobů je použít + n, kde n je počet minut, po které by vypnutí mělo čekat, než bude pracovat. Pro ostatní options, podívejte se na manuálovou stránku vypnutí (8).

Chcete-li system restartujte za 10 minut, spusťte tento příkaz:

shutdown-r + 10

V systému Linux vypínání upozorní každého přihlášeného machine klesá, ale dělá malou skutečnou práci. Pokud zadáte jiný čas než nyní, vypnutí vytvoří a file nazývá se / etc / nologin. Když toto file je přítomen, system zakazuje přihlášení kdokoli kromě superuživatele.

Kdy system konečně dorazí čas vypnutí, vypnutí říká inici, aby přepnul na runlevel 0 pro zastavení a runlevel 6 pro restart. Když init enters runlevel 0 nebo 6, proběhne vše, co si můžete ověřit při pohledu na skripty uvnitř rc0.d a rc6.d:

1. init zabije každého procesu, který je v jeho silách (jako by při přechodu k jinému runlevelu).

# Počáteční příkazy rc0.d / rc6.d běží, zamykají se system files na místě a další přípravy na vypnutí.
# Další příkazy rc0.d / rc6.d odpojí všechny filesystemjiné než root.
# Další příkazy rc0.d / rc6.d připojí kořenový adresář filesystem pouze ke čtení.
# Stále více příkazů rc0.d / rc6.d zapisuje všechna data ve vyrovnávací paměti do filesystem se synchronizačním programem.
# Konečné rc0.d / rc6.d příkazy říct, že jádro restartovat nebo zastavit s restartem, zastavení nebo vypínání programu.

Programy restartu a zastavení se chovají pro každou úroveň běhu odlišně, což může způsobit zmatek. podle default, tyto programy volají vypnutí pomocí -r nebo -h options, ale pokud system je již na zastavené nebo restartované úrovni běhu, programy řeknou jádru, aby se okamžitě vyplo. Pokud opravdu chcete zavřít macsvižně spěchejte (bez ohledu na případné poškození z neuspořádaného vypnutí), použijte volbu -f.

Vášnivý k technologii, rád testuji a píšu výukové programy o operačních systémech macOS, Linux, Windows, o WordPress, WooCommerce a konfiguraci webových serverů LEMP (Linux, NGINX, MySQL a PHP). píšu dál StealthSettings.com od roku 2006 ao několik let později jsem začal psát na iHowTo.Tips výukové programy a novinky o zařízeních v ekosystému Apple: iPhoneiPad Apple Hodinky, HomePod, iMac, MacBook, AirPods a příslušenství.

Zanechat komentář