giovedì 11 agosto 2011

Compilare moduli del kernel con DKMS

Il Dynamic Kernel Module Support (DKMS) è un sistema che permette di generare moduli per il kernel Linux i quali non sono presenti nel sorgente del kernel stesso. Quando viene installata una nuova versione del kernel Linux, normalmente è necessario ricompilare questi moduli. Nei sistemi Debian e derivati (e probabilmente anche in altre distribuzioni con kernel Linux), questa operazione viene svolta automaticamente eseguendo lo script /usr/lib/dkms/dkms_autoinstaller. A volte, però, si potrebbe voler ricompilare manualmente un modulo, oppure compilarlo per una versione del kernel diversa da quella per cui esiste già. La sintassi da usare per ricompilare un modulo chiamato <modulo> è la seguente
sudo dkms build -m <modulo> -v <versione_modulo> -k <versione_kernel>
sudo dkms install -m <modulo> -v <versione_modulo> -k <versione_kernel>
sudo dkms status
Il primo comando serve per compilare il modulo, nella versione <versione_modulo> e per il kernel <versione_kernel>, il secondo comando serve per installare il modulo compilato (prima di procedere con questo comando assicurarsi che la compilazione sia andata a buon fine. La buona riuscita o meno della compilazione viene segnalata dai messaggi di output del comando dkms build) e l'ultimo serve per verificare lo stato dei moduli gestiti da DKMS, per controllare che i moduli desiderati siano stati effettivamente installati. Per conoscere la versione del kernel attualmente in uso si può dare nel terminale il comando uname -r.

Quando si installa una nuova versione dei driver proprietari della scheda video (farò l'esempio con una scheda Nvidia), viene compilato solo il modulo per il kernel attualmente in uso (oltre ai kernel successivamente installati, come abbiamo già detto prima). Si potrebbe, però, voler compilare il modulo anche per una versione del kernel diversa da quella in uso (come può essere una versione precedente). Ammettiamo quindi per esempio che il modulo che si voglia ricompilare è il driver Nvidia, chiamato nvidia, che la sua versione è la 280.13 e che il kernel per il quale si vuole ricompilare il modulo è il 3.0.0-1-686-pae. Dunque dovremo dare i seguenti comandi per compilare e installare il modulo:
sudo dkms build -m nvidia -v 280.13 -k 3.0.0-1-686-pae
sudo dkms install -m nvidia -v 280.13 -k 3.0.0-1-686-pae
Alla fine potremo usare il comando dkms status per controllare lo stato dei moduli così installati. L'output sarà qualcosa di questo tipo
nvidia, 280.13, 2.6.38-2-686, i686: installed
nvidia, 280.13, 2.6.39-2-686-pae, i686: installed
nvidia, 280.13, 3.0.0-1-686-pae, i686: installed
Naturalmente consiglio di consultare il manuale di DKMS (man dkms) per avere maggiori informazioni sul programma e le sue opzioni.

Invece di usare dkms build e dkms install, è possibile utilizzare il comando dkms autoinstall che installa, per una specifica versione del kernel, tutti i moduli che sono già installati per altre versioni del kernel diverse da quella indicata. La sintassi è
sudo dkms autoinstall --kernelver <versione_kernel>
Si può anche eseguire direttamente lo script dkms_autoinstaller citato all'inizio (il breve script dkms_autoinstaller richiama a sua volta dkms autoinstall al suo interno). La sintassi è
/usr/lib/dkms/dkms_autoinstaller start
se si vogliono compilare i moduli per il kernel attualmente in uso oppure
/usr/lib/dkms/dkms_autoinstaller start <versione_kernel>
se si vuole indicare una particolare versione del kernel.

I comandi sopra spiegati sono validi solo se il modulo è già predisposto per la compilazione con DKMS. Per aggiungere il supporto a DKMS a dei moduli di cui si possiede il codice sorgente si può vedere qui.

I comandi di questo post sono stati presi dal seguente messaggio dell'utente bugsbunny sul forum forums.debian.net: http://forums.debian.net/viewtopic.php?f=6&t=66973#p382913.