Installazione manuale del kernel Linux su Ubuntu

Devo ammetterlo, pur essendo una persona che ama sperimentare – mosso da curiosità – le nuove versioni del software appena disponibili, ho imparato in fretta che non è affatto una buona idea, soprattutto se si dispone di un unico PC (e con quello ci si “lavora”). Grande intuizione, mi direte! Come darvi torto… .

Ma veniamo a noi. Prima d’ora non mi ero mai spinto ad intraprendere la strada (apparentemente impervia) dell’installazione manuale del kernel Linux: in fin dei conti si tratta di un’operazione delicata, vuoi per la durata della procedura vuoi perché un singolo errore può rendere il sistema inutilizzabile. L’esperienza sul campo mi ha dimostrato che ci vogliono pazienza e attenzione, ma la soddisfazione che se ne ricava è impagabile. In questo post mi accingo dunque a mostrarvi come farlo (e a rimediare ad eventuali problemi “postumi”).

La domanda ovvia a questo punto è: perché adesso (o perché non prima, dipende dai punti di vista)? La risposta è piuttosto semplice: perché da qualche mese ho accantonato lo storico PC desktop a favore di un portatile di nuova generazione, scoprendo che (a differenza di prima) una versione aggiornata del kernel promette sostanziali benefici su diversi fronti (risparmio energetico, driver hardware, reattività del sistema, …) e volevo constatare di persona la fondatezza di queste promesse.

Proprio in questi giorni è uscita la versione 3.10, che introduce moltissime novità, tra cui una migliore gestione sul fronte energetico, vero tallone d’Achille dei portatili; l’ho considerato un segnale: avevo il movente giusto, dovevo solo armarmi di pazienza e provarci.

La procedura descritta di seguito riflette la mia esperienza (con il vantaggio della prova diretta, ma il limite dell’essere un caso specifico), ma cerca di offrire linee guida generiche: nell’elaborarla ho tratto ispirazione da diverse fonti online, citate alla fine dell’articolo per completezza e per tributare il dovuto ringraziamento ai rispettivi autori.

1. Prerequisiti

Prima di procedere all’installazione del kernel occorre effettuare delle operazioni preliminari per garantire il soddisfacimento di alcuni requisiti.

1. Disporre di privilegi amministrativi. Innanzi tutto occorre assicurarsi che il proprio account (impiegato nel seguito nella procedura) disponga dei privilegi di amministratore; per verificarlo è sufficiente lanciare da terminale il seguente comando:

sudo -l

Se si dispone di privilegi amministrativi verrà mostrato qualcosa del genere:

User nicola may run the following commands on this host:
    (ALL : ALL) ALL

In caso contrario è necessario utilizzare l’account root (ove configurato) o un altro provvisto di privilegi di amministratore.

2. Aggiornare il sistema. Per garantire le migliori probabilità di successo è opportuno accertarsi che il sistema sia aggiornato, tramite il Gestore aggiornamenti o eseguendo da terminale il comando:

sudo apt-get update && sudo apt-get upgrade

3. Pacchetti indispensabili. Per la compilazione del kernel occorre installare alcuni pacchetti (build-essential, bin86, fakeroot, kernel-package): è possibile farlo singolarmente mediante l’Ubuntu Software Center o tutti insieme eseguendo da terminale il seguente comando:

sudo apt-get install build-essential bin86 fakeroot kernel-package

4. Configurazione grafica del kernel. Per gestire la configurazione del kernel è possibile ricorrere ad un’applicazione dotata di interfaccia grafica installando il pacchetto libglade2-dev, mediante l’Ubuntu Software Center o direttamente da terminale:

sudo apt-get install libglade2-dev

5. Aggiungere l’utente al gruppo src. Le linee guida Debian per l’installazione del kernel suggeriscono di conservarne i sorgenti nella cartella /usr/src, il cui gruppo proprietario è src. Per poter procedere è necessario aggiungere l’utente a tale gruppo, eseguendo da terminale il comando:

sudo adduser {nomeutente} src

che nel mio caso diventa

sudo adduser nicola src

Se tutto avviene correttamente verrà visualizzato qualcosa di simile a:

