Ricerca nel sito web

Come compilare un kernel - Il modo Debian


Su questa pagina

  1. 1 Nota preliminare
  2. 2 Creazione di un pacchetto Kernel .deb
    1. 2.1 Installare i pacchetti richiesti per la compilazione del kernel
    2. 2.2 Scarica i sorgenti del kernel
    3. 2.3 Applicare le patch alle sorgenti del kernel (facoltativo)
    4. 2.4 Configurare il kernel
    5. 2.5 Crea il kernel
    6. 2.6 Installa il nuovo kernel

    1. 3.1 Installare i pacchetti richiesti per la compilazione del kernel
    2. 3.2 Scarica i sorgenti del kernel
    3. 3.3 Applicare le patch alle sorgenti del kernel (facoltativo)
    4. 3.4 Configurare il kernel
    5. 3.5 Compila e installa il kernel
    6. 3.6 Passaggi successivi all'installazione

    Ogni distribuzione ha alcuni strumenti specifici per costruire un kernel personalizzato dai sorgenti. Questo articolo riguarda la compilazione di un kernel su un sistema Debian (Etch). Descrive come costruire un kernel personalizzato utilizzando le ultime fonti del kernel non modificate dal kernel vanilla) in modo da essere indipendenti dai kernel forniti dalla tua distribuzione. Mostra anche come applicare una patch ai sorgenti del kernel se hai bisogno di funzionalità che non sono presenti.

    Non garantisco che funzionerà per te!

    1 Nota preliminare

    Descriverò due modi per compilare un nuovo kernel. Usando il primo metodo, ti ritroverai con un pacchetto kernel .deb che può essere installato sul sistema e che puoi condividere con altri e installare su altri sistemi Debian Etch.

    Il secondo metodo consiste nel compilare un kernel nel modo \tradizionale\. In questo modo funziona su qualsiasi distribuzione Linux, ma ovviamente non ti ritroverai con un pacchetto kernel .deb.

    2 Creazione di un pacchetto Kernel .deb

    Questo capitolo mostra come compilare un kernel e ottenere un pacchetto .deb che puoi installare e condividere con altri.

    2.1 Installare i pacchetti richiesti per la compilazione del kernel

    Per prima cosa aggiorniamo il nostro database dei pacchetti:

    apt-get update

    Quindi installiamo tutti i pacchetti necessari in questo modo:

    apt-get install kernel-package ncurses-dev fakeroot wget bzip2 build-essential

    2.2 Scarica i sorgenti del kernel

    Quindi scarichiamo il nostro kernel desiderato in /usr/src. Vai su http://www.kernel.org/pub/linux/kernel/v2.6/). Quindi puoi scaricarlo in /usr/src in questo modo:

    cd /usr/src
    wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.3.tar.bz2

    Quindi scompattiamo i sorgenti del kernel e creiamo un collegamento simbolico linux alla directory dei sorgenti del kernel:

    tar xjf linux-2.6.21.3.tar.bz2
    ln -s linux-2.6.21.3 linux
    cd /usr/src/linux

    2.3 Applicare le patch alle sorgenti del kernel (facoltativo)

    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 è necessario applicare una patch ai sorgenti del kernel (ammesso che sia disponibile una patch...).

    Ora supponiamo che tu abbia scaricato la patch necessaria (io la chiamo patch.bz2 in questo esempio) in /usr/src. Ecco come lo applichi ai sorgenti del tuo 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 alle tue fonti. Se non mostra errori, puoi eseguire il secondo comando che applica effettivamente la patch. Non farlo se il primo comando mostra errori!

    Puoi anche applicare i prepatch del kernel ai sorgenti del kernel. Ad esempio, se hai bisogno di una funzionalità che è disponibile solo nel kernel 2.6.22-rc3, ma i sorgenti completi non sono ancora stati rilasciati per questo kernel. Invece, è disponibile una patch-2.6.22-rc3.bz2. Puoi applicare quella patch ai sorgenti del kernel 2.6.21, ma non al kernel 2.6.21.1 o 2.6.21.2, ecc. Questo è spiegato su http://kernel.org/patchtypes/pre.html:

    Le prepatch sono l'equivalente delle versioni alfa per Linux; vivono nelle directory di test negli archivi. Dovrebbero essere applicati utilizzando l'utility patch(1) al codice sorgente della versione completa precedente con un numero di versione in 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.22-rc3, devi scaricare i sorgenti del kernel 2.6.21 (http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21. tar.bz2) nel passaggio 3 invece del kernel 2.6.21.3!

    Ecco come applicare la patch 2.6.22-rc3 al kernel 2.6.21:

    cd /usr/src 
    wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.22-rc3.bz2
    cd /usr/src/linux
    bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1 --dry-run
    bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1

    2.4 Configurare il kernel

    È una buona idea usare la configurazione del tuo attuale kernel funzionante come base per il tuo nuovo kernel. Quindi copiamo la configurazione esistente in /usr/src/linux:

    make clean && make mrproper
    cp /boot/config-`uname -r` ./.config

    Allora corriamo

    make menuconfig

    che fa apparire il menu di configurazione del kernel. Vai a Carica un file di configurazione alternativo e scegli .config (che contiene la configurazione del tuo attuale kernel funzionante) come file di configurazione:

    Quindi sfoglia il menu di configurazione del kernel e fai le tue scelte. Quando hai finito e seleziona Esci, rispondi alla seguente domanda (Vuoi salvare la tua nuova configurazione del kernel?) con Sì:

    2.5 Costruisci il kernel

    Per compilare il kernel, esegui questi due comandi:

    make-kpkg clean
    fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers

    Dopo --append-to-version= puoi scrivere qualsiasi stringa che ti aiuti a identificare il kernel, ma deve iniziare con un meno (-) e non deve contenere spazi bianchi.

    Ora 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 corretta compilazione del kernel, puoi trovare due pacchetti .deb nella directory /usr/src.

    cd /usr/src
    ls -l

    Sul mio sistema di test erano chiamati linux-image-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb (che contiene il kernel vero e proprio) e linux-headers-2.6.21.3-custom_2.6.21.3- custom-10.00.Custom_i386.deb (che contiene i file necessari se si desidera compilare moduli del kernel aggiuntivi in seguito). Li installo così:

    dpkg -i linux-image-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb
    dpkg -i linux-headers-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb

    (Ora puoi persino trasferire i due file .deb su altri sistemi Debian Etch e installarli lì esattamente nello stesso modo, il che significa che non devi compilare di nuovo il kernel lì.)

    Questo è tutto. Il file di configurazione del bootloader GRUB /boot/grub/menu.lst è stato modificato automaticamente ed è stato creato un ramdisk per il nuovo kernel in /boot.

    Ora riavvia il sistema:

    shutdown -r now

    Al prompt di avvio, seleziona il tuo nuovo kernel (dovrebbe essere selezionato per impostazione predefinita):

    Se tutto va bene, dovrebbe uscire con il nuovo kernel. Puoi verificare se sta davvero usando il tuo nuovo kernel eseguendo

    uname -r

    Questo dovrebbe visualizzare qualcosa di simile

    2.6.21.3-custom

    Se il sistema non si avvia, riavvialo e seleziona il tuo vecchio kernel al prompt di avvio. Ora puoi riprovare a compilare un kernel funzionante. Non dimenticare di rimuovere le stanze del kernel non funzionante da /boot/grub/menu.lst.

    3 Costruire un kernel in modo tradizionale

    Questo capitolo descrive un approccio diverso che può essere utilizzato su qualsiasi sistema Linux (a parte dettagli come la creazione di un ramdisk o l'aggiornamento del bootloader). Ovviamente non ti ritroverai con un pacchetto kernel .deb.

    3.1 Installare i pacchetti richiesti per la compilazione del kernel

    Per prima cosa aggiorniamo il nostro database dei pacchetti:

    apt-get update

    Quindi installiamo tutti i pacchetti necessari in questo modo:

    apt-get install kernel-package libncurses5-dev fakeroot wget bzip2 build-essential

    3.2 Scarica i sorgenti del kernel

    Successivamente, scarichiamo il nostro kernel desiderato in /usr/src. Vai su http://www.kernel.org/pub/linux/kernel/v2.6/). Quindi puoi scaricarlo in /usr/src in questo modo:

    cd /usr/src
    wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.3.tar.bz2

    Quindi scompattiamo i sorgenti del kernel e creiamo un collegamento simbolico linux alla directory dei sorgenti del kernel:

    tar xjf linux-2.6.21.3.tar.bz2
    ln -s linux-2.6.21.3 linux
    cd /usr/src/linux

    3.3 Applicare le patch alle sorgenti del kernel (facoltativo)

    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 è necessario applicare una patch ai sorgenti del kernel (ammesso che sia disponibile una patch...).

    Ora supponiamo che tu abbia scaricato la patch necessaria (io la chiamo patch.bz2 in questo esempio) in /usr/src. Ecco come lo applichi ai sorgenti del tuo 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 alle tue fonti. Se non mostra errori, puoi eseguire il secondo comando che applica effettivamente la patch. Non farlo se il primo comando mostra errori!

    Puoi anche applicare i prepatch del kernel ai sorgenti del kernel. Ad esempio, se hai bisogno di una funzionalità che è disponibile solo nel kernel 2.6.22-rc3, ma i sorgenti completi non sono ancora stati rilasciati per questo kernel. Invece, è disponibile una patch-2.6.22-rc3.bz2. Puoi applicare quella patch ai sorgenti del kernel 2.6.21, ma non al kernel 2.6.21.1 o 2.6.21.2, ecc. Questo è spiegato su http://kernel.org/patchtypes/pre.html:

    Le prepatch sono l'equivalente delle versioni alfa per Linux; vivono nelle directory di test negli archivi. Dovrebbero essere applicati utilizzando l'utility patch(1) al codice sorgente della versione completa precedente con un numero di versione in 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.22-rc3, devi scaricare i sorgenti del kernel 2.6.21 (http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21. tar.bz2) nel passaggio 3 invece del kernel 2.6.21.3!

    Ecco come applicare la patch 2.6.22-rc3 al kernel 2.6.21:

    cd /usr/src 
    wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.22-rc3.bz2
    cd /usr/src/linux
    bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1 --dry-run
    bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1

    3.4 Configurare il kernel

    È una buona idea usare la configurazione del tuo attuale kernel funzionante come base per il tuo nuovo kernel. Quindi copiamo la configurazione esistente in /usr/src/linux:

    make clean && make mrproper
    cp /boot/config-`uname -r` ./.config

    Allora corriamo

    make menuconfig

    che fa apparire il menu di configurazione del kernel. Vai a Carica un file di configurazione alternativo e scegli .config (che contiene la configurazione del tuo attuale kernel funzionante) come file di configurazione:

    Quindi sfoglia il menu di configurazione del kernel e fai le tue scelte. Quando hai finito e seleziona Esci, rispondi alla seguente domanda (Vuoi salvare la tua nuova configurazione del kernel?) con Sì:

    3.5 Compilare e installare il kernel

    Per compilare il kernel, esegui questi comandi:

    make all
    make modules_install
    make install

    Ora sii paziente, la compilazione del kernel può richiedere alcune ore, a seconda della configurazione del tuo kernel e della velocità del tuo processore.

    3.6 Fasi successive all'installazione

    Il nuovo kernel è ora installato, ma abbiamo ancora bisogno di un ramdisk per il nostro nuovo kernel (altrimenti il sistema molto probabilmente non si avvierà!), e dobbiamo informare il bootloader GRUB del nostro nuovo kernel.

    Per prima cosa facciamo così:

    depmod 2.6.21.3
    apt-get install yaird

    Quindi creiamo un ramdisk con il seguente comando:

    mkinitrd.yaird -o /boot/initrd.img-2.6.21.3 2.6.21.3

    La configurazione di GRUB è molto semplice su Debian Etch. Tutto quello che dobbiamo fare è correre

    update-grub

    Questo rileverà il nuovo kernel e ramdisk e aggiornerà /boot/grub/menu.lst per noi.

    Ora riavvia il sistema:

    shutdown -r now

    Al prompt di avvio, seleziona il tuo nuovo kernel (dovrebbe essere selezionato per impostazione predefinita). Se tutto va bene, dovrebbe uscire con il nuovo kernel. Puoi verificare se sta davvero usando il tuo nuovo kernel eseguendo

    uname -r

    Questo dovrebbe visualizzare qualcosa di simile

    2.6.21.3

    Se il sistema non si avvia, riavvialo e seleziona il tuo vecchio kernel al prompt di avvio. Ora puoi riprovare a compilare un kernel funzionante. Non dimenticare di rimuovere le stanze del kernel non funzionante da /boot/grub/menu.lst.

    4 collegamenti

    • Debian: http://www.debian.org
    • Gli archivi del kernel Linux: http://www.kernel.org