Processo di boot Linux su un PC x86 : il Bootstrap

Transcript

Processo di boot Linux su un PC x86 : il Bootstrap
Processo di boot Linux su un
PC x86 : il Bootstrap
http://www.imolug.org/wiki/index.php/Bootstrap
Bootstrap
Durante il processo di avvio i normali strumenti
del sistema operativo non sono disponibili, quindi
il computer deve riuscire a farcela da solo
”tirandosi su con le cinghie dei propri stivali”.
Bootstrap
System Startup
La fase di boot di Linux dipende dall'hardware su cui
viene avviato; in alcune piattaforme viene utilizzato
un'ambiente di bootstrap specifico, alcuni esempi :
U-Boot : sta per Universal Bootloader, disponibile per diverse
architetture tra cui PPC,ARM, X86 ecc...; è un software free
rilasciato sotto licenza GPL.
➢ RedBoot : applicazione open source che permette il download e
l'esecuzione di applicazioni embedded via serial o ethernet.
➢ Boot Monitor : è un piccolo programma interattivo che permette
ad un utente di caricare un sistema operativo; risiede in ROM o in
una locazione ben conosciuta su un disco; permette all'utente di
ispezionare e fare il setup dell'hardware; tra i più famosi troviamo il
BIOS, ma ci sono anche Open Firmware e Micromonitor
➢
System Startup - BIOS
Esistono BIOS, oltre che per il PC, anche per :
Schede video
➢ Controller RAID
➢ Schede SCSI
➢ Schede di rete
➢
Con una combinazione di tasti è possibile
intervenire manualmente accedendo ad una
interfaccia di configurazione; l'utilizzo tipico è
modificare la sequenza dei dispositivi di boot del
PC.
System Startup - BIOS
System Startup - BIOS
L'avvio di Linux inizia nel BIOS, il quale si avvia
dall'indirizzo di memoria 0xFFFF0.
BIOS esegue due operazioni :
➢ Power On Self Test
➢ Enumerazione e inizializzazione hardware
System Startup - BIOS
Ricerca di un dispositivo da cui eseguire il boot
(active and bootable)
Devices possibili : floppy, cdrom, HD partition,
USB flash memory, network device.
From System Startup to
Stage 1 Boot Loader - MBR
Il Master Boot Record consiste in 512 byte
posizionati nel primo settore dell'hard disk
identificato per il boot :
SECTOR 1 of CYLINDER 0, HEAD 0
Dopo che il caricamento dell'MBR è avvenuto in
RAM, il BIOS gli lascia il controllo
Stage 1 Boot Loader - MBR
Magic Number
0xAA55
Stage 1 Boot Loader - MBR
Interessanti sono i 64 bytes del MBR che contengono le
info inerenti alla tabella delle partizioni : max 4 partizioni
per cui 16 bytes ciascuna, i quali contengono le seguenti
informazioni :
0 : indicatore di boot (valore 80 Hex se attivo)
➢ 1 : testina, settore e cilindro del primo blocco della
partizione
➢ 4 : identificazione del filesystem contenuto nella partizione
➢ 5-7 : testina, settore e cilindro dell'ultimo blocco della
partizione
➢ 8-11 : numero di blocchi prima della partizione
➢ 12-15 : numero di blocchi che costituiscono la partizione
➢
Stage 1 Boot Loader - HD
Stage 1 Boot Loader - HD
➢ Piatto : un disco rigido si compone di uno o più dischi paralleli, di cui ogni
superficie, detta "piatto" e identificata da un numero univoco, è destinata alla
memorizzazione dei dati.
➢ Traccia : ogni piatto si compone di numerosi anelli concentrici numerati, detti
tracce ciascuna identificata da un numero univoco.
➢ Cilindro : l'insieme di tracce alla stessa distanza dal centro presenti su tutti i
dischi è detto cilindro. Corrisponde a tutte le tracce aventi il medesimo numero,
ma diverso piatto.
➢ Settore : ogni piatto è suddiviso in "spicchi" radiali uguali ciascuno identificato
da un numero univoco.
➢ Blocco : L'insieme di settori posti nella stessa posizione in tutti i piatti.
➢ Testina : Su ogni piatto è presente una testina per accedere in scrittura o in
lettura ai dati memorizzati sul piatto; la posizione di tale testina è solidale con
tutte le altre sugli altri piatti. In altre parole, se una testina è posizionata sopra
una traccia, tutte le testine saranno posizionate nel cilindro a cui la traccia
appartiene.
Stage 1 Boot Loader - MBR
E' possibile eseguire il backup del MBR tramite il
comando come root :
dd if=/dev/hda of=mbr.bin bs=512 count=1
Il comando legge i primi 512 bytes da hda e li
scrive nel file mbr.bin
Il restore si ottiene con il seguente comando
sempre da eseguire come root:
dd if=mbr.bin of=/dev/hda bs=512 count=1
From Stage 1 Boot Loader
to Stage 2 - GRUB
Obiettivo principale dello Stage 2 è caricare il
kernel Linux.
La combinazione dello Stage 1 e 2 prende il nome
di LILO (LInux LOader) oppure GRUB (GRand
Unified Bootloader).
Stage 2 - GRUB
Stage 2 - GRUB
GRUB ha la particolarità di conoscere i file system
Linux grazie ad uno stadio intermedio definito
Stage 1.5
Quando lo Stage 1.5 è caricato e attivo allora è
possibile caricare lo Stage 2 il quale visualizza
l'elenco dei kernel disponibili.
Grub si appoggia a due file di configurazione :
grub.conf e menu.lst
Stage 2 - GRUB
default 0
timeout 10
title
Hardy Heron Ubuntu 8.04, kernel 2.6.24-16-generic
root
(hd0,2)
kernel
/boot/vmlinuz-2.6.24-16-generic root=UUID=e0c9adfe1ba7-4a2b-9870-f3a3e41231ac ro quiet splash noapic noacpi
locale=it_IT
initrd
/boot/initrd.img-2.6.24-16-generic
quiet
title
Windows XP/Vista (loader)
root
(hd0,0)
savedefault
makeactive
chainloader +1
From Stage 2 to Kernel Linux
Con lo Stage 2 caricato in memoria, il file system
viene consultato, le immagine del kernel e initrd
vengono a loro volta caricate in memoria.
Con le immagini pronte lo Stage 2 invoca
l'immagine del kernel.
Kernel - Linux
Tipicamente il kernel che viene caricato non è un
eseguibile ma bensì una immagine che contiene all'inizio
della stessa una routine che consente le seguenti
operazioni :
➢ la decompressione il posizionamento in memoria alta
del kernel
➢ se presente un'immagine initrd, la sposta in memoria
e lo annota per una fase successiva
➢ una chiamata al kernel in modo da avviarne il boot
Uncompressing Linux... Ok, booting the kernel
Kernel - Linux
From Kernel to INIT – User
Space
Dopo che il kernel è stata avviato e inizializzato, lo
stesso kernel avvia il primo processo
non-kernel : init il quale ha sempre l'ID 1
USER
root
PID %CPU %MEM
1 0.0
0.0
VSZ RSS TTY
4020 876 ?
STAT START TIME COMMAND
Ss
17:27
0:00 /sbin/init
INIT – User Space
INIT legge il proprio file di configurazione e determina quello
che viene denominato RUNLEVEL che in sostanza imposta il
comportamento del sistema.
I runlevel sono 7 e possono avere i valori :
0 Ferma il sistema
➢ 1 Entra in modalità singolo utente (no network)
➢ 2 Modalità multiutente ma senza NFS
➢ 3 Modalità multiutente completa
➢ 4 Non utilizzato
➢ 5 Come il 3 ma con X window
➢ 6 Riavvia il sistema
➢
INIT – User Space
Il valore del runlevel decide il comportamento del
sistema grazie all'avvio di script denominati
RC(Run Command).
Esiste una cartella (/etc/rcx.d) per ogni runlevel
con dentro i link agli script RC veri e propri :
lrwxrwxrwx 1 root root 13 2008-04-27 14:04 K01gdm -> ../init.d/gdm
lrwxrwxrwx 1 root root 17 2008-04-27 14:04 K01usplash -> ../init.d/usplash
lrwxrwxrwx 1 root root 17 2008-09-12 22:06 K09apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root root 22 2008-04-27 14:04 S15wpa-ifupdown -> ../init.d/wpaifupdown
lrwxrwxrwx 1 root root 18 2008-04-27 14:04 S20sendsigs -> ../init.d/sendsigs
INIT – User Space
lrwxrwxrwx 1 root root 13 2008-04-27 14:04 K01gdm -> ../init.d/gdm
Da notare la nomenclatura dei file che presentano il prefisso K o S
e un numero.
Quando si passa ad un runlevel più alto, init esegue con il
parametro Start tutti gli script che iniziano con S, in ordine
numerico crescente.
Nel passaggio ad un runlevel più basso, init esegue con il
parametro Stop tutti gli script che iniziano con K, in ordine
decrescente.
Questo metodo permette di decidere quali demoni avviare e in
quale sequenza, non ha alcun senso avviare il demone sshd se
prima non si attivano le interfacce di rete.
Gli script e la posizione degli stessi nel file system cambiano a
seconda della distribuzione.
LINUX
Fabrizio Canonici
GRAZIE