Init e il processo di avvio

Loris Tissino

9 luglio 2009

Il processo di avvio (prima parte)

Il processo tradizionale di avvio (boot) prevede i seguenti passi:

Il processo di avvio (seconda parte)

Successivamente al caricamento di init vengono compiuti i seguenti passi:

Avvio e distribuzioni GNU/Linux

La seconda parte del processo di avvio avviene in maniera diversa a seconda della distribuzione.

In particolare:

I bootloader

I due bootloader (caricatori del sistema operativo) più comunemente usati con Linux sono LILO (Linux Loader) e GNU GRUB (GRand Unified Bootloader):

Configurazione di init

Il file di configurazione di init è /etc/inittab: esso contiene informazioni sul runlevel di default, sul numero di terminali da attivare, sul trap della combinazione di tasti ctrl-alt-del ecc.

I runlevel

Un runlevel consiste nella definizione dello stato di un sistema mediante l'indicazione di quali programmi devono essere eseguiti (eventualmente, in quale ordine) e di quali servizi devono essere attivati.

Tradizionalmente, vengono individuati i seguenti runlevel:

Per sapere qual è il runlevel corrente si può impartire il comando runlevel (che mostra anche il runlevel precedente, oppure N se questo è assente).

$ runlevel
N 2

Per passare da un runlevel ad un altro si può usare il comando telinit.

Gli script di avvio dei servizi

Gli script di avvio/terminazione dei servizi (o, in generale, dei programmi) da eseguire quando si entra o esce in un determinato runlevel sono posti nella directory /etc/init.d (Debian) o /etc/rc.d/init.d (RedHat).

Si tratta di script impostati in modo da poter essere invocati anche manualmente per avviare (parametro start), terminare (parametro stop), riavviare (parametro restart) un servizio (oppure, con il parametro reload, fargli rileggere il file di configurazione).

$ sudo /etc/init.d/apache2 start
 * Starting web server apache2             [ OK ] 
$ sudo /etc/init.d/apache2 reload
 * Reloading web server config apache2     [ OK ]
$ sudo /etc/init.d/apache2 restart
 * Restarting web server apache2           [ OK ]
$ sudo /etc/init.d/apache2 stop
 * Stopping web server apache2             [ OK ] 

Le varie distribuzioni mettono a disposizione "scorciatoie" per invocare questi script, come service e invoke-rc.d.

Definizione dei runlevel

Cosa esattamente avviare quando il sistema entra in un particolare runlevel è determinato dai link simbolici presenti nella directory di quel runlevel.

I link simbolici hanno un nome che inizia per S (start) o per K (kill), più un numero che indica la priorità (utile se si vuole garantire che un determinato servizio parta solo dopo un altro).

$ ls /etc/rc2.d/
K74bluetooth                 S11klogd   S20hotkey-setup   S20samba         S89anacron       S99rc.local
README                       S12dbus    S20incron         S22consolekit    S89atd           S99rmnologin
S05vbesave                   S12hal     S20makedev        S23ntp           S89cron          S99stop-readahead
S10acpid                     S16ssh     S20nvidia-kernel  S24avahi-daemon  S91apache2
S10powernowd.early           S19cupsys  S20postfix        S24dhcdbd        S98usplash
S10sysklogd                  S20apmd    S20powernowd      S30gdm           S99acpi-support
S10xserver-xorg-input-wacom  S20apport  S20rsync          S65firestarter   S99laptop-mode

Configurazione dei runlevel

La configurazione dei runlevel può essere fatta:

Uso di sysvconfig

Uso di sysvconfig

Chkconfig

La configurazione dei vari servizi può essere agevolmente effettuata con chkconfig, strumento tipico dei sistemi RedHat ma portato anche su Ubuntu.

$ sudo chkconfig  --add verysimplewebserver 
 Adding system startup for /etc/init.d/verysimplewebserver ...
$ sudo chkconfig  --del verysimplewebserver 
 Removing any system startup links for /etc/init.d/verysimplewebserver ...
$ sudo chkconfig  --level 234 verysimplewebserver on
 Adding system startup for /etc/init.d/verysimplewebserver ... 
$ chkconfig --list | grep verysimplewebserver
verysimplewebserver     1:none  2:on    3:on    4:on    5:none  6:none  S:none

Sotto Ubuntu, con l'opzione --dryrun si può vedere quali comandi verrebbero eseguiti.

Informazioni negli script di avvio

Gli script relativi ai servizi contengono delle informazioni, sotto forma di commento, che vengono utilizzate per sapere quali sono i livelli di priorità di default.

Le prime righe dello script httpd di un sistema Fedora 8:

#!/bin/bash
# httpd        Startup script for the Apache HTTP Server
# chkconfig: - 85 15

Le prime righe dello script apache2 di un sistema Ubuntu 7.10:

#!/bin/sh -e
[snip]
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO

Sequenze di avvio "moderne"

I sistemi moderni (specialmente desktop e laptop) hanno bisogno di gestire la sequenza di avvio:

Sono state studiate diverse forme moderne di gestione della sequenza di avvio:

Nei sistemi che usano Upstart, la configurazione di init viene fatta attraverso i file presenti nella directory /etc/event.d.

Spegnere il sistema

Per spegnere il sistema si deve impartire il comando shutdown.

$ sudo shutdown -h now   # spegne il sistema immediatamente
$ sudo shutdown -r now   # riavvia il sistema dopo averlo spento
$ sudo shutdown -t 10    # spegne il sistema dopo 10 secondi

Per altre opzioni interessanti, si veda shutdown(8).

Sono normalmente a disposizione anche le forme sintetiche halt, reboot e poweroff.

Esercizi