Aggiunta dell'utente «nicola» al gruppo «src» ...
Aggiunta dell'utente nicola al gruppo src
Fatto.

Per rendere effettive tutte le modifiche riavviare il sistema.

6. Abilitare i permessi in scrittura su /usr/src. Al termine della fase di compilazione vengono generati dei file di installazione, salvati nella cartella /usr/src. Per non trovarsi a fallire sul più bello, è bene essere sicuri di disporre di tali permessi, eseguendo da terminale il comando:

sudo chmod -R g+wr /usr/src

2. Recuperare i sorgenti

The Linux Kernel ArchivesA questo punto possiamo scaricare l’archivio dei sorgenti del kernel dal sito ufficiale. Come si vede nell’immagine a fianco l’ultima versione stabile (nel nostro caso, 3.10) corrisponde alla prima riga della tabella, iniziante con mainline. Fate quindi clic sul collegamento tar.xf (come evidenziato nell’immagine) – o sul riquadro giallo appena sopra – e salvate l’archivio sul disco.

A questo punto occorre estrarre i sorgenti nella cartella /usr/src: per prima cosa spostate l’archivio nella vostra cartella home quindi eseguite da terminale i seguenti comandi (anche se il terminale non sembra dare segnali di vita dopo l’esecuzione del primo comando, siate pazienti):

tar -xf linux-3.10.tar.xz
sudo mv linux-3.10 /usr/src/

Ecco in uno screenshot il risultato:

Copia dei sorgenti del kernel in /usr/src

3. Configurare il kernel

La configurazione del kernel rappresenta il passaggio più delicato, poiché serve ad indicare quali moduli debbano essere caricati in funzione della configurazione (componenti hardware in primis) del proprio computer. Tale specificità rende questa fase della procedura differente da un utente all’altro, così come ciascun PC è diverso dall’altro; un solo errore in questa fase (modulo mancante o errato) può compromettere il funzionamento del sistema.

Configurazione manuale. Volendo partire da zero occorrerebbe armarsi di molta pazienza e identificare ogni singolo componente della propria macchina, individuare i moduli richiesti per il suo funzionamento e provvedere ad aggiungerli alla configurazione: in questo caso un buon punto di partenza è rappresentato dal comando lshw, che consente di ottenere informazioni dettagliate riguardo la configurazione del proprio hardware.

Configurazione automatica. Nel mio caso ho deciso di partire da fondamenta solide, riutilizzando un file di configurazione esistente e adattandolo alle esigenze del caso: si tratta di una strada decisamente più sicura, soprattutto per utenti (incluso il sottoscritto) alla presa per le prime volte con l’installazione manuale del kernel.

Lo svantaggio è rappresentato dal fatto che alcuni dispositivi (schede video nVidia o ATI e schede wireless, in particolare) richiedono una configurazione manuale per includere i moduli necessari al loro corretto funzionamento (nel mio caso non è stata riconosciuta la scheda wireless). Confrontando l’output del comando lshw con versioni diverse del kernel si possono d’altro canto individuare i dispositivi non correttamente riconosciuti o configurati. Considerata la vastità e complessità dell’argomento, spero di dedicarci un post successivo.

Qualsiasi strada scegliate, per prima cosa occorre spostarci da terminale all’interno della cartella contenente i sorgenti del kernel, eseguendo il comando:

cd /usr/src/linux-3.10/

Importazione del file di configurazione (rapida). A questo punto esistono (almeno) due modi per importare la configurazione esistente, il più semplice dei quali consiste nel tornare al terminale e – assicurandosi di trovarsi nella cartella /usr/src/linux-3.10/ – lanciare il comando:

make oldconfig

In un colpo solo avete importato il file di configurazione del kernel attualmente in uso (probabilmente il più recente tra quelli installati) e potete passare direttamente alla compilazione.

Importazione del file di configurazione (estesa).Se invece volete importare un file di configurazione particolare, apportare modifiche aggiuntive o semplicemente conoscere meglio le opzioni di configurazione disponibili vi consiglio di lanciare quest’altro comando:

make gconfig

