Jemny uvod do startovacich skriptov

27.12.2007 18:20 | blackhole_ventYl

Kde koho mozno napadlo, ako vlastne Linux startuje a kde sa nastavuje, co sa spusti a co nie. Windowsy za tymto ucelom maju binarne registre a kopu srotu, ako to ale chodi na Linuxe? Toto je strucny (skor by som povedal, ze az z rychlika) pohlad na to, ako vyzeraju a ako funguju startovacie skripty v dnesnych Linuxovych systemoch.

Linux je historicky spaty so svojimi filozofickymi predchodcami System V UNIX a BSD UNIX. Oba su to UNIXy, ale od istej doby siel kazdy z nich viacmenej svojou vlastnou cestou. BSD ako prinieslo sockety, System V zasa IPC subsystem. Odlisnosti panovali (a panuju dodnes) aj v tom, ako jednotlive systemy startovali.

Zakladny rozdiel medzi BSD a SystemV je v tom, ze System V na rozdiel od BSD ma v init-e podporu runlevelov. Runlevel je informacia o tom, v akom stave momentalne operacny system je. Historicky je definovanych 7 runlevelov:
0 - system sa vypina
1 - jednouzivatelsky rezim
2 - obvykle nevyuzite, alebo to iste, co 3
3 - mnohouzivatelsky rezim bez grafickeho prostredia
4 - nevyuzite, alebo mnohouzivatelsky rezim s grafickym prostredim
5 - mnohouzivatelsky rezim s grafickym prostredim
6 - system sa restartuje

Linux vychadza z Minixu, ktory zrejme bol SystemV kompatibilny, preto aj Linuxovy init je SystemV kompatibilny a teda pozna runlevely. BSD init runlevely nepozna a teda take prikazy, ako telinit 3 moc velky zmysel nemaju.

Nie je vsetko ale az take jednoznacne, ked dojde na otazku startovacich skriptov Linuxu. Tu sa kreativite medze nekladu, preto drviva vacsina Linuxov obsahuje nejaku svoju vlastnu implementaciu startovacich skriptov. V zasade mozno tieto implementacie rozdelit na 2 rodiny:

  • BSD rodina
  • System V rodina

Dalej v tomto clanku, kdekolvek sa spomenie skriptovy subor, bude sa predpokladat, ze skript je pisany pre interpreter /bin/sh (coz je bash v Linuxoch v 99% pripadov a sh v BSD UNIXoch).

BSD rodina
Vychadza z povodnej filozofie startovacich skriptov BSD. V BSD neexistuju runlevely, system je teda riadeny jedinym startovacim skriptom, ktory obvykle na zaklade toho, ci su startovacie skripty jednotlivych sluzieb spustitelne, alebo nie, ich spusta, alebo na ne kasle. Kuprikladu sa v startovacom skripte moze nachadzat kod, ktory overi, ci je startovaci skript apache spustitelny, alebo nie a ked je spustitelny, spusti ho.

Rovnako existuje aj shutdown skript, ktory robi to iste (v obratenom poradi) pre vypnutie systemu.

V prostredi BSD startovacich skriptov sa spustenie / nespustenie danej sluzby riadi obvykle priznakom executable startovacieho skriptu prislusnej sluzby a je globalne pre vsetky runlevely.

V prostredi Linuxoveho runlevel-aware init-u je obvykle jeden startovaci a vypinaci skript rozdeleny na niekolko skriptov (napriklad rc.S, rc.M v Slackware), pricom jeden z nich riadi zakladne systemove startovacie operacie a dalsi sa stara o prepinanie medzi runlevelmi.

BSD-like startovacie skripty pouzivaju napriklad Arch Linux, Slackware Linux, Crux Linux a mozno aj niektore dalsie.

System V rodina
Pri startovacich skriptoch System V je vsetko komplikovanejsie a preto zo zaciatku aj menej prehladne. Kedze tu existuju runlevely, je nutne nakonfigurovat kazdy z nich osobitne a to tak, aby bolo mozne konfigovat aj prechod medzi jednotlivymi runlevelmi. Preto su startovacie skripty zhromazdene v jednom adresari (obvykle /etc/init.d/). Kazdy skript je schopny prijat jeden z parametrov start | stop. Kazdej jednotlivej instalovanej sluzbe na pocitaci prislucha jeden startovaci skript. Takisto existuje hlavny konfiguracny subor runlevelov (ktory ako jeden z mala nie je skriptom) /etc/inittab, ktory urcuje, ktory skript sa bude starat o systemovu inicializaciu a ako sa bude vstupovat a vystupovat z runlevelov).

Ako ale urcit, co sa kedy bude startovat? Podobne, ako v BSD, existuje jeden skript, ktory spravi zakladne nevyhnutne zalezitosti hned po starte systemu. Ten ale vykona len zivotne potrebne veci, aby bolo vobec mozne dostat shell. Nasleduje konfiguracia zavisla od runlevelu. Tu ma System V riesenu rc.d adresarmi. Kazdemu jednemu runlevelu patri jeden rc adresar (obvykle su umiestnene bud priamo v /etc, cize sa volaju /etc/rc0.d /etc/rc1.d alebo su umiestnene v /etc/init.d alebo niekde inde). Konvencia pomenovani je rozna, adresare sa mozu volat rc.0 az rc.6, alebo rc0.d az rc6.d, na tom nezalezi.

Princip fungovania SystemV tkvie v tom, ze sa do adresarov runlevelov umiestnuju (dnes su to symlinky, svojho casu to boli mozno hardlinky). Adresar runlevelu sa prehliada pri vstupe do runlevelu a pri vystupe z runlevelu. Aby sa dalo odlisit, pre ktoru akciu je dany skript urceny, skripty su odlisene nazvami. Skripty s prvym pismenom v nazve "S" (Start) sluzia k riadeniu startovania aplikacii pri vstupe do runlevelu. Na poradi ich spustania obvykle zalezi, preto hned za pismenom S nasleduje dvojmiestne poradove cislo skriptu. napriklad S00. A aby v tom nebol neporiadok, obvykle sa za poradove cislo umiestni bodka a nazov sluzby, ktoru skript obsluhuje. Poradove cisla nutne nemusia ist za sebou a obvykle ani nejdu, dolezite je len to, aby poradove cisla boli zotriedene s lubovolnymi medzerami v takom poradi, v akom sa maju spustat skripty. Kazdy symlink na skript sa spusti s parametrom start a skript si vykona operaciu, ktora je nutna k spusteniu danej sluzby.

Podobne, ako pri vstupe do runlevelu sa aj pri vystupe z runlevelu pustaju skripty. Tieto su oznacene zaciatocnym pismenom "K" (Kill). Skripty su opat pustene v tom (alebo mozno presne opacnom) poradi, v ktorom su ocislovane za pismenom K. Kazdy skript je spusteny s parametrom stop.

To znamena, ze pri starte systemu sa najprv spustia skripty nutne pre beh systemu (premontuje sa / ako read-write, pripoji sa /proc, swap, vycisti sa /tmp, skontroluju sa disky a pod.), nasledne sa v subore /etc/inittab zisti, ktory runlevel je defaultny (riadok initdefault). Prezrie sa adresar prisluchajuci tomuto runlevelu (napriklad /etc/rc3.d) a spustia sa vsetky skripty zacinajuce S v nom nasymlinkovane s parametrom start. Ked vsetky skripty dobehnu, system je pripraveny na pracu v runleveli. Ked uzivatel z terminalu zmeni runlevel, najprv sa spustia skripty zacinajuce K z adresara sucasneho runlevelu s parametrom stop. Nasledne sa prepne runlevel a spustia sa vsetky skripty zacinajuce S z adresara noveho runlevelu s parametrom start. Potom je system pripraveny na pracu v novom runleveli.

Co ale znamena, ze system je pripraveny na pracu v novom runleveli?
V dnesnych linuxoch to urcuje obsah inittabu. V inittabe je mozne urcit, v ktorych runleveloch ma byt dostupny ktory terminal a ktory program sa ma starat o jeho obsluhu. V unixoch sa o obsluhu terminalu stara tzv. getty proces. Getty prijima spojenie na terminal (ak sa jedna napriklad o terminal prostrednictvom modemovej linky), spusta program login, prihlasuje uzivatela a spusta jeho predvoleny shell. Ak sa ako spravca terminalu nastavi napriklad X server, dany terminal bude fungovat ako X konzola.

Rozsirenia
Pocas rokov ponad System V vznikli rozne rozsirenia roznych distribucii. System Gentoo napriklad obsahuje informaciu o stave sluzieb, takze nie je mozne spustit 2x po sebe jeden a ten isty skript sluzby a nemoze dojst ku konfliktom. Takisto obsahuje init depencies, co znaci, ze skript sa automaticky zaradi presne na take miesto, aby mal spustene vsetky sluzby, ktore vyzaduje (napriklad nema zmysel spustat apache skor, nez su nahodene sietove adaptery). Takisto existuju rozsirenia, ktore umoznuju nechat bezat niektoru sluzbu v danom runleveli aj napriek tomu, ze ma naschedulovany vypinaci skript, ak v cielovom runleveli existuje startovaci skript na rovnaku sluzbu.

