| Red Hat Linux 9: Red Hat Linux Reference Guide | ||
|---|---|---|
| Indietro | Capitolo 1. Processo di avvio, init e spegnimento | Avanti |
L'inizio del processo di avvio varia in base alla piattaforma in cui viene avviato Red Hat Linux. Tuttavia, quando il kernel viene rilevato e caricato dal sistema, il processo di avvio di default è identico per tutte le architetture. Nell'esempio riportato di seguito, si tratterà di un computer con sistema x86.
Quando un computer x86 viene avviato, il processore controlla il BIOS o Basic Input/Output System alla fine della memoria di sistema e lo avvia. Il BIOS controlla non solo la prima fase del processo di avvio, ma fornisce l'interfaccia di livello inferiore alle periferiche. Per questo motivo è scritto in una memoria permanente in sola lettura e può sempre essere utilizzato.
Altre piattaforme utilizzano programmi diversi per eseguire attività di livello inferiore in minima parte equivalenti a quelle del BIOS di un sistema x86. Per esempio i computer con processore Itanium utilizzano la shell EFI (Extensible Firmware Interface, mentre i sistemi Alpha utilizzano la console SRM.
Dopo il caricamento il BIOS esamina il sistema, cerca e controlla le periferiche e cerca un dispositivo valido per avviare il sistema. Di solito controlla le unità floppy e i CD-ROM presenti alla ricerca di supporti avviabili e verifica il disco fisso. Nella maggior parte dei casi, la sequenza delle unità utilizzate per l'avvio è controllata da una particolare configurazione del BIOS. Spesso il primo disco fisso impostato per l'avvio è il disco C o il dispositivo IDE master del bus IDE primario. Il BIOS carica in memoria qualsiasi programma si trovi nel primo settore di questo dispositivo, denominato MBR o Master Boot Record. L'MBR ha dimensioni pari a soli 512 byte e contiene le istruzioni in codice macchina per l'avvio del computer oltre alla tabella delle partizioni. Al termine dell'operazione il BIOS passa il controllo a qualsiasi programma si trova nell'MBR.
Questa sezione si dedica in particolare al processo di avvio per la piattaforma x86, che può variare leggermente in base all'architettura del sistema. Per ulteriori informazioni sui processi di avvio diversi da x86, consultate la Sezione 1.2.2.1.
In Red Hat Linux sono disponibili due boot loaders: GRUB o LILO. GRUB è il boot loader di default, ma LILO è disponibile per coloro che lo richiedono per la propria configurazione hardware o per chi lo preferisce. Per ulteriori informazioni sulla configurazione e l'utilizzo di GRUB o LILO, consultate Capitolo 2.
Entrambi boot loader per la piattaforma x86 sono caratterizzati da almeno due fasi, la prima delle quali è rappresentata da una piccola porzione del codice macchina binario dell'MBR. L'unico obiettivo di questa fase è quello di rilevare il boot loader secondario e caricare la prima parte in memoria.
GRUB è il boot loader più recente e ha il vantaggio di poter leggere ext2 e ext3. [1]partizioni e carica il file di configurazione — /boot/grub/grub.conf— durante l'avvio. Per ulteriori informazioni consultate la Sezione 2.7.
LILO, il boot loader secondario, utilizza l'informazione sul MBR per determinare quale opzione di avvio è disponibile all'utente. Questo significa che quando viene effettuata una modifica di configurazione oppure il kernel viene aggiornato manualmente, il comando /sbin/lilo -v -v deve essere eseguito per scrivere questa informazione sul MBR. Per dettagli su come utilizzare questo comando, consultate la Sezione 2.8.
![]() | Suggerimento |
|---|---|
Se aggiornate il kernel mediante Red Hat Update Agent, il file di configurazione per il boot loader verrà aggiornato automaticamente. Per ulteriori infomazioni su Red Hat Network fate riferimento all'URL riportato di seguito: https://rhn.redhat.com. |
Quando il boot loader secondario è in memoria, viene visualizzata la schermata iniziale di Red Hat Linux che mostra i diversi
sistemi operativi o i kernel che sono stati configurati per l'avvio.
Su questa schermata un'utente può usare i tasti direzionali per scegliere quale sistema operativo o kernel vuole avviare e premere
![]() | Nota Bene |
|---|---|
Se avete installato il supporto per il kernel SMP (Symmetric Multi-Processor), potrete visualizzare più opzioni al primo avvio del sistema. In LILO potrete visualizzare linux, il kernel di SMP, e linux-up, per singoli processori. GRUB visualizza Red Hat Linux (<versione-kernel>-smp), il kernek di SMP, e Red Hat Linux (<versione-kernel>), per singoli processori. Se si verificassero problemi con il kernel SMP, provate a selezionare il kernel non-SMP kernel dopo il riavvio. |
Quando il boot loader di seconda fase ha determinato quale kernel avviare, rileva il kernel binario corrispondente nella directory /boot/. Il kernel binario si chiama usando il formato che segue — /boot/vmlinuz-<versione-kernel> file (dove <versione-kernel> corrisponde alla versione di kernel specificata nelle impostazioni del boot loader).
Per instruzioni su come usare il boot loader per fornire argomenti della linea di comando al kernel, consultate Capitolo 2. Per maggiori informazioni su come modificare il runlevel al prompt di GRUB o LILO, consultate la Sezione 2.10.
Colloca quindi in memoria l'immagine RAM disk iniziale appropriata, denominata initrd. initrd è utilizzata dal kernel per caricare tutti i driver non compilati e che sono necessari per avviare il sistema. Questa operazione è particolarmente importante se disponete di unità SCSI o state utilizzando il filesystem ext3 [2].
![]() | Avvertenza |
|---|---|
Non rimuovete per nessun motivo la directory /initrd/ dal filesystem o il sistema non sarà in grado di avviarsi e verrà visualizzato un messaggio di errore relativo al kernel. |
Dopo avere caricato in memoria il kernel e l'immagine initrd, il boot loader trasferisce il controllo del processo di avvio al kernel.
Per una panoramica dettagliata sui boot loader GRUB e LILO, consultate Capitolo 2.
Dopo il caricamento del kernel di Red Hat Linux e il trasferimento del processo di avvio al comando init, gli stessi eventi si verificano in ciascuna architettura nello stesso modo. L'unica differenza tra le architetture sta nell'applicazione utilizzata per trovare e caricare il kernel.
Per esempio, l'architettura Alpha utilizza il boot loader aboot, mentre l'architettura Itanium impiega il boot loader ELILO.
Consultate la specifica Red Hat Linux Installation Guide per queste piattaforme e per informazioni su come configurare le relative boot loader.
Quando il kernel viene caricato, inizializza e configura immediatamente la memoria del computer. Configura quindi i vari elementi hardware collegati al sistema, inclusi tutti i processori e i sottosistemi I/O, oltre a tutti i dispositivi di memorizzazione. Cerca quindi l'immagine initrd compressa in un percorso predeterminato della memoria, la decomprime, la monta e carica tutti i driver necessari. Successivamente inizializza i dispositivi virtuali del sistema, come LVM o il software RAID prima di smontare l'immagine disco initrd e liberare tutta la memoria.
Dopo l'inizializzazione di tutti i dispositivi del sistema da parte del kernel, viene creato un dispositivo root, montata la partizione root di sola lettura e liberata la memoria non utilizzata.
Il kernel risulta così caricato in memoria e operativo. Tuttavia, senza alcuna applicazione che consenta all'utente di fornire input significativo al sistema, il kernel non è molto utile.
Per configurare l'ambiente utente, il kernel esegue il comando /sbin/init.
Il programma /sbin/init (chiamato anche init) coordina la fase restante del processo di avvio e configura l'ambiente per l'utente.
Quando init viene eseguito, diventa il padre di tutti i processi che si avviano automaticamente sul sistema Red Hat Linux. Innanzitutto esegue lo script /etc/rc.d/rc.sysinit che imposta il percorso, attiva lo swapping, controlla i filesystem e così via. In sostanza, si occupa di tutti i processi che vanno eseguiti all'inizializzazione del sistema. Per esempio, la maggior parte dei sistemi utilizza un orologio e rc.sysinit usa il file di configurazione /etc/sysconfig/clock per inizializzare l'orologio. Un'altro esempio è se dovete inizializzare processi speciali per le porte seriali, rc.sysinit può eseguire anche il file /etc/rc.serial.
In seguito il comando init esegue lo script /etc/inittab, che descrive il modo in cui il sistema va configurato per ogni runlevel SysV [3]. Questo file specifica, tra le altre cose, che /etc/inittab imposta il runlevel predefinito e che /sbin/update va eseguito a ogni avvio dei runlevel. [4].
Successivamente il comando init configura la libreria delle funzioni sorgenti /etc/rc.d/init.d/functions per il sistema, che stabilisce come avviare o terminare un programma e come trovare il PID di un programma.
A questo punto il programma init avvia tutti i processi di background cercando nella relativa directory rc il runlevel specificato come predefinito in /etc/inittab. Le directory rc) sono numerate per corrispondere ai runlevel che rappresentano. Per esempio /etc/rc.d/rc5.d/ è la directory per il runlevel cinque.
Quando si esegue l'avvio dal runlevel 5, il programma init cerca nella directory /etc/rc.d/rc5.d/ per determinare quali processi iniziare e arrestare.
Di seguito è riportato un esempio che illustra un runlevel 5, la directory /etc/rc.d/rc5.d/:
K05innd -> ../init.d/innd K05saslauthd -> ../init.d/saslauthd K10psacct -> ../init.d/psacct K12cWnn -> ../init.d/cWnn K12FreeWnn -> ../init.d/FreeWnn K12kWnn -> ../init.d/kWnn K12mysqld -> ../init.d/mysqld K12tWnn -> ../init.d/tWnn K15httpd -> ../init.d/httpd K15postgresql -> ../init.d/postgresql K16rarpd -> ../init.d/rarpd K20bootparamd -> ../init.d/bootparamd K20iscsi -> ../init.d/iscsi K20netdump-server -> ../init.d/netdump-server K20nfs -> ../init.d/nfs K20rstatd -> ../init.d/rstatd K20rusersd -> ../init.d/rusersd K20rwalld -> ../init.d/rwalld K20rwhod -> ../init.d/rwhod K24irda -> ../init.d/irda K25squid -> ../init.d/squid K28amd -> ../init.d/amd K34dhcrelay -> ../init.d/dhcrelay K34yppasswdd -> ../init.d/yppasswdd K35atalk -> ../init.d/atalk K35dhcpd -> ../init.d/dhcpd K35smb -> ../init.d/smb K35vncserver -> ../init.d/vncserver K35winbind -> ../init.d/winbind K40mars-nwe -> ../init.d/mars-nwe K45arpwatch -> ../init.d/arpwatch K45named -> ../init.d/named K45smartd -> ../init.d/smartd K46radvd -> ../init.d/radvd K50netdump -> ../init.d/netdump K50snmpd -> ../init.d/snmpd K50snmptrapd -> ../init.d/snmptrapd K50tux -> ../init.d/tux K54pxe -> ../init.d/pxe K55routed -> ../init.d/routed K61ldap -> ../init.d/ldap K65identd -> ../init.d/identd K65kadmin -> ../init.d/kadmin K65kprop -> ../init.d/kprop K65krb524 -> ../init.d/krb524 K65krb5kdc -> ../init.d/krb5kdc K70aep1000 -> ../init.d/aep1000 K70bcm5820 -> ../init.d/bcm5820 K74ntpd -> ../init.d/ntpd K74ups -> ../init.d/ups K74ypserv -> ../init.d/ypserv K74ypxfrd -> ../init.d/ypxfrd K84bgpd -> ../init.d/bgpd K84ospf6d -> ../init.d/ospf6d K84ospfd -> ../init.d/ospfd K84ripd -> ../init.d/ripd K84ripngd -> ../init.d/ripngd K85zebra -> ../init.d/zebra K90isicom -> ../init.d/isicom K92ipvsadm -> ../init.d/ipvsadm K95firstboot -> ../init.d/firstboot S00microcode_ctl -> ../init.d/microcode_ctl S05kudzu -> ../init.d/kudzu S08ip6tables -> ../init.d/ip6tables S08ipchains -> ../init.d/ipchains S08iptables -> ../init.d/iptables S09isdn -> ../init.d/isdn S10network -> ../init.d/network S12syslog -> ../init.d/syslog S13portmap -> ../init.d/portmap S14nfslock -> ../init.d/nfslock S17keytable -> ../init.d/keytable S20random -> ../init.d/random S24pcmcia -> ../init.d/pcmcia S25netfs -> ../init.d/netfs S26apmd -> ../init.d/apmd S28autofs -> ../init.d/autofs S44acpid -> ../init.d/acpid S55sshd -> ../init.d/sshd S56rawdevices -> ../init.d/rawdevices S56xinetd -> ../init.d/xinetd S80sendmail -> ../init.d/sendmail S80spamassassin -> ../init.d/spamassassin S84privoxy -> ../init.d/privoxy S85gpm -> ../init.d/gpm S90canna -> ../init.d/canna S90crond -> ../init.d/crond S90cups -> ../init.d/cups S90xfs -> ../init.d/xfs S95anacron -> ../init.d/anacron S95atd -> ../init.d/atd S97rhnsd -> ../init.d/rhnsd S99local -> ../rc.local S99mdmonitor -> ../init.d/mdmonitor |
Nessuno degli script che avvia e arresta realmente i servizi si trova nella directory /etc/rc.d/rc5.d/. Tutti i file in /etc/rc.d/rc5.d/ sono link simbolici diretti a script che si trovano nella directory /etc/rc.d/init.d/. I link simbolici sono utilizzati in ciascuna delle directory rc per fare in modo che i runlevel possano essere riconfigurati creando, modificando ed eliminando i link simbolici senza influire sugli script a cui fanno riferimento.
Il nome di ciascun link simbolico inizia con K o S. I link K sono processi che vengono terminati, mentre quelli che iniziano con S vengono avviati.
Il comando init arresta innanzi tutto i link simbolici K della directory eseguendo il comando /etc/rc.d/init.d/<comando> stop, in cui <comando> è il processo da terminare. Avvia quindi tutti i link simbolici S eseguendo il comando /etc/rc.d/init.d/<comando> start.
![]() | Suggerimento |
|---|---|
Al termine dell'avvio del sistema, potete accedere come root ed eseguire gli stessi script per avviare e interrompere i servizi. Per esempio /etc/rc.d/init.d/httpd stop interromperà il server Web Apache. |
Ciascuno dei link simbolici è numerato per stabilire l'ordine di avvio. Potete modificare l'ordine in cui i servizi vengono avviati o interrotti cambiando questo numero. I link simbolici con lo stesso numero sono avviati in base a un ordine alfabetico.
![]() | Nota Bene |
|---|---|
L'ultima azione di init è l'avvio di tutti gli script di /etc/rc.d/rc.local. Per uteriori informazioni sulla personalizzazione del sistema usando il file rc.local consultate la Sezione 1.3. |
Dopo che init ha percorso la directory appropriata rc alla ricerca del runlevel, lo script /etc/inittab crea un processo /sbin/mingetty per ciascuna console virtuale (prompt di login) di ogni runlevel. I runlevel da 2 a 5 dispongono di sei console, mentre il runlevel 1, in modalità a utente singolo, dispone di un'unica console e i runlevel 0 e 6 non ne ottengono nessuna. In sostanza, getty apre delle linee ai dispositivi tty [5], ne imposta la modalità, visualizza il prompt di login, riceve il nome dell'utente e inizializza il processo di login per quell'utente.
Nel runlevel 5 /etc/inittab esegue uno script denominato /etc/X11/prefdm. Lo script prefdm esegue il display manager X preferito — gdm, kdm,o xdm, in base al contenuto della directory /etc/sysconfig/desktop/.
A questo punto, il sistema operativo dovrebbe essere nel runlevel 5 e una schermata di login dovrebbe comparire.
| [1] | GRUB legge i filesystem ext3 come ext2, non facendo caso al file dei journal. Per ulteriori informazioni sul filesystem ext3 consultate il capitolo intitolato Il Filesystem ext3 nella Red Hat Linux Customization Guide. |
| [2] | Per dettagli su come creare un initrd, consultate la sezione sulla conversione di un filesystem ext3 nella Red Hat Linux Customization Guide. |
| [3] | Per maggiori informazioni su i runlevel SysV init, consultate la Sezione 1.4. |
| [4] | Il comando update viene utilizzato per ripulire i buffer difettosi su disco. |
| [5] | Per maggiori informazioni sui dispositivi tty, consultate la Sezione 5.3.11. |