Configurazione grafica del kernelNella finestra dell’applicazione apertasi (v.immagine a fianco) potete modificare la vostra configurazione in modo (relativamente) semplice: selezionando un’opzione di configurazione potete consultare in basso la relativa descrizione (ove disponibile). In questo modo potete studiare il significato di ciascuna opzione ed effettuare le modifiche desiderate.

Dal momento che tali modifiche non vengono salvate automaticamente, potete effettuare prove ed esperimenti senza timore: per annullare le modifiche è sufficiente chiudere la finestra senza salvare la configurazione (v. immagine sottostante).

Annullare le modifiche alla configurazione

Per importare un file di configurazione sono richiesti pochi e semplici passi:
Importazione di un fle di configurazione esistente

  1. fate clic su Load nella barra degli strumenti dell’applicazione: si aprirà una finestra per la selezione dei file, che mostra il contenuto della cartella con i sorgenti del kernel;
  2. spostatevi nella cartella boot/ (per fare in fretta, selezionate dal menu a discesa in alto la voce / e quindi fate doppio clic sulla cartella boot/ nel riquadro di sinistra);
  3. dal riquadro a destra selezionate un file di configurazione – tra quelli che iniziano per config, nel mio caso config-3.5.0-34-generic;
  4. fate clic su OK.
  5. nella barra degli strumenti della finestra principale fate clic su Save.

Ora, se volete, potete apportare eventuali modifiche aggiuntive alla configurazione: una volta soddisfatti, salvate tutto e procediamo con la compilazione.

4. Compilare il kernel

La compilazione del kernel richiede l’esecuzione da terminale di un comando simile a questo:

sudo make-kpkg --append-to-version -nicola --initrd --jobs 8 --rootcmd fakeroot kernel_image kernel_headers modules_image

Il comando effettivamente eseguito varia leggermente da caso a caso: sebbene possa apparire a prima vista complesso, in realtà è abbastanza intuitivo una volta compreso il significato delle varie opzioni, di cui mi appresto a dissezionare significato e scopo, indicando ad esempio se siano obbligatorie o richiedano argomenti. Alla fine vedrete come sarà facile arrivare a definire il vostro comando personalizzato. Per approfondire le informazioni fornite di seguito, un ottimo punto di partenza è il manuale del comando, consultabile eseguendo da terminale:

man make-kpkg

Tanto per cominciare il comando da eseguire è il seguente (che sorpresa!):

make-kpkg

e permette di ottenere – a partire dai sorgenti scaricati – i file di installazione (in formato .deb) del kernel, che ci serviranno nell’ultima fase.

append-to-version {stringa}. L’opzione --append-to-version consente di aggiungere una stringa specifica come suffisso al nome del kernel (subito dopo il numero di versione), per distinguerlo dalle versioni fornite a corredo di Ubuntu, caratterizzate dal suffisso generic. La stringa, che a tutti gli effetti diventa parte integrante del numero di versione, può contenere solo lettere minuscole, trattini (‘-‘), tilde (‘~’), punti (‘.’) e caratteri di somma (‘+’). Nel mio caso ho scelto il mio nome, rigorosamente in minuscolo, preceduto da un trattino (in modo da separarlo visivamente dal numero di versione).

sudo make-kpkg --append-to-version -nicola

Sebbene non obbligatoria, si tratta di un’opzione indubbiamente utile 1) per distinguere i kernel compilati manualmente da quelli forniti da Ubuntu, 2) ma soprattutto per conferire al nostro un tocco decisamente “personale”.

initrd. Opzione necessaria senza alcun argomento aggiuntivo, risulta importante in fase di avvio per effettuare delle operazioni legate al boot del sistema.

jobs {numero}. La compilazione del kernel può richiedere un tempo considerevole per essere portata a termine (ca. 1 ora) e questa opzione ci viene in soccorso permettendo di suddividere il carico di lavoro tra i vari core del vostro processore. L’argomento {numero} rappresenta il numero di unità di lavoro (eseguite contemporaneamente) in cui si vuole suddividere l’intero carico: dal momento che ogni core può gestire un’unità di lavoro, un buon compromesso si ottiene creando tante unità di lavoro quanti sono i core del processore (se volete continuare ad usare il computer durante la compilazione, riducete il valore in modo da riservarvi un paio di core liberi).

Numero di core | Monito di sistemaPer scoprire il numero di core disponibili, potete avviare il Monitor di sistema e – aprendo la scheda Risorse – visualizzare il loro numero in alto: come evidenzia la figura, nel mio caso ho 8 core (4 fisici con HyperThreading: CPU1, CPU2, …, CPU8)

sudo make-kpkg --append-to-version -nicola --initrd --jobs 8

rootcmd fakeroot. L’opzione --rootcmd (accompagnata dall’argomento fakeroot) emula un ambiente di esecuzione dotato dei privilegi necessari a portare a termine la compilazione. Nulla di più.

target. Gli altri argomenti del comando (kernel_image, kernel_headers, modules_image) indicano il prodotto desiderato della compilazione: nel nostro caso siamo interessati ai file di installazione (kernel_image), inclusi i moduli collegati (modules_image), e ai sorgenti (kernel_headers) in formato .deb.

A questo punto dovreste aver ottenuto un comando simile a quello di partenza. Non vi resta che eseguirlo da terminale:

sudo make-kpkg --append-to-version -nicola --initrd --jobs 8 --rootcmd fakeroot kernel_image kernel_headers modules_image

Ora potete tranquillamente andare a farvi un giro all’aria aperta o bere qualcosa.

5. Installare il kernel

File di installazione del kernelBene, avete terminato la fase di compilazione ed è giunto (finalmente) il momento di installare il kernel. Per prima cosa avviate il gestore file Nautilus e aprite la cartella /usr/src/, al cui interno dovreste trovare due file in formato .deb, i cui nomi iniziano rispettivamente per:

  • linux-headers-3.10.0
  • linux-image-3.10.0

Se tutto è andato per il verso giusto (e non c’è ragione di credere altrimenti) non vi resta che lanciare da terminale i seguenti comandi, sostituendo a versione la stringa appropriata (con l’auto completamento è un gioco da ragazzi):

cd /usr/src
sudo dpkg -i linux-image-versione.deb
sudo dpkg -i linux-headers-versione.deb

Al termine della procedura non vi resta che riavviare il PC. Per verificare che il kernel utilizzato sia effettivamente quello appena installato è sufficiente eseguire il seguente comando da terminale:

uname -r

che dovrebbe restituire qualcosa di simile a:

3.10.0-nicola

Siete finalmente giunti all’epilogo (lieto, mi auguro, altrimenti continuate a leggere). Per qualsiasi domanda, integrazione o altro vi esorto ad intervenire attraverso i commenti.

A. Il kernel non funziona… Che fare?

Avete fatto qualche esperimento di troppo con la configurazione? O avete seguito la procedura ma qualcosa è comunque andato storto? Nessun problema.

Riavviate (manualmente, se necessario) il computer, selezionate dal menu GRUB (se non appare, tenete premuto il pulsante Shift all’avvio del computer) la voce Opzioni avanzate per Ubuntu e premete Invio dalla tastiera: viene visualizzato l’elenco dei kernel installati, tra cui potete sceglierne uno qualsiasi (il più recente, ad esempio) con suffisso generic.

A questo punto il sistema si avvia normalmente e potete procedere con calma alla disinstallazione del “vostro” kernel. Per prima cosa installate il gestore pacchetti Synaptic mediante l’Ubuntu Software Center o eseguendo da terminale il comando:

sudo apt-get install synaptic

Al termine dell’installazione, lanciate l’applicazione per la gestione dei pacchetti: nella finestra fate clic sul pulsante Origine in basso sinistra, quindi su Locale nell’area sovrastante. A destra compare la lista dei pacchetti installati manualmente, tra cui due i cui nomi iniziano per:

  • linux-headers-3.10.0
  • linux-image-3.10.0

Selezionateli entrambi, fate clic con il tasto destro del mouse e selezionate Rimuovi completamente. A questo punto fate clic su Applica nella barra degli strumenti e confermate nella finestra che appare.

Non vi resta che riavviare il sistema e verificare che tutto funzioni a dovere; per averne la certezza eseguite nuovamente da terminale il seguente comando:

uname -r

B. Fonti online

Lascia un commento