Sistemi Operativi Corso di Laurea Triennale in Ingegneria Informatica Esercitazione 11 Kernel Linux (vs micro-kernel) Configurazione e compilazione Linux Kernel daniel.cesarini@for.unipi.it 1
Sommario Kernel monolitico vs modulare vs microkernel Kernel Linux: configurazione e compilazione... Kernel Linux, Configurazione e compilazione 2
Kernel (Differenti approcci)
Kernel monolitico Un unico file oggetto Un unico spazio di indirizzamento nel kernel tutti i processi a livello di sistema (quando sono nel kernel) condividono lo spazio di indirizzamento CPU, mem, IPC, Driver, Permessi, nel kernel Kernel Linux, Configurazione e compilazione 4
Micro-Kernel Nucleo micro Ridotto all'essenziale per garantire l'astrazione di macchina Scheduler (CPU virtuali) Memory management (memoria virtuale) IPC - Inter Process Communication es. L4 (Jochen Liedtke), GNU/Hurd,... Kernel Linux, Configurazione e compilazione 5
Monolithic vs Micro-Kernel microkernel: PRO - isolamento componenti - resistenza ai guasti - sicurezza CONTRO - tutto passa dall'ipc: - prestazioni, - difficoltà progettuale Kernel Linux, Configurazione e compilazione 6
Kernel modulare I kernel monolitici possono essere modularizzati Tale operazioni non incide sullo spazio di indirizzamento del kernel Si dice kernel modulare un kernel che permette il caricamento dinamico (a runtime ) di moduli oggetto Kernel Linux, Configurazione e compilazione 7
Kernel Linux configurazione / compilazione
Kernel Linux (2.6.x) Numeri mole: 320 Mb di sorgenti per 4 500 000 LOC costo dello sviluppo: 4 500 anni/uomo, 612 000 000 $ totale fonte: www.dwheeler.com/essays/linux-kernel-cost.html Kernel Linux, Configurazione e compilazione 9
Ottenere il kernel http://www.kernel.org tarball da 30 Mb contenenti sorgenti C (portabili su almeno 16 architetture ad oggi) Assembly (architecture specific) interamente rilasciato sotto licenza GPL (firmware a parte) compilabile utilizzando utility GNU (GCC, Make, Binutils) SCM utilizzato dalla comunità: git Kernel Linux, Configurazione e compilazione 10
Linux Kernel E un kernel monolitico (i.e. non microkernel), ma modulare L installazione consiste di: parte monolitica (vmlinuz) moduli (initrd) Kernel Linux, Configurazione e compilazione 11
Linux parte monolitica Non risiede necessariamente sul filesystem, ma deve essere nota al boot loader (e.g. lilo, grub, yaboot, loadlin,... ) il boot loader ` l applicazione che si preoccupa di installare il e kernel in modo che la procedura di bootstrap della macchina (tipicamente implementata nel BIOS) sia in grado di accedervi è fortemente dipendente dall architettura esempi: lilo e grub su i386, yaboot su powerpc Quando risiede sul filesystem tipicamente è un unico file: /boot/vmlinu{x,z}-<kernel-version> (e.g. /boot/vmlinux-2.6.32) Viene caricata in memoria al boot e mai scaricata Kernel Linux, Configurazione e compilazione 12
Linux moduli del kernel Parti di kernel, caricati/scaricati su richiesta, manualmente dall utente o da demoni preposti (kerneld, ora kmod subsystem) Devono essere accessibili a runtime, quindi sono nel filesystem un albero di file oggetto (.o, ora.ko) radicato in /lib/modules/<kernel-version>/ (e.g. /lib/modules/2.6.32/) Flessibilità dei moduli name aliasing ed opzioni (/etc/modules.conf, /etc/modprobe.d/) dipendenze inter-modulo (/lib/modules/.../modules.dep) moduli caricati al boot (/etc/modules) Kernel Linux, Configurazione e compilazione 13
Gestione moduli Comandi inerenti i moduli: Caricamento su richiesta insmod (full path, non gestisce alias e dipendenze) modprobe (nome modulo, gestisce alias e dipendenze) Rimozione: rmmod, modprobe -r (gestisce dipendenze) Lista dei moduli caricati: lsmod (implementato via /proc/modules) Calcolo delle dipendenze: depmod Informazioni (parametri, licenza,... ): modinfo Pacchetto Debian module-init-tools Kernel Linux, Configurazione e compilazione 14
Configurazione e compilazione
Configurazione
Configurazione, compilazione, installazione kernel Gestite dal Makefile distribuito assieme al kernel Target del Makefile: config, xconfig, menuconfig, oldconfig, gconfig (solo 2.6.x) Ogni (o quasi) componente del kernel può essere: compilata ed inclusa nella parte monolitica compilata come modulo non compilata Vengono gestite dipendenze inter-componente Kernel Linux, Configurazione e compilazione 17
Configurazione Risiede nel file.config all interno dell albero dei sorgenti La configurazione del kernel installato è tipicamente in /boot/config-x.x.x (X.X.X versione kernel installato) Per partire da quella base copiarlo nella cartella in cui sono i sorgenti Kernel Linux, Configurazione e compilazione 18
Compilazione
Compilazione Target del Makefile di interesse: pulizia: clean, mrproper compilazione parte monolitica: bzimage compilazione moduli: modules Risultati della compilazione arch/<architecture>/boot/bzimage più i file (.o/.ko) per i moduli Installazione: su disco: fortemente dipendente dal bootloader, spesso target install del Makefile su floppy: dd if=.../bzimage of=/dev/fd0 moduli: target modules_install del Makefile Kernel Linux, Configurazione e compilazione 20
Initrd (1/2) INITial Ram Disk Nel caso che parti del kernel necessarie al boot siano necessarie al boot (e.g. supporto scsi, filesystem, RAID) è possibile utilizzare un initrd Ogni initrd è una immagine (compressa, tipicamente in formato cpio + gzip) di un filesystem minimale contenente: moduli necessari al boot del sistema tool per il boot del filesystem reale (post caricamento dei moduli) Kernel Linux, Configurazione e compilazione 21
Initrd (2/2) Procedura (semplificata) di boot con initrd: loading del kernel e del ramdisk (boot loader) mounting del ramdisk come root filesystem (kernel) esecuzione di un programma predefinito (e.g. /init, /linuxrc) (kernel) loading di moduli necessari (/init) mounting del filesystem reale (/init) pivot_root (/init) procedura usuale di boot La configurazione di initrd è bootloader-dependent Comandi: mkinitrd, yaird, mkinitramfs(-kpkg), update-initramfs Kernel Linux, Configurazione e compilazione 22
Kernel Linux - the Debian way of life
Kernel the Debian way 1/2 Debian (come ogni distribuzione) fornisce pacchetti contenenti il kernel e i moduli. Vantaggi: supporto alla sicurezza, stabile e testato Svantaggi: non all ultimo grido, pochissime patch extra Può risultare utile utilizzare un kernel più recente per avere migliore supporto hardware o software (NIC ethernet 10 000, funzionalità stack di rete, virtualizzazione,... ) Debian fornisce una utility make-kpkg (pacchetto kernelpackage) per creare pacchetti del kernel customizzati Vantaggi: facile installare anche su un intero cluster, integrato con il package manager, integrato con patch presenti nell archivio Debian Svantaggi: niente supporto da parte del security team di Debian Kernel Linux, Configurazione e compilazione 24
Kernel the Debian way 2/2 Per ottenere un pacchetto del kernel custom Scaricare la tarpalla desiderata (o pacchetto linux-source- 2.6.26) Configurare il kernel (make oldconfig) Compilazione: make-kpkg --initrd kernel_image kernel_headers Opzioni: CONCURRENCY_LEVEL per specificare il numero di cpu da usare --append-to-version (alla versione del kernel) --revision (del pacchetto debian) --added-patches (vedi apt-cache search linux-patch) --added-modules (vedi module-assistant) Kernel Linux, Configurazione e compilazione 25
Moduli non ufficiali the Debian way 1/2 Molti driver non vengono integrati nel kernel di www.kernel.org per motivi di obsolescenza oppure di immaturità Debian fornisce una utility per creare pacchetti per tali moduli chiamata module-assistant (aka m-a, ) Pacchetti con suffisso -source o -src nell archivio (e.s. linux-wlan-ng-source) contengono i sorgenti di tali driver che devono poi essere compilati con m-a Vantaggi: generazione di pacchetti Debian Svantaggi: niente supporto dal security team Modalità interattiva: m-a Kernel Linux, Configurazione e compilazione 26
Moduli non ufficiali the Debian way 2/2 Listing dei driver disponibili: m-a list Preparazione del sistema alla compilazione (installazione degli header del kernel): m-a prepare Build: m-a build linux-wlan-ng (build) e installazione: m-a a-i linux-wlan-ng Update del DB di driver noti: m-a update Interfaccia testuale (utile per bugreport): m-a -t Kernel per cui compilare (default è quello in esecuzione): m-a -l 2.6.26-1-amd64 Kernel Linux, Configurazione e compilazione 27
Cosa c'è nel kernel?
Guardiamo un po' nel kernel Invochiamo il comando make menuconfig Ci si presenta un menu in ncurses (interfaccia testuale interattiva, basata sulle librerie ncurses) Possiamo trovare corrispondenze tra voci del menu e codice? Guardate un po' nei sottosistemi del kernel (dal menu, e poi direttamente nella gerarchia delle cartelle) Kernel Linux, Configurazione e compilazione 29
Esercizi
Esercizi Scaricare da http://kernel.org l ultima versione stabile del kernel Linux Configurarla Compilarla con make-kpkg Installare il deb risultante e tentare un boot (non rimuovere il kernel precedente, in caso qualcosa vada storto è bene avere almeno un kernel funzionante) Utilizzare m-a per compilare un modulo non ufficiale a vostra scelta (es. linux-wlan-ng) Kernel Linux, Configurazione e compilazione 31
Riferimenti (e fonti del codice, e delle slide) Linux Kernel Development (Robert Love) www.kernel.org per il codice www.debian.org e www.debianizzati.org per la compilazione a-là Debian www.msr-inria.inria.fr/~gares/stsl10 - Enrico Tassi - (buona parte di queste slide sono state copiate direttamente in questa presentazione, perché si è ritenuto che il materiale originale fosse una valida base per la lezione) Kernel Linux, Configurazione e compilazione 32