Hlavní navigace

Source Mage GNU/Linux: není init jako init (2)

Ladislav Hagara 21. 5. 2004

Na linuxovém tržišti: "Už máme téměř všechno. Chybí nám pouze init." "Vezmeme System V init nebo BSD init?" "V žádném případě. K výjimečné distribuci pouze výjimečný init." "Daemontools, Minit, Jinit, Pinit, Runit, SSS, BusyBox, Depinit, Serel, Twsinit nebo Simpleinit?" "Simpleinit-MSB!!!"

Source Mage GNU/Linux

Jak již bylo zmíněno v části Není init jako init – I, k spouštění a zastavování linuxových systémů slouží obvykle System V init nebo BSD init. Kromě těchto dvou nejrozšířenějších initů mohou dobře posloužit také alternativní inity. Dnešní díl je věnován jejich stručnému přehledu a implementaci initu Simpleinit-MSB v Source Mage GNU/Linux.

Daemontools

Daemontools jsou určeny k ovládání unixových služeb/démonů. Tato sada nástrojů je neodmyslitelně svázána především s poštovním serverem qmail, jmenným serverem djbdns a internetovým superserverem ucspi-tcp. Není divu. Jedná o softwarové produkty stejného autora – D. J. Bernsteina.

Služby běžící pod dohledem daemontools mají své vlastní konfigurační adresáře (například /etc/sshd). Jediným povinným souborem v konfiguračním adresáři je soubor run definující start služby (exec sshd). Daemontools (přesněji procesy svscan a supervise) monitorují adresář /service. Pokud se v něm objeví nový podadresář (nová služba) obsahující soubor run, je tento soubor automaticky spuštěn. Přidat i spustit novou službu lze pouhým vytvořením symbolického linku (ln -s /etc/sshd /services). Službu lze odstranit odstraněním linku. Služby jsou monitorovány. V případě pádu jsou opětovně nahozeny.

Běžně jsou daemontools používány pouze ke spouštění služeb. K inicializaci systému a také k vlastnímu spuštění daemontools je používán některý z běžných initů. V systému tak „zbytečně“ běží dva „inity“. Tomu lze předejít dvěma způsoby. Zbavit se initu a daemontools (proces svscan) spouštět jako proces s číslem 1, tj. jako proces init. Druhou možností je zbavit se jak běžného initu, tak i daemontools, a použít některý z alternativních, na daemontools založených initů.

Minit

Alternativní init minit vychází z initu Simpleinit. Také definuje závislosti mezi podsystémy. Patří mezi menší inity. Lze jej sestavit s knihovnou dietlibc. Je používán například v linuxové distribuci dietlinux, což je linuxová distribuce založená právě na dietlibc. Init minit využívá ke komunikaci dvě pojmenované roury /etc/minit/in a /etc/minit/out. Pro neznalé: pojmenovaná roura (named pipe) je speciální soubor sloužící ke komunikaci mezi procesy. Pojmenovanou rouru lze vytvořit například příkazem mkpipe. Ve výpisu ls -l ji lze poznat podle znaku p zobrazeného před přístupovými právy.

Jinit

Init jinit je také založen na Simpleinit konceptu. Zatím ale nepodporuje provide(8). Je napsán v C++, což způsobuje, že je větší než jiné inity. Lze jej použít v read-only systémech, poněvadž komunikuje pomocí front zpráv. Má propracované závislosti mezi spouštěnými podsystémy. Zastavení síťového podsystému například způsobí zastavení všech na síti závislých podsystémů (webový server, poštovní server, …). Používá jiný formát souboru /etc/inittab, nepodporuje úrovně běhu systému. Dokáže zabezpečit neustálý běh (respawn) určených příkazů (procesů) bez nutnosti jejich zmínění v souboru /etc/inittab. Slouží k tomu příkaz need s volbou –respawn. Init jinit tak umožňuje již v průběhu kontroly souborových systémů otevřít read-only terminálové sezení. Není nutné čekat na naběhnutí celého systému.

Pinit

