Trucchi per la compilazione del Kernel fai-da-te

24 04 2007

KernelNei giorni scorsi mi è capitato di voler ricompilare il kernel ad-hoc per ottenere qualcosa di maggiormente adatto alla mia macchina e quindi un sistema più ottimizzato. Non era la prima volta che mi preparavo a ricompilare un kernel, ho solo dovuto seguire le varie guide che spiegano i passaggi giusti per compilare ed installare un kernel alla DebianWay e devo ammettere che la procedura è molto semplificata rispetto alle altre distribuzioni, soprattutto in fase di installazione del nuovo kernel dove con un semplice dpkg -i si è esentati da qualsiasi altra operazione :)

Tuttavia, nonostante la mia esperienza, mi è capitato, come sicuramente a molti di voi, di ottenere il classico errore al riavvio della macchina col nuovo kernel:

Kernel Panic: not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

Ovviamente il problema era chiaro, come spiegato nelle varie guide, se si vuole compilare ed installare un kernel senza usare l’immagine initrd (preferibile) è necessario compilare staticamente nel kernel i moduli relativi al filesystem in uso nella partizione di root / e al controller dei dischi del proprio PC.

Il problema  è che, come nel più classico dei casi, ero convinto di averli messi!! :)
Così mi sono lanciato in nuove compilazioni, ogni volta aggiungendo qualcosa di nuovo, aspettando un bel pò e riprovando, ma il problema permaneva…

Così ho deciso di adottare un’altra strada, forse semplice e banale, ma che mi è sembrato utile riportare qui per altre persone che possono incappare nel medesimo problema.

Ho preso il file di configurazione (/boot/config*) standard del kernel precompilato che è possibile scaricare tramite apt-get e l’ho usato per avviare la configurazione del kernel con le opzioni standard con cui ero sicuro funzionasse. Ho quindi tolto solo le cose di cui ero sicuro non aver bisogno ed ho avviato la compilazione con il supporto per l’immagine initrd  (make-kpkg –append-to-version=XXXX -revision=XX –initrd kernel_image).

La parte essenziale qui è la creazione dell’immagine di initrd: esistono diversi sistemi per la generazione della stessa, update-initramfs (fornito dal pacchetto initramfs-tools – standard) e il recente mkinitrd.yaird (fornito dal pacchetto yaird). Mkinitrd.yaird è il tool che useremo in quanto, al contrario del metodo standard, per la creazione dell’immagine di initrd, esegue una scansione del sistema e carica solo i moduli necessari.

Quindi, dopo aver installato yaird con apt-get, synaptic o aptitude, è necessario dire al sistema di usare quel tool per la generazione dell’immagine di initrd, altrimenti di default verrà utilizzato il tool di sistema mkinitramfs. Per fare ciò è necessario modificare il file /etc/kernel-img.conf e aggiungere la seguente riga:

ramdisk = /usr/sbin/update-initramfs /usr/sbin/mkinitrd.yaird

Ora è quindi possibile lanciare la compilazione del kernel.

A questo punto, dopo aver riavviato il sistema col nuovo kernel, sarà sufficente scompattare l’immagine di initrd in una cartella temporanea ed esaminare il suo contenuto per vedere quali sono i moduli necessari da compilare staticamente nel kernel per non avere più kernel panic al boot del nostro kernel compilato senza initrd! :)

 

Per fare ciò è sufficente creare una cartella dove scompattare l’immagine (ad esempio initrd in /tmp) e digitare:

# zcat /boot/initrd.img-* | cpio -i

ovviamente potete sostituire initrd.img-* col nome completo del file creato nel vostro sistema (attenzione che il comando scompatta l’initrd dove vi trovate, quindi posizionatevi nella cartella che avete creato precedentemente prima di eseguirlo).

Ora sarà sufficiente esplorare il contenuto di /lib/modules/2.6.*/kernel/ e nelle sottocartelle drivers/ e fs/ troverete i moduli caricati dal sistema al boot, quindi necessari per il funzionamento dello stesso.

Cercateli durante la compilazione del vostro nuovo kernel e compilateli staticamente all’interno dello stesso, al prossimo riavvio col vostro nuovo kernel non avrete più a che fare con un kernel panic! ;)

