IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

El procés d'arrancada en Linux

En aquest article explicarem el d'arrancada dels sistemes Unix basats en SystemV. La majoria de Distribucions Linux utilitzen un sistema d'arrencada compatible amb SystemV. Hi ha però algunes distribucions com Slackware que utilitzen un sistema basat en BSD i altres tenen el seu propi sistema d'arrencada (Gentoo Linux).

El cor del sistema d'arrancada és el procés init. Aquest procés l'executa el kernel al iniciar el sistema i és l'encarregat d'executar tots els serveis necessaris per tal que el sistema funcioni correctament.

El procés d'execució en SystemV és el següent:

  • El kernel busca el procés segons un protocol establert i l'executa.
  • El procés init s'executa.
  • S'executen en ordre els nivells d'execució segons la configuració del /etc/inittab.
NOTA: Actualment sistemes operatius com Ubuntu ja no utilitzant el fitxer inittab. L'arrancada del sistema es duu a terme mitjançant upstart.
  • Un cop s'ha acabat d'executar tots les scripts s'executa el fitxer /etc/rc.local.

Fases de l'arrancada del sistema

L'arrancada d'un sistema operatiu (boot en anglès) té les següents fases:

Carregador ROM de la màquina i BIOS

El primer procés a executar-se a l'encendre un sistema operatiu és una petita aplicació normalment carregada en una memòria ROM (Read Only Memory) o algun altre sistema empotrat (embedded) com memòries PROM, EPROM o FLASH (lectura i escriptura). Aquesta aplicació és anomenada firmware o en el cas de IBM PC s'anomena BIOS (Basic Input/Output System). Actualment tant els firmware com les BIOS són sistemes que es poden actualitzar (tot i que no es una tasca habitual) i per tant utilitzant memòries de lectura/escriptura.

En el cas dels PC, la BIOS disposa d'un programa de configuració al qual es pot a accedir durant l'arrancada amb una seqüència de tecles especifiques com Supr, o tecles de funció. La configuració determina configuracions del maquinari del sistema (Chipsets, busos de sistema, Gestió del consum energètic, seguretat d'accés al sistema, etc.) i sobretot l'ordre d'arrancada dels dispositius del sistema' (quin dispositiu serà el que carregarà el sistema operatiu)

Programari carregador del sistema operatiu. Boot Loader

Un cop escollit segons la configuració de la BIOS el dispositiu d'arrancada, en el cas d'un disc dur es passa l'execució (aquest procés és anomenat Chain Loading o també canvi de context, ja que es commuta la memòria i la CPU del firware al Boot Loader) a un programa que es troba al primer sector del dispositiu. El programa s'anomena Boot Loader i el primer sector del disc és el Master Boot Record (MBR) que típicament té 512 bytes.

En aquest petit espai, trobem una petita aplicació que carrega el sistema operatiu i informació del disc dur (taula de particions, etiqueta del disc, etc).

Els programaris carregadors del sistema operatiu més coneguts són:

Tots ells permeten en major o menor mida, configurar la càrrega del SO. El més habitual és poder escollir entre múltiples sistemes operatius en sistemes duals, o poder configurar el pas de paràmetres al nucli del sistema operatiu.

Alguns carregadors del sistema com Grub, per poder suportat diferents sistemes de fitxer necessiten més espai que el proporcionat pel MBR. En aquest cas el gestor esta dividit en parts o stages. La primera part té la part bàsica de l'arrancada (menús) i les altres parts es troben al primer sector de la partició de carrega del sistema operatiu o en espais com l'espai de compatibilitat de DOS.

Càrrega del nucli del sistema operatiu

Un cop escollit el sistema operatiu i la partició on aquest es troba allotjat, es procedeix a carregar el nucli del S0. Aquesta fase depèn força de cada sistema operatiu. Tots els SO disposen d'un nucli, encara que hi han diferents tipus de nucli:

  • Nuclis monolítics: Els nuclis monolítics engloben tots els serveis de maquinari del sistema, i no s'utilitzen serveis (en el sentit d'aplicacions fora del nucli que accedeixin directament al maquinari)
  • Micronuclis: Els micronuclis (en anglès microkernel) proporcionen un petit conjunt d'abstraccions simples del maquinari, i utilitzen aplicacions anomenades servidors per oferir la majoria de la resta de funcionalitats.
  • Nuclis híbrids: Los nuclis híbrids (micronúclis modificats) són molt pareguts als micronúclis purs, excepte perquè inclouen codi addicional en el espai del nucli per tal que aquest s'executi més ràpidament.
  • exonúclis: no faciliten cap abstracció del maquinari, però permeten l'ús de biblioteques que proporcionen major funcionalitat gracies a l'accés directa al maquinari.

