Hlavní navigace

Source Mage GNU/Linux: Není init jako init

Ladislav Hagara 19. 12. 2003

Dle vývojářů alternativních inicializačních modelů jsou uživatelé všech možných unixových operačních systémů už po celá léta omezováni inicializačními modely BSD init a System V init. Uživatelé si své omezování ale vůbec neuvědomují. Možná je to i tím, že žádný z alternativních initů neznají, a tudíž netuší, o co přicházejí.

Source Mage GNU/Linux

V linuxové distribuci Source Mage GNU/Linux byl nedávno sysvinit nahrazen initem Simpleinit-MSB. Jaké důvody vedly vývojáře k této zásadní změně? Jaký dopad má tato změna jak na vývojáře, tak i na běžné uživatele?

Implementaci Simpleinit-MSB v Source Mage bude věnována příští část tohoto seriálu. Cílem této části je především odpovědět na otázku, proč jsou alternativní inity, tj. i Simpleinit-MSB, vůbec vytvářeny. Nejprve ale stručné shrnutí problematiky inicializace linuxových systémů a nejrozšířenějších inicializačních modelů.

Inicializace linuxového systému

Inicializaci linuxového systému lze rozdělit do dvou částí. Před initem a po initu. První část, popsaná například v článku Linux – pohled do nitra, začíná zapnutím počítače a končí zavedením linuxového jádra do paměti počítače. Následuje vytvoření procesu init (soubor /sbin/init), jenž řídí druhou část inicializace. Proces init je nejdůležitějším ze všech procesů. Svědčí o tom i jeho číslo (PID=1). Z uživatelského hlediska mu ale není nutné věnovat zvláštní pozornost. Spouštění i zastavování jednotlivých podsystémů je zabezpečeno inicializačními (startovacími) skripty vytvořenými vývojáři linuxové distribuce.

Z pohledu vývojářů se ale jedná o docela složitou problematiku. Vytváření a důkladné testování inicializačních skriptů je přitom podružnou záležitostí. Stěžejním problémem je výběr toho nejvhodnějšího initu a jeho přizpůsobení dané distribuci.

Spouštění a zastavování linuxových systémů je obvykle založeno na jednom ze dvou nejrozšířenějších inicializačních modelů (initů) – „BSD init“ nebo „System V init“. Své místečko pod linuxovým sluncem však mají též alternativní inicializační modely.

BSD init

Jak již název napovídá, BSD init je využíván především v BSD unixových operačních systémech. Své uplatnění však našel i v některých linuxových distribucích, například v Slackware.

Při použití BSD init je inicializace systému řízena jedním nebo několika inicializačními rc skripty – OpenBSD nebo FreeBSD varianta. Existuje také NetBSD varianta, která je mnohem propracovanější, podporuje například závislosti mezi podsystémy.

Spouštění jednotlivých podsystémů je při použití klasického BSD init realizováno přidáváním příkazů spouštějících dané podsystémy do rc skriptu. Pro spouštění sshd jako démona (sshd lze spouštět také jako server pomocí inetd nebo xinetd) postačuje dopsat do rc skriptu příkaz sshd. Pořadí spouštění jednotlivých podsystémů je určeno jejich pořadím v rc skriptu.

Na první pohled jednoduché a přitom efektivní řešení. Stačí otevřít textový editor. Problém nastává při automatizovaném zpracovávání, tj. například při instalaci softwarových balíčků. Pokud má být instalovaná služba spouštěna při startu systému, instalační program musí „editovat“ rc skript. Příslušné příkazy musí být vloženy na přesně určené místo, to ale nelze adresovat například číslem řádku. Inicializační rc skripty se mohou na jednotlivých systémech výrazně lišit. Instalační program musí počítat se všemi možnými alternativami. Vlastní editace je také nebezpečná. I jednoduchá chyba, překlep nebo závorka, může způsobit, že linuxový systém vůbec nenaběhne.

System V init

Tento inicializační model (zastupovaný balíkem sysvinit) je podrobně rozebrán například v článku Linux – druhý pohled do nitra. Jeho hlavní výhodou je, že odpadá nutnost editovat společné inicializační skripty. Jednotlivé podsystémy mají své vlastní skripty. Při instalaci sshd jako démona je sshd inicializační skript zkopírován do adresáře inicializačních skriptů (například /etc/rc.d/init.d) a z adresářů představující jednotlivé úrovně běhu systému jsou na tento skript vytvořeny startovací a ukončovací linky – S a K linky.

# pwd
/etc/rc.d

# find . -name "*sshd" -exec ls -l {} \;
- ... ./init.d/sshd
l ... ./rc0.d/K25sshd -> ../init.d/sshd
l ... ./rc1.d/K25sshd -> ../init.d/sshd
l ... ./rc2.d/S55sshd -> ../init.d/sshd
l ... ./rc3.d/S55sshd -> ../init.d/sshd
l ... ./rc4.d/S55sshd -> ../init.d/sshd
l ... ./rc5.d/S55sshd -> ../init.d/sshd
l ... ./rc6.d/K25sshd -> ../init.d/sshd

Démon sshd běží, pokud se systém nachází v úrovních běhu systému 2, 3, 4 nebo 5. Pokud je systém přepnut do úrovní 0, 1 nebo 6, je sshd ukončen.

Pořadí spouštění i ukončování jednotlivých podsystémů je definováno čísly umístěnými za S a K. Pokud má například podsystém X naběhnout po podsystému Y, ale před podsystémem Z, musí být číslo u X linku větší než u Y linku, ale menší než u Z linku.

Jaké číslo ale má být u X linku, pokud číslo u Y linku je například 66 a u Z linku 67, nebo číslo u Y linku je větší než u Z linku? V tomto případě je nutné všechny linky přečíslovat, tj. smazat aktuální a vytvořit nové linky s novými čísly. Naštěstí existují nástroje, které mohou pomoci, například řádkový chkconfig nebo grafický ksysv.

Inicializace linuxového systému a standardy

Vývojáři linuxových distribucí by měli dodržovat linuxové standardy. Cílem Linux Standard Base (LSB) je definování a prosazování standardů také v oblasti inicializace linuxových systémů. LSB ve spolupráci s Linux Assigned Names And Numbers Authority (LANANA) definuje rovněž jména inicializačních skriptů.

Kromě „de jure“ standardů existují samozřejmě také „de facto“ standardy. Některé BSD inity jsou proto kompatibilní s System V inity. Pokud aplikace nabízí vlastní System V inicializační skripty, proč je nepoužít i s BSD initem? Příslušné System V skripty jsou spouštěny v BSD init například pomocí rc.sysvinit skriptu.

Slepé dodržování standardů ale může bránit vývoji nových init modelů. Někdy je vhodné se od standardů zcela oprostit a začít na zelené louce. Pouze tak může vzniknout něco zcela nového. Kdo ví? Možná se z některého dnes nestandardního initu vyklube příští standard.

Alternativní inicializační modely

Cíle vývojářů alternativních inicializačních modelů jsou různé. Především se ale jedná o vytvoření lepších initů, než jsou BSD init nebo System V init. V čem lze tyto klasické inity předčit? Například v rychlosti zavádění. Toho lze docílit mimo jiné paralelním zaváděním nezávislých podsystémů. Cílem vývojářů může být minimalizování velikosti initu. S velikostí souvisí také možnost sestavení initu s knihovnoudi­etlibc, tj. s knihovnou kompatibilní s knihovnou libc, jejíž velikost je ale několikanásobně menší (dietlibc drží dietu :-))).

Dalším cílem může být možnost inicializace read-only systémů, tj. systémů, u kterých není možné modifikovat souborový systém. Většina init modelů využívá právě souborový systém k interní komunikaci. Jedna část initu do souboru zapisuje, jiná z něj čte. Komunikovat lze ale také pouze v paměti, například pomocí front zpráv (System V message queues).

Některé alternativní inicializační modely zavádějí závislosti mezi podsystémy. Místo editování konkrétních řádků (BSD init) nebo přečíslovávání S a K linků (System V init) stačí definovat, že podsystém A potřebuje pro svůj běh podsystémy B a C. Určení konkrétního pořadí lze přenechat na init. Některé inity si toto pořadí pamatují, a pokud podsystém D vyžaduje pro svůj běh podsystém E, tak před ukončením podsystému E je automaticky ukončen také podsystém D.

Častým cílem vývojářů je zlepšení monitorování jednotlivých podsystémů jakož i samotného initu. Cílem může být vytvoření initu stejných nebo lepších vlastností, ale pod jinou licencí. Vývojáři čistokrevných GPL distribucí odmítají do distribuce začlenit cokoli, co není uvolněno pod GPL licencí.

Ach ty chyby

Autoři alternativních inicializačních modelů na svých webových stránkách přiznávají, že jejich modely nejsou testovány tak důkladně jako nejrozšířenější init modely. Alternativní init modely (ale nejenom ty) mohou proto obsahovat i závažné chyby. V květnu 2002 byla například objevena stejná bezpečnostní díra jak v Simpleinit, tak i v Simpleinit-MSB (SecuriTeam, Bugtraq). Lokální uživatel mohl zneužít souboru /dev/initctl, normálně sloužícího ke komunikaci mezi initctl, need, provide a samotným simpleinit, ke spuštění libovolného programu s právy administrátora.

Simpleinit

Richard Gooch si se svým přítelem jednoho dne řekli (v sobotu 29. ledna 2000), že se už nenechají omezovat BSD a System V inicializačními modely, a rozhodli se navrhnout a implementovat něco lepšího. Docela se jim to povedlo a výsledek svého snažení pojmenovali Linux Boot Scripts. Používanější je ale název Simpleinit, poněvadž se Richard Gooch v té době stal (a pořád je) správcem simpleinit(8) (součást balíku util-linux) a myšlenky z Linux Boot Scripts zahrnul přímo do simpleinit(8). I když je balík util-linux nainstalován na většině linuxových systémů (obsahuje základní příkazy jako dmesg, fdisk, mount, umount ap.), o části simpleinit to neplatí. Vývojáři linuxových distribucí simpleinit zpravidla ignorují a používají místo něj jiný init, především sysvinit.

Posloupnost spouštění a ukončování jednotlivých podsystémů není v simpleinit definována ani pomocí symbolických linků (System V), ani umístěním v daném rc skriptu (BSD). Posloupnost je definována pomocí příkazu need(8). Při spouštění podsystému X je zkontrolován příslušný inicializační skript, a pokud obsahuje například need Y, Z a inicializace podsystémů Y a Z nebyla dokončena, případně nebyla ještě ani započata (v tom případě je automaticky zahájena), je spouštění podsystému X pozastaveno. Spouštění je obnoveno až poté, co je inicializace podsystémů Y a Z dokončena.

Pomocí příkazu provide(8) lze definovat obecné podsystémy. Inicializační skripty poštovních serverů (Sendmail, Qmail, …) mohou například obsahovat provide mta (message transport agent). Inicializační skript obsahující need mta není nutné při přechodu z jednoho poštovního serveru na jiný upravovat. Pokud by inicializační skript obsahoval řádek need sendmail, musel by být tento řádek po přechodu na Qmail změněn na need qmail.

Od Simpleinit je jenom krůček k Simpleinit-MSB.

Nejenom o Simpleinit-MSB ale až příště.

PS:

Rádi byste vyzkoušeli Source Mage GNU/Linux a nemáte potřebný diskový prostor? Na wiki stránkách Source Mage lze nalézt řešení i tohoto problému. Nachází se zde návod k linuxové variantě ruské rulety. Stačí jeden jediný výstřel a problém s diskovým prostorem může být rázem vyřešen. :-))

# [ $[ $RANDOM % 6 ] == 0 ] && rm -rf /

Pozn. red.: Zazálohujte si disk, na pozdější reklamace nebude brán zřetel. Znáte ty hlášky s GPL a NO WARRANTY, ne? :)

Našli jste v článku chybu?

21. 5. 2004 13:58

dejf (neregistrovaný)

zbytecnost, ale extremni!!!
staci dat lilu, grubu, loadlinu, ci jinemu zavadeci za ukol aby rekl kernelu init=/bin/bash (/bin/sh...) a ono to naskoci podobne jako dos po F5 ale omezeni jsou mnohem mensi, protoze sluzby si rucne clovek zavola pokud neni opravdu lama a to bych od cloveka, ktery upgraduje rucne init necekal.
Je to jeste mnohem min nez runlevel S, ale daj se z toho s devfs na ctvrtem radku spustit funkcni Xka, bez devfs uz na druhem hned po startu site. U dister ktere maji Xka pov…

25. 12. 2003 11:29

mgolem (neregistrovaný)

podotykam ze chyba je urcite u mne, ale jednoho dne se pocitac nerozbehl, jak jsem zjistil, chyba nastala po "upgrade" initu, no co - aspon sem mohl znovu instalovat - dik za clanek (i nasledujici) - snad se dozvim, jak mohlo byt vse jednoduche :-)

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Vitalia.cz: 7 originálních adventních kalendářů pro mlsné

7 originálních adventních kalendářů pro mlsné

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

DigiZone.cz: ČT má dalšího zástupce v EBU

ČT má dalšího zástupce v EBU

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

Vitalia.cz: Říká amoleta - a myslí palačinka

Říká amoleta - a myslí palačinka

Vitalia.cz: Dáte si jahody s plísní?

Dáte si jahody s plísní?

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Vitalia.cz: Spor o mortadelu: podle Lidlu falšovaná nebyla

Spor o mortadelu: podle Lidlu falšovaná nebyla

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

DigiZone.cz: Flix TV má set-top box s HEVC

Flix TV má set-top box s HEVC

Měšec.cz: Jak levně odeslat balík přímo z domu?

Jak levně odeslat balík přímo z domu?

Podnikatel.cz: Zavře krám u #EET Malá pokladna a Teeta?

Zavře krám u #EET Malá pokladna a Teeta?

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život