Annunci

Azioni

Information

8 responses

24 04 2007
Suedehead

Ciao, anche io mi sono Debianizzato (ci sono arrivato attraverso Ubuntu, ma credo che rimarrò con Debian), dopo aver usato Windows per 13 anni.

Ancora non ho provato a compilare il kernel, magari se ho problemi ti posso venire a scocciare? ;)

Ciao :D

24 04 2007
DrBrex

certo, sennò lo spirito della community dove starebbe :)
bevenuto tra noi ;)

11 06 2007
Gunther Grasshopper

Ciao,
ho lo stesso kernel panic e anch’io ho fatto decine e decine di configurazioni e compilazioni… senza successo. Frustrantissimo.
Per ora mi sono arreso ed ho risolto pure io usando l’initrd, ma è una tassa che vorrei evitare.
In effetti l’idea di prendere una configurazione standard sicuramente funzionante e pian piano sfoltirla è d’aiuto per molta gente (ad esempio me :-) ma non mi pare un approccio molto “informatico” procedere per esclusione.
Nel caso specifico: dove si trova questo file config? Oppure basta cancellare tutti i config preesistenti e lanciare make menuconfig?

Ciao a tutt*
e complimenti a te per il blog.

12 06 2007
DrBrex

Ciao Gunther…
sinceramente non so se hai capito bene l’intento del mio post…non era quello di prendere una configurazione standard e di sfoltirla alla ricerca dei moduli giusti, ma di prendere l’initrd creato con yaird, il quale inserisce *SOLO* i moduli necessari per l’avvio del *PROPRIO* sistema (fa un analisi dell’hardware e inserisce solo i moduli necessari al contrario di altri script per la creazione di initrd), e dopo aver capito quali sono decomprimendolo (attenzione, non intendo fare una ricerca a caso, ma solo leggere i nomi in quanto quelli li sono effettivamente i SOLI moduli che servono), ricompilare il kernel ad-hoc…mi sembra un procedimento analitico soddisfacente e non va affatto contro la mia etica ingegneristica, in quanto è una scomposizione del problema in parti più semplici…forse hai letto di fretta e hai perso il senso del post..

7 02 2008
Davide

ciao, ho una domanda, magari stuida…
Ho provato a fare come consigli tu, ma nelle directory i moduli son nel formato .ko, come risalgo al modulo da compilare nel kernel?

es. cciss.ko a cosa corrisponde?

Grazie

Davide

27 02 2008
Paco

Ciao, ho letto solo ora l’articolo e devo dire che è proprio quello che mi interessa in quanto ho notato che debian, rispetto ad altre distribuzioni, è molto lenta nella fase di boot.
Quello che ti volevo chiedere è se c’è un sistema per conoscere la lista dei moduli da caricare staticamente senza per forza compilare il kernel.
Mi spiego:
Se non erro, seguendo il tuo ragionamento, per ottenere un kernel ke non sfrutti l’immagine di initrd è necessario compilare il kernel 2 volte:
1) la prima per ottenere lìimmagine creata da yaird da utilizzare poi per conoscere i moduli.
2) la seconda per settare come statici i moduli ottenuti dal passo precedente e quindi ottenere finalmente il kernel da usare.

non si può usare yaird per ottenere semplicemente la lista dei moduli necessari??
Spero di essere stato chiaro.
Grazie e Ciao

13 02 2009
LicaoneSs-Newbie

sono alla prima compilazione e purtroppo leggo solo ora… ho passato 6 ore a controllare ogni singolo modulo, a leggere guide ecc.
beh ora spero solo di aver fatto tutto giusto. Altrimenti saprò come procedere la prossima volta.
Grazie

22 02 2009
LicaoneSs

la prima compilazione è andata a buon fine, solo che volevo provare questo “trucchetto”.
però vorrei dei chiarimenti:
1)scarico il kernel con apt-get (e fin qui ci siamo)
2) copio il file config del vecchio kernel (in cui sono sicuro tutto funzionasse) e “make oldconfig”
3)ramdisk = /usr/sbin/update-initramfs /usr/sbin/mkinitrd.yaird e poi compilo

è questa la strada giusta da percorrere?

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...




%d blogger hanno fatto clic su Mi Piace per questo: