Compilazione Kernel · 7 min read · Nov 09, 2025
Come Compilare Un Kernel - Il Modo CentOS
Come Compilare Un Kernel - Il Modo CentOS
Versione 1.0
Autore: Falko Timme
Ogni distribuzione ha alcuni strumenti specifici per costruire un kernel personalizzato dai sorgenti. Questo articolo riguarda la compilazione di un kernel sui sistemi CentOS. Descrive come costruire un kernel personalizzato utilizzando gli ultimi sorgenti del kernel non modificati da www.kernel.org (kernel vanilla) in modo da essere indipendenti dai kernel forniti dalla tua distribuzione. Mostra anche come applicare patch ai sorgenti del kernel se hai bisogno di funzionalità che non sono incluse.
Ho testato questo su CentOS 4.4.
Voglio dire prima di tutto che questo non è l’unico modo per impostare un sistema del genere. Ci sono molti modi per raggiungere questo obiettivo, ma questo è il modo che seguo. Non fornisco alcuna garanzia che questo funzionerà per te!
1 Nota Preliminare
In questo articolo descriverò due modi per costruire un kernel per i sistemi CentOS. Il primo ti darà un pacchetto kernel rpm che puoi installare o condividere con altri. Il secondo modo è lo stesso per tutte le distribuzioni Linux, ma non finisci con un pacchetto rpm.
2 Costruire Un Pacchetto Kernel rpm
Questo capitolo mostra come costruire un kernel e finire con un pacchetto rpm che puoi installare e condividere con altri.
2.1 Scaricare I Sorgenti Del Kernel
Prima scarichiamo il nostro kernel desiderato in /usr/src. Vai su www.kernel.org e seleziona il kernel che vuoi installare, ad esempio linux-2.6.18.3.tar.bz2 (puoi trovare tutti i kernel 2.6 qui: http://www.kernel.org/pub/linux/kernel/v2.6/). Poi puoi scaricarlo in /usr/src in questo modo:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.3.tar.bz2
Poi scompattiamo i sorgenti del kernel e creiamo un symlink linux alla directory dei sorgenti del kernel:
tar xjf linux-2.6.18.3.tar.bz2
ln -s linux-2.6.18.3 linux
cd /usr/src/linux
2.2 Modificare /etc/modprobe.conf
Ora dobbiamo commentare il modulo mptscsi in /etc/modprobe.conf perché altrimenti riceveremo un errore come questo:
No module mptscsi found for kernel 2.6.18.3-default, aborting.quando proviamo a creare un ramdisk per il nostro nuovo kernel.
vi /etc/modprobe.conf| alias eth0 pcnet32 alias scsi_hostadapter mptbase # alias scsi_hostadapter1 mptscsi alias scsi_hostadapter2 mptfc alias scsi_hostadapter3 mptspi alias scsi_hostadapter4 mptsas alias scsi_hostadapter5 mptscsih |
2.3 Applicare Patch Ai Sorgenti Del Kernel (Opzionale)
A volte hai bisogno di driver per hardware che non è supportato dal nuovo kernel per impostazione predefinita, o hai bisogno di supporto per tecniche di virtualizzazione o qualche altra tecnologia all’avanguardia che non è ancora arrivata al kernel. In tutti questi casi devi applicare patch ai sorgenti del kernel (a condizione che ci sia una patch disponibile…).
Ora supponiamo che tu abbia scaricato la patch necessaria (la chiamo patch.bz2 in questo esempio) in /usr/src. Questo è come la applichi ai tuoi sorgenti del kernel (devi essere ancora nella directory /usr/src/linux):
bzip2 -dc /usr/src/patch.bz2 | patch -p1 –dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -p1
Il primo comando è solo un test, non fa nulla ai tuoi sorgenti. Se non mostra errori, puoi eseguire il secondo comando che applica effettivamente la patch. Non farlo se il primo comando mostra errori!
Se le tue patch sono compresse con gzip (.gz) invece di bzip2 (.bz2), allora patchi il tuo kernel come segue:
gunzip -c /usr/src/patch.gz | patch -p1 –dry-run
gunzip -c /usr/src/patch.gz | patch -p1
Puoi anche applicare prepatch ai tuoi sorgenti del kernel. Ad esempio, se hai bisogno di una funzionalità che è disponibile solo nel kernel 2.6.19-rc6, ma i sorgenti completi non sono ancora stati rilasciati per questo kernel. Invece, è disponibile una patch-2.6.19-rc6.bz2. Puoi applicare quella patch ai sorgenti del kernel 2.6.18, ma non ai kernel 2.6.18.1 o 2.6.18.2 o 2.6.18.3, ecc. Questo è spiegato su http://kernel.org/patchtypes/pre.html:
Le prepatch sono l’equivalente delle versioni alpha per Linux; vivono nelle directory di test negli archivi. Dovrebbero essere applicate utilizzando l’utility patch(1) al codice sorgente della precedente versione completa con un numero di versione a 3 parti (ad esempio, la prepatch 2.6.12-rc4 dovrebbe essere applicata ai sorgenti del kernel 2.6.11, non, ad esempio, 2.6.11.10.)
Quindi, se vuoi compilare un kernel 2.6.19-rc6, devi scaricare i sorgenti del kernel 2.6.18 ( http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2) nel passo 2.1 invece del kernel 2.6.18.3!
Questo è come applichi la patch 2.6.19-rc6 al kernel 2.6.18:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc6.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -p1 –dry-run
bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -p1
2.4 Configurare Il Kernel
È una buona idea utilizzare la configurazione del tuo attuale kernel funzionante come base per il tuo nuovo kernel. Pertanto, copiamo la configurazione esistente in /usr/src/linux:
make clean && make mrproper
cp /boot/config-uname -r ./.config
Poi eseguiamo
make menuconfigche apre il menu di configurazione del kernel. Vai su Carica un File di Configurazione Alternativo e scegli .config (che contiene la configurazione del tuo attuale kernel funzionante) come file di configurazione:


Poi naviga nel menu di configurazione del kernel e fai le tue scelte. Assicurati di specificare una stringa di identificazione della versione del kernel sotto Impostazioni Generali —> () Versione locale - aggiungi al rilascio del kernel. Io uso -default in modo che il nostro pacchetto kernel rpm si chiami kernel-2.6.18.3default-1.i386.rpm. Puoi lasciare la stringa vuota o specificarne una diversa che ti aiuti a identificare il kernel (ad esempio -custom o qualsiasi altra cosa tu voglia).
Si prega di notare: Dopo aver installato kernel-2.6.18.3default-1.i386.rpm e decidere di compilare un altro pacchetto kernel rpm 2.6.18.3, è importante utilizzare una stringa di versione diversa, ad esempio -default1, -default2, ecc., perché altrimenti non puoi installare il tuo nuovo kernel perché rpm si lamenta che kernel-2.6.18.3default-1.i386.rpm è già installato!




Quando hai finito e selezioni Esci, rispondi alla seguente domanda (Vuoi salvare la tua nuova configurazione del kernel?) con Sì:

2.5 Costruire Il Kernel
Per costruire il kernel, esegui semplicemente questo comando:
make rpmOra sii paziente, la compilazione del kernel può richiedere alcune ore, a seconda della configurazione del tuo kernel e della velocità del tuo processore.
2.6 Installare Il Nuovo Kernel
Dopo la costruzione riuscita del kernel, è stato creato un pacchetto src.rpm e un pacchetto rpm. Il pacchetto src.rpm può essere trovato nella directory /usr/src/redhat/SRPMS/, puoi scoprire il suo nome eseguendo
ls -l /usr/src/redhat/SRPMS/Sul mio sistema si chiamava kernel-2.6.18.3default-1.src.rpm.
Il pacchetto rpm può essere trovato in /usr/src/redhat/RPMS/i386/, /usr/src/redhat/RPMS/i586/, /usr/src/redhat/RPMS/i686/, /usr/src/redhat/RPMS/x86_64/, ecc., a seconda della tua architettura. Sul mio sistema si trovava in /usr/src/redhat/RPMS/i386/, e eseguendo
ls -l /usr/src/redhat/RPMS/i386/ho scoperto che il suo nome era kernel-2.6.18.3default-1.i386.rpm.
Ora possiamo installare il nostro pacchetto kernel rpm in questo modo:
cd /usr/src/redhat/RPMS/i386/
rpm -ivh –nodeps kernel-2.6.18.3default-1.i386.rpm
Si prega di notare l’opzione –nodeps: se non la usi, vedrai un errore come questo:
errore: Dipendenze non soddisfatte:
kernel >= 2.6.10 conflitti con lksctp-tools-1.0.2-6.4E.1.i386
Ho scoperto che ignorare questa dipendenza non ha causato problemi sul mio sistema.
Ora puoi anche trasferire il pacchetto kernel rpm ad altri sistemi CentOS e installarlo lì esattamente nello stesso modo, il che significa che non devi compilare di nuovo il kernel lì.
Successivamente creiamo un ramdisk per il nostro nuovo kernel, perché altrimenti il sistema probabilmente non avvierà il nostro nuovo kernel:
mkinitrd /boot/initrd-2.6.18.3-default.img 2.6.18.3-default2.7 Configurare Il Boot Loader GRUB
Ora dobbiamo configurare il nostro boot loader GRUB in modo che i nostri nuovi kernel vengano avviati quando riavviamo il sistema.
Esegui
ls -l /bootper scoprire il tuo nuovo kernel (tipicamente inizia con vmlinuz, ad esempio vmlinuz-2.6.18.3-default) e ramdisk (tipicamente inizia con initrd, ad esempio initrd-2.6.18.3-default.img).
Poi modifica /boot/grub/menu.lst. Dai un’occhiata alle tue esistenti (funzionanti) strofette del kernel lì e prendi una di esse come campione per la tua nuova strofa e sostituisci il kernel e il ramdisk, poi aggiungi la strofa sopra tutte le altre strofe.
vi /boot/grub/menu.lstAd esempio, il mio menu.lst appare così prima di aggiungere la nuova strofa:
| # grub.conf generato da anaconda # # Nota che non devi rieseguire grub dopo aver apportato modifiche a questo file # AVVISO: Hai una partizione /boot. Questo significa che # tutti i percorsi del kernel e initrd sono relativi a /boot/, ad esempio. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00 # initrd /initrd-version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.9-42.0.3.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.0.3.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.0.3.EL.img title CentOS-4 i386 (2.6.9-42.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.EL.img |
e così dopo:
| # grub.conf generato da anaconda # # Nota che non devi rieseguire grub dopo aver apportato modifiche a questo file # AVVISO: Hai una partizione /boot. Questo significa che # tutti i percorsi del kernel e initrd sono relativi a /boot/, ad esempio. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00 # initrd /initrd-version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.18.3-default) root (hd0,0) kernel /vmlinuz-2.6.18.3-default ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18.3-default.img title CentOS (2.6.9-42.0.3.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.0.3.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.0.3.EL.img title CentOS-4 i386 (2.6.9-42.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.EL.img |
Ora riavvia il sistema:
shutdown -r nowSe tutto va bene, dovrebbe avviarsi con il nuovo kernel. Puoi controllare se sta realmente utilizzando il tuo nuovo kernel eseguendo
uname -rQuesto dovrebbe visualizzare qualcosa come
2.6.18.3-defaultSe il sistema non si avvia, riavvialo, e quando vedi questo:
 premi un tasto qualsiasi per entrare nel menu GRUB:
Seleziona il tuo vecchio kernel e avvia il sistema. Puoi ora provare di nuovo a compilare un kernel funzionante. Non dimenticare di rimuovere la strofa del kernel non funzionante da /boot/grub/menu.lst.
Ricevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.