Risolvere i problemi di compilazione per il kernel 2.6.33 RC 1 e successivi
Pensavo che si trattasse di un mio errore, dovuto all’indicazione di un nome personalizzato per il kernel, invece è un bug noto che affligge i sistemi Debian: per fortuna insieme al ticker è presente anche la soluzione. Si tratta di una modifica minimale, che però rallenta considerevolmente il processo d’aggiornamento dopo la prima installazione.
In pratica, se volete compilare l’ultimo kernel – che aggiunge delle feature piuttosto interessanti – dovrete incorrere in un problema legato al print della versione: nulla di trascendentale, ma almeno eviterete di fare come il sottoscritto che ha imprecato ripetutamente — prima di cedere a una ricerca su Google.
Scaricate i sorgenti e applicate tranquillamente (dal momento che funziona) l’ultima patch disponibile: non c’è alcuna differenza tra gli snapshot e la versione mainline, da questo punto di vista. In entrambi i casi sarete costretti a modificare un file.
$ wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/linux-2.6.33-rc1.tar.bz2 $ tar xjvf linux-2.6.33-rc1.tar.bz2 $ sudo mv linux-2.6.33-rc1 /usr/src/ $ cd /usr/src/ $ sudo ln -sf linux-2.6.33-rc1 linux $ cd ~ $ wget http://www.kernel.org/pub/linux/kernel/v2.6/next/patch-v2.6.33-rc1-next-20091219.bz2 $ tar xjvf patch-v2.6.33-rc1-next-20091219.bz2 $ sudo mv patch-* /usr/src/linux/ $ cd /usr/src/linux/ $ sudo patch -p1 < patch-*
Configurate il kernel come di consueto – eventualmente caricando anche un file di configurazione precedentemente salvato – e fate attenzione soltanto a non abilitare /dev tmpfs perché ho il dubbio che sia la causa dei problemi che ho avuto con /proc/mounts. Procediamo applicando le modifiche necessarie:
$ sudo make-kpkg clean $ sudo make-kpkg debian $ sudo gedit debian/ruleset/misc/version_vars.mk
Non ha importanza con quale editor decidiate di aprire il file: le stringe da sostituire si trovano dalla riga 141 in poi e si presentano come di seguito.
UTS_RELEASE_HEADER=$(call doit,if [ -f include/linux/utsrelease.h ]; then \
echo include/linux/utsrelease.h; \
else \
echo include/linux/version.h; \
Rimuovete la parte evidenziata e sostituitela con ciò che segue: è essenziale effettuare questo passaggio per completare la creazione dei pacchetti che andremo successivamente a installare.
UTS_RELEASE_HEADER=$(call doit,if [ -f include/generated/utsrelease.h ]; then \
echo include/generated/utsrelease.h; \
elif [ -f include/linux/utsrelease.h ]; then \
echo include/linux/utsrelease.h; \
else \
echo include/linux/version.h; \
Lasciate invariato il resto e salvate il file. Prima di procedere con la generazione dei pacchetti tenete presente i presupposti già considerati tempi addietro: il prossimo comando è diverso da quello standard perché non possiamo specificare un numero di revisione.
$ sudo fakeroot make-kpkg --initrd kernel_headers kernel_image $ cd .. $ sudo dpkg -i *.deb
Di diverso c’è poi soltanto la rimozione del parametro --revision che andrebbe in conflitto con il file creato contestualmente alla cartella /debian — che dobbiamo per forza generare prima. In apertura citavo il fatto che questo workaround rallenta l’aggiornamento del kernel: il problema è che occorre rimuovere intestazioni, pacchetti e moduli manualmente a causa dell’impossibilità di provvedere a un differente numero di versione.