Capitolo 3. Inizializzazione del sistema

Indice

3.1. Panoramica del processo di avvio
3.1.1. Stadio 1: il BIOS
3.1.2. Stadio 2: il bootloader
3.1.3. Stadio 3: il mini-sistema Debian
3.1.4. Stadio 4: il normale sistema Debian
3.2. init in stile SysV
3.2.1. Il significato del runlevel
3.2.2. La configurazione del runlevel
3.2.3. Esempio di gestione dei runlevel
3.2.4. Il parametro predefinito per ciascuno script init
3.2.5. Il nome host
3.2.6. Il filesystem
3.2.7. Inizializzazione delle interfacce di rete
3.2.8. Inizializzazione dei servizi di rete
3.2.9. I messaggi di sistema
3.2.10. I messaggi del kernel
3.3. Il sistema udev
3.3.1. L'inizializzazione dei moduli del kernel

È bene che l'amministratore di sistema conosca almeno a grandi linee come viene avviato e configurato il sistema Debian. Anche se i dettagli precisi sono nei file sorgenti dei pacchetti installati e nella loro documentazione, essi sono un po' troppo per la maggior parte degli utenti.

Ho cercato di fornire una veloce panoramica dei punti chiave del sistema Debian e della loro configurazione, come punto di riferimento per l'utente, in base alle conoscenze attuali e passate mie e di altri. Dato che il sistema Debian è in costante evoluzione, la situazione potrebbe essere cambiata. Prima di fare qualsiasi modifica al sistema, si dovrebbe far riferimento alla documentazione più recente per ciascun pacchetto.

Il sistema del computer passa attraverso varie fasi del processo di avvio, dall'accensione a quando offre all'utente il sistema operativo (SO) pienamente funzionante.

Per semplicità la spiegazione è limitata alla piattaforma PC tipica con l'installazione standard.

Il normale processo di avvio è come un razzo a quattro stadi. Ogni stadio del razzo passa il controllo del sistema allo stadio successivo.

Naturalmente questo può essere configurato in modo diverso. Per esempio, se è stato compilato un kernel personalizzato, si potrebbe saltare la fase con il mini-sistema Debian. Non dare per scontato che quanto detto valga per il proprio sistema fino a che non si abbia controllato direttamente.

[Nota] Nota

Per piattaforme PC non sorpassate, come il sistema SUN o Macintosh, il BIOS nella ROM e la partizione sul disco possono essere alquanto differenti (Sezione 9.5.2, «Configurazione del partizionamento dei dischi»). In questi casi, cercare la documentazione piattaforma specifica altrove.

Il BIOS è il primo stadio del processo di avvio che viene avviato dall'accensione. Il BIOS, che risiede nella ROM (read only memory, memoria in sola lettura) è eseguito da un particolare indirizzo di memoria al quale è inizializzato, dall'accensione, il contatore di programma della CPU.

Il BIOS effettua l'inizializzazione base dell'hardware (POST (power on self test, auto-test di accensione) e passa il controllo del sistema allo stadio successivo fornito dall'utente. Il BIOS è di solito fornito con l'hardware.

La schermata di avvio del BIOS indica solitamente quale tasto o tasti premere per entrare nella schermata di impostazioni del BIOS, per configurarne il comportamento. Tasti comunemente usati sono F1, F2, F10, Esc, Ins e Canc. Se la schermata di avvio del BIOS è nascosta da una bella schermata grafica, si può premere dei tasti, come Esc, per disabilitarla. Quali tasti vadano premuti dipende fortemente dall'hardware.

Dalla schermata di impostazioni del BIOS si può scegliere la posizione hardware e la priorità del codice avviato dal BIOS. Tipicamente vengono caricati in memoria i primi pochi settori del primo dispositivo selezionato trovato (disco fisso, dischetto floppy, CD-ROM, ...) e viene eseguito questo codice iniziale che può essere una qualsiasi tra le cose seguenti.

  • Il codice del bootloader

  • Il codice del kernel di SO di passaggio come FreeDOS

  • Il codice del kernel del sistema operativo finale, se può essere contenuto in questo piccolo spazio

Tipicamente il sistema viene avviato dalla partizione specificata del disco fisso primario. I primi 2 settori del disco fisso nei PC vecchi contengono ilmaster boot record (MBR). Le informazioni sulle partizioni del disco, inclusa la selezione per l'avvio sono memorizzate alla fine di questo MBR. Il primo codice boot loader eseguito dal BIOS occupa la parte restante di questo MBR.

Il bootloader è il secondo stadio del processo di avvio che è iniziato dal BIOS. Carica l'immagine kernel del sistema e l'immagine initrd in memoria e passa il controllo ad essi. L'immagine initrd è l'immagine del file system radice ed il suo supporto dipende dal bootloader usato.

Il sistema Debian normalmente usa il kernel Linux come kernel predefinito del sistema. L'immagine initrd dell'attuale kernel Linux 2.6/3.x è tecnicamente l'immagine initramfs (initial RAM filesystem). Questa è un archivio cpio compresso con gzip dei file nel filesystem root.

L'installazione predefinita del sistema Debian posiziona, per la piattaforma PC, il codice di primo stadio del bootloader GRUB nell'MBR. Sono disponibili molti bootloader e opzioni di configurazione.


[Avvertimento] Avvertimento

Non mettere mano ai bootloader senza aver creato supporti avviabili di ripristino (CD o floppy) da immagini nel pacchetto grub-rescue-pc. Questo permette di avviare il sistema anche senza un bootloader funzionante sul disco fisso.

Per GRUB Legacy, il file di configurazione del menu è "/boot/grub/menu.lst". Contiene, per esempio, delle voci come quella seguente.

title           Debian GNU/Linux
root            (hd0,2)
kernel          /vmlinuz root=/dev/hda3 ro
initrd          /initrd.img

Per GRUB 2, il file di configurazione del menu è "/boot/grub/grub.cfg". Viene generato automaticamente da "/usr/sbin/update-grub" usando modelli da "/etc/grub.d/*" e impostazioni da "/etc/default/grub". Contiene, per esempio, delle voci come quella seguente.

menuentry "Debian GNU/Linux" {
        set root=(hd0,3)
        linux /vmlinuz root=/dev/hda3
        initrd /initrd.img
}

Negli esempi precedenti i parametri di GRUB hanno i seguenti significati.


[Nota] Nota

Il valore per il numero di partizione usato dal programma GRUB Legacy è minore di uno rispetto a quello normale usato dal kernel Linux e dagli strumenti di utilità. il programma GRUB 2 ha risolto questo problema.

[Suggerimento] Suggerimento

Per identificare un particolare dispositivo a blocchi si può usare il suo UUID (vedere Sezione 9.5.3, «Accedere alle partizioni usando UUID») invece del suo nome file come "/dev/hda3", ad esempio "root=UUID=81b289d5-4341-4003-9602-e254a17ac232 ro".

[Suggerimento] Suggerimento

Se viene usato GRUB, il parametro di avvio del kernel viene impostato in /boot/grub/grub.cfg. Nei sistemi Debian non si dovrebbe modificare direttamente il file /boot/grub/grub.cfg. Si dovrebbe modificare il valore GRUB_CMDLINE_LINUX_DEFAULT in /etc/default/grub ed eseguire update-grub(8) per aggiornare /boot/grub/grub.cfg.

[Suggerimento] Suggerimento

Si può avviare un bootloader da un altro bootloader usando una tecnica chiamata caricamento a catena.

Vedere "info grub" e grub-install(8).

Il mini-sistema Debian è il terzo stadio del processo di avvio che viene iniziato dal bootloader. Esegue il kernel del sistema con il suo filesystem root in memoria. Questo è uno stadio opzionale preparatorio del processo di avvio.

[Nota] Nota

L'espressione "sistema Debian mini" è stata coniata per descrivere il terzo stadio del processo di avvio in questo documento. Normalmente ci si riferisce a questo sistema come sistema initrd o initramfs. Un sistema simile in memoria è usato dall'installatore Debian.

Lo script "/init" viene eseguito come primo programma in questo filesystem root in memoria. È un programma script di shell che inizializza il kernel in spazio utente e passa il controllo allo stadio successivo. Questo mini-sistema Debian offre flessibilità al processo di avvio, come la possibilità di aggiungere moduli del kernel prima del processo di avvio principale o di montare il filesystem root come cifrato.

Si può interrompere questa parte del processo di avvio per ottenere una shell di root fornendo il parametro di avvio per il kernel "break=init" etc. Vedere lo script "/init" per ulteriori condizioni di interruzione. Questo ambiente shell è abbastanza sofisticato da fare una buona ispezione dell'hardware della macchina.

I comandi disponibili in questo mini-sistema Debian sono versioni minimali e vengono principalmente forniti da uno strumento GNU chiamato busybox(1).

[Attenzione] Attenzione

È necessario usare l'opzione "-n" per il comando mount quando si è nel filesystem root in sola lettura.

Il sistema Debian normale è il quarto stadio del processo di avvio che viene iniziato dal mini-sistema Debian. Il kernel di sistema del mini-sistema Debian continua ad essere in esecuzione anche in questo ambiente. Il filesystem root viene cambiato da quello in memoria all'effettivo filesystem sul disco fisso.

Il programma init viene eseguito come primo programma con PID=1 per effettuare il processo principale di avvio di far partire molti programmi. Il percorso di file predefinito per il programma init è «/sbin/init», ma può essere cambiato con un parametro di avvio del kernel come in «init=/percorso/del/programma_init».

Il programma init predefinito ha subito cambiamenti:

  • Prima di squeeze Debian usava il semplice init in stile SysV.

  • Debian wheezy migliora l'init in stile SysV ordinando la sequenza con intestazioni LSB e avviando gli script di avvio in parallelo.

  • Debian jessie è passata come init predefinito a systemd per l'inizializzazione pilotata da eventi e in parallelo.

[Suggerimento] Suggerimento

Tutti i meccanismi di avvio sono compatibili grazie agli script "/etc/init.d/rc", "/etc/init.d/rcS", "/usr/sbin/update-rc.d" e "/usr/sbin/invoke-rc.d".

[Suggerimento] Suggerimento

Si può verificare quale è l'effettivo comando init nel proprio sistema con il comando «ps --pid 1 -f».


[Suggerimento] Suggerimento

Il pacchetto readahead-fedora può velocizzare l'avvio di un sistema con una buona quantità di DRAM.

[Suggerimento] Suggerimento

Vedere la pagina del Wiki Debian sulla velocizzazione del processo di avvio per i più recenti suggerimenti su come velocizzare il processo di avvio.

Questa sezione descrive come il buon vecchio init in stile SysV avviava il sistema. Il sistema Debian non funziona esattamente come descritto qui, ma è piuttosto istruttivo sapere queste nozioni di base dato che i nuovi sistemi init tendono ad offrire funzionalità equivalenti.

Il processo di avvio in stile SysV essenzialmente passa attraverso le seguenti fasi.

  1. Il sistema Debian va nel runlevel N (None, nessuno) per inizializzare il sistema seguendo la descrizione "/etc/inittab".

  2. Il sistema Debian va nel runlevel S per inizializzare il sistema in modalità singolo-utente per completare l'inizializzazione dell'hardware, ecc.

  3. Il sistema Debian va in uno dei runlevel multiutente (da 2 a 5) specificato per avviare i servizi di sistema.

Il runlevel iniziale usato per la modalità multi-utente è specificato con il parametro di avvio del kernel "init=" o nella riga "initdefault" del file "/etc/inittab". Il sistema Debian, nella configurazione predefinita, si avvia nel runlevel 2.

Tutti i file script effettivamente eseguiti dal sistema init sono contenuti nella directory "/etc/init.d/".

Vedere init(8), inittab(5) e "/usr/share/doc/sysv-rc/README.runlevels.gz" per la spiegazione esatta.

Quando i comandi init(8) o telinit(8) vanno nel runlevel "<n>", il sistema fondamentalmente esegue gli script di inizializzazione nel modo seguente.

  1. Gli script in "/etc/rc<n>.d/ il cui nome inizia con una "K" vengono eseguiti in ordine alfabetico con l'unico argomento "stop". (uccisione dei servizi)

  2. Gli script in "/etc/rc<n>.d/ il cui nome inizia con una "S" vengono eseguiti in ordine alfabetico con l'unico argomento "start". (avvio dei servizi)

Per esempio, se in una directory di runlevel sono presenti i collegamenti "S10sysklogd" e "S20exim4", "S10sysklogd", che è un collegamento simbolico a "../init.d/sysklogd", viene eseguito prima di "S20exim4", che è un collegamento simbolico a "../init.d/exim4".

Questo semplice sistema di inizializzazione sequenziale è il classico sistema di avvio in stile System V ed è stato usato fino al rilascio Lenny di Debian.

Il sistema Debian recente è stato ottimizzato per eseguire invece gli script di inizializzazione in modo concorrente.

[Avvertimento] Avvertimento

È sconsigliato fare qualsiasi cambiamento ai collegamenti simbolici in "/etc/rcS.d/" a meno che non si sia più esperti del manutentore.

Per esempio, si può impostare il sistema dei runlevel in un modo che ricorda Red Hat Linux nel modo seguente.

  • init avvia il sistema con runlevel=3 in modo predefinito.

  • init non avvia gdm3(1) nei runlevel=(0,1,2,6).

  • init avvia gdm3(1) nei runlevel=(3,4,5).

Si può ottenre questo modificando con un editor il file "/etc/inittab", per cambiare il runlevel di avvio, e usando strumenti amichevoli di gestione dei runlevel come sysv-rc-conf o bum, per modificare i runlevel. Se si vuole invece usare solamente la riga di comando, si può farlo nel modo seguente (dopo l'installazione standard del pacchetto gdm3 e avendolo selezionato come display manager prescelto).

# cd /etc/rc2.d ; mv S21gdm3 K21gdm3
# cd /etc ; perl -i -p -e 's/^id:.:/id:3:/' inittab

Notare che il file "/etc/X11/default-display-manager" viene controllato quando vengono avviati i demoni per display manager: xdm, gdm3, kdm e wdm.

[Nota] Nota

Si può sempre avviare X da qualsiasi shell in console con il comando startx(1).

Il parametro predefinito per ciascun script init in "/etc/init.d/" è dato dal file corrispondente in "/etc/default/" che contiene solamente assegnazioni di variabili d'ambiente. Il nome della directory è una scelta specifica di Debian. È grossomodo l'equivalente della directory "/etc/sysconfig" di Red Hat Linux e altre distribuzioni. Per esempio, si può usare "/etc/default/cron" per controllare il funzionamento di "/etc/init.d/cron".

Il file "/etc/default/rcS" può essere usato per personalizzare impostazioni standard dell'avvio per motd(5), sulogin(8), ecc.

Se non si ottiene il comportamento voluto cambiando queste variabili, si possono modificare gli script init stessi. Questi sono file di configurazione modificabili dall'amministratore di sistema.

Molti servizi di rete (vedere Capitolo 6, Applicazioni per la rete) sono avviati nella modalità multi-utente direttamente, come processi demone, all'avvio da script di init, per esempio, "/etc/rc2.d/S20exim4" (per RUNLEVEL=2) che è un collegamento simbolico a "/etc/init.d/exim4".

Alcuni servizi di rete possono essere avviati a richiesta, usando il super-server inetd (o un equivalente). inetd viene avviato all'avvio da "/etc/rc2.d/S20inetd" (per RUNLEVEL=2) che è un collegamento simbolico a "/etc/init.d/inetd". Fondamentalmente inetd permette ad un demone in esecuzione di invocarne svariati altri, riducendo il carico sul sistema.

Quando al super-server inetd arriva una richiesta per un servizio, vengono identificati il suo protocollo e il suo servizio cercandoli nei database in "/etc/protocols" e "/etc/services". inetd quindi cerca un servizio Internet normale nel database "/etc/inetd.conf" o un servizio basato su Open Network Computing Remote Procedure Call (ONC RPC)/Sun RPC in "/etc/rpc.conf".

A volte, inetd non avvia il servizio richiesto direttamente, ma avvia il programma wrapper TCP tcpd(8), con il nome di servizio richiesto, in "/etc/inetd.conf", come argomento. In questo caso, tcpd esegue il programma server appropriato dopo aver fatto la registrazione della richiesta e qualche altro controllo addizionale usando "/etc/hosts.deny" e "/etc/hosts.allow".

Per la sicurezza del sistema è bene disabilitare più servizi di rete possibile. Vedere Sezione 4.6.4, «Limitare l'accesso ad alcuni servizi server».

Vedere inetd(8), inetd.conf(5), protocols(5), services(5), tcpd(8), hosts_access(5), hosts_options(5), rpcinfo(8), portmap(8) e "/usr/share/doc/portmap/portmapper.txt.gz".

Per i kernel Linux 2.6 e successivi, il sistema udev fornisce un meccanismo di rilevazione e inizializzazione automatiche dell'hardware (vedere udev(7)). Per ogni dispositivo rilevato dal kernel, il sistema udev avvia un processo utente che usa le informazioni del filesystem sysfs (vedere Sezione 1.2.12, «procfs e sysfs»), carica, usando modprobe(8) (vedere Sezione 3.3.1, «L'inizializzazione dei moduli del kernel»), i moduli del kernel necessari per il supporto del dispositivo e crea i nodi di device corrispondenti.

[Suggerimento] Suggerimento

Se, per una qualche ragione "/lib/modules/<versione-kernel>/modules.dep non viene generato in modo appropriato dal depmod(8), i moduli non possono essere caricati come dovuto dal sistema udev. Per risolvere il problema eseguire "depmod -a".

Il nome dei nodi di device può essere configurato dai file di regole di udev in "/etc/udev/rules.d/". Le regole predefinite attuali tendono a creare nomi generati dinamicamente che hanno come risultato nomi di device non fissi, tranne che per dispositivi CD e di rete. Aggiungendo le proprie regole personalizzate, in modo simile a quelle per i dispositivi CD e di rete, si possono creare nomi di device statici anche per altri dispositivi, come chiavette USB. Vedere "Scrivere regole udev" o "/usr/share/doc/udev/writing_udev_rules/index.html".

Dato che il sistema udev è in qualche modo in costante evoluzione, in questo documento sono fornite informazioni base, lasciando i dettagli ad altra documentazione.

[Suggerimento] Suggerimento

Per le regole di montaggio in "/etc/fstab", non è necessario che i nodi di device siano statici. Si possono usare gli UUID per montare i dispositivi, al posto dei nomi di device come "/dev/sda". Vedere Sezione 9.5.3, «Accedere alle partizioni usando UUID».

Il programma modprobe(8) permette di configurare il kernel Linux in esecuzione da processi utente, aggiungendo e rimuovendo moduli del kernel. Il sistema udev (vedere Sezione 3.3, «Il sistema udev») automatizza la sua invocazione per facilitare l'inizializzazione dei moduli del kernel.

Ci sono moduli non-hardware e speciali moduli con driver hardware, come quelli elencati in seguito, che devono essere precaricati elencandoli nel file "/etc/modules" (vedere modules(5)).

I file di configurazione per il programma modprobe(8) sono contenuti nella directory "/etc/modprobes.d/", come spiegato in modprobe.conf(5). (Se si desidera evitare l'autocaricamento di alcuni moduli del kernel, considerare la loro aggiunta nella lista nera nel file "/etc/modprobes.d/blacklist".)

Il file "/lib/modules/<versione>/modules.dep" generato dal programma depmod(8) descrive le dipendenze dei moduli usate dal programma modprobe(8).

[Nota] Nota

Se si hanno problemi di caricamento dei moduli all'avvio o con modprobe(8), "depmod -a" potrebbe risolverli rigenerando il file "modules.dep".

Il programma modinfo(8) mostra informazioni su un modulo del kernel Linux.

Il programma lsmod(8) formatta in un bel modo i contenuti di "/proc/modules", mostrando quali moduli del kernel siano attualmente caricati.

[Suggerimento] Suggerimento

Si può identificare l'esatto hardware sul proprio sistema. Vedere Sezione 9.4.3, «Identificazione dell'hardware».

[Suggerimento] Suggerimento

Si può configurare l'hardware all'avvio per attivare le funzionalità dell'hardware desiderate. Vedere Sezione 9.4.4, «Configurazione dell'hardware».

[Suggerimento] Suggerimento

Si può probabilmente aggiungere il supporto per il proprio speciale dispositivo ricompilando il kernel. Vedere Sezione 9.9, «Il kernel».