View Full Version : [Linux Kernel]Informazione su ricompilazione kernel con moduli esistenti
Devo compilare un kernel con delle patch che però deve poter girare su un sistema già precostituito.
Ossia voglio cambiare solo il file del kernel e non anche tutti i binari dei moduli.
Ho preso i sorgenti del kernel (già specifici per quel sistema) e fatto delle modifiche al .config aggiungendo delle cose e togliendone delle altre, ed in più ho applicato delle patch (es. BFQ)
Il kernel compilato apparentemente sembra funzionare, ma in alcune situazioni dumpa ed alcuni driver non vanno più (es. tun.ko).
Cosa sbaglio, non sono espertissimo di compilazione kernel ?
Devo per forza cambiare tutti i moduli installando anche quelli che escono dalla mia compilazione ?
Sarebbe scomodissimo da fare e poi di alcuni moduli (che non fanno parte del kernel tree) non ho i sorgenti ma solo i binari pre-build
Cosa sbaglio, non sono espertissimo di compilazione kernel ?
Devo per forza cambiare tutti i moduli installando anche quelli che escono dalla mia compilazione ?
Sarebbe scomodissimo da fare e poi di alcuni moduli (che non fanno parte del kernel tree) non ho i sorgenti ma solo i binari pre-build
Di tanto in tanto capita di dover compilare dei moduli contro un kernel pre esistente, ma voler cambiare il kernel e pretendere di mantenere i moduli di un kernel precedente mi sembra un po' avventato.
Dipende: sei uno alle prime compilazioni che non ha le idee chiare o sei uno con un sistema tipo industriale con dell'hardware dedicato per cui non puo' cambiare i moduli?
Diciamo che si tratta di un progetto OpenSource (non mio) di cui per il 95% dei moduli ci sono i sorgenti (perché moduli standard nel kernel tree) e per alcuni moduli (driver di hw custom) ci sono solo i binari dei moduli.
Se si compila tutto con il .config di default funziona tutto, però io volevo aggiungere e togliere delle funzionalità al kernel quindi ho modificato il .config, aggiunto delle patch al kernel e ricompilato.
Mi aspettavo che il nuovo kernel potesse funzionare con i moduli già presenti sull'installazione (dopotutto sono stessa versione e non sono toccati dalle modifiche), però sembra che invece il nuovo kernel in alcune funzionalità dumpi.
Cambiare i moduli sarebbe doppiamente scomodo, sia perché dovrei sostituire tutti i moduli presenti nell'installazione, sia perché allora dovrei anche fare un repository pubblico per tutti gli altri moduli opzionali (che escono dalla compilazione ma che non sono installati di default), altrimenti alla prima installazione di un modulo opzionale si avrebbe di nuovo un binario vecchio.
E poi rimane il fatto che non potrei ricompilare i driver custom.
Quindi cercavo di capire come operare per fare il kernel con le mie modifiche ma mantenendo la compatibilità con i binari presenti sull'installazione.
L'idea di un kernel modulare e' che sia possibile aggiungere dei moduli mantenendo lo stesso kernel, tu vuoi fare il contrario.
Se il kernel e' compilato con la feature x o y di conseguenza i moduli si potranno adattare a usare x o y, ma se tu vuoi tenere fermi i moduli che sono conseguenti al kernel e cambiare il kernel allora con una sola modifica al kernel puoi avere 100 moduli che non vanno.
Dovreste avere una qualche API nel kernel per la gestione dei moduli binari, un po' come fa intel con i firmware ipw*.
Poi non per farmi i fatti tuoi ma o il progetto e' opensource o ha i moduli binari: di' piuttosto che state cercando di integrare dei driver proprietari con software libero pre esistente.
Poi non per farmi i fatti tuoi ma o il progetto e' opensource o ha i moduli binari: di' piuttosto che state cercando di integrare dei driver proprietari con software libero pre esistente.
Ma non è assolutamente vero, basta che guardi Nokia N900 per fare un esempio semplice.
Il sistema operativo è quasi totalmente opensource, ma i driver per l'hw di Nokia sono closed source e forniti solo come binari.
Tu puoi farti tutti i tuoi kernel custom che vuoi, solo che non puoi cambiare versione del kernel (altrimenti è quasi sicuro che i moduli non andrebbero più) e devi cmq fare in modo che il tuo kernel giri con i binari forniti da Nokia.
Nel mio caso non è un Nokia N900, ma la situazione è simile.
Il produttore del sistema ha rilasciato tutti i sorgenti, tranne quelli dei driver per alcuni parti dell'Hw per evitare che l'intero sistema (un firmware) sia usato su altri hw simili ma non prodotti da loro.
Io volevo solo customizzare il kernel, per aggiungere features interessanti per me e per altri.
Cmq proverò a reintegrare le 2 funzioni che ho soppresso (che però non sono legate ai moduli che crashano) per vedere se è quella mancanza a dare l'instabililtà.
Il sistema operativo è quasi totalmente opensource, ma i driver per l'hw di Nokia sono closed source e forniti solo come binari.
Il produttore del sistema ha rilasciato tutti i sorgenti, tranne quelli dei driver per alcuni parti dell'Hw per evitare che l'intero sistema (un firmware) sia usato su altri hw simili ma non prodotti da loro.
- http://www.gnu.org/philosophy/free-sw.html
Poi che non diventi un flame, io ti aiuterei volentieri ma se uno dei produttori non rilascia i sorgenti in modo che gli altri non possano avvantaggiarsi dei contributi a me la cosa sembra ben definita.
non ho capito se esegui anche:
make modules
make modules_install
pabloski
31-12-2012, 14:25
Il problema che ti trovi ad affrontare è in effetti assai spinoso.
Siccome linux non garantisce la stabilità di api e abi per il kernel, è praticamente obbligatorio ricompilare i moduli quando si crea un nuovo kernel.
Puoi però settare, durante la compilazione, il kernel affinchè non verifichi le informazioni di versione dei moduli, ma lo fai a tuo rischio e pericolo.
Riguardo le società che distribuiscono moduli closed, o ne producono vari per ogni versione del kernel o usano del gluecode opensource che verrà ricompilato ad ogni ricompilazione del kernel integrando o affiancando un pezzo di codice binario closed source ( i blob binari in pratica ).
L'avere solo un modulo binario implica in parecchi casi l'impossibilità ad usarlo con versioni differenti del kernel.
- http://www.gnu.org/philosophy/free-sw.html
Poi che non diventi un flame, io ti aiuterei volentieri ma se uno dei produttori non rilascia i sorgenti in modo che gli altri non possano avvantaggiarsi dei contributi a me la cosa sembra ben definita.
In alcuni casi però ci sono contratti di NDA che impediscono di farlo.
E poi è così per la maggior parte dei Soc in giro, infatti mi pare che anche il famoso Raspberry PI che dovrebbe essere tutto OpenSource (pure gli schemi dell'HW) ha driver video solo come blob binario, perché la fondazione non ha il permesso di Broadcom di divulgare i sorgenti (e magari non li ha neanche lei stessa).
In alcuni casi potrebbe essere la società X che decide di regalare parte del proprio sviluppo ma trattiene volontariamente parte del codice per garantirsi almeno un "Ok fai quello che vuoi con il software da noi sviluppato ma almeno fallo sul ns HW".
Dopotutto se fai business oggi se divulghi tutto, tempo 10gg c'è un clone cinese con il tuo software ad un terzo del tuo prezzo e tu vai fuori business in brevissimo tempo.
In altri casi invece la società Y potrebbe non essere in grado di divulgare tutto perché ha usato Soc di produttori che ti fanno firmare contratti di NDA ed in alcuni casi non ti danno manco i sorgenti ma ti fanno loro i moduli binari da usare.
Insomma io non ci vedrei tante critiche da fare, ne mi farei paladino a priori del "only free software"
non ho capito se esegui anche:
make modules
make modules_install
No io i moduli che poi non vanno, ce li avrei anche tutti (li ricompilo tutti ogni volta) anche se non li ho provati per vedere se risolvono il crash.
Solo che vorrei una soluzione per evitare di doverli usare (e quindi poi distribuire agli altri, rendendo tutto scomodo).
make modules_install
te li installa..... prima di eseguirlo salvati i moduli binari, che poi devi riaggiornare
Il problema che ti trovi ad affrontare è in effetti assai spinoso.
Siccome linux non garantisce la stabilità di api e abi per il kernel, è praticamente obbligatorio ricompilare i moduli quando si crea un nuovo kernel.
Puoi però settare, durante la compilazione, il kernel affinchè non verifichi le informazioni di versione dei moduli, ma lo fai a tuo rischio e pericolo.
La versione del kernel però non è cambiata.
Insomma stai dicendo che se io integro, per esempio, EXT4 nel kernel (scegliendolo nel .config dove prima era spento) tutti gli altri moduli già esistenti diventano incompatibili o parzialmente incompatibili ?
Quindi ogni volta faccio una modifica al kernel, mi tocca mettere in piedi un repository alternativo (perché mica posso scrivere in quello ufficiale) in cui mettere tutti i moduli ricompilati ?
Scomodissimo da ridistribuire ad altri.
E poi se fosse così allora potrebbe anche smettere di funzionare il driver video (non disponibile come sorgenti) anche solo perché magari ho aggiunto al kernel il modulo NetConsole per avere un debug senza cavo seriale.
Utile ...
pabloski
31-12-2012, 17:41
La versione del kernel però non è cambiata.
Insomma stai dicendo che se io integro, per esempio, EXT4 nel kernel (scegliendolo nel .config dove prima era spento) tutti gli altri moduli già esistenti diventano incompatibili o parzialmente incompatibili ?
accade cambiando versione del kernel ovviamente, se è la medesima non hai problemi
E poi se fosse così allora potrebbe anche smettere di funzionare il driver video (non disponibile come sorgenti) anche solo perché magari ho aggiunto al kernel il modulo NetConsole per avere un debug senza cavo seriale.
Utile ...
ovviamente non è così suscettibile, anzi l'importante è che non vi sia un'api breakage tra le varie versioni del kernel
l'uso di informazioni di versioning fu inserito proprio perchè tra una versione e l'altra del kernel è probabilissimo che cambiamenti all'api siano stati fatti e quindi alcuni moduli potrebbero non funzionare
l'esistenza di moduli solo binari è un problema in quest'ultimo caso, ma se si continua ad usare la medesima versione del kernel ( ovviamente non si può fare in eterno ) non ci sono problemi
make modules_install
te li installa..... prima di eseguirlo salvati i moduli binari, che poi devi riaggiornare
Non è così semplice, il kernel viene fatto su un altro sistema e usando un sistema di build (bitbake).
Alla fine hai un nuovo file del kernel, una immagine cramfs del firmware (con già vari moduli installati, tra cui quelli forniti senza sorgenti), e tanti pacchetti da mettere in un repository con tutti i moduli del kernel dichiarati come modulo opzionale (non ho verificato ma dovrebbero esserci anche quelli installati nell'immagine).
accade cambiando versione del kernel ovviamente, se è la medesima non hai problemi
Invece sembra che li ho.
Io ho preso il sistema di build, modificato il file di config del kernel per:
Aggiungere NetConsole
Aggiungere il supporto EXT4
Togliere il supporto EXT2 ed EXT3, per ridurre le dimensioni del kernel (ho un limite max in cui devo stare)
Aggiungere il supporto CGROUP
Aggiungere BFQ via patch al kernel
e ho ricompilato tutto.
Il nuovo kernel (sostituito al vecchio tenendo i moduli del vecchio) sembra funzionare bene finché non si cerca di usare un driver WiFi o il driver tun.ko (openvpn).
In quel caso il modulo dumpa con per esempio:
[ 4283.940000] CPU 0 Unable to handle kernel paging request at virtual address 00000014, epc == c9cca9dc, ra == c9cca9c0
[ 4283.950000] Oops[#1]:
[ 4283.950000] Cpu 0
[ 4283.950000] $ 0 : 00000000 00000001 94948400 00000000
[ 4283.950000] $ 4 : 00000000 00000001 9687a580 900f6eb8
[ 4283.950000] $ 8 : 00000998 00000997 00000000 962b8f98
[ 4283.950000] $12 : 000f0000 00000218 00000c90 962b0148
[ 4283.950000] $16 : 9539d640 000000c8 9539d640 905e0000
[ 4283.950000] $20 : 905e0000 9636dda0 c9ccd620 00000001
[ 4283.950000] $24 : 00000000 9007e47c
[ 4283.950000] $28 : 96b42000 96b43cb8 00000000 c9cca9c0
[ 4283.950000] Hi : 00000005
[ 4283.950000] Lo : 0505050a
[ 4283.950000] epc : c9cca9dc tun_chr_open+0x44/0x64 [tun]
[ 4283.950000] Tainted: P O
[ 4283.950000] ra : c9cca9c0 tun_chr_open+0x28/0x64 [tun]
[ 4283.950000] Status: 10009c03 KERNEL EXL IE
[ 4283.950000] Cause : 30800008
...
e mi chiedevo come risolvere (senza dover ridistribuire tutti i moduli).
Ho già provato a togliere CGROUP e NetConsole ma dumpa lo stesso.
Mi rimane da provare con rimettere EXT2 ed EXT3 (ma in quel caso non sono sicuro di stare dentro le dim. max).
Tra l'altro non dampa sempre, esempio ci sono volte che il WiFi per un po' di volte di fila funziona senza problemi e poi ad un ulteriore utilizzo invece va in dump.
Con il kernel compilato senza modifiche invece sembra funzionare tutto ed a lungo.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.