445 Capitolo 8 Kernel « 8.1 Ricompilazione del kernel ...... 448 8.2 Compilazione del kernel in una distribuzione GNU/Linux ...... 453 8.3 Elementi della configurazione ...... 455 8.3.1 General setup ...... 460 8.3.2 Enable loadable module support ...... 461 net 8.3.3 Processor type and features ...... 462 8.3.4 Power management and ACPI options ...... 465 8.3.5 Bus options ...... 466 informaticalibera. / 8.3.6 Executable file formats ...... 468 http:/ 8.3.7 Networking ...... 468 8.3.8 Device drivers ...... 474 8.3.9 Filesystems ...... 495 8.3.10 Kernel hacking ...... 498 8.4 Come fare per configurare correttamente il kernel che si vuole compilare ...... 500 8.5 Parametri di avvio del kernel Linux ...... 502 Daniele Giacomini -- [email protected]  8.5.1 principale (root) ...... 503

Copyright 8.5.2 Memoria ...... 504 8.5.3 Varie ...... 505 8.5.4 Interfacce di rete Ethernet ...... 507 2» 2013.11.11 --- a

« 8.6 Gestione dei moduli ...... 509 446 volume I Sistemi GNU/Linux 8.6.1 Dipendenza tra i moduli ...... 509 8.6.2 Parametri ...... 510 8.6.3 Utilizzo di «insmod» ...... 511 8.6.4 Utilizzo di «rmmod» ...... 512 8.6.5 Utilizzo di «lsmod» ...... 512 8.6.6 Utilizzo di «depmod» ...... 514 8.6.7 Utilizzo di «modprobe» ...... 515 8.6.8 Informazione sui moduli ...... 518 8.7 Configurazione dei moduli ...... 518 8.7.1 Direttiva alias ...... 519 8.7.2 Direttiva options ...... 521 8.8 Firmware ...... 521 8.9 File di dispositivo ...... 524 8.9.1 Creazione dei file di dispositivo ...... 525 8.9.2 kernel Linux e ...... 527 8.9.3 Messaggio: «unable to open an initial console» . . . 533 8.10 Disco RAM iniziale: Initrd ...... 534 8.10.1 Teoria e visione generale ...... 535 8.10.2 Creazione automatica di un disco RAM iniziale . 538 8.10.3 Esempio di un disco RAM iniziale ...... 539 8.11 Combinazioni magiche con «R sist», ovvero «SysRq» 542 8.12 Riferimenti ...... 546 Kernel Linux 447 depmod 514 insmod 511 lsmod 512 MAKEDEV 525 make-kpkg 453 mkinitrd 538 mknod 525 modinfo 518 modprobe 515 rmmod 512 udevd 527 Il kernel è il nocciolo del sistema operativo: i programmi utilizzano le funzioni fornite dal kernel e in questa maniera sono sollevati dal- l’agire direttamente con la CPU. Il kernel Linux è costituito da un file principale, il cui nome può essere ‘vmlinuz’, oppure ‘zImage’, ‘bzImage’ e altri ancora, ma può comprendere anche moduli ag- giuntivi per la gestione di componenti hardware specifici che de- vono poter essere attivati e disattivati durante il funzionamento del sistema. Quando si fa riferimento a un kernel in cui tutte le funzionalità che servono sono incluse nel file principale, si parla di kernel monoliti- co, mentre quando parte di queste sono demandate a moduli esterni, si parla di kernel modulare. Il kernel monolitico ha il vantaggio di avere tutto in un file, ma nello stesso modo è rigido e non permette di liberare risorse quando le unità periferiche gestite non servono. Il kernel modulare ha il vantaggio di poter disattivare e riattivare i mo- duli a seconda delle esigenze, in particolare quando moduli distinti gestiscono in modo diverso lo stesso tipo di unità periferica. Tutta- via, a causa della frammentazione in molti file, l’uso dei moduli può essere fonte di errori. In generale, chi fa per la prima volta l’esperienza di compilarsi un kernel personalizzato farebbe bene a cominciare incorporando nel file principale tutta la gestione delle memorie di massa, in modo da non dipendere dai moduli per l’innesto del file system principale. 448 volume I Sistemi GNU/Linux 8.1 Ricompilazione del kernel « Le distribuzioni GNU/Linux tendono a fornire agli utilizzatori un kernel modulare per usi generali. Anche se questo tipo di kernel si adatta sicuramente alla maggior parte delle configurazioni, ci so- no situazioni particolari dove è preferibile costruire un proprio ker- nel, monolitico o modulare che sia. Per poter comprendere il pro- cedimento di compilazione del kernel Linux, occorre sapere come si compila e si installa un programma tipico distribuito in forma sorgente, come descritto nella sezione 7.1. Per poter procedere alla compilazione del kernel è necessario avere installato gli strumenti di sviluppo software, cioè il compilatore e i sorgenti del kernel. In particolare, i sorgenti del kernel possono anche essere reperiti presso vari siti, ma principalmente da http:// www.kernel.org . Se i sorgenti sono stati installati come parte di una distribuzio- ne, questi potrebbero trovarsi da qualche parte a partire da ‘/usr/ src/’, ma la loro compilazione non richiede una collocazione par- ticolare nel file system, tanto che anche un utente comune, senza privilegi, può farlo, collocando i sorgenti nell’ambito della propria directory personale. In particolare, la distribuzione GNU/Linux De- bian si limita a piazzare un archivio (un file compresso) nella direc- tory ‘/usr/src/’, lasciando all’utente il compito di estrarlo dove meglio crede. Si parte con l’estrazione dell’archivio che contiene i sorgenti; natu- ralmente l’utente deve estrarre l’archivio in una posizione in cui gli sia concesso di farlo in base ai permessi che lo riguardano. Va tenuto presente che i sorgenti possono essere compilati da un utente comu- Kernel Linux 449 ne, anche se poi questo potrebbe non avere la facoltà di installare effettivamente il kernel prodotto in questo modo. $ tar xjvf linux-versione.tar.bz2 [ Invio ] Una volta estratti i sorgenti del kernel, si può passare alla configura- zione che precede la compilazione. Per questo, ci si posiziona nella directory dei sorgenti; quindi, dopo aver letto il file ‘README’, si può procedere. $ cd linux-versione [ Invio ] La directory corrente deve essere quella a partire dalla quale si diramano i sorgenti del kernel. $ make mrproper [ Invio ]

Il comando ‘make mrproper’ serve a eliminare file e collegamen- ti vecchi che potrebbero interferire con una nuova compilazione. In particolare, elimina la configurazione data in precedenza alla compilazione del kernel. $ make defconfig [ Invio ] La prima volta che si procede a definire i contenuti di un proprio kernel, conviene partire da una configurazione predefinita, ottenibi- le con il comando ‘make defconfig’, appena mostrato. In prati- ca si ottiene un file ‘.config’ con la selezione delle voci ritenute fondamentali. Successivamente si passa alla fase di configurazione: $ make [ Invio ] Questa è l’operazione più delicata attraverso la quale si definisco- no le caratteristiche e i componenti del kernel che si vuole ottene- re. Ogni volta che la si esegue, viene riutilizzato il file ‘.config’ 450 volume I Sistemi GNU/Linux contenente la configurazione impostata precedentemente, mentre al- la fine la nuova configurazione viene salvata nello stesso file. Di conseguenza, ripetendo il procedimento ‘make config’, le scelte predefinite corrispondono a quelle effettuate precedentemente.1

Il comando ‘make mrproper’ elimina il file ‘.config’, quindi si deve fare attenzione a non eseguire tale comando se non è questa l’intenzione.

Figura| 8.1. Il menù principale della configurazione del kernel attraverso il comando ‘make menuconfig’. |.------ Configuration ------. || Arrow keys navigate the menu. selects submenus | || --->. Highlighted letters are hotkeys. Pressing | || includes, excludes, modularizes features. | || Press to exit, for Help, for Search. | || Legend: [*] built-in [ ] excluded module < > | || .------. | || | General setup ---> | | || |[*] Enable loadable module support ---> | | || |-*- Enable the block layer ---> | | || | Processor type and features ---> | | || | Power management options (ACPI, APM) ---> | | || | Bus options (PCI, PCMCIA, EISA, MCA, ISA) ---> | | || | Executable file formats ---> | | || | Networking support ---> | | || ‘v(+)------’ | ||------| ||