Init pinit se od zbylých inicializačních modelů liší především tím, že konfigurace jednotlivých podsystému není uložená v klasických textových souborech, ale v XML souborech. Jeho požadavkem jsou knihovny LibXML a Glib. Místo obvyklých inicializačních skriptů jsou použity binární moduly. Pro jejich běh proto není nutná přítomnost příkazového interpretu, obvykle bashe.

Runit

Init runit je založen na daemontools. Kromě Linuxu běží spolehlivě také na OpenBSD, FreeBSD, Mac OS X nebo Solarisu. Init runit definuje tři stádia běhu systému: zavádění, vlastní běh a ukončování. V prvním stádiu, řízeném skriptem /etc/runit/1, jsou spouštěny jednorázové inicializační úlohy. Skript /etc/runit/2 běží, dokud není initu sdělen požadavek na ukončení nebo restart systému (halt nebo reboot). Poté je spuštěn skript /etc/runit/3. Init runit lze také sestavit s knihovnou dietlibc.

SSS

V diskusi k sedmé části tohoto seriálu zmínil Martin Marešsvou vlastní „potvůrku“ jménem sss (system startup and shutdown). Cílem sss je zpřehlednění systému initscriptů. Místo několika konfiguračních a inicializačních skriptů nacházejících se v různých podadresářích je veškerá konfigurace initu sss umístěna v jediném konfiguračním souboru.

BusyBox

Spouštění mini distribucí je často zajišťováno initem obsaženým v BusyBox. Jedná se o binární spustitelný soubor, ve kterém je kromě initu obsažena celá řada základních linuxových nástrojů (ash, bunzip2, chmod, ls, mount, vi, …). V systémech využívajících BusyBox jsou běžné příkazy realizovány pouze jako symbolické linky na tento binární soubor. Nástroje obsaženy v BusyBox se samozřejmě nemohou, co se týče množství podporovaných voleb a vlastností, srovnávat s plnohodnotnými linuxovými nástroji. Pro mini systémy jsou však obvykle postačující.

Při vývoji BusyBox je kladen důraz na optimalizaci na velikost a omezené zdroje. BusyBox je modulární. Při jeho překladu lze definovat, které nástroje a vlastnosti budou ve výsledním souboru obsaženy. K BusyBox stačí přidat linuxové jádro, několik speciálních souborů v adresáři /dev, několik konfiguračních souborů v adresáři /etc a vznikne fungující linuxový systém.

Init v BusyBox nepodporuje úrovně běhu systému. Položky runlevels v /etc/inittab jsou ignorovány. BusyBox init ke své činnosti nevyžaduje ani soubor inittab. Pokud tento soubor není nalezen, je použito implicitní nastavení.

Depinit, Serel, Twsinit, …

Své uživatele mají i další alternativní inity, například depinit, serel nebo také pravděpodobně nejmenší z initů: twsinit.

Od sysvinit k Simpleinit-MSB

Source Mage GNU/Linux zdědil po svém předchůdci, linuxové distribuci Sorcerer, inicializační model sysvinit. Vytváření startovacích a ukončovacích linků (S a K linků) potřebných pro sysvinit bylo zprvu součástí spellů. V souborů CONFIGURE byla umístěna otázka, zda je zájem o spouštění aplikace při startu systému. Odpověď na tuto otázku byla testována v souboru BUILD. V případě zájmu byly S a K linky vytvořeny.

CONFIGURE

if  !  grep  -q  "SSHD_BOOT="  $SPELL_CONFIG;  then

  if    query  "Invoke SSHD via init at boot?" y
  then  echo   "SSHD_BOOT=y"  >>  $SPELL_CONFIG
  else  echo   "SSHD_BOOT=n"  >>  $SPELL_CONFIG
  fi

fi

BUILD

...
make install
...
case $SSHD_BOOT  in
  y|Y|j|J) cp $SCRIPT_DIRECTORY/sshd.sh  /etc/init.d

      ln  -sf  ../init.d/sshd.sh  /etc/rc0.d/K50sshd
      ln  -sf  ../init.d/sshd.sh  /etc/rc6.d/K50sshd

      ln  -sf  ../init.d/sshd.sh  /etc/rc1.d/S35sshd
      ln  -sf  ../init.d/sshd.sh  /etc/rc2.d/S35sshd
      ln  -sf  ../init.d/sshd.sh  /etc/rc3.d/S35sshd
