Differences between revisions 16 and 18 (spanning 2 versions)
Revision 16 as of 2015-11-27 11:08:46
Size: 11081
Comment: sync with English master
Revision 18 as of 2017-04-01 15:20:22
Size: 355
Comment: sync with english master
Deletions are marked like this. Additions are marked like this.
Line 4: Line 4:
{{{#!wiki caution
'''Questa pagina ha contenuti in parte non aggiornati.'''

Dovrebbe essere modificata facendo riferimento alla pagina https://debian-handbook.info/browse/en-US/stable/sect.kernel-compilation.html
}}}

= 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'''

<<Anchor(reasons)>> '''Ragioni per farlo:'''

 1. Modificare la configurazione Debian per cambiare il '''modello di preemption'''.
 1. Modificare la configurazione Debian per cambiare la '''frequenza del timer'''.
 1. Aggiungere una patch.
 1. 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 [[http://www.frankvm.com/nfs-ngroups/|patch NFS-ngroups]] e il [[https://packages.debian.org/source/stable/linux|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
# Assicurarsi di avere voci deb-src per stable '''*e*''' security in /etc/apt/sources.list
apt-get update
apt-get source linux
cd linux-3.16.7-cktXX/
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 -f amd64 -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 :)
}}}

<<Anchor(add-a-patch)>>
== 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
}}}

 1. 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 [[DebianKernel|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
}}}

 1. 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".

 1. 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}}}.

 1. Usare quilt per aggiungere la propria patch (vedere [[it/UsingQuilt|Uso di quilt]])

 1. 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
}}}

 1. 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]

 {{{
make -f debian/rules source-all
}}}

 1. Una volta ottenuto il messaggio di errore soprastante, dopo il primo “debian/rules clean”, {{{dch}}} funziona perché {{{debian/control}}} è stato (ri)generato. (Notare che, dopo la modifica di {{{debian/changelog}}}, “debian/rules clean” deve essere eseguito nuovamente perché cambia il suo hash.) Iniziare una nuova sezione all'inizio di {{{debian/changelog}}} e usare un numero di versione appropriato. Assicurarsi che la distribuzione '''non''' sia impostata ad un nome regolare di rilascio. Cambiarla in qualcosa tipo '''NONRILASCIATO.''' Lo si può fare con lo strumento {{{dch}}} nel pacchetto DebPkg:devscripts in questo modo: {{{
dch --local +pippo.
}}}

 1. Documentare l'aggiunta di questa patch nella nuova sezione in {{{debian/changelog}}}.

<<Anchor(build-all)>>
=== Compilare tutti i pacchetti relativi al kernel ===
 0. Assicurarsi di avere almeno 40 GB di spazio libero su disco (per la versione 2.6.32-17 sono serviti 30 GB).

 1. 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.

<<Anchor(build-one)>>
=== Compilare un'unica variante del kernel ===
 0. 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).

 1. 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.

 1. Cambiare il file {{{.config}}}, usando ad esempio {{{
make menuconfig
cd ../../..
}}}

 1. 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 [[http://lists.debian.org/debian-kernel/2008/04/msg00190.html|questa discussione]].
 Soluzione: {{{
fakeroot make -f debian/rules.gen binary-arch_i386_none_real
}}}

 1. 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 [[http://lists.debian.org/debian-kernel/2012/08/msg00390.html|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://anonscm.debian.org/svn/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:
 * Come unica modifica l'autore di questo commento ha dovuto andare in /usr/src/linux-headers-3.2.0.4-common/ ed eseguire {{{
ln -s ../linux-headers-$(uname -r)/scripts .
}}}.

Vedere la sezione sulla [[https://kernel-handbook.alioth.debian.org/ch-common-tasks.html#s-common-official|Ricompilazione dei pacchetti ufficiali del kernel di Debian]] nel Kernel Handbook.

Traduzioni: English - Italiano

Vedere la sezione sulla Ricompilazione dei pacchetti ufficiali del kernel di Debian nel Kernel Handbook.