Depenent del tipus de nucli aquest durà a terme unes o altres tasques.

Consulteu l'apartat el kernel del tema 15 sobre sistemes operatius.

Càrrega dels serveis del sistema operatiu

Un cop carregat el nucli s'inicien els processos i serveis del sistema. A GNU/Linux els processos s'executen en un ordre determinat pels Nivells d'execució de Unix/Linux. Els primers processos en executar-se són:

  • Scheduler (pid 0): planificador de processos del sistema operatiu. És una part molt important del nucli del sistema operatiu
  • init (pid 1): És el primer procés en executar-se, i tota la resta de processos són fills de pid.

El PID és l'identificador del procés.

Podem consultar els processos i els seus PID amb la comanda:

$ ps aux

I podem consultar l'estructura d'arbre jeràrquic amb:

$ pstree

Consulteu el tema:

Nivells d'execució de Unix/Linux

El terme RunLevel es refereix a un mode d'operació d'un ordinador segons el sistema d'inicialització UNIX SystemV.

Els sistemes Unix/Linux carregen els serveis del sistema mitjançant un sistema de nivells o runlevels. Cada distribució Unix té els seus propis nivells amb petites diferències.

La comanda init ens permet moure'ns entre nivells. Així per exemple, un sistema multiusuari Linux pot esdevenir, en cas de necessitat (per exemple per a tasques de manteniment o de recuperació delk sistema), un sistema monousuari executant:

$ sudo init 1

Tots les sistemes Linux tenen al menys els tres nivells estàndard:

Id     Nom   Descripció
0 	Halt 	           Para o apaga el sistema.
S 	Single-User Mode   Entra al sistema en un sol usuari. Només s'executen els serveis bàsics.
6 	Reboot 	           Torna a iniciar el sistema.

Com hem vist, el procés inicial a tots els sistemes Linux és el procés init. El primer que fa aquest procés és llegir el fitxer /etc/inittab. Aquest fitxer és el que determina els nivells existents i el seu comportament.

Realment la majoria de sistemes moderns tenen el següents nivells d'execució:

ID Nom Descripció
1 	Single-User Mode 	No configura xarxa (NOTA a Ubuntu sembla que no és pas així) ni inicia daemons i només permet el login a root.
2 	Multi-User Mode 	Permet múltiples usuaris però sense xarxa
3 	Multi-User Mode amb xarxa. 	Nivell d'execució típic dels servidors.
4 	No utilitzat. 	Reservat per usos futurs?
5 	X11 	Nivell d'execució + X Window System. 

Amb una mica més de detall:

  • Nivell d'execució S: Aquest nivell és en realitat una copia del nivell 1.
  • Nivell d'execució 0 (Halt System): Aquest es el nivell d'execució encarregat d'apagar el sistema. Al realitzar un "shutdown" del sistema posem la màquina en aquest nivell.
  • Nivell d'execució 1 (Single User Mode): Igual que la resta de sistemes però la existència del nivell S fa que hi hagi xarxa. Consulteu la secció Scripts d'inicialització System V de l'article sobre Xarxes_Linux.
  • Nivell d'execució 2 (Sistema bàsic multiusuari sense NFS): Els nivells 1 i 2 s'utilitzen normalment per tasques de depuració.
  • Nivell d'execució 3 (Sistema multiusuari complet): El nivell 3 és el nivell que utilitzen les màquines sense entorn gràfic, servidors. Exemple Ubuntu Server.
  • Nivell d'execució 4 (sense utilitzar): El fet de tenir un runlevel sense utilitzar permet reservar-ne l'ús per a futures utilitats.
  • Nivell d'execució 5 (Mode multiusuari amb interfície gràfica): Aquest nivell d'execució és el que correspon a aquells sistemes que utilitzen interfície gràfica (s'entra en aquest nivell al executar el "display manager" del gestor de finestres - gdm, kdm, xdm -). Aquest és el nivell d'execució per a les màquines d'escriptori. Realment quan estem al nivell 5 també estem als nivells anteriors (consoles).
  • Nivell d'execució 6 (tornar a iniciar el sistema). Aquest és el nivell d'execució al qual enviem la màquina quan tornem a iniciar (per exemple, amb la comanda reboot).

A Debian i Ubuntu no hi ha distinció entre els nivell 2 a 5. Vegeu Debian FAQ on booting.

  • 0 - Halt
  • 1 - Single
  • 2 a to 5 - Multiuser
  • 6 - Reboot

NOTA: Ubuntu utilitza upstart

En Linux parlem de serveis o dimonis (i en altres sistemes operatius el concepte és similar) quan ens referim a un procés que normalment s'executa de forma continua i sense interactivitat amb l'usuari (no s'utilitzen els dispositius I/O habituals -teclat, ratolí, pantalla). Cal diferenciar els processos de les aplicacions interactives que són executades específicament pels usuaris.

Podem consultar el nivell d'execució en que estem amb:

$ runlevel

o

$ who -r

La comanda init ens permet moure'ns entre nivells. Així per exemple, un sistema multiusuari Linux pot esdevenir, en cas de necessitat (per exemple per a tasques de manteniment o de recuperació del sistema), un sistema monousuari executant:

$ sudo init 1

Cada distribució Unix inicia els seus nivells utilitzant scripts d'inicialització/control de serveis. Aquests scripts no es troben sempre al mateix lloc en diferents distribucions però lo habitual (segons el sistema System V) és:

Tenir els scripts a:

/etc/init.d

Es poden controlar els serveis de la següent forma (exemple Apache):

$ sudo /etc/init.d/apache2 
* Usage: /etc/init.d/apache2 {start|stop|restart|reload|force-reload|start-htcacheclean|stop-htcacheclean}

La forma de determinar quins serveis s'executen al carregar el sistema i en quins nivell és creant enllaços a les carpetes:

$ ls /etc/rc
rc0.d/    rc1.d/    rc2.d/    rc3.d/    rc4.d/    rc5.d/    rc6.d/    rc.local  rcS.d/    

Hi ha una carpeta per nivell. Exemple:

$ ls /etc/rcls /etc/rc2.d/
ls: /etc/rcls: No such file or directory
/etc/rc2.d/:
README               S10xserver-xorg-input-wacom  S19autofs   S20exim4          S20samba          S24dhcdbd     S89atd             S99rc.local
S01vboxadd           S11klogd                     S19cupsys   S20hotkey-setup   S20snmpd          S25bluetooth  S89cron            S99rmnologin
S02vboxadd-timesync  S12dbus                      S19mysql    S20makedev        S20sysstat        S30gdm        S90binfmt-support  S99stop-readahead
S02vboxvfs           S12hal                       S19slapd    S20ntop           S20uml-utilities  S30nagios     S91apache2         S99webmin
S05vbesave           S16ssh                       S20acct     S20nvidia-kernel  S20vboxdrv        S30nagios2    S98munin-node
S10acpid             S17mysql-ndb-mgm             S20apmd     S20openbsd-inetd  S20vboxnet        S50ntp        S98usplash
S10powernowd.early   S18avahi-daemon              S20apport   S20powernowd      S20winbind        S50proftpd    S99acpi-support
S10sysklogd          S18mysql-ndb                 S20dirmngr  S20rsync          S22consolekit     S89anacron    S99laptop-mode

On

  • S: és start
  • K: és kill (apagar)

i el número determinar l'ordre d'arrancada o apagada.

Recursos:

Inici de sessió interactiva de l'usuari

Un cop carregats tots els serveis, el sistema demanara a l'usuari les dades (també es pot configurar el sistema per tal que entri per defecte amb un usuari concret)

En entorns Unix, el procés que s'encarrega d'aquesta fase és getty. Si executem:

$ ps aux | grep getty
root      4696  0.0  0.0   1696   520 tty4     Ss+  08:24   0:00 /sbin/getty 38400 tty4
root      4697  0.0  0.0   1696   520 tty5     Ss+  08:24   0:00 /sbin/getty 38400 tty5
root      4701  0.0  0.0   1692   516 tty2     Ss+  08:24   0:00 /sbin/getty 38400 tty2
root      4702  0.0  0.0   1696   520 tty3     Ss+  08:24   0:00 /sbin/getty 38400 tty3
root      4703  0.0  0.0   1692   512 tty1     Ss+  08:24   0:00 /sbin/getty 38400 tty1
root      4704  0.0  0.0   1696   520 tty6     Ss+  08:24   0:00 /sbin/getty 38400 tty6
sergi    16338  0.0  0.0   2988   744 pts/2    R+   20:00   0:00 grep getty

Com podeu veure hi ha diferents logins en execució. El control de les terminals d'inici el trobem al fitxer:

$ cat /etc/inittab
... 
# The default runlevel.
id:2:initdefault: 

# Boot-time system configuration/initialization script.
# This is run first except when booting in emergency (-b) mode.
si::sysinit:/etc/init.d/rcS 

# What to do in single-user mode.
~~:S:wait:/sbin/sulogin

# /etc/init.d executes the S and K scripts upon change
# of runlevel.
#
#  Runlevel 0 is halt.
# Runlevel 1 is single-user.
# Runlevels 2-5 are multi-user.
# Runlevel 6 is reboot. 

l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# Normally not reached, but fallthrough in case of emergency.
z6:6:respawn:/sbin/sulogin

# What to do when CTRL-ALT-DEL is pressed.
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
 
# Action on special keypress (ALT-UpArrow).
#kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work." 

# What to do when the power fails/returns.
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop 

# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
#  <id>:<runlevels>:<action>:<process>
#  
# Note that on most Debian systems tty7 is used by the X Window System,
# so if you want to add more getty's go ahead but skip tty7 if you run X.
#
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6 
...

A Ubuntu ja no s'utilitza aquest fitxer, perquè utilitza upstart. La configuració la trobarem a:

/etc/event.d

Per exemple hi ha un fitxer per cada tty:

$ cat tty1 
# tty1 - getty
#
# This service maintains a getty on tty1 from the point the system is
# started until it is shut down again.  

start on runlevel 2
start on runlevel 3
start on runlevel 4
start on runlevel 5  

stop on runlevel 0
stop on runlevel 1
stop on runlevel 6  

respawn
exec /sbin/getty 38400 tty1

Normalment per defecte podem accedir a les terminals tty amb la combinació de tecles Ctrl+Alt+F1-F6. Es poden configurar altres terminals i fins i tot que una tty remota es connecti a un login remot

La terminal 7 (Ctrl+Alt+F7) normalment esta reservada a l'entorn gràfic X. Actualment hi ha diferents entorns d'escriptori] en Unix (Gnome, KDE, XFCE,) que corren sobre X-Window. Tots ells disposen del que s'anomena un Desktop Manager (DM) (Gnome té GDM, KDE té KDM, i també hi ha el genèric XDM) que és l'aplicació que s'encarrega del login del usuari a l'entorn gràfic i de la gestió del mateix.

L'execució dels desktops managers es duu a terme al nivell corresponent (depèn de cada distribució). A Ubuntu:

$ ls /etc/rc2.d| grep gdm
S30gdm

Per tant s'executa al nivell 2. L'entorn gràfic es pot reiniciar amb

NOTA: Atenció, la següent comanda reinicia l'entorn gràfic sense confirmació i per tant podem perdre dades.
$ sudo /etc/init.d/gdm restart

Procés init

El procés init (abreviació d'initialization) és el programa inicial en tots els sistemes xNIX. És pare de tota la resta de processos, normalment té el PID 1 i s'executa com un dimoni del sistema.

Tal com mostra la comanda:

$ pstree 
init─┬─acpid
     ├─amarokapp─┬─ruby
     │           └─6*[{amarokapp}]
     ├─amarokapp
     ├─apache2───5*[apache2]
     ├─arpwatch
     ..............

El procés init és pare de tota la resta de processos. Si executem

$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   1628   524 ?        Ss   08:50   0:01 /sbin/init splash
root         2  0.0  0.0      0     0 ?        SN   08:50   0:00 [ksoftirqd/0]
root         3  0.0  0.0      0     0 ?        S    08:50   0:00 [watchdog/0]
root         4  0.0  0.0      0     0 ?        S<   08:50   0:00 [events/0]
root         5  0.0  0.0      0     0 ?        S<   08:50   0:00 [khelper]
root         6  0.0  0.0      0     0 ?        S<   08:50   0:00 [kthread]
root         8  0.0  0.0      0     0 ?        S<   08:50   0:00 [kblockd/0]
root         9  0.0  0.0      0     0 ?        S<   08:50   0:00 [kacpid]
root        10  0.0  0.0      0     0 ?        S<   08:50   0:00 [kacpi_notify]
............

Podem veure que el procés init sempre té l'identificador de procés (PID) 1. Podem obtenir més informació sobre els processos Linux a l'article Processos_Linux.

Comanda init

Consulteu init.

Fitxer /etc/inittab

IMPORTANT: A partir de la versió Feisty d'Ubuntu i de Fedora 9 s'utilitza el sistema d'arrancada basat en  Upstart en comptes del fitxer /etc/inittab. 
Els sistemes que utilitzen upstart, encara s'utilitza el fitxer /etc/inittab però només per establir el nivell d'execució per defecte.

Segons el manual, cada línia del fitxer inittab té el següent format:

 id:runlevels:action:process

On

  • id: són fins a 4 caràcters que identifiquen el tipus d'entrada.
  • runlevels: llista dels nivells d'execució en els quals l'acció especificada és durà a terme. Per exemple, 123 vol dir els nivells 1, 2 i 3.
  • action: Descriu quina acció es durà a terme.
  • process: Indica el procés que s'executarà. Si el procés comença per + utmp i wtmp no tindran en compte aquest procés.

Les opcions vàlides del camp action són:

  • respawn: El procés es tornarà a executar cada cop que es finalitzi. Per exemple s'utilitza amb els processos getty.
  • wait: el procés s'executarà un sol cop quan s'entri al nivell d'execució especificat, i el procés init s'esperarà fins que el procés acabi la seva execució.
  • once: el procés s'executarà un sol cop quan s'entri al nivell d'execució especificat.
  • boot: El procés s'executarà durant l'engegada del sistema. El camp runlevels és ignorat.
  • bootwait: El procés s'executarà durant l'engegada del sistema, mentrestant init espera a que el procés s'acabi. El camp runlevels és ignorat.
  • off: No fa res
  • ondemand: S'executarà el procés en un nivell d'execució ondemant (a, b, c...)
  • initdefault: Indica quin és el nivell d'execució que s'executarà després del procés d'engegada (nivell d'execució per defecte). Si no existeix, el procés init el demanarà per la consolta durant la execució. El camp process és ignorat.
  • sysinit: El procés s'executarà durant l'engegada del sistema abans que els processos boot o bootwait. entries. El camp runlevels és ignorat.
  • powerwait: El procés s'executarà quan l'energia s'apagui. Init normalment es informat d'aquest esdeveniment per un sistema de SAI (UPS). El procés init esperarà a que s'acabi el procés abans de continuar.
  • powerfail: Igual que l'anterior però no s'esperà a que el procés s'acabi d'executar.
  • powerokwait: Aquest procés s'executarà tan aviat com init sigui informat de que l'energia ha estat restaurada.
  • powerfailnow: Aquest procés s'executarà tan aviat com init sigui informat de que la bateria del SAI és quasi buida.
  • ctrlaltdel: Aquest procés s'executarà quan el sistema rebi el senyal SIGINT. Normalment aquest senyal es rep quan algú prem la combinació de tecles CTRL-ALT-DEL.
  • kbrequest: El procés s'executarà quan init rebi un senyal del teclat. Més documentació als paquet kbd.

El fitxer inittab és l'encarregat de la configuració del procés init. Vegem un exemple de fitxer inittab (extret d'una Debian):

# /etc/inittab: init(8) configuration.
# $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $

# The default runlevel.
id:2:initdefault:

# Boot-time system configuration/initialization script.
# This is run first except when booting in emergency (-b) mode.
si::sysinit:/etc/init.d/rcS

# What to do in single-user mode.
~~:S:wait:/sbin/sulogin

# /etc/init.d executes the S and K scripts upon change
# of runlevel.
#
# Runlevel 0 is halt.
# Runlevel 1 is single-user.
# Runlevels 2-5 are multi-user.
# Runlevel 6 is reboot.

l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# Normally not reached, but fallthrough in case of emergency.
z6:6:respawn:/sbin/sulogin

# What to do when CTRL-ALT-DEL is pressed.
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

# Action on special keypress (ALT-UpArrow).
#kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."

# What to do when the power fails/returns.
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop

# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
#  <id>:<runlevels>:<action>:<process>
#
# Note that on most Debian systems tty7 is used by the X Window System,
# so if you want to add more getty's go ahead but skip tty7 if you run X.
#
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

# Example how to put a getty on a serial line (for a terminal)
#
#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100

# Example how to put a getty on a modem line.
#
#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3

La secció:

# Boot-time system configuration/initialization script.
# This is run first except when booting in emergency (-b) mode.
si::sysinit:/etc/init.d/rcS

Determina que el primer que s'executa és l'script /etc/init.d/rcS:

$ cat /etc/init.d/rcS
#! /bin/sh
#
# rcS
#
# Call all S??* scripts in /etc/rcS.d/ in numerical/alphabetical order
#  

exec /etc/init.d/rc S

El que fa és executar tots els scripts que comencen per S (Start) de la carpeta /etc/rcS.d/. Els script s'executen en l'ordre que indica el número que hi ha després de la S en els scripts.

La secció:

# /etc/init.d executes the S and K scripts upon change
# of runlevel.
#
# Runlevel 0 is halt.
# Runlevel 1 is single-user.
# Runlevels 2-5 are multi-user.
# Runlevel 6 is reboot.

l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# Normally not reached, but fallthrough in case of emergency.
z6:6:respawn:/sbin/sulogin

Determina que s'executa al passar a un nivell d'execució concret. Estan indicats els 6 nivells (tot i que Debian utilitza el 0 el 1 el 2 i el 6). S'executen els scripts amb S o els scripts amb K segons s'estigui iniciant o aturant el nivell.

La secció:

1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

Indica que cal executar a les terminals virtuals (accessibles amb la combinació de tecles Ctrl+Alt+Fnúmero_de_terminal, Crt+Alt+F1,F2..).

