Traduzioni: English - Italiano

Compilare pacchetti kernel personalizzati

Questa pagina tratta la ricompilazione di un pacchetto kernel ufficiale Debian con modifiche personalizzate. Il Kernel Handbook tratta questo argomento: http://kernel-handbook.alioth.debian.org/ (che spiega come "Ricompilare un pacchetto kernel Linux ufficiale Debian": http://kernel-handbook.alioth.debian.org/ch-common-tasks.html ch 4.2 : "Ricompilare un pacchetto kernel ufficiale Debian").

Seguendo la sezione 4.2: Ricompilare un pacchetto kernel ufficiale Debian

Ragioni per farlo:

  1. Modificare la configurazione Debian per cambiare il modello di preemption.

  2. Modificare la configurazione Debian per cambiare la frequenza del timer.

  3. Aggiungere una patch.
  4. Aggiungere il proprio insieme preferito di patch.

Quello che si ottiene è esattamente il kernel rilasciato da Debian, ma con in più quelle modifiche. I nuovi pacchetti non pesteranno i piedi alle immagini ufficiali del kernel.

Per chi non ha pazienza

Esempio con la patch NFS-ngroups e il più recente kernel stabile (in questo caso Jessie):

# Eseguire quanto segue nella stessa versione di distribuzione del kernel ricompilato, possibilmente in una chroot
apt-get install devscripts equivs wget
wget http://www.frankvm.com/nfs-ngroups/3.16-nfs-ngroups-4.61.patch
apt-get update
apt-get source linux
cd linux-3.16.7-ckt7/
mk-build-deps -i
sed -i -e 's/~test/~nfs/g' debian/bin/test-patches # suffisso di versione
sed -i -e 's/^abiname:.*/&nfs/' debian/config/defines # suffisso pacchetto
time debian/bin/test-patches -j$(nproc) ../3.16-nfs-ngroups-4.61.patch  # forse usare --fuzz 3, ma con cautela
fakeroot make -f debian/rules.gen binary-arch_amd64_none_real # se è necessario il pacchetto linux-headers-XXX-common ad es. per i moduli DMKS
# Alla data di marzo 2015, dopo circa 55 minuti usando -j4 e con 12Go di spazio su disco si ottiene il .deb :)

Aggiungere una patch a linux e compilare un nuovo pacchetto kernel

  1. Creare la directory in cui si vuole compilare il pacchetto kernel come utente normale ed assicurarsi che tutti i pacchetti necessari siano installati:

    apt-get install fakeroot build-essential devscripts
    apt-get build-dep linux
  2. Recuperare i sorgenti del pacchetto. Affinché ciò funzioni si deve avere una riga deb-src per l'archivio ufficiale in /etc/apt/sources.list:

    apt-get source linux
    cd linux-*

    Ora si è nell'albero dei sorgenti con tutte le modifiche che Debian vi ha fatto. In alternativa, si potrebbe prendere un archivio tar del kernel, ad esempio da buildserver (vedere Kernel Debian), spacchettarlo e ottenere le patch e le impostazioni di configurazione Debian più recenti:

    tar xzf linux_3.0.0~rc6.orig.tar.gz
    cd linux-*
    svn export svn://svn.debian.org/svn/kernel/dists/trunk/linux/debian
  3. Guardare l'inizio del file debian/changelog e pensare ad un numero di versione appropriato. Tuttavia non si può ancora usare dch. yet, though. Se si sta aggiungendo una sola patch "pippo", si potrebbe aggiungere in fondo al nome "+pippo.1". Se si stanno aggiungendo più patch per la propria azienda o per uso personale, usare "+qualchenome.1".

  4. Aggiungere la stessa stringa alla fine del campo abi.abiname in debian/config/defines per assicurarsi che il nome del pacchetto del proprio kernel personalizzato non vada in conflitto con quello ufficiale. Nell'esempio precedente, si sta ora creando linux-image-3.x.0-y+pippo.1-zzz.

  5. Usare quilt per aggiungere la propria patch
  6. Opzionale: se questo non è il primo tentativo di compilazione e si deve fare pulizia in caso di fallimenti della compilazione:

    make -f debian/rules clean
  7. Ora controllare che il proprio insieme di patch sia ancora valido e che risolva qualsiasi conflitto: Nota: alla prima esecuzione, il target fallisce. Assicurarsi di eseguire due volte.

This target is made to fail intentionally, to make sure
that it is NEVER run during the automated build. Please
ignore the following error, the debian/control file has
been generated SUCCESSFULLY.

[In italiano: Questo target è fatto apposta per fallire, per assicurare che non venga MAI eseguito durante la compilazione automatica. Ignorare l'errore seguente, il file debian/control è stato generato con SUCCESSO]

Compilare tutti i pacchetti relativi al kernel

  1. Assicurarsi di avere almeno 40 GB di spazio libero su disco (per la versione 2.6.32-17 sono serviti 30 GB).
  2. Ipotizzando di voler compilare tutti i pacchetti relativi al kernel, compilare con il parametro DEBIAN_KERNEL_JOBS appropriato (il numero di processori che può essere usato per la compilazione):

    ~/src/linux-3.2.31$ debuild -e DEBIAN_KERNEL_JOBS=$(nproc)

Se si intende fare più ricompilazioni si può usare ccache aggiungendo l'opzione --prepend-path=/usr/lib/ccache al comando debuild qui sopra.

Compilare un'unica variante del kernel

  1. Assicurarsi di avere almeno 10 GB di spazio libero su disco (per setup_amd64_none_amd64 sono serviti 7.3 GB per la versione 2.6.32-17).
  2. Preparare il file di regole per l'unica compilazione che si vuole fare, ad esempio:

    fakeroot make -f debian/rules.gen setup_i386_none_686-pae

    Questo creerà un albero nella directory debian/build/build_i386_none_686-pae. Andare in quella directory.

  3. Cambiare il file .config, usando ad esempio

    make menuconfig
    cd ../../..
  4. Compilare il kernel e generare i pacchetti del kernel. Sostituire a $NR_CPUS il numero di CPU della macchina di compilazione (mantenendo il tutto su un'unica riga) ed eseguire, ad esempio:

    fakeroot make -f debian/rules.gen binary-arch_i386_none_686-pae binary-indep \

    Dopo un po' di tempo saranno stati generati i file dei pacchetti, ad esempio:

    linux-image-3.2.0-4+pippo.1-686-pae_3.2.31-1+pippo.1_i386.deb
    linux-image-3.2.0-4+pippo.1-686-pae-dbg_3.2.31-1+pippo.1_i386.deb
    linux-headers-3.2.0-4+pippo.1-686-pae_3.2.31-1+pippo.1_i386.deb
    xen-linux-system-3.2.0-4+pippo.1-686-pae_3.2.31-1+pippo.1_i386.deb

    Problema: In questo caso, linux-headers-3.2.0-4+pippo.1-common è mancante. Per generarlo è necessario invocare il target binary-arch_i386, che genera tutti gli insiemi di funzionalità (RT) e tipologie e ovviamente necessita di molto più tempo. Vedere questa discussione. Soluzione:

    fakeroot make -f debian/rules.gen binary-arch_i386_none_real
  5. Se si applicano ulteriori cambiamenti al pacchetto sorgente ed è necessario ricompilare i pacchetti binari, senza ricompilare ogni oggetto binario, si può rimuovere la marcatura temporale di compilazione prima di eseguire i comandi di compilazione detti sopra. Ad esempio

    rm debian/stamps/build_i386_none_686-pae_plain

La storia di linux-tools

I pacchetti linux-headers-* creati con il metodo sopra descritto dipendono da linux-kbuild-*, che non è compilato dal pacchetto sorgente linux, ma da linux-tools.

Spesso, quando arriva un nuovo kernel, linux-kbuild-3.xx non è ancora disponibile nell'archivio, perciò si deve compilarlo da soli o aspettare.

Un Mini-Howto scritto da Sedat (dileks) fornisce istruzioni dettagliate su come compilare linux-kbuild-3.5. L'integrazione qui appesantirebbe di molto in modo non necessario il wiki.

Come compilare linux-tools da soli

Scaricare il sorgente dal repository SVN:

svn co svn://svn.debian.org/kernel/dists/trunk/linux-tools

Poi, scaricare l'archivio tar del kernel nella versione senza modifiche (vanilla) (solitamente la versione 3.x, non 3.x.y):

VERSION="3.6"
wget http://ftp.kernel.org/pub/linux/kernel/v3.x/linux-${VERSION}.tar.bz2

Ora preparare il pacchetto Debian:

cd linux-tools
./debian/bin/genorig.py ../linux-${VERSION}.tar.bz2
cd ..
tar -xzf orig/linux-tools_${VERSION}.orig.tar.gz
cd linux-tools-${VERSION}
cp -a ../linux-tools/* ./

NOTA: Opzionalmente si deve cambiare la versione Debian in debian/changelog, se $VERSION di Linux-kernel è più alta; pensare che 3.5 (la più recente versione nel ramo SVN di linux-tools) è più piccola di 3.6-rcx (versione dell'archivio tar), altrimenti la riga genorig.py fallisce.

Da ultimo, modificare la versione Debian e aggiungere commenti come "Non-maintainer upload" più "New upstream version" attraverso il comando dch. Ultimo, ma non per importanza, compilare l'effettivo pacchetto dopo aver installato eventuali dipendenze di compilazione mancanti:

dch -i
make -f debian/rules clean
dpkg-checkbuilddeps
cp -av ../orig/linux-tools_${VERSION}.orig.tar.gz ../ <--- Necessario per ottenere un file diff.
dpkg-buildpackage -us -uc (o debuild)

e tutto è fatto.

Come ricompilare un singolo modulo del kernel Debian

apt-get install linux-headers-$(uname -r)
apt-get source linux-image-$(uname -r)
cd linux-*
# Modify a module if you want
make -C /lib/modules/$(uname -r)/build M=$(pwd) drivers/usb/host/xhci-hcd.ko

Nota: