Personal tools

Difference between revisions of "Procesul de initializare al unui sistem Slackware GNU/Linux"

From linux360

Jump to: navigation, search
Line 204: Line 204:
 
#  6 = reboot
 
#  6 = reboot
 
</pre>
 
</pre>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;In fisierul /etc/inittab, campul dedicat nivelurilor de rulare trebuie sa contina o lista de niveluri de rulare pentru care trebuie executata actiunea din campul actiune. Vom vedea imediat ce inseamna toate acestea.
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;In fisierul /etc/inittab, campul dedicat nivelurilor de rulare trebuie sa contina o lista de niveluri de rulare pentru care trebuie executata o actiune ce, in majoritatea cazurilor. Vom vedea imediat ce inseamna toate acestea.
  
* Campul actiune: Descrie actiunea pe care init o s-o realizeze pentru o lista de niveluri de rulare. Exista mai multe tipuri de actiuni, printre care:
+
* Campul actiune: Descrie actiunea pe care init o sa o realizeze pentru o lista de niveluri de rulare. Exista mai multe tipuri de actiuni, printre care:
  
  
Line 214: Line 214:
  
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''once''': procesul va fi executat o singura data, de indata ce se va intra in nivelul de rulare
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''once''': procesul va fi executat o singura data, de indata ce se va intra in nivelul de rulare
 
  
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''sysinit''': intrarea ce contine aceasta actiune specifica procesul ce trebuie executat in timpul initializarii sistemului de catre init. De obicei, acest, dupa cum vom vedea, scriptul BASH /etc/rc.S.
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''sysinit''': intrarea ce contine aceasta actiune specifica procesul ce trebuie executat in timpul initializarii sistemului de catre init. De obicei, acest, dupa cum vom vedea, scriptul BASH /etc/rc.S.
Line 220: Line 219:
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''initdefault''': intrarea ce contine aceasta actiune specifica si nivel de rulare care va fi executat de catre init, imediat dupa ce sistemul a fost initializat (prin intermediul scriptului rc.S.)
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''initdefault''': intrarea ce contine aceasta actiune specifica si nivel de rulare care va fi executat de catre init, imediat dupa ce sistemul a fost initializat (prin intermediul scriptului rc.S.)
  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''ctrlaltdel''':
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''ctrlaltdel''': procesul va fi executat atunci cand init va primi semnalul SIGINIT. Semnalul SIGINIT este trimis atunci cand sint apasate tastele CTRL-ALT-DELETE.
 +
 
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dupa cum se observa, majoritatea actiunilor merg mana in mana cu un proces. Procesul este specificat in campul proces.
 +
 
 +
* Campul proces: Specifica un proces ce trebuie executat la intrarea intr-un nivel de rulare. Procesul poate fi o comanda sau un script.
 +
 
 +
 
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ca sa intelegem mai bine ce inseamna toate acestea, vom analiza un fisier /etc/inittab.
 +
 
 +
<pre>
 +
err@coliba:~$ cat -n /etc/inittab
 +
    1  #
 +
    2  # inittab      This file describes how the INIT process should set up
 +
    3  #              the system in a certain run-level.
 +
    4  #
 +
    5  # Version:      @(#)inittab            2.04    17/05/93        MvS
 +
    6  #                                      2.10    02/10/95        PV
 +
    7  #                                      3.00    02/06/1999      PV
 +
    8  #                                      4.00    04/10/2002      PV
 +
    9  #
 +
    10  # Author:      Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
 +
    11  # Modified by:  Patrick J. Volkerding, <volkerdi@slackware.com>
 +
    12  #
 +
    13
 +
    14  # These are the default runlevels in Slackware:
 +
    15  #  0 = halt
 +
    16  #  1 = single user mode
 +
    17  #  2 = unused (but configured the same as runlevel 3)
 +
    18  #  3 = multiuser mode (default Slackware runlevel)
 +
    19  #  4 = X11 with KDM/GDM/XDM (session managers)
 +
    20  #  5 = unused (but configured the same as runlevel 3)
 +
    21  #  6 = reboot
 +
    22
 +
    23  # Default runlevel. (Do not set to 0 or 6)
 +
    24  id:3:initdefault:
 +
    25
 +
    26  # System initialization (runs when system boots).
 +
    27  si:S:sysinit:/etc/rc.d/rc.S
 +
    28
 +
    29  # Script to run when going single user (runlevel 1).
 +
    30  su:1S:wait:/etc/rc.d/rc.K
 +
    31
 +
    32  # Script to run when going multi user.
 +
    33  rc:2345:wait:/etc/rc.d/rc.M
 +
    34
 +
    35  # What to do at the "Three Finger Salute".
 +
    36  ca::ctrlaltdel:/sbin/shutdown -t5 -r now
 +
    37
 +
    38  # Runlevel 0 halts the system.
 +
    39  l0:0:wait:/etc/rc.d/rc.0
 +
    40
 +
    41  # Runlevel 6 reboots the system.
 +
    42  l6:6:wait:/etc/rc.d/rc.6
 +
    43
 +
    44  # What to do when power fails.
 +
    45  pf::powerfail:/sbin/genpowerfail start
 +
    46
 +
    47  # If power is back, cancel the running shutdown.
 +
    48  pg::powerokwait:/sbin/genpowerfail stop
 +
    49
 +
    50  # These are the standard console login getties in multiuser mode:
 +
    51  c1:1235:respawn:/sbin/agetty 38400 tty1 linux
 +
    52  c2:1235:respawn:/sbin/agetty 38400 tty2 linux
 +
    53  c3:1235:respawn:/sbin/agetty 38400 tty3 linux
 +
    54  c4:1235:respawn:/sbin/agetty 38400 tty4 linux
 +
    55  c5:1235:respawn:/sbin/agetty 38400 tty5 linux
 +
    56  c6:12345:respawn:/sbin/agetty 38400 tty6 linux
 +
    57
 +
    58  # Local serial lines:
 +
    59  #s1:12345:respawn:/sbin/agetty -L ttyS0 9600 vt100
 +
    60  #s2:12345:respawn:/sbin/agetty -L ttyS1 9600 vt100
 +
    61
 +
    62  # Dialup lines:
 +
    63  #d1:12345:respawn:/sbin/agetty -mt60 38400,19200,9600,2400,1200 ttyS0 vt100
 +
    64  #d2:12345:respawn:/sbin/agetty -mt60 38400,19200,9600,2400,1200 ttyS1 vt100
 +
    65
 +
    66  # Runlevel 4 used to be for an X window only system, until we discovered
 +
    67  # that it throws init into a loop that keeps your load avg at least 1 all
 +
    68  # the time. Thus, there is now one getty opened on tty6. Hopefully no one
 +
    69  # will notice. ;^)
 +
    70  # It might not be bad to have one text console anyway, in case something
 +
    71  # happens to X.
 +
    72  x1:4:respawn:/etc/rc.d/rc.4
 +
    73
 +
    74  # End of /etc/inittab
 +