Establir el nivell d'execució per defecte

S'indica de la següent forma al fitxer /etc/inittab:

# The default runlevel.
id:2:initdefault:

L'exemple anterior indica que el nivell d'execució per defecte és el 2 (típic dels sistemes Debian o de versions prèvies a Upstart d'Ubuntu).

Fedora encara manté aquest fitxer tot i utilitzar upstart, precisament per indicar el nivell per defecte:

id:5:initdefault:

El nivell per defecte dels sistemes de la família Red Hat és el nivell 5 (quant hi ha entorn gràfic, és a dir, en versions d'escriptori, no de servidor).

halt equival a aturar sense apagar la electricitat

Si executem:

$ sudo shutdown -h -H 0

El resultat serà quelcom similar a:

Systemhalted.png

És a dir s'aturarà el sistema però no s'aturarà la màquina.

Ctrl+Alt+Delete

Aquesta combinació es pot utilitzar des d'una terminal no gràfica (des de l'entorn gràfic sovint s'ignora o la combinació es capturada i apareix un menú amb opcions d'aturada) per tornar a iniciar l'ordinador.

Als sistemes que configuren la seva engegada amb el fitxers inittab, podem modificar el comportament de Ctrl+Alt+Delete modificant aquest fitxer. Per exemple a Debian podeu trobar:

$ sudo joe /etc/inittab
   ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

Podem comentar la línia amb un # al principi i desactivarem ctrl+Alt+Delete. O podem canviar la comanda (per exemple canviar el -r per -h i aturarà la màquina en comptes de tornar-la a iniciar).

Scripts d'inicialització. Configuració de la inicialització de serveis

La carpeta /etc/init.d conté el scripts (executables) encarregats de l'inicialització de serveis. Un script típic ha de tenir com a mínim els parametres start i stop. Altres possibilitats són reload, restart o status. Per exemple:

$ /etc/init.d/apache2 start 

Inicialitza el servidor web apache (versió 2.0).

L'últim script en executar-se és /etc/rc.d/rc.local. En aquest fitxer podem inicialitzar serveis específics del nostre sistema, encara que el proposit inicial éra controlar els serveis de xarxa.

Programació de dimonis Linux. Esquelet dels scripts d'inicialització

Consulteu:

Programació_de_Dimonis_Linux#Programaci.C3.B3_d.27scripts_d.27inicialitzaci.C3.B3_System_V_per_a_dimonis

Procés d'execució dels serveis

Quan s'inicia un nivell d'execució, el sistema executa els links que és troben a la carpeta que li correspon a aquest nivell d'execució (p.e. per al nivell 3 /etc/rc3.d). Les carpetes/nivells existents són:

  • rc0.d: Nivell d'execució al aturar la màquina.
  • rcS.d: Tal com diu al fitxer /etc/inittab aquest nivell d'execució és el cridat el primer al iniciar el sistema
  • rc1.d: Nivell d'execució 1.
  • rc2.d: Nivell d'execució 2.
  • rc3.d: Nivell d'execució 3.
  • rc5.d: Nivell d'execució 5.
  • rc6.d: Nivell d'execució al reiniciar.
  • rc.local: Scripts d'execució locals.

En aquestes carpetes trobem dos tipus de links:

  • Comencen en K. Aquest són els serveis que s'han de parar en aquest nivell d'execució.
  • Comencen amb S. Aquest són els serveis que s'han d'executar (start) en aquest nivell d'execució.

Els dos dígits que segueixen a les lletres k o s, indiquen la prioritat del procés. Els nombres menors s'executen abans. Els enllaços apunten als scripts d'inicialització de serveis (normalment a la carpeta /etc/init.d).

Per defecte els links k executen l'script amb el paràmetre stop i els links s executen el mateix script però amb el paràmetre start.

Paquets

sysv-rc

chkconfig

Proporciona l'ordre:

$ dpkg -L chkconfig | grep bin
/sbin
/sbin/chkconfig

sysvinit-utils

Els executables proporcionats pel paquet són:

$ dpkg -L sysvinit-utils | grep bin
/usr/bin
/usr/bin/last
/usr/bin/mesg
/usr/sbin
/usr/sbin/service
/bin
/sbin
/sbin/killall5
/sbin/sulogin
/sbin/fstab-decode
/sbin/bootlogd
/sbin/startpar
/usr/bin/lastb 
/bin/pidof

Ksysv

sysvconfig

sysv-rc-conf

Comandes de gestió dels scripts d'inicialització

Comanda update-rc.d

La comanda update-rc.d facilita el procés explicat en el punt anterior. Per exemple:

$ sudo update-rc.d -f samba remove 

Esborra tots els enllaços de les carpetes /etc/rcx.d que fan referència al servei samba.

o podem afegir el servei Samba a l'arrencada del sistema amb:

$ sudo update-rc.d samba defaults 
Adding system startup for /etc/init.d/samba ...
  /etc/rc0.d/K20samba -> ../init.d/samba
  /etc/rc1.d/K20samba -> ../init.d/samba
  /etc/rc6.d/K20samba -> ../init.d/samba
  /etc/rc2.d/S20samba -> ../init.d/samba
  /etc/rc3.d/S20samba -> ../init.d/samba
  /etc/rc4.d/S20samba -> ../init.d/samba
  /etc/rc5.d/S20samba -> ../init.d/samba

Crea enllaços al servei samba en els nivells per defecte. Els nivell per defecte estan indicats al propi fitxer d'inicialització:

$ cat /etc/init.d/samba | more
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6

El paràmetre -d serveix per a fer proves. No executa cap canvi però mostra quins serien aquests canvis.

Podem veure en quins nivells el sistema estarà en execució o apagat. Un altre manera és utilitzar la comanda locate:

# updatedb
# locate ntop | grep rc
/etc/rc.d/rc5.d/S93ntop
/etc/rc.d/rc0.d/K83ntop
/etc/rc.d/rc2.d/S93ntop
/etc/rc.d/rc1.d/K83ntop
/etc/rc.d/rc6.d/K83ntop
/etc/rc.d/rc3.d/S93ntop
/etc/rc.d/rc4.d/S93ntop
/etc/rc.d/init.d/ntop 
/usr/share/doc/ntop-3.2/FAQarchive
/usr/share/ntop/html/marchio_unipi_pant541_144.gif

NOTA: La comanda equivalent en sistema Fedora/red Hat és chkconfig

A Debian/Ubuntu l'ordre es proporcionada pel paquet:

$ whereis update-rc.d
update-rc: /usr/sbin/update-rc.d-insserv /usr/sbin/update-rc.d
$ dpkg -S /usr/sbin/update-rc.d
sysv-rc: /usr/sbin/update-rc.d

Ordre chkconfig

NOTA: L'ordre chkconfig està disponible també a Debian/Ubuntu, i es proporcionada pel paquet del mateix nom:

$ whereis chkconfig
chkconfig: /sbin/chkconfig /usr/share/man/man8/chkconfig.8.gz
$ dpkg -S /sbin/chkconfig 
chkconfig: /sbin/chkconfig

Segons el manual:

$ man chkconfig 

chkconfig --list serveix per activar/desactivar serveis del sistema. També però el pode utilitzar per consultar els serveis del sistema amb:

$ chkconfig --list | more
NetworkManager.dpkg-backup  0:off  1:off  2:off  3:off  4:off  5:off  6:off
acpi-support              0:off  1:off  2:on   3:on   4:on   5:on   6:off
acpid                     0:off  1:off  2:off  3:off  4:off  5:off  6:off
alsa-utils                0:off  1:off  2:off  3:off  4:off  5:off  6:off
anacron                   0:off  1:off  2:off  3:off  4:off  5:off  6:off
...

Mostra tots els serveis del sistema i en quins nivells d'execució s'executen o s'aturen. POdeu mostrar només un servei indicant en nom del dimoni:

$ chkconfig --list apache2
apache2                   0:off  1:off  2:on   3:on   4:on   5:on   6:off

Per exemple per afegir un servei com ntop, primer s'ha d'afegir el servir al control de chkconfig. Per exemple el servei ntop:

# /sbin/chkconfig --add ntop

I després fer que el servei s'executi durant l'arrancada del sistema:

# /sbin/chkconfig ntop on

Ara amb la comanda:

# /sbin/chkconfig --list | grep ntop
ntop            0:apagat        1:apagat        2:engegat       3:engegat       4:engegat       5:engegat       6:apagat

Si no volem aplicar els valors per defecte podem indicar en quins nivells cal executar/aturar el dimoni:

$ chkconfig --level 23 ntop on
            

NOTA: L'exemple està pensat per a sistemes Debian

ntsysv

No està disponible per defecte a Ubuntu.

Comanda invoke-rc.d

Segons el manual:

$ man invoke-rc.d
       invoke-rc.d - executes System-V style init script actions

Per exemple:

$ sudo invoke-rc.d apache2 start

executa el servidor web apache.

NOTA: En sistemes Fedora la comanda equivalent és service.

A Debian/Ubuntu el paquet es proporcionat:

$ whereis invoke-rc.d 
invoke-rc: /usr/sbin/invoke-rc.d
$ dpkg -S /usr/sbin/invoke-rc.d
sysv-rc: /usr/sbin/invoke-rc.d

service

NOTA: També està disponible a Ubuntu

Per engegar un servei en sistemes Fedora:

# /sbin/service ntop start

A Ubuntu:

$ sudo /usr/bin/service apache2 start
* Starting web server apache2 ...                                                                           [ OK ]

Recursos:

L'ordre service a Ubuntu es proporcionada pel paquet:

$ whereis service
service: /usr/bin/service /usr/sbin/service /usr/share/man/man8/service.8.gz
$ dpkg -S /usr/bin/service
sysvinit-utils: /usr/bin/service

Tancant el sistema

Per apagar un sistema Linux es pot executar la següent comanda:

$ shutdown -h 0 

Aquesta comanda envia el sistema al runlevel 0

Per reiniciar és pot executar...

$ reboot

o

$ shutdown 6

Fitxers i Carpetes implicats en el procés d'arrancada i de configuració de Fitxers

/etc/inittab

Consulteu /etc/inittab

/etc/rc?.d

On ? és el corresponent runlevel.

/etc/init.d

Llista de serveis

El fitxer /etc/services conté un llistat amb els serveis més habituals i els ports en els qual corren aquest serveis.

Documentació Debian

La carpeta /usr/share/doc/sysv-rc conté més documentació sobre SysV a Debian. Podem descomprimir els README amb la comanda:

$ cd /usr/share/doc/sysv-rc
$ sudo gunzip README.runlevels

El fitxer més interessant per llegir és:

$ gedit README.runlevels


Vegeu també

Enllaços externs