PDA

View Full Version : Compilare singolo modulo del kernel, come ?


FabryHw
20-01-2012, 19:05
Sto usando una distribuzione Linux per la quale non hanno rilasciato molti moduli del kernel come binari già pronti.

In particolare mi servivano vari moduli DVB.

Di solito usavo Media_Build per questo ma non so perché con l'ultimo kernel della distribuzione (attualmente 3.1.7) NON funziona più.
Ossia i moduli che mi compila poi danno un sacco di errori quando vengono caricati.

Quindi ho optato per compilare dai sorgenti del kernel.

Ecco il problema è che non posso aspettare ne di compilare tutto il kernel ne neanche tutti i modules, perché ci vorrebbe troppo tempo (2 o 3 ore).
A me serve urgentemente solo uno o due moduli che probabilmente in 5-10 min compilerei, il problema è che non so come dirgli "fai solo quello"

sacarde
20-01-2012, 21:01
http://www.linux-magazine.it/Compilare-un-solo-modulo-del-kernel.htm

FabryHw
21-01-2012, 01:52
Grazie, ma il link non sembra dire nulla di utile.

Io non ho i sorgenti a parte del modulo, ho solo tutti i sorgenti del kernel (presi dal sito ufficiale).
Ed il modulo (o i moduli) che voglio compilare sono già in quei sorgenti.

Solo che non voglio compilare per ore tutti i moduli, ma compilare selettivamente solo quelli che mi interessano e mancano.

sacarde
21-01-2012, 09:01
non li hai trovati dentro: /lib/modules/......

entri nella relativa dir e li compili



p.s.
alternativa:
http://guide.debianizzati.org/index.php/Debian_Kernel_Howto#Per_aggiungere_un_modulo_devo_ricompilare_tutto_il_kernel.3F


p.s.
che distro usi?

FabryHw
21-01-2012, 17:42
non li hai trovati dentro: /lib/modules/......

entri nella relativa dir e li compili



p.s.
alternativa:
http://guide.debianizzati.org/index.php/Debian_Kernel_Howto#Per_aggiungere_un_modulo_devo_ricompilare_tutto_il_kernel.3F


p.s.
che distro usi?

Il nuovo link che hai proposto sembra dire "devi ricompilare tutto" :D, e quindi non sembra essere di utilità (sempre se si può fare).

In lib/modules/... ho alcuni dei moduli Dvb + ovviamente il DVB Core, però mancano i moduli per 2 delle 3 periferiche che voglio usare io.

Di solito usavo compilare il pacchetto Media_Build (che poi sono i moduli Media, quindi anche DVB, del Kernel pacchettizzati a parte) e fino al kernel 3.1.4 funzionava bene.
Poi è uscito l'aggiornamento a 3.1.6 e qui il pacchetto Media_Build faceva funzionare bene solo 1 delle 2 periferiche.

Al successivo aggiornamento 3.1.7 (e relativa ricompilazione di Media_Build) NON funzionava più nessun driver (webcam compresa).
Dato che però usando il driver webcam fornito di serie con i moduli del kernel invece la webcam funziona ho supposto che ci sia un problema di compatibità tra media_build (ufficialmente rilasciata a Novembre) e gli ultimi kernel.

Quindi volevo compilare i 4 o 5 moduli del kernel che mi servono per le 2 periferiche che mi mancano usando direttamente i sorgenti del kernel, sperando poi che i driver ottenuti siano funzionanti.

Entrare nella cartella (sorgenti del kernel) che li contiene NON serve a nulla dato che il Makefile lì presente non è un makefile da compilazione standalone.
Ossia se faccio "cd linux-3.1.7/drivers/media/dvb/dvb-usb/ && make" ottengo la risposta che il makefile non ha un target main da eseguire

E fare il downgrade al kernel 3.1.4 (per tornare ad usare con successo media_build) non è possibile perché la distribuzione (ArchLinux) non supporta di buon grado i downgrade (es. i server repo non tengono versioni vecchie a lungo)

FabryHw
21-01-2012, 17:55
Comunque visto che la cosa si è fatta lunga alla fine l'ho lasciato tutta notte a ricompilare tutti i moduli.

Mi piacerebbe ancora sapere come compilare un singolo modulo, ma cmq ora ce li ho tutti (quelli del mio config).

Il problema è farli funzionare.

Ho fatto "make modules_install" e tutti moduli sono stati copiati nella cartella lib/modules/3.1.7-.... però ora non ne va neanche uno (e non parlo solo del DVB ma di tutti i moduli del kernel).
Allora sono ritornato indietro restorando un backup della cartella originale e devo capire cosa non gli piaccia (il kernel è 3.1.7 ed i moduli sono stati compilati dai sorgenti di tale kernel con il config del mio kernel).

L'unica cosa che ho notato è che i moduli originali sono tutti gzipped (ko.gz) mentre quelli compilati da me no.
Che sia solo quello ?

sacarde
21-01-2012, 17:57
i sorgenti che trovi in: /usr/src non sono completi

- per compilarti il kernel con arch devi usare: https://wiki.archlinux.org/index.php/Kernel_Compilation

- oppure cercare in AUR se esiste un pacchetto per il tuo modulo

- il downgrade perche' non puoi farlo? cancelli i pacchetti dalla cache di pacman?

FabryHw
21-01-2012, 18:09
i sorgenti che trovi in: /usr/src non sono completi

- per compilarti il kernel con arch devi usare: https://wiki.archlinux.org/index.php/Kernel_Compilation

- oppure cercare in AUR se esiste un pacchetto per il tuo modulo

- il downgrade perche' non puoi farlo? cancelli i pacchetti dalla cache di pacman?

I sorgenti li ho presi da http://www.kernel.org/pub/linux/kernel/v3.x/ quindi suppongo siano più che completi.

Non ci sono moduli in AUR per i miei device (o meglio uno c'è ma è vecchio, si basa su sorgenti outdated).

Ho reinstallato di recente la macchina (causa problemi di corruzione sul disco Ext2 dovuti ad uno spegnimento brutale) e quindi è ora una installazione pulita partita fin da subito con 3.1.7 (niente 3.1.4 in cache).

Cmq prima della reinstallazione un downgrade l'avevo fatto, ed in effetti poi bootava con il kernel 3.1.4
Però pacman non gestiva bene le dipendenze transitive e non downgradava anche gli altri pacchetti.

Es. se provavi a compilare media_build nonostante la macchina stesse girando con 3.1.4 e ci fossero gli headers giusti installati, media_build cercava cmq di compilare per 3.1.6 (il kernel più recente usato in preced.).

PS
Per la compilazione avevo seguito proprio il link da te consigliato usando il ramo "Traditional", solo che non volevo compilare tutto.

sacarde
21-01-2012, 20:47
ma compilando tutti i moduli con:

make modules

make modules_install

andrebbe bene?

FabryHw
21-01-2012, 21:53
ma compilando tutti i moduli con:

make modules

make modules_install

andrebbe bene?

In teoria doveva andare bene (ovviamente dopo avere fatto prima un make menuconfig per aggiungere i moduli che mi mancano), però non volevo farlo perché mi servivano i moduli velocemente ed i comandi citati sopra impiegano anche oltre 2 ore.

In pratica invece non va ed i kernel non vede tutti i nuovi moduli anche se presenti fisicamente.
Adesso ho provato a gzipparli (come quelli forniti dai repository) e poi proverò a copiarli a mano

sacarde
21-01-2012, 23:09
li inserisci con: insmod ?

FabryHw
22-01-2012, 15:06
No di solito riavvio e trovando l'HW dovrebbe caricare lui il modulo, e se non voglio riavviare uso modprobe.

Cmq come sospettavo non era colpa del gzip, ma sono proprio i moduli ottenuti che NON sono compatibili con il kernel.

Nonostante abbia seguito i passi della guida c'è qualcosa che non va e non basta mettere il .config del proprio kernel nei sorgenti e poi dare make modules.

Cmq alla fine ho risolto spulciando vari forum (non legati a ArchLinux) e facendo un collage dei vari consigli.

Procedura che ha funzionato:

Scaricare i sorgenti del kernel e metterli decompressi da qualche parte.
Esempio in /home/utente/src/linux-3.1.7
Entrare nella cartella build che c'è dentro la cartella modules (es cd /lib/modules/3.1.7-2-ARCH/build) ed eseguire "make menuconfig" per andare ad aggiungere i moduli mancanti che ci interessano
Compilare con il seguente comando:
make -C /lib/modules/3.1.7-2-ARCH/build SUBDIRS=/home/utente/src/linux-3.1.7/drivers/media/dvb/ modules
Verrà compilato solo tutto quello presente sia nel config impostato prima sia nella sottocartella specificata.
Alias con il comando indicato saranno rifatti soli i driver DVB attivi nel config, quindi pochi minuti di compilazione.
Convertire i moduli in formato gzip (passaggio opzionale) con
find /home/utente/src/linux-3.1.7/drivers/media/dvb/ -name '*.ko' -exec gzip -9 {} \;
Copiare a mano i nuovi moduli nelle varie giuste sottocartelle dentro /lib/modules/3.1.7-2-ARCH
Eseguire depmod -a
Riavviare o caricare a mano i moduli con modprobe


Ora tutto funziona, e sotto kernel 3.1.7, come quando ero sotto kernel 3.1.4 + media_build
Oddio una scheda non funziona ancora bene (freeza il frontend dopo un po' che la usi), ma non funzionava bene neanche prima ed è colpa del driver ufficiale per linux (devo provare qualche variante beta, visto che l'ufficiale ha problemi)

FabryHw
22-01-2012, 17:55
Ora tutto funziona, e sotto kernel 3.1.7, come quando ero sotto kernel 3.1.4 + media_build
Oddio una scheda non funziona ancora bene (freeza il frontend dopo un po' che la usi), ma non funzionava bene neanche prima ed è colpa del driver ufficiale per linux (devo provare qualche variante beta, visto che l'ufficiale ha problemi)

E te pareva che oggi non usciva l'aggiornamento del kernel a 3.2.1 :D

In più sono in contatto con lo sviluppatore del driver AF9015 (quello che non va benissimo) il quale mi consiglia assolutamente di usare Media_build che ha una versione più recente (e che sarà rilasciata solo con il kernel 3.3).

Vabbè ora faccio l'aggiornamento a 3.2.1 e poi provo a compilare MB