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