</pre>
 +
 
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Vom analiza fiecare intrare, explicand-o.
 +
 
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Prima intrare, cea de la linia 24, are urmatoarele calitati: Este identificata prin sirul de caractere "id" (datorita campului id, faptul ca valoare campului coincide cu numele acestuia nu are vreo importanta). Campul nivelului de rulare este ocupat de caracterul "3". Campul actiunii este ocupat de 'initdefault', ceea ce inseamna ca init va intra in nivelul de rulare specificat de catre acest camp, adica, in cazul nostru, "3". Campul proces lipseste doarece intrarea, continand actiunea 'initdefault', nu necesita un proces, acesta fiind oricum ignorat daca ar fi specificat.
 +
 
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A doua intrare, cea de la linia 27, are urmatoarele calitati: Este identificata prin sirul de caractere "si". Campul nivelului de rulare este ocupat de caracterul "S".Campul actiunii este ocupat de  catre "sysinit", iar procesul este scriptul /etc/rc.d/rc.S. Faptul ca "sysinit" ocupa campul actiune ii spune lui init sa execute procesul din campul proces (in cazul acest, ii spune lui init sa execute scriptul /etc/rc.d/rc.S) inainte de a intra in vreun nivel de rulare(nivelul "3", in cazul nostru ^^).
 +
 
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A treia intrare, cea de la linia 30, are urmatoarele calitati:Este identificata prin sirul de caractere "su". Campul nivelului de rulare este "1S", ceea ce-nseamna ca intrarea se aplica atat nivelului de rulare "1", cat si nivelului de rulare "S".Campul actiunii este ocupat de catre "wait", iar procesul de catre scriptul /etc/rc.d/rc.K. Faptul ca "wait" ocupa campul actiune ii spune lui init sa execute scriptul /etc/rc.d/rc.K atunci cand va intra in oricare dintre nivelurile de rulare specificate in campul nivelului de rulare.
 +
 
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aaa..
 +
[hmm, poate-ar fi mai bine altfel...]
  
 
[...]
 
[...]
 
* Campul proces: Specifica un proces ce trebuie executat la intrarea intr-un nivel de rulare. Procesul, in cazul de fata, nu este nici mai mult nici mai putin decat un program(fisier executabil, mai exact) cu parametrii sai de executie.
 

Revision as of 01:48, 25 November 2006

      Primul pas catre atingerea rangul de administrator de sistem nu este configurarea serverului X, nici jonglatul cu un parafoc, ci intelegerea procesului de demarare al unui sistem de operare si de initializare a serviciilor oferite de acesta. Odata inteles acest proces, se poate fasona profilul sistemului si se pot alege serviciile care se doresc a fi pornite, de abia dupa care atentia poate fi focalizata catre configurarea unui serviciu anume.

      In continuare, voi incerca sa explic, sumar, demararea sistemului de operare GNU/Linux si, in detaliu, procesul de initializare al unui sistem bazat pe distributia Slackware.

Cu ce ar trebui sa fie familiarizat cititorul

            Pornind de la premiza ca interactioneaza/a interactionat cu sistemul de operare GNU/Linux, distributia fiind irelevanta, cititorul ar trebui sa fie familiarizat cu urmatoarele:

  • notiuni elementare in ceea ce priveste geometria unui hard-disc
  • conceptul de nucleu linux ( Preferabil sa-l fi configurat si compilat macar o data. )
  • experienta cu interpretatorul de comenzi BASH, precum si modul in care acesta poate fi folosit pentru scriptare
  • deprindere in intrebuintarea paginilor manual
  • notiuni de baza ale limbajului de programare C

[...de completat pe parcurs..]

    Observatii:

  • Toate paginile manual din acest ghid sint din cadrul distributiei Slackware 11.0; unele dintre ele n-o sa existe pe alte distributii, iar daca exista, sansele sint sa difere, dat fiind faptul ca voi acoperi subiecte care sint, de obicei, specifice unei distributii.


[...de completat pe parcurs.]

Cuprins

Conform paginii manual boot(7), secventa de demarare difera de la un sistem la sistem, dar poate fi impartita, pe scurt si incomplet, in urmatoarele stagii:

  • Demararea fizica
  • Incarcarea nucleului
  • Initializarea sistemului si a serviciilor

