ot Theodor(21-10-2000)

reiting (8)   [ dobre ]  [ zle ]

Printer Friendly Variant za otpechatvane

System-V raziasnena

Geoffrey Bennett - 07/17/2000

SHTe razgledame initsializatsiiata (init) i initsializatsionnite System-V skriptove, izpolzvani v povecheto Linux distributsii.

Purvata programa, koiato iadroto startira, sled kato draiverite za ustroistva veche sa zaredeni i root failovata sistema e montirana e /sbin/init. Konfiguratsionniiat fail za init e /etc/inittab.

Vseki red v inittab, koito ne e otbeliazan kato komentar (ne zapochva s #) sledva opredelen format, koito obiasniava koi programi triabva da budat startirani ot init na vsiako nivo na startirane (runlevel). Formatut e identifikator:nivo na startirane:deistvie:programa. Vsiako pole ima spetsifichno prednaznachenie. Eto edin primen inittab fail (po-skoro chast ot nego)

# /etc/inittab
#
# Format of this file:
# identifier:runlevels:action:program

# Default runlevel.
id:3:initdefault:

# System initialisation.
si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Run gettys in standard runlevels.
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

# Run xdm in runlevel 5.
x:5:respawn:/etc/X11/prefdm -nodaemon

Poleto na identifikatora predvizhda ot edno do chetiribukveno ime za suotvetniia red. Identifikatorut triabva da bude unikalen. Toi obiknovenno e sukrashtenie na tova kakvo predstavliava programata ili kakvo vurshi, no za getty protsesa (koito izkarva login prompta na ekrana vi) toi triabva da sudurzha imeto na terminala bez purvite tty bukvi. Naprimer getty protsesa, koito startira na purviia serien port (/dev/ttyS0) shte bude S0.

Poleto runlevel izbroiava nivata na startirane v koito programata shte se startira. Naprimer X displei menidzhura obiknovenno e nastroen da se startira samo v runlevel 5, no mingetty protsesite obiknovenno se izpolzvat v niva na startirane 2, 3, 4 i 5.

Funktsiite, obiknovenno svurzani sus vseki runlevel sa slednite:

0 halt - spirane rabotata na kompyutura;
1 single user mode - ednopotrebitelski rezhim na rabota;
2 multiuser, without NFS - mnogopotrebitelski rezhim na rabota bez NFS (Network File System);
3 full multiuser mode - pulen mnogopotrebitelski rezhim na rabota;
4 unused - ne se izpolzva;
5 X11 - X11 (X Windows);
6 reboot - Restartirane.

Peleto "deistvie" sudurzha klyuchova duma (kato respawn, wait, once), koiato pokazva kak triabva da bude startirana programata. Poleto "programa" sudurzha imeto na programata, koiato triabva da bude startirana, a sushto i neinite argumenti (optsii).

Klyuchovite dumi na poleto "deistvie" v inittab.

Nai-interesnata klyuchova duma na poleto "deistvie" e respawn. Tia kazva na init da startira dadenata programa v podhodiashtiia runlevel i da startira drugo kopie, kogato tozi protses zavurshi. Vie mozhe da vidite v inittab faila, che tazi vuzmozhnost se izpolzva pri mingetty protsesite.

Predi da eksperimentirate s tova deistvie proverete, dali e zareden login prompta na vtorata virtualna konzola (otvaria se s Alt-F2), sled tova se lognete v purvata virtualna konzola (Alt-F1) i napishete ps auxw | grep tty2 . SHTe vidite startiran protses, koito izglezhda taka:

root 14718 0.0 0.6 1092 408 tty2 S 13:11 0:00
/sbin/mingetty tty2

Prevklyuchete na vtorata virtualna konzola i napishete svoeto ime za logvane, no vse oshte ne pishete parolata si. Prevklyuchete na purvata konzola i startiraite ps komandata otnovo i shte vidite rezultat kato tozi otdolu

root 14718 0.0 1.3 2108 868 tty2 S 13:11 0:00 /bin/login
--

Vupreki, che mingetty protsesut e zavurshil, toi e ostavil sled sebe si nov login protses sus sushtiia identifikatsionen nomer na protsesa (PID). Kato protses sus sushtiia PID kato purvonachalniia mingetty protses vse oshte sushtestvuva init vse oshte niama da startira drug mingetty protses na tazi konzola.

Sled tova vuvedete parolata vuv vtorata virtualna konzola, povtorete ps komandata i shte vidite neshto kato tova

root 14718 0.0 1.7 2232 1112 tty2 S 13:11 0:00 login --
geoffrey

geoffrey 14830 3.7 1.6 1208 432 tty2 S 13:25 0:00 -bash

Vednuzh login da potvurdi vashata parola toi startira vashiia login shell (login obvivka - v sluchaia bash). login protsesa obiknovenno sushtestvuva, dokato ne izlezete (log out), no v niakoi sluchai toi shte zamesti sebe si sus vashata obvivka (po sushtiia nachin po koito mingetty zamestva sebe si s login). Protsesut shte izglezhda taka.

root 14886 0.4 0.6 1092 408 tty2 S 13:33 0:00 /sbin/mingetty tty2

init e inteligenten v tozi smisul, che ako zabelezhi, che toi restartira sushtiia protses protses toi shte go dezaktivira za niakolko minuti. Tova shte pomogne da se predpazi sistemata ot tvurde goliamo natovarvane, v sluchai, che programata, koiato init triabva da restartira ne raboti korektno. Tova se sluchva obiknovenno, kogato vie napishete pogreshno imeto na programata v /etc/inittab, ili kogato iztriete programa, kum koiato ima obrushtenie v inittab.

Za da vidite tova lichno natisnete 10 puti Ctrl+D, kogato se namirate na login prompta. Vie triabva da vidite suobshtenie kato dolnoto, koeto oznachava, che za izvestno vreme niama da imate login prompt.

INIT: Id "2" respawning too fast: disabled for 5 minutes

Ako niakoga poluchite takova suobshtenie mozhe da ne iskate da chakate 5 minuti, dokato init opita otnovo ( naprimer ako ste popravili problema, koito kara programata da se zatvaria tolkova burzo). V tozi sluchai napishete slednoto kill -1 1 ili /sbin/telinit q. Napisanoto igrae roliata na komanda za init da prochete otnovo svoia konfiguratsionen fail i da aktivira vsichki programi, koito predi tova sa bili dezaktivirani.

Deistvieto wait v /etc/inittab shte startira dadenata programa i init shte izchaka, dokato zavurshi izpulnenieto na programata. Za razlika ot respawn, kogato rabotata na programata zavurshi tia niama da bude startirana otnovo. V nashiiat primeren inittab wait se izpolzva za startiraneto na skripta /etc/rc.d/rc, koito e klyuchova chast ot initsializirashtite Sistem V skriptove.

Deistvieto sysinit se otnasia za programa, koiato triabva da bude startirana samo vednuzh pri startiraneto na sistemata (programite shte se startirat predi niakoe otdelno nivo na startirane (runlevel)). Pri sysinit deistiveto spisukut s nivata na startirane se ostavia prazen, zashtoto tuk toi ne e nuzhen.

Nai-nakraia deistvieto initdefault definira standartnoto nivo na startirane za vashata sistema. Imeto na programata se ignorira i triabva da bude ostaveno prazno.

Gornite primeri ilyustrirat nai-osnovnite deistviia. Za poveche informatsiia vizhte man stranitsata inittab(5).

init.d skriptove i uslugi

Vupreki, che init mozhe da bude izpolzvan za startirane i spirane na uslugi (takiva kato xdm) sushtestvuva po-udoben metod, koito se izpolzva za povecheto ot drugite uslugi; tova e shemata na initsializatsionni skriptove na System-V.

Purvata chast ot tazi shema e, che edin skript v /etc/rc.d/init.d direktoriiata (/etc/init.d v niakoi distributsii) se pazi za vsiaka usluga i vseki skript triabva da mozhe da priema edin argument - start ili stop. Naprimer, ako bihte iskali da sprete printerskata usluga (lpd) vednaga, vie triabva da mozhete da napishete
/etc/rc.d/init.d/lpd stop

Vseki skript shte priema start i stop kato parametri, no za povecheto uslugi ima i drugi nalichni parametri.

status

Tozi parametur suobshtava dali e startirana ili ne tazi usluga. Za uslugi s poveche ot edin demon (daemon) (kakto NFS, koito ima demon za mauntvane, demon za kvoti, a sushto taka i glaven NFS demon) parameturut status vi pokazva sustoianieto na vseki demon.

restart

Tova e sukratena komanda za spirane i otnovo startirane na uslugata.

reload

Tozi parametur dava komanda na uslugata da prochete otnovo konfiguratsionniia si fail. V mnogo sluchai e preporuchitelno e da se izpolzva reload vmesto restart. Taka se izbiagva kratkiia period, v koito uslugata ne e startirana.

The /etc/rc.d/rcx.d directories

Direktoriite /etc/rc.d/rcx.d sa sledvashtata chast ot shemata na initsializatsionni skriptove na System-V. Tuk h se otnasia do konkreten runlevel (ot 0 do 6) (niakoi distributsii durzhut tezi skriptove v direktoriia /etc/rcx.d).

Da razgledame /etc/rc.d/rc3.d direktoriiata.

ls -la
total 2
drwxr-xr-x 2 root root 1024 Apr 30 12:50 .
drwxr-xr-x 10 root root 1024 Apr 26 13:28 ..
lrwxrwxrwx 1 root root 13 Feb 26 1998 K15gpm -> ../init.d/gpm
lrwxrwxrwx 1 root root 15 Jan 16 18:57 K35dhcpd -> ../init.d/dhcpd
lrwxrwxrwx 1 root root 13 Apr 26 14:01 K35smb -> ../init.d/smb
lrwxrwxrwx 1 root root 15 Jun 2 1999 K50snmpd -> ../init.d/snmpd
lrwxrwxrwx 1 root root 13 Feb 26
1998 K60lpd -> ../init.d/lpd
lrwxrwxrwx 1 root root 14 Nov 11 1998 S05apmd -> ../init.d/apmd
lrwxrwxrwx 1 root root 17 Feb 3 1998 S10network -> ../init.d/network
lrwxrwxrwx 1 root root 16 Feb 3 1998 S20random -> ../init.d/random
lrwxrwxrwx 1 root root 15 Apr 26 13:28 S25netfs -> ../init.d/netfs
lrwxrwxrwx 1 root root 16 Feb 3 1998 S30syslog -> ../init.d/syslog
lrwxrwxrwx 1 root root 13 Feb 2 1999 S40atd -> ../init.d/atd
lrwxrwxrwx 1 root root 15 Feb 3 1998 S40crond -> ../init.d/crond
lrwxrwxrwx 1 root root 16 Jun 2 1999 S45pcmcia -> ../init.d/pcmcia
lrwxrwxrwx 1 root root 14 Apr 26 13:43 S50inet -> ../init.d/inet
lrwxrwxrwx 1 root root 18 Apr 26 13:28 S75keytable -> ../init.d/keytable
lrwxrwxrwx 1 root root 18 Feb 3 1998 S80sendmail -> ../init.d/sendmail
lrwxrwxrwx 1 root root 15 Jul 1 1999 S85httpd -> ../init.d/httpd
lrwxrwxrwx 1 root root 15 Feb 3 1998 S85sound -> ../init.d/sound
lrwxrwxrwx 1 root root 13 Jun 2 1999 S90xfs -> ../init.d/xfs
lrwxrwxrwx 1 root root 11 Feb 3 1998 S99local -> ../rc.local

Tuk ima mnogo simvolni vruzki, vsiaka ot koito sochi kum edin ot skriptovete v init.d direktoriiata. Kogato preminavame kum nov runlevel imenata na simvolnite vruzki se izpolzvat za da se opredeli koi konkretni uslugi triabva da budat startirani ili spriani i v kakuv red (naprimer mrezhovata usluga e neobhodima za povecheto ot ostanalite uslugi i zatova triabva da bude startirana po-rano).

Imeto na simvolnata vruzka triabva da otgovaria na sledniia format.

  • S (za 'Start') ili K (za 'Kill') za startirane ili spirane na uslugata v tozi runlevel

  • Dvutsifreno chislo, chrez koeto se opredelia reda v koito se poiaviavat uslugite (malkite chisla se startirat i spirat predi golemite chisla)

  • Ime na uslugata, za da e sigurno, che imenata sa unikalni.
  • Napirimer simvolnata vruzka S05apmd, koiato e purvata vruzka namirashta se v direktoriia /etc/rc.d/rc3.d oznachava che apmd shte bude purvata usluga, koiato shte se startira pri preminavane kum runlevel 3.

    Vuzmozhno e (makar i da e dosadno) tezi simvolni vruzki da se promeniat ruchno. Naprimer, ako reshite da startirate lpd v runlevel 3 vie mozhe da napishete slednoto.

    mv /etc/rc.d/rc3.d/K60lpd \

    /etc/rc.d/rc3.d/S40lpd.

    Po-malko dosaden metod za manipulirane na simvolni vruzki e da se izpolzva programata chkconfig napisana ot Red Hat. Naprimer, za da vidite nivata v koito uslugata e aktivirana napishete $ /sbin/chkconfig --list lpd i triabva da poluchite neshto kato lpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off. Za da startirate lpd uslugata v tezi niva, kudeto tia e nai-mnogo neobhodima napishete $ /sbin/chkconfig --list lpd on. Prepotvurdete otnovo s optsiiata --list i vie triabva da vidite, che lpd e aktivirana za niva na startirane 3, 4 i 5.

    rc skriptut

    Finalnata chast ot System-V initsializatsionnite skriptove e rc skripta, koito predstavliava maluk skript, koito sledi simvolnite vruzki i startira skriptovete v init.d direktoriiata.

    /etc/rc.d/rc skripta se startira na vseki runlevel, s parametur pokazvasht v koe nivo na startirane sme navlezli. Izpolzvaiki tazi informatsiia i simvolnata vruzka v podhodiashtata direkporiia e vupros na suvsem prosto shell programirane (izpolzvaiki komandite na bash ili druga obvivka) da se izvurshi podhodiashtoto deistvie.

    Istinskiiat rc skript sushto taka shte proveriava, dali ne se opitva da startira veche startirana usluga ili da spira usluga, koiato ne e startirana.

    #!/bin/sh

    # Get the new runlevel
    runlevel=$1

    # Run the ‘Kill’ scripts
    for i in /etc/rc.d/rc$runlevel.d/K*; do
    $i stop
    done

    # Run the ‘Start’ scripts
    for i in /etc/rc.d/rc$runlevel.d/S*; do
    $i start
    done

    Purvata chast ot skripta postavia purviia argument v promenlivata runlevel, koiato e dostupna chrez $runlevel. Purviiat tsikul vzima vsichki K skriptove ot suotvetnata runlevel direktoriia i gi startira sus argument stop. Vtoriiat tsikul izvikva S skriptovete sus start argument.

    Ako ne ste vizhdali kak se izpolzva tsikul v obvivkata niakolko prosti primera mogat da vi budat ot polza. Napishete slednata komanda na prompta na obvivkata.

    for i in fred bob sam; do

    echo $i

    done

    Obvivkata shte povtori chastta mezhdu do i done tri puti i vseki put tia shte dava stoinost na promenlivata $i suotvetno fred, bob i sam. CHastta mezhdu in i do ne e zadulzhitelno da e fiksiran spisuk. Mozhe da izpolzvata zvezdichki, za da generirate spisuk ot failovi imena. Za da opitate da go napravite izpolzvaite echo komandata po-dolu.

    echo /etc/rc.d/rc3.d/K*

    echo /etc/rc.d/rc3.d/S*

    runlevel=3

    echo /etc/rc.d/rc$runlevel.d/K*

    echo /etc/rc.d/rc$runlevel.d/S*


    << Win NT vs. Linux! | Rukovodstvo za namirane na pomoshtna informatsiia v Linux >>