Zaver
System V startovacie skripty su v dnesnych Linuxoch beznou zalezitostou a obvykle su skryte hlboko v systeme startovacich skriptov vasho distra (ak nemate BSD-like startovacie skripty). Ak existuje nadstavba systemu, alebo clovek riadne pochopi SystemV, su omnoho flexibilnejsie, ale lahko sa v nich da stratit prehlad. Naproti tomu BSD startovacie skripty su priamociare, jednoduche, ale v niektorych pripadoch je ich konfigurovatelnost obmedzena. Na zaver uz len dodam, ze nema velky zmysel definovat si ako defaultny runlevel levely 0 a 6, nema do adresarov pre tieto runlevely zmysel umiestnovat Kill skripty (ak niektory zo start skriptov nie je upraveny tak, ze je schopny zmenit runlevel) a vzhladom k tomu, ze vsetky skripty v startovacej faze sa spustaju ako blokujuce, netreba umiestnovat do skriptov volanie na take programy, ktore by mohli zablokovat beh skriptu, pretoze system nebude schopny do daneho runlevelu vstupit.

    • Re: Jemny uvod do startovacich skriptov 27.12.2007 | 20:10
      Avatar foOk   Používateľ

      Super.
      Spustim pc ( som pri nom fyzicky, ako inak ) nabehne nejaky boot ( grub )
      Teraz chcem editovat normalny boot distra a rovno sa pustim do editacie kernelu.
      Ten sa da editnut tak, aby ma hodil priamo za roota.
      avsak ako tomu zabranit, tak aby som nemohol zasahovat do start. scriptov?

      edit

      mam dual boot, teda boot loaderu sa nevyhnem

      -----------------------------

      Art is state of mind

      sloboda motýľov !
      • Re: Jemny uvod do startovacich skriptov 27.12.2007 | 20:11
        Avatar marvin   Používateľ

        skus formulovat otazku nejak jasnejsie..z grubu nemozes pokial viem editovat ziaden subor a ako root bez hesla sa dnes uz nedostanes editnutim boot moznosti v grube do ziadneho rozumne stareho distra,takze este raz a zrozumitelnejsie,pls:)
        ------
        I'm not drunk,I'm Irish!

        ------ Kto je Španielsko?Prečo je Hitler?Kedy je vľavo?
        • Re: Jemny uvod do startovacich skriptov 27.12.2007 | 21:40
          Avatar foOk   Používateľ

          nj:)

          ako zabranim editacii prikazov pred bootom systemu?

          grub dovoluje editaciu prikazov a ma akysi bash command line, teda mozes vytvarat nove prikazy ktore sa vykonaju pri bootnuti.

          A ja ti rucim ze sa dostanes do kazdeho, pokial toto nemas vyriesene.

          edit by TommyHot: dufam ze sa nenahnevas, ale zmazal som tieto tvoje posledne dva rovnake posty, pretoze tu boli viac krat :) asi refresh

          sloboda motýľov !
          • Re: Jemny uvod do startovacich skriptov 27.12.2007 | 22:29
            Avatar marvin   Používateľ

            grub umoznuje casti svojej funkcnosti zaheslovat v grub.conf - tymto sposobom sa daju napr skryt polozky boot menu alebo zamknut moznost editacie boot prikazov. vid napr http://www.gnu.org/software/grub/manual/html_node/Security.html#Security
            mna by vsak ozaj zaujimalo akym sposobom konkretne vies ziskat rootshell bez hesla len za pomoci grubu (ak neratame zobrazenie /etc/shadow a nasledne cracknutie hashu hesla)? predpokladam ze si nemal na mysli dodanie parametru "1" ,"single" alebo "s" na koniec riadku kernel pretoze to uz par rokov nefunguje v ziadnom slusnom distre.

            ps: teraz si editol svoj povodny comment,takze pre zmenu ja s mojou ziadostou aby si sa vyjadril jasnejsie vyzeram ako debil:) ale ok:)
            ------
            I'm not drunk,I'm Irish!

            ------ Kto je Španielsko?Prečo je Hitler?Kedy je vľavo?
            • Re: Jemny uvod do startovacich skriptov 28.12.2007 | 11:17
              Avatar foOk   Používateľ

              svoj povodny comment som editol, predtym ako si dal reply.
              ked nahodou nie, tak prepac, nebolo to vedome.

              rootshell bez hesla, hore uz o tom pise ventYl ako.

              dik za grub.conf pozriem sa nato.

              :)

              -------------------------------

              Art is state of mind

              sloboda motýľov !
              • Re: Jemny uvod do startovacich skriptov 04.01.2008 | 00:40
                Avatar blackhole_socket   Používateľ

                myslím že toto ti pomôže
                _______________________________________________________
                Gentoo READY ! ...

      • Re: Jemny uvod do startovacich skriptov 28.12.2007 | 00:01
        Avatar blackhole_ventYl   Používateľ

        v LILO je na to opsna restricted a password pri jednotlivych volbach imageov na bootovanie, co ti umozni nastavit heslo, ktore je potrebne, ak chces editovat parametre kernelu a napriklad podhodit /bin/sh ako init :)) grub ma urcite similar funkcionalitu

        ---
        Cuchat s nadchou, to je ako sniffovat bez promiscu.

        --- Cuchat s nadchou, to je ako sniffovat bez promiscu.
    • Re: Jemny uvod do startovacich skriptov 27.12.2007 | 21:30
      qaws   Návštevník

      Pekny clanok, aspon sa z neho dalo nieco naucit, dufam, ze bude pokracovanie.

      Este ako je mozne, ze ja mam zevraj runlevel 2? Som na X (takze s graf. prostredim), multiuser mode ci mam, to neviem. Je to mozno sposobene tym, ze mam Upstart, co ma ciastocne nahradit init.d, ale teoreticky by to malo emulovat runlevely.

      ____________________________________________________________
      Ked niecim nie som takmer uplne presvedceny, nepisem to. Vzdy uvadzajte vecne a najdolezitejsie argumenty, inak ma nepresvedcite. Ked sa mylim, opravte ma; rad sa poucim.

      • Re: Jemny uvod do startovacich skriptov 27.12.2007 | 22:11
        Avatar marvin   Používateľ

        to co ventyl napisal v clanku je zauzivana (resp. odporucana) konvencia. technicky nic nebrani tomu aby si v runleveli 2 mal xka. akurat runlevely 0,1 (niekde oznacene aj s) a 6 su brane viac-menej ako nemenny standard,inak je to zavisle na distre.
        ------
        I'm not drunk,I'm Irish!

        ------ Kto je Španielsko?Prečo je Hitler?Kedy je vľavo?
      • Re: Jemny uvod do startovacich skriptov 29.12.2007 | 13:58
        Avatar blackhole_ventYl   Používateľ

        err... pokracovanie? ake? :) neviem, co dalsie by sa dalo napisat ;)

        ---
        Cuchat s nadchou, to je ako sniffovat bez promiscu.

        --- Cuchat s nadchou, to je ako sniffovat bez promiscu.
        • Re: Jemny uvod do startovacich skriptov 29.12.2007 | 17:57
          qaws   Návštevník

          Prave ani ja neviem a chcel by som sa dozvediet :D.
          Uz nic nechcem :D, asi som si neuvedomil, ze jemny uvod moze znamenat aj nieco ine ako diel 1/x.
          ____________________________________________________________
          Ked niecim nie som takmer uplne presvedceny, nepisem to. Vzdy uvadzajte vecne a najdolezitejsie argumenty, inak ma nepresvedcite. Ked sa mylim, opravte ma; rad sa poucim.

    • Re: Jemny uvod do startovacich skriptov 29.12.2007 | 16:45
      martin88   Návštevník

      Ruku do ohna by som za to nedal, ale myslim, ze runlevel 2 je jednouzivatelsky s podporou siete.

      • Re: Jemny uvod do startovacich skriptov 29.12.2007 | 18:02
        qaws   Návštevník

        Na http://en.wikipedia.org/wiki/Runlevel je napisane, ze runlevel 2 je len multiuser bez siete alebo nastavitelne prip. nepouzite (ako je to v clanku).

        Niekde som cital, ze runlevely 2 az 5 su vsetky variabilne, takze je mozne, ze mas pravdu, ale len v specifickych pripadoch.
        ____________________________________________________________
        Ked niecim nie som takmer uplne presvedceny, nepisem to. Vzdy uvadzajte vecne a najdolezitejsie argumenty, inak ma nepresvedcite. Ked sa mylim, opravte ma; rad sa poucim.

        • Re: Jemny uvod do startovacich skriptov 30.12.2007 | 13:35
          martin88   Návštevník

          Tak pravdu som na koniec nemal :) (minimalne u mna na SUSE). 2ka je tu ako multiuser bez siete.

          Mrkol som do LSB (LSB != LSD) a tam sa pise:
          ....
          Conforming implementations are not required to provide these exact run levels or give them the meanings described here, and may map any level described here to a different level which provides the equivalent functionality.
          ....
          => V kazdom distre mozu byt runlevely ocislovane lubovolne.

          P.S. Ospravedlnujem sa za tu mylnu informaciu ktoru som pustil do eteru ....

      • Re: Jemny uvod do startovacich skriptov 29.12.2007 | 19:01
        Avatar blackhole_ventYl   Používateľ

        Zalezi od distra, slackware napriklad runlevel 2 nepouziva. Okrem toho, ze ti siet nespustia v singleuser rezime skripty, neznamena, ze si ju nemozes spustit sam, to nie je ako vo Windowse, ze potrebujes samostatny "runlevel" na to, aby si nieco vedel robit, ked ti to zhnije. Proste si rucne spustis /etc/init.d/network start a neriesis.

        Ale nic nevylucuje, ze v Ubuntu je runlevel 2 nastaveny ako "jednouzivatelsky s podporou siete". Ubuntu sa potrebuje podobat na Widla.

        ---
        Cuchat s nadchou, to je ako sniffovat bez promiscu.

        --- Cuchat s nadchou, to je ako sniffovat bez promiscu.