Demararea Fizica

    Procesul de demarare fizica al unui calculator este dependent de arhitectura microprocesorului. In cazul de fata, aceasta arhitectura va fi x86/x86-compatibila. Procesul este unul complex, dar poate fi rezumat in felul urmator:

  • La pornirea sursei de alimentare, memoria primara a sistemului(memoria cu acces aleatoriu — engl.: RAM) este goala, asa ca microprocesorul este programat sa execute instructiunile situate intr-o zona rezervata(FFFF0h) a memoriei numai-citire(engl. presc. ROM) a sistemului de intrare/iesire pe baza(engl.presc. BIOS). Scopul acestei zone este de a directiona microprocesorul catre locatia unde se afla programul BIOS.
  • Odata ce BIOSul este incarcat in memorie, acesta efectueaza mai multe operatii: autotestarea la punerea in functiune(engl. presc. POST), initializarea/inventar al dispozitivelor s.a.
  • Catre final, BIOSul cauta o unitate de disc de pe care sa demareze. De obicei, aceasta unitate de disc este selectionata in prealabil de catre utilizator si poate fi un CD-ROM, o unitatea de dischete, un hard disc.. In cazul acesta o sa fie de hard disc, caci se presupune ca sistemul este deja instalat in memoria fizica.
  • Cand gaseste unitatea de disc, ii incarca si executa sectoru de demarare(engl. boot sector), care, in cazul de fata, fiind vorba de un hard disc, poarta numele de MBR(Master Boot Record) si este localizat in primul sector al hard discului(primii 512 byti). Din momentul acesta, controlul este predat codului din MBR.

Incarcarea nucleului

    Acest al doilea stagiu are ca scop principal incarcarea in memorie a nucleului de pe hard disc si executarea acestuia. Solutionarea poate fi abordata in mai multe moduri:

  • Poate fi folosit un program de incarcare(engl. bootloader) independent de nucleu. Cele mai populare in mediul GNU/Linux sint LILO si GRUB.
  • Nucleul poate fi lasat sa se autoincarce si autoexecute.

    Ambele solutii au in comun faptul ca se folosesc de primul sector din MBR pentru a isi pune in functiune mecanismul, deoarece codul din primul sector al MBRului hard discului este primul care va fi executat la in acest stagiu.

    Astazi, in mediul calculatoarelor personale, a doua metoda este foarte rar intrebuintata, date fiind avantajele folosirii unui program de incarcare independent de nucleu. Dintre aceste avantaje, cele mai important de mentionat ar fi: posibilitatea de-a rula mai multe sisteme de operare pe acelasi calculator si posibilitatea de-a trimite parametrii de executie nucleului. Problema este ca aceste beneficii, dupa cum vom vedea putin mai tarziu, pot aduce (mari) riscuri de securitate.

    Urmeaza o scurta explicatie a mecanismului celor doua metode.

Programul de incarcare(GRUB/LILO)

    Aceasta metoda se imparte, la randul ei, in mai multe stagii, datorita limitarilor impuse de componentele hard. Daca se va opta pentru folosirea unui program de incarcare, odata cu instalarea acestuia, primul sector al MBRului va fi ocupat de de programul de incarcare primar(engl. primary boot loader), contine un set de instructiuni, un tabel cu partitii(maximum 4 primare, dintre care una poate fi extinsa). si, la final, un numar 'magic'(0xAA55) folosit pentru validarea continutului. Acesta este primul stagiu, iar scopul lui este sa verifice tabelul cu partitii pentru partitii active, iar in cazul vreunei descoperiri, sa incarce in memorie continutul sectorului de incarcare al respectivei partitii si sa-l execute.

    Stagiul al doilea(care poate fi, de asemenea, fractionat) difera de la program de incarcare la program de incarcare, dar scopul lui este sa incarce in memorie imaginea nucleului(doar este arhivat cu gzip, nu?), sa-l dezarhiveze si sa-l execute cu sau fara parametrii de executie specificati de catre utilizator. Pentru mai multe detalii, consultati sfirsitul ghidului.

Autoincarcarea si autoexecutarea nucleului

[...]m-am gandit si cred ca nu ar merita detaliata..., mm...??!1111