...

sshd.sh

#!/bin/sh

case $1 in
     start|restart)  echo   "$1ing sshd."
...

Snahou vývojářů, především správců spellů, bylo přesunout vytváření linků přímo do sorcery. Proč opakovaně vkládat příkazy pro vytváření linků do jednotlivých spellů, když mohou být součástí sorcery?

Po vylepšení sorcery stačilo umístit inicializační skript do adresáře init.d vytvořeného v rámci spellu. Skript obsahoval seznam úrovní, ve kterých měla služba běžet a ve kterých běžet neměla (SMGL-START a SMGL-STOP). Kromě souboru BUILD mohl být odstraněn i soubor CONFIGURE. Pokud spell obsahoval adresář init.d a v něm inicializační skript, bylo položení otázky i vytvoření S a K linků zabezpečeno přímo sorcery.

Současně s úpravou sorcery byly dle standardu přejmenovány inicializační skripty. Soubor sshd.sh byl přejmenován na sshd.

sshd

#!/bin/sh
#
# SMGL-script-version=20030224
# SMGL-START:1 2 3 4 5:S35
# SMGL-STOP:0 6:K50

. /etc/init.d/functions


case $1 in

        start)  echo "$1ing sshd."
                loadproc sshd
                ;;
...

Init sysvinit byl následně nahrazen initem Simpleinit-MSB. Inicializační skripty bylo nutné opět upravit. Poznámky o úrovních mohly být vyhozeny. Musela být přidána klíčová slova jako RUNLEVEL, PROVIDES nebo NEEDS.

sshd

#!/bin/sh

PROGRAM=/usr/sbin/sshd
RUNLEVEL=3
NEEDS="+network +remote_fs"

. /etc/init.d/smgl_init

start() {
  echo -n "Starting sshd..."
...

Práce s Simpleinit-MSB

Běžnému uživateli je jedno, jaký init je v jeho systému používán. Mnoho uživatelů Source Mage GNU/Linux si vůbec neuvědomilo, že sysvinit byl nahrazen initem Simpleinit-MSB. Změnilo se pouze to, že systém startoval o něco rychleji a při startu byly na obrazovce zobrazovány jiné informace.

Problém nastává až při úpravách chování initu. K povolování či zakazování, k spouštění či ukončování jednotlivých podsystémů nelze použít standardních uživatelsky přívětivých nástrojů (například ksysv). Ty jsou vytvářeny především pro sysvinit a o Simpleinit-MSB vůbec netuší.

V operačním systému Linux obvykle platí, že při změnách v jednotlivých podsystémech není nutné restartovat celý systém. Stačí restartnout daný podsystém. Toho lze dosáhnout spouštěním inicializačních skriptů s požadovanou volbou, například /etc/rc.d/init­.d/sshd restart. V Source Mage lze postupovat obdobně. Inicializační skripty jsou ale umístěny v adresářích představujících úrovně běžícího systému. Například sshd je spouštěn na úrovni 3, spustit jej lze tedy příkazem /etc/init.d/run­levels/%3/sshd start. Doporučuje se použití příkazu telinit. Spuštění sshd lze docílit příkazem telinit run sshd start, jeho zastavení příkazem telinit run sshd stop. K zakázání spouštění sshd při startu systému lze použít telinit disable sshd, k opětovnému povolení telinit enable sshd. Při povolování a zakazování nejsou žádné soubory editovány nebo dokonce rušeny. Inicializačním skriptům se pouze přidá nebo ubere právo na spouštění. Zakázané podsystémy lze vypsat příkazem telinit disabled. Změnit úroveň běhu systému lze příkazem telinit switch 5. Všechny volby příkazu telinit lze vypsat pomocí telinit help.

Implicitní úroveň běhu systému není definována v souboru /etc/inittab, nýbrž v souboru /etc/sysconfig/i­nit (DEFAULT_RUNLE­VEL=3).

Závislosti mezi podsystémy jsou definovány pomocí klíčových slov NEEDS a PROVIDES. Například fam může být spuštěn až poté, co je spuštěn portmap. Soubor /etc/init.d/run­levels/%3/por­tmap tedy obsahuje PROVIDES=portmap a soubor /etc/init.d/run­levels/%3/smgl_fam zase NEEDS=„+portmap“.

Paralelní zavádění systému (parallel booting)

Source Mage GNU/Linux umožňuje paralelní zavádění systému. Standardně je tato vlastnost zakázána, lze ji povolit nastavením proměnné PARALLEL_INIT=„yes“ v souboru /etc/sysconfig/i­nit. Simpleinit-MSB tak nemusí čekat na dokončení spouštění jednotlivých podsystémů. Nezávislé podsystémy mohou být spouštěny současně. Tato vlastnost si vyžádala změnu v způsobu zobrazování informací o spouštění a ukončování jednotlivých podsystémů. Informace už nemohou být zobrazovány na jediném řádku (xinetd … [OK]). Při vypisování několika řádků současně (podsystémy jsou spouštěny paralelně) není možné vypsat informaci o výsledku spuštění podsystému (OK nebo FAIL) na stejném řádku jako informaci o jeho startu. Při startu xinetd je tak na samostatném řádku zobrazena informace xinetd: Starting xinetd… a po jeho naběhnutíxinetd: success. Mezi těmito řádky může být zobrazeno mnoho řádků vztahujících se k jiným podsystémům.

Budoucnost Simpleinit-MSB

Samotný autor Simpleinit-MSB v konferenci věnované Linux From Scratch 11. srpna 2003 uvádí, že cítí potřebu ještě lepšího inicializačního modelu a Simpleinit-MSB považuje za slepou větev. Slíbil však opravovat chyby. Vydáním verze 1.2 to také dodržel. Verze 1.1 přestala v sobotu 10. ledna 2004 ve 13 hodin 37 minut a 04 sekund UTC fungovat.

V diskusích o budoucnosti Source Mage GNU/Linux se občas objevují názory, že by se mělo přejít na „lepší“ init. Zastánci Simpleinit-MSB tvrdí, že není problém libovolnou požadovanou vlastnost do Simpleinit-MSB přidat. Nic tomu nebrání, jedná se o GPL software. Zatím se ale nenašel nikdo, kdo by se initem Simpleinit-MSB vážně zabýval. Nemáte zájem?

Našli jste v článku chybu?

25. 5. 2004 15:06

Zdenek Pavlas (neregistrovaný)

Jo, to me taky napadlo. Nebo keca, lidem kteri pouzivaji uchylarny jako SysV IPC, kdyz existuje POSIXove IPC, neverim ani spojku ve vete. :)

25. 5. 2004 10:25

JirkaS (neregistrovaný)

Mozna uvazuje pripad, kdy roura z nejakeho duvodu na filesystemu neexistuje a tudiz by musel pri startu volat 'mkfifo'.

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

Přehledná titulka, průvodci, responzivita

Podnikatel.cz: Vrátí zvýhodnění, ale výrazně omezí paušály

Vrátí zvýhodnění, ale výrazně omezí paušály

Podnikatel.cz: 1. den EET? Problémy s pokladnami

1. den EET? Problémy s pokladnami

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

Podnikatelům dorazí varování od BSA

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

EET: Totálně nezvládli metodologii projektu

Podnikatel.cz: Chaos u EET pokračuje. Jsou tu další návrhy

Chaos u EET pokračuje. Jsou tu další návrhy

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

DigiZone.cz: Rádio Šlágr má licenci pro digi vysílání

Rádio Šlágr má licenci pro digi vysílání

Vitalia.cz: Znáte „černý detox“? Ani to nezkoušejte

Znáte „černý detox“? Ani to nezkoušejte

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

Podnikatel.cz: Babiše přesvědčila 89letá podnikatelka?!

Babiše přesvědčila 89letá podnikatelka?!

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

Vypadl Google a rozbilo se toho hodně

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

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

DigiZone.cz: ČRa DVB-T2 ověřeno: Hisense a Sencor

ČRa DVB-T2 ověřeno: Hisense a Sencor

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?

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

Flix TV má set-top box s HEVC

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

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č?