Guida alla configurazione del kernel Linux in Gentoo
1.
Introduzione
Gentoo fornisce due modi per gestire l'installazione e l'aggiornamento del
kernel: automatica (genkernel), e manuale. Sebbene il metodo
automatico sia un approccio più facile per l'utente, ci sono vari motivi
per i quali una vasta fetta di utenti Gentoo sceglie di configurare manualmente
il proprio kernel: maggiore flessibilità, kernel di dimensioni minori, tempi di
compilazione più brevi, acquisizione di esperienza, tempo da perdere, ecc.
Questa guida non copre il metodo automatico (genkernel). Se si preferisce usare
genkernel per compilare ed installare il proprio kernel, si faccia riferimento
alla documentazione di Genkernel.
Questa guida non ha lo scopo di documentare il processo di configurazione
manuale dall'inizio alla fine: il processo di configurazione fa affidamento ad
una buona dose di buonsenso, e ad un livello relativamente alto di conoscenza
tecnica riguardo al sistema. Questo documento, invece, introdurrà i concetti di
una configurazione manuale, elencando in modo dettagliato le trappole più comuni
nelle quali incappano gli utenti.
Questo documento è stato scritto basandosi sui kernel più recenti, per le
architetture di computer più comuni. Qualche dettaglio potrebbe differire per i
kernel più vecchi o architetture più esotiche, comunque gran parte dei
contenuti rimarranno pertinenti.
A questo punto si suppone di avere già scompattato i sorgenti del kernel nel
proprio disco fisso (solitamente da qualche parte in /usr/src/linux), e
si presume la conoscenza su come accedere allo strumento di configurazione
menuconfig e su come muoversi nel menù di sistema. Se non si è ancora a
questo livello di esperienza, sono disponibili altre utili guide a riguardo.
2.
Nozioni di configurazione
Le basi
Il processo in generale è alquanto semplice: verrà mostrata una serie di
opzioni, categorizzate in menù individuali e sottomenù, e si dovrà selezionare
il supporto all'hardware e alle funzionalità del kernel attinenti al proprio
sistema.
Il kernel include una configurazione predefinita, che viene proposta la
prima volta che si esegue menuconfig in una particolare serie di sorgenti. Le
opzioni predefinite sono generalmente essenziali e ragionevoli, per cui la
maggioranza degli utenti dovranno apportare solamente poche modifiche alla
configurazione di base. Se si decide di disabilitare un'opzione abilitata in
modo predefinito, ci si assicuri di avere ben chiaro a cosa serve e le
conseguenze della sua disabilitazione.
Se si sta configurando il kernel Linux per la prima volta, è consigliabile
avere un approccio prudenziale: non si dev'essere troppo avventati, ed è meglio
cercare di apportare il minor numero possibile di modifiche alla configurazione
predefinita. Nello stesso tempo si tenga presente che sarà necessario adattare
certe parti della configurazione alle caratteristiche del proprio sistema per
permettere allo stesso di avviarsi!
Built-in o modulare
Molte opzioni di configurazione sono a tre stati: possono non essere
assolutamente compilate, integrate (built-in) nel kernel (Y), o compilate come
modulo (M). I moduli sono memorizzati esternamente nel filesystem, mentre gli
oggetti built-in sono compilati direttamente all'interno dell'immagine stessa
del kernel.
C'è un'importante differenza tra la compilazione nel kernel e quella modulare:
tranne qualche eccezione, il kernel non effettua nessun tentativo di caricamento
dei moduli all'occorrenza (l'operazione viene demandata all'utente). Mentre
certe parti del sistema possono avere strumenti di caricamento su richiesta, e
sono disponibili delle utilità per il caricamento dei moduli, è raccomandabile
compilare il supporto hardware e alle funzionalità del kernel direttamente
all'interno dello stesso. Ciò assicura che i supporti all'hardware e alle
funzionalità saranno sempre disponibili quando se ne avrà bisogno.
Ovviamente in certe parti della configurazione la scelta dell'integrazione nel
kernel è un requisito assolutamente necessario. Per esempio, se la propria
partizione di root è su un filesystem ext2, il sistema non si avvierà se
il supporto a ext2 è stato compilato come modulo (il sistema cercherà il modulo
ext2 nella partizione di root, ma non ci riuscirà a meno che il supporto a ext2
non sia già stato caricato!).
Supporto Hardware
Oltre a rilevare il tipo di architettura del proprio sistema, lo
strumento di configurazione non effettuerà nessun tentativo per identificare
l'hardware attualmente presente nella macchina. Sebbene ci siano già delle
configurazioni preimpostate per il supporto a diverso hardware, probabilmente
sarà necessario individuare e selezionare le opzioni appropriate per la propria
configurazione hardware.
Ovviamente questo comporta una conoscenza dei componenti interni e di quelli
collegati al proprio computer, o comunque l'identificazione degli stessi. Per
molti componenti interni, si dovrà identificare il chipset utilizzato da
ognuno, piuttosto che il nome del produttore.
Sono disponibili degli strumenti che possono aiutare in questo processo di
riconoscimento. lspci (contenuto nel pacchetto sys-apps/pciutils)
identificherà l'hardware basato su PCI e AGP, inclusi i componenti integrati
nella scheda madre stessa. lsusb (contenuto nel pacchetto
sys-apps/usbutils) identificherà i dispositivi connessi alle porte USB.
La situazione è alquanto confusa poiche il mondo dell'hardware non è
propriamente standardizzato. Se la propria configurazione hardware non si
discosta molto da quelle più comuni, molto probabilmente il proprio hard disk
IDE funzionerà da subito, come il mouse PS/2 o la tastiera o il mouse USB. Si
avrà inoltre un supporto grafico VGA di base. Tuttavia alcuni dispositivi, tipo
le adattatori ethernet, raramente usano componenti hardware standard, per cui
sarà necessario identificare il chipset della propria scheda e abilitare il
relativo supporto, al fine di avere una connessione alla rete disponibile.
Inoltre, mentre alcune cose funzioneranno regolarmente con le impostazioni
predefinite, si dovranno selezionare ulteriori opzioni per sfruttare tutte
le potenzialità dal proprio sistema. Per esempio, se non si abilita il supporto
per il giusto chipset IDE, il proprio disco fisso IDE funzionerà molto
lentamente.
Funzionalità del kernel
Come per il supporto hardware, bisogna decidere quali funzionalità offerte dal
kernel sono necessariamente da abilitare. Un esempio importante riguarda il
supporto ai filesystem: si deve selezionare il supporto ai filesystem in uso nel
proprio disco fisso, e probabilmente anche a quelli in uso su supporti
rimovibili (es. VFAT su flash disk USB).
Un'altro esempio comune sono le funzionalità avanzate di rete. Se si vuole
utilizzare qualche tipo di routing o firewalling, ci si assicuri che le voci di
configurazione pertinenti siano incluse nella configurazione del kernel.
Pronti?
Ora che sono stati introdotti i concetti, si hanno gli strumenti per cominciare
ad identificare il proprio hardware e navigare nel menù di configurazione,
selezionando le opzioni del kernel necessarie per il proprio sistema.
Il resto di questo documento mira a chiarire gli aspetti che generalmente
possono creare confusione, e dare dei suggerimenti onde evitare i problemi più
comuni nei quali gli utenti incorrono spesso. Buona fortuna!
3.
Problemi comuni e aree di confusione
I dischi SATA sono SCSI
Gran parte dei sistemi desktop moderni sono forniti di dispositivi di
memorizzazione di massa (dischi fissi e drive CD/DVD) su bus Serial ATA piuttosto che sul
vecchio bus di tipo IDE (cavo piatto).
Il supporto SATA in Linux è implementato in uno strato definito libata,
posizionato al di sotto del sottosistema SCSI. Per questa ragione, i driver SATA
si trovano nella sezione della configurazione relativa ai driver SCSI. Siccome
i dispositivi di archiviazione verranno trattati come dispositivi SCSI, è
implicitamente richiesto anche il supporto ai dischi/cdrom SCSI. Il proprio
disco SCSI verrà chiamato (es.) /dev/sda e il proprio drive CD/DVD SATA
verrà chiamato (es.) /dev/sr0.
Sebbene la maggioranza di questi driver sia per i controller SATA, libata non è
stato progettato specificatamente per SATA. Tutti i principali driver IDE
verranno portati su libata nel prossimo futuro, e a quel punto le
considerazioni fatte in precedenza saranno valide anche per tutti gli
utilizzatori di dischi IDE.
Codice 3.1: Opzioni di configurazione per libata |
Device Drivers --->
SCSI device support --->
<*> SCSI device support
<*> SCSI disk support
<*> SCSI CDROM support
SCSI low-level drivers --->
<*> Serial ATA (SATA) support
|
Chipset IDE e DMA
Malgrado l'introduzione di SATA, i dispositivi IDE sono ancora molto comuni e
utilizzati da molte persone. IDE è una tecnologia abbastanza generica, per cui
Linux supporta nativamente pressochè tutti i controller IDE, senza dover
selezionare alcuna opzione specifica.
Tuttavia IDE è una tecnologia vecchia, e la sua incarnazione originale del
Programmed Input/Output (PIO - "Input/Output Programmato") - non riesce a
fornire le velocità di trasferimento necessarie per un accesso veloce ai moderni
dispositivi di memorizzazione. Il driver IDE generico si limita a queste
modalità di trasferimento PIO, che causano velocità di trasferimento dati
bassissime ed un uso elevato della CPU durante il trasferimento dei dati da/sul
disco.
A meno che non si abbia a che fare con sistemi precedenti al 1995, il proprio
controller IDE supporterà anche un metodo di trasferimento alternativo,
denominato Direct Memory Access (DMA - "Accesso Diretto alla Memoria").
DMA è molto più veloce, e l'utilizzo della CPU è scarsamente influenzato mentre
vengono effettuati dei trasferimento di dati. Se si stanno riscontrando delle
prestazioni del sistema veramente scarse e si sta usando un disco IDE, molto
probabilmente la modalità DMA non viene utilizzata.
Nota:
Come menzionato in precedenza, libata è disponibile anche per i dischi IDE. Se
si sta utilizzando libata, tutti i propri dischi, inclusi quelli IDE, useranno
DMA. Non c'è bisogno di nessuna ulteriore verifica o configurazione.
|
Se non si sta usando libata per i propri dischi IDE, allora bisognerà verificare
l'utilizzo del DMA ed eventualmente abilitarlo.
Codice 3.2: Verificare se DMA è abilitato per il proprio disco IDE |
# hdparm -d /dev/hda
/dev/hda:
using_dma = 0 (off)
|
Per abilitare il DMA per il proprio dispositivo IDE, si dovrà semplicemente
abilitare l'opzione di configurazione per il proprio controller IDE.
Codice 3.3: Opzioni di configurazione per i controller IDE |
Device Drivers --->
ATA/ATAPI/MFM/RLL support --->
<*> ATA/ATAPI/MFM/RLL support
<*> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
[*] PCI IDE chipset support
|
Controller Host USB
USB è un bus ampiamente
utilizzato per connettere periferiche esterne al computer. Uno dei motivi del
successo di USB è il suo protocollo unificato, sebbene i dispositivi denominati
host controller devices (HCD) che vengono implementati nei computer
possano contenere delle lievi variazioni. Le tipologie principali sono 3:
-
UHCI "Universal Host Controller Interface". Supporta USB 1.1, e
solitamente si trova nelle schede madri basate su chipset VIA o Intel.
-
OHCI "Open Host Controller Interface". Supporta USB 1.1 e solitamente
si trova nelle schede madri basate su chipset Nvidia o SiS.
-
EHCI "Extended Host Controller Interface". È l'unico controller host
comune che supporta USB 2.0, e tipicamente si trova in ogni computer che
supporta USB 2.0.
Molti sistemi vengono forniti con due delle tipologie di interfacce
sopraelencate: EHCI (USB 2.0) e una tra UHCI e OHCI (USB 1.1). È importante che
vengano selezionate entrambe le tipologie presenti nel proprio sistema. Mentre
tutti i dispositivi USB 2.0 sono retrocompatibili con USB 1.1, una larga fetta
dei dispositivi USB (anche quelli venduti al giorno d'oggi) sono basati su
un'interfaccia USB 1.1 - perchè un mouse USB dovrebbe necessitare di più di
1,5mbit/sec?
Se non si selezionano le opzioni pertinenti per i tipi di HCD USB presenti nel
proprio sistema, si potrebbero riscontrare problemi di porte USB 'morte': si
inserisce un dispositivo, ma esso non viene alimentato o non risponde in alcun
modo.
Un abile trucchetto con lspci (contenuto nel pacchetto
sys-apps/pciutils) rende relativamente facile identificare quali HCD
sono presenti nel proprio sistema. Ignorando i controller FireWire, inclusi
anch'essi nell'identificazione, è semplice capire che il seguente sistema
richiede il supporto a OHCI e EHCI:
Codice 3.4: Usare lspci per individuare i tipi di HCD |
# lspci -v | grep HCI
00:02.0 USB Controller: nVidia Corporation CK804 USB Controller (rev a2) (prog-if 10 [OHCI])
00:02.1 USB Controller: nVidia Corporation CK804 USB Controller (rev a3) (prog-if 20 [EHCI])
01:0b.0 FireWire (IEEE 1394): Agere Systems FW323 (rev 61) (prog-if 10 [OHCI])
|
Codice 3.5: Configurazione per gli HCD USB |
Device Drivers --->
USB support --->
<*> Support for Host-side USB
--- USB Host Controller Drivers
<*> EHCI HCD (USB 2.0) support
<*> OHCI HCD support
<*> UHCI HCD (most Intel and VIA) support
|
Sistemi Multiprocessore, Hyper-Threading e Dual Core
Molti computer sono basati su più processori, a volte in modi non immediatamente
evidenti.
-
Diverse CPU Intel supportano una tecnologia chiamata hyper-threading,
nella quale la CPU viene vista dal sistema come due processori
logici.
-
Alcune delle più recenti CPU Intel/AMD attualmente sono composte da più
processori fisici inclusi in un singolo involucro, e vengono definiti
processori dual
core.
-
Qualche computer di alto livello ha diversi processori fisici installati
in speciali schede madri per fornire un incremento significativo delle
prestazioni rispetto ad un sistema uniprocessore. Probabilmente si
saprà se si dispone di un sistema di questo tipo, in quanto ha costi non
propriamente economici.
In ogni caso si deve selezionare l'appropriata opzione del kernel per ottenere
prestazioni ottimali da queste configurazioni.
Codice 3.6: Configurazione per sistemi multi-processore |
Processor type and features --->
[*] Symmetric multi-processing support
[*] SMT (Hyperthreading) scheduler support
[*] Multi-core scheduler support (NEW)
Power management and ACPI options --->
[*] ACPI (Advanced Configuration and Power Interface) Support
|
Supporto High Memory x86
A causa delle limitazioni nello spazio d'indirizzamento a 32bit delle
architetture x86, un kernel con una configurazione standard può solamente
supportare fino a 896mb di RAM. Se il proprio sistema ha più memoria, solo i
primi 896mb saranno visibili, a meno di non abilitare il supporto all'high
memory.
Nota:
Questa limitazione è specifica delle architetture x86 (IA32). Altre architetture
supportano nativamente grandi quantità di memoria, senza nessuna modifica alla
configurazione.
|
Il supporto all'high memory non è abilitato in modo predefinito, poiche esso
introduce un leggero aumento di carico sul sistema. Non ci si deve lasciare
fuorviare da ciò, l'aumento di carico è insignificante se comparato
all'incremento di prestazioni dovuto alla quantità maggiore di memoria
disponibile!
Codice 3.7: Abilitare il supporto all'high memory su x86 |
Processor type and features --->
High Memory Support --->
(X) 4GB
( ) 64GB
|
4.
Nota sulla stenografia della configurazione del Kernel
Introduzione
Quando si legge riguardo alle configurazioni del kernel, spesso si
vedono impostazioni descritte come CONFIG_<qualcosa>.
Questa notazione stenografata è quella che il kernel utilizza internamente,
ed è ciò che si troverà nel file di configurazione del kernel (sia esso
/usr/src/linux/.config o nel caso autogenerato
/proc/config.gz). Ovviamente utilizzare una notazione
stenografata non sarebbe di molto utile se non si può tradurre questa
nella reale locazione nella configurazione del kernel. Fortunatamente
lo strumento make menuconfig permette di fare proprio questo.
Tradurre CONFIG_FOO nella reale locazione nella configurazione
Si supponga di dover abilitare CONFIG_TMPFS_XATTR, lanciare il menù
di configurazione del kernel (make menuconfig) e digitare /.
Questo aprirà il box di ricerca. In questo box di ricerca digitare
CONFIG_TMPFS_XATTR (si può anche evitare CONFIG_).
Il seguente listato di codice mostra il risultato di questa ricerca.
Codice 4.1: Risultato della ricerca di CONFIG_TMPFS_XATTR |
Symbol: TMPFS_XATTR [=n]
Type : boolean
Prompt: Tmpfs extended attributes
Defined at fs/Kconfig:138
Depends on: TMPFS [=y]
Location:
-> File systems
-> Pseudo filesystems
-> Virtual memory file system support (former shm fs) (TMPFS [=y])
Selected by: TMPFS_POSIX_ACL [=n] && TMPFS [=y]
|
Questo output contiene molte informazioni interessanti.
| Voce |
Descrizione |
| Symbol: TMPFS_XATTR [=n] |
Questo identifica la voce che si sta cercando nella configurazione
del kernel. Informa anche che l'impostazione attualmente
non è abilitata ([=n]).
|
| Type: boolean |
L'impostazione ricercata è di tipo booleano (significa cioè che può
essere abilitata o disabilitata). Alcune impostazioni sono numeri
o stringhe.
|
| Prompt: Tmpfs extended attributes |
Questo è il testo che si trova in make menuconfig e
simili, è la voce che si sta cercando in un formato più
umanamente leggibile.
|
| Depends on: TMPFS [=y] |
Prima che questa opzione sia visibile è necessario avere CONFIG_TMPFS
abilitata. In questo caso è già a posto (si noti [=y]), ma nel caso non
lo fosse è necessario prima cercare (e abilitare) CONFIG_TMPFS.
|
| Location: ... |
Questa è la locazione nella struttura di make menuconfig in cui
si trovano le impostazioni. L'opzione che si sta cercando è
Tmpfs extended attributes.
|
| Selected by: TMPFS_POSIX_ACL [=n] && TMPFS [=y] |
Se le opzioni descritte qui sono entrambe abilitate (in questo caso
la prima non lo è), CONFIG_TMPFS_XATTR sarà automaticamente
abilitato e non sarà possibile disabilitarlo.
|
Con queste informazioni si dovrebbe essere in grado di tradurre facilmente
qualsiasi CONFIG_* richiesto. In breve:
- è necessario abilitare le impostazioni descritte nel campo Depends on
- spostarsi dove si viene indirizzati da Location:
- abilitare il valore riportato da Prompt:
5.
Ulteriore documentazione sulla configurazione del kernel
Finora si è discusso riguardo a concetti generici e problemi specifici riguardo
alla configurazione del kernel, senza scendere nei dettagli (si lascia al
lettore il compito di farlo!). Tuttavia, altre parti della raccolta di
documentazione su Gentoo forniscono informazioni più particolareggiate riguardo
alle questioni affrontate in precedenza.
Questi documenti potranno risultare utili durante la configurazione di aspetti
specifici, ma se si è nuovi alla configurazione del kernel si raccomanda di non
essere troppo avventurosi. È consigliabile iniziare con la preparazione di un
sistema di base funzionante, si potrà sempre tornare sui propri passi e
aggiungere il supporto all'audio, stampa, ecc.
-
La Guida su ALSA fornisce i
dettagli delle opzioni di configurazione richieste per il supporto alle
schede audio. È da notare che ALSA è un'eccezione rispetto alla modalità
suggerita di compilazione built-in degli oggetti; ALSA attualmente è molto
più facile da configurare se i componenti sono modulari.
-
La Guida Gentoo Linux al
Bluetooth fornisce i dettagli sulle opzioni necessarie per usare i
dispositivi bluetooth nel proprio sistema.
-
La Guida Router IPV6 spiega come
configurare il proprio kernel per il routing usando il protocollo di
indirizzamento di rete di nuova generazione.
-
Se si utilizzano i driver grafici proprietari di nVidia per migliorare le
prestazioni grafiche 3D, la Guida
nVidia per Gentoo Linux elenca quali opzioni bisognerebbe e non
bisognerebbe selezionare su tali sistemi.
-
Tra le altre cose, la Guida alla Gestione
Energetica spiega come configurare il proprio kernel per lo scaling
della frequenza della CPU, e per le funzionalità di ibernazione e
sospensione.
-
Se si sta utilizzando un sistema PowerPC, le risposte a domande frequenti su Gentoo
Linux/PowerPC contengono qualche sezione riguardante la configurazione
del kernel.
-
La Guida alla stampa in Gentoo
elenca le opzioni del kernel necessarie per il supporto alla stampa in
Linux.
-
La guida USB e Gentoo Linux
fornisce i dettagli della configurazione richiesta per usare i dispositivi
USB più comuni, come mouse/tastiere, supporti di archiviazione e stampanti.
6.
Risoluzione dei problemi
Le modifiche alla configurazione non hanno effetto
È molto comune per gli utenti effettuare una modifica alla configurazione, ma
poi fare un piccolo errore nei passaggi successivi. Il sistema viene riavviato
con un'immagine del kernel che non è quella appena riconfigurata, viene
verificato che il problema che si cercava di risolvere persiste, e si conclude
che la modifica alla configurazione non risolve il problema.
Il processo di compilazione e installazione del kernel esula dagli scopi di
questo documento, per le linee guida si faccia riferimento alla guida Upgrade del kernel Gentoo Linux. In
breve, le operazioni sono: configurare, compilare, montare /boot (se non è già
montata), sovrascrivere l'immagine del kernel con quella nuova, riavviare. Se
si omette una qualsiasi di queste operazioni conclusive, le modifiche non
avranno effetto!
È possibile verificare se il kernel con il quale si ha avviato il sistema
combacia con quello compilato nel proprio disco fisso esaminando la data e
l'ora di compilazione. Presupponendo che la propria architettura sia x86 e i
sorgenti del kernel siano installati in /usr/src/linux:
Codice 6.1: Verificare se si ha avviato il sistema con il kernel modificato |
# uname -v
#4 SMP PREEMPT Sat Jul 15 08:49:26 BST 2006
# ls -l /usr/src/linux/arch/i386/boot/bzImage
-rw-r--r-- 1 dsd users 1504118 Jul 15 08:49 /usr/src/linux/arch/i386/boot/bzImage
|
Se i due orari visualizzati dai precedenti comandi differiscono per più di 2
minuti, vuol dire che è stato commesso un errore durante la reinstallazione del
kernel e non si sta eseguendo l'immagine del kernel desiderata!
I moduli non vengono caricati automaticamente
Come menzionato precedentemente in questo documento, selezionare un componente
del kernel come modulo (M) piuttosto che built-in (Y) influenza enormemente il
comportamento del kernel. Vale la pena ripeterlo, poichè molti utenti cadono in
questa trappola.
Quando si seleziona un componente come built-in, il codice viene compilato
nell'immagine del kernel (bzImage). Quando il kernel ha bisogno di usare quel
componente, può inizializzarlo e caricarlo automaticamente, senza nessun
intervento da parte dell'utente.
Quando si seleziona un componente come modulo, il codice viene compilato in un
file e installato nel filesystem. Generalmente, quando il kernel ha bisogno di
usare quel componente, non ci riesce! Con qualche eccezione, il kernel non fa
nessun tentativo di caricare questi moduli, lasciando il compito all'utente
Per cui, se si ha compilato il supporto alla propria scheda di rete come
modulo, e non si riesce ad accedere alla rete, la probabile causa è che il
modulo non è caricato, perciò si dovrà caricarlo manualmente o configurare il
sistema per farlo caricare in automatico durante l'avvio.
A meno che non si abbiano precisi motivi per fare diversamente, si risparmia un
bel po' di tempo compilando questi componenti direttamente nell'immagine del
kernel, per permettere al kernel stesso di impostarli automaticamente per
l'utente.
I contenuti di questo documento sono rilasciati sotto la licenza Creative
Commons - Attribution / Share Alike.
|