Initializarea sistemului si a serviciilor

    Odata executat, nucleul, printre altele, initializeaza si seteaza dispozitivele hard, memoria, monteaza sistemul de fisiere radacina s.a. Daca doriti sa stiti mai multe informatii despre acest proces, verificati sfirsitul ghidului.

    In final, nucleul executa comanda init (sau cea prestabilita prin intermediul programului de incarcare), prin care initializarea sistemului este pornita. Pentru a exemplifica, am sa postez _finalul_ fisierului sursa init/main.c:

       /*
        * We try each of these until one succeeds.
        *
        * The Bourne shell can be used instead of init if we are
        * trying to recover a really broken machine.
        */
       if (execute_command)
               run_init_process(execute_command);
       run_init_process("/sbin/init");
       run_init_process("/etc/init");
       run_init_process("/bin/init");
       run_init_process("/bin/sh");
       panic("No init found.  Try passing init= option to kernel.");

    Dupa cum observam, init este primul(chiar unicul) program executat de catre nucleu. De fapt, nucleul nu executa _programul_ init, ci programul care are calea absoluta /sbin/init, /etc/init, /bin/init sau /bin/sh, asta in cazul in care nucleului nu-i este specificat ca parametru de executie(init= -- deobicei specificat prin intermediul lui LILO sau altui program de incarcare) altceva(execute_command).

    Mai observam ca dupa 3 incercari de a executa programul "init", nucleul isi incearca pentru ultima oara norocul cu /bin/sh. Pe Slackware (si nu numai), fisierul cu aceasta cale absoluta este o legatura cu interpretorul de comenzi BASH. Asta inseamna ca, in cazul in care celelalte trei cai nu sint valide, ne vom trezi cu un interpretor de comenzi pentru suprautilizator si un sistem neconfigurat. Acesta este unul dintre riscurile de securitate despre care vorbeam in subcapitolul legat de programele de incarcare, datorita faptului ca prin intermediul lor se poate forta nucleul sa execute calea /bin/sh, sau a oricarui alt executabil preprogramat. Folosindu-ne de cunostintele acumulate pe parcursul ghidului, voi arata, catre final, in capitolul [inca nu i-am gasit un nume] cum se poate configura si pune in picioare in mod manual un sistem folosindu-ne doar de interpetatorul de comenzi.

    Tot procesul descris pana in acest moment ar trebui sa fie independent de distributia folosita. In schimb, odata cu executia programului cu una dintre cele 3 cai enumerate mai devreme, lucrurile tind sa devina specifice (dar nu exagerat) distributiei, sau, mai exact, specifice unui stil de initializare.

    Lumea tinde sa-i atribuie lui Slackware si derivatelor sale stilul "BSD", iar distributiilor ca Fedora Core, SuSe, Mandriva s.a. stilul "System V". BSD si System V au fost, acum multi ani, niste versiuni de UNIX care, dupa cum se vede, au influentat sistemele de operare actuale. Ele isi mai continua si astazi existenta prin rudele lor de grad I, cum ar fi, in cazul lui System V, UnixWare, iar, in cazul lui BSD, Open/Net/FreeBSD.

    Aceasta categorisire, in schimb, daca este luata la puricat, nu este tocmai corecta. Slackware se foloseste de stilul de initializare "System V", doar ca il abordeaza intr-o maniera 'mai BSD', simplificandu-l, dupa cum vom vedea. Nu am sa intru detalii legate de diferentele de abordare a initializarii de catre, sa zicem, Mandriva si Slackware, nu asta este scopul ghidului. In schimb, la final, odata inteles modul in care Slackware 'vede lumea', cititorul se poate folosi de cunostiintele acumulate pentru a compara toate distributiile GNU/Linux, daca doreste :~)

sysvinit

    Slackware, ca si majoritatea celorlalte distributii, se foloseste de suita de utilitare sysvinit (instalata prestabilit). O scurta descriere a pachetului, insotita de o lista cu programele incluse in el, ar fi urmatoarea:

err@coliba:~$ echo -e \\n "Descriere:"; head -n14 /var/log/packages/sysvinit-2.84-i486-69; \
echo -e \\n\\n "Lista cu programe:"; grep -e [18].gz$ !head:$ | \
awk -F/ ' { print $4 } ' | awk -F. ' { print $1 } '

Descriere:
PACKAGE NAME:     sysvinit-2.84-i486-69
COMPRESSED PACKAGE SIZE:     296 K
UNCOMPRESSED PACKAGE SIZE:     650 K
PACKAGE LOCATION: /var/log/mount/slackware/a/sysvinit-2.84-i486-69.tgz
PACKAGE DESCRIPTION:
sysvinit: sysvinit (init, the parent of all processes)
sysvinit:
sysvinit: System V style init programs by Miquel van Smoorenburg that control
sysvinit: the booting and shutdown of your system.  These support a number of
sysvinit: system runlevels, each with a specific set of utilities spawned.
sysvinit: For example, the normal system runlevel is 3, which starts agetty
sysvinit: on virtual consoles tty1 - tty6.  Runlevel 4 starts xdm.
sysvinit: Runlevel 0 shuts the system down.
sysvinit:


Lista cu programe:
last
runlevel
killall5
shutdown
poweroff
init
halt
pidof
reboot
telinit

    Observam ca unul dintre programele incluse in pachet poarta denumirea de init. II aflam calea absoluta:

err@coliba:~$ su -c 'which init'
Password:
/sbin/init

    Avand respectiva cale, inseamna ca ar trebui sa fie primul program executat de nucleu. Ne putem convinge de acest lucru folosind comanda pstree(1), care ne va afisa un arbore de procese.

err@coliba:~$ pstree -np
init(1)-+-keventd(2)
        |-ksoftirqd_CPU0(3)
        |-kswapd(4)
        |-bdflush(5)
        |-kupdated(6)
        |-khubd(7)
        |-syslogd(72)
        |-klogd(75)
        |-inetd(631)
        |-dhcpcd(635)
        |-sshd(639)
        |-crond(652)
        |-atd(654)
        |-gpm(664)
        |-agetty(667)
        |-agetty(668)
        |-agetty(669)
        |-agetty(670)
        |-agetty(671)
        |-bash(860)---startx(958)---xinit(974)-+-X(975)
        |                                      `-xinitrc(979)---startkde(980)---kwrapper(1020)
        |-kdeinit(1008)-+-kdeinit(1013)
        [...]

    Uitandu-ne la arbore, observam ca, pe langa faptul ca init este primul proces si are pid'ul(tradus?) 1, restul proceselor tind sa izvoreasca din el. Consultandu-i pagina manual (init(8)), aflam niste detalii importante, printre care:

  • Init este tatal tuturor proceselor. Este primul program executat de catre nucleul la sfarsitul secventei de initializare al acestuia, fiindu-i atribuit pid-ul cu valoarea 1. ( de mentionat ca nucleul n-are pid'ul 1, ci 0. )
  • Printre scopurile sale se numara: Initializarea tuturor celorlalte procese, colectarea proceselor moarte(zombi) si regenerarea unor procese fiu la terminarea lor; Inspectarea, la initializare, a fisierului /etc/inittab, pentru configurarea sistemului.
  • Acceptare unor parametrii de executie, de obicei setati prin intermediul unui program de incarcare, care, daca sint specificati, ii pot schimba cursul firesc al derularii.
  • Captarea unor semnale si reactionarea la ele.

    Restul capacitatilor vor fi descrise spre finalul ghidului.

/etc/inittab

    Dupa cum s-a specificat mai sus, init,la executare, va citi fisierul /etc/inittab pentru a sti cum sa configureze sistemul. Conform paginii manual inittab(5), formatul fisierului /etc/inittab este urmatorul:

id:niveluri de rulare:actiune:proces

  • Campul id: Trebuie sa contina un sir unic de maximum 4 caractere alfanumerice. Este folosit pentru a identifica fiecare intrare din fisier.
  • Niveluri de rulare: In primul rand, nivelul de rulare, conform paginii manual init(8), reprezinta o configuratie software a sistemului care, printre altele, specifica ce procese trebuiesc pornite de catre init. Configuratia se realizeaza prin intermediul unor scripturi BASH, fiecarui nivel de rulare atribuindu-se cel putin unul. Pot exista mai multe niveluri de executie. In Slackware, cele prestabilite sint urmatoarele:
# These are the default runlevels in Slackware:
#   0 = halt
#   1 = single user mode
#   2 = unused (but configured the same as runlevel 3)
#   3 = multiuser mode (default Slackware runlevel)
#   4 = X11 with KDM/GDM/XDM (session managers)
#   5 = unused (but configured the same as runlevel 3)
#   6 = reboot

      In fisierul /etc/inittab, campul dedicat nivelurilor de rulare trebuie sa contina o lista de niveluri de rulare pentru care trebuie executata o actiune ce, in majoritatea cazurilor. Vom vedea imediat ce inseamna toate acestea.

  • Campul actiune: Descrie actiunea pe care init o sa o realizeze pentru o lista de niveluri de rulare. Exista mai multe tipuri de actiuni, printre care:


      respawn: lanseaza o noua instanta a unui proces, daca acesta isi termina executia

      wait: procesul va fi pornit odata cu intrarea in nivelul de rulare, iar init va astepta pana acesta se incheie.

      once: procesul va fi executat o singura data, de indata ce se va intra in nivelul de rulare

      sysinit: intrarea ce contine aceasta actiune specifica procesul ce trebuie executat in timpul initializarii sistemului de catre init. De obicei, acest, dupa cum vom vedea, scriptul BASH /etc/rc.S.

      initdefault: intrarea ce contine aceasta actiune specifica si nivel de rulare care va fi executat de catre init, imediat dupa ce sistemul a fost initializat (prin intermediul scriptului rc.S.)

      ctrlaltdel: procesul va fi executat atunci cand init va primi semnalul SIGINIT. Semnalul SIGINIT este trimis atunci cand sint apasate tastele CTRL-ALT-DELETE.

      Dupa cum se observa, majoritatea actiunilor merg mana in mana cu un proces. Procesul este specificat in campul proces.

  • Campul proces: Specifica un proces ce trebuie executat la intrarea intr-un nivel de rulare. Procesul poate fi o comanda sau un script.


      Ca sa intelegem mai bine ce inseamna toate acestea, vom analiza un fisier /etc/inittab.

err@coliba:~$ cat -n /etc/inittab
     1  #
     2  # inittab       This file describes how the INIT process should set up
     3  #               the system in a certain run-level.
     4  #
     5  # Version:      @(#)inittab             2.04    17/05/93        MvS
     6  #                                       2.10    02/10/95        PV
     7  #                                       3.00    02/06/1999      PV
     8  #                                       4.00    04/10/2002      PV
     9  #
    10  # Author:       Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
    11  # Modified by:  Patrick J. Volkerding, <volkerdi@slackware.com>
    12  #
    13
    14  # These are the default runlevels in Slackware:
    15  #   0 = halt
    16  #   1 = single user mode
    17  #   2 = unused (but configured the same as runlevel 3)
    18  #   3 = multiuser mode (default Slackware runlevel)
    19  #   4 = X11 with KDM/GDM/XDM (session managers)
    20  #   5 = unused (but configured the same as runlevel 3)
    21  #   6 = reboot
    22
    23  # Default runlevel. (Do not set to 0 or 6)
    24  id:3:initdefault:
    25
    26  # System initialization (runs when system boots).
    27  si:S:sysinit:/etc/rc.d/rc.S
    28
    29  # Script to run when going single user (runlevel 1).
    30  su:1S:wait:/etc/rc.d/rc.K
    31
    32  # Script to run when going multi user.
    33  rc:2345:wait:/etc/rc.d/rc.M
    34
    35  # What to do at the "Three Finger Salute".
    36  ca::ctrlaltdel:/sbin/shutdown -t5 -r now
    37
    38  # Runlevel 0 halts the system.
    39  l0:0:wait:/etc/rc.d/rc.0
    40
    41  # Runlevel 6 reboots the system.
    42  l6:6:wait:/etc/rc.d/rc.6
    43
    44  # What to do when power fails.
    45  pf::powerfail:/sbin/genpowerfail start
    46
    47  # If power is back, cancel the running shutdown.
    48  pg::powerokwait:/sbin/genpowerfail stop
    49
    50  # These are the standard console login getties in multiuser mode:
    51  c1:1235:respawn:/sbin/agetty 38400 tty1 linux
    52  c2:1235:respawn:/sbin/agetty 38400 tty2 linux
    53  c3:1235:respawn:/sbin/agetty 38400 tty3 linux
    54  c4:1235:respawn:/sbin/agetty 38400 tty4 linux
    55  c5:1235:respawn:/sbin/agetty 38400 tty5 linux
    56  c6:12345:respawn:/sbin/agetty 38400 tty6 linux
    57
    58  # Local serial lines:
    59  #s1:12345:respawn:/sbin/agetty -L ttyS0 9600 vt100
    60  #s2:12345:respawn:/sbin/agetty -L ttyS1 9600 vt100
    61
    62  # Dialup lines:
    63  #d1:12345:respawn:/sbin/agetty -mt60 38400,19200,9600,2400,1200 ttyS0 vt100
    64  #d2:12345:respawn:/sbin/agetty -mt60 38400,19200,9600,2400,1200 ttyS1 vt100
    65
    66  # Runlevel 4 used to be for an X window only system, until we discovered
    67  # that it throws init into a loop that keeps your load avg at least 1 all
    68  # the time. Thus, there is now one getty opened on tty6. Hopefully no one
    69  # will notice. ;^)
    70  # It might not be bad to have one text console anyway, in case something
    71  # happens to X.
    72  x1:4:respawn:/etc/rc.d/rc.4
    73
    74  # End of /etc/inittab

      Vom analiza fiecare intrare, explicand-o.

      Prima intrare, cea de la linia 24, are urmatoarele calitati: Este identificata prin sirul de caractere "id" (datorita campului id, faptul ca valoare campului coincide cu numele acestuia nu are vreo importanta). Campul nivelului de rulare este ocupat de caracterul "3". Campul actiunii este ocupat de 'initdefault', ceea ce inseamna ca init va intra in nivelul de rulare specificat de catre acest camp, adica, in cazul nostru, "3". Campul proces lipseste doarece intrarea, continand actiunea 'initdefault', nu necesita un proces, acesta fiind oricum ignorat daca ar fi specificat.

      A doua intrare, cea de la linia 27, are urmatoarele calitati: Este identificata prin sirul de caractere "si". Campul nivelului de rulare este ocupat de caracterul "S".Campul actiunii este ocupat de catre "sysinit", iar procesul este scriptul /etc/rc.d/rc.S. Faptul ca "sysinit" ocupa campul actiune ii spune lui init sa execute procesul din campul proces (in cazul acest, ii spune lui init sa execute scriptul /etc/rc.d/rc.S) inainte de a intra in vreun nivel de rulare(nivelul "3", in cazul nostru ^^).

      A treia intrare, cea de la linia 30, are urmatoarele calitati:Este identificata prin sirul de caractere "su". Campul nivelului de rulare este "1S", ceea ce-nseamna ca intrarea se aplica atat nivelului de rulare "1", cat si nivelului de rulare "S".Campul actiunii este ocupat de catre "wait", iar procesul de catre scriptul /etc/rc.d/rc.K. Faptul ca "wait" ocupa campul actiune ii spune lui init sa execute scriptul /etc/rc.d/rc.K atunci cand va intra in oricare dintre nivelurile de rulare specificate in campul nivelului de rulare.

      aaa.. [hmm, poate-ar fi mai bine altfel...]

[...]