Author Topic: Guida alla compilazione del kernel di Linux  (Read 14556 times)

0 Members and 1 Guest are viewing this topic.

Offline MsZ

  • Il Manutentore
  • Militante
  • ******
  • Posts: 913
  • GNUru Meditation
Guida alla compilazione del kernel di Linux
« on: Sun 10 June 2007, 17:29 »
Il kernel di Linux
Breve guida alla compilazione

Prima parte

Nota
---------------------------------------------------------------------------------------------------------------------------------------------------------
Questa non vuole essere una guida definitiva su come si compila il kernel. E' solo una 'traccia' che è possibile seguire per compilare il kernel al meglio, un gruppo di indicazioni che possono tornare utili per questo complesso e delicato procedimento.
Desidero inoltre precisare che una scorretta compilazione o configurazione del kernel può portare ad un sistema non bootabile. Perciò consiglio caldamente di fare una copia di backup del kernel precedente per poterlo poi riportare in funzione senza troppi problemi. Io stesso comtinuo a fare copie di backup. Non si sa mai.


Il seguente procedimento è indicato per distribuzioni "semplici" quali Slackware, Mandrake, Fedora o RedHat. Per una distribuzione come Debian o le sue derivate (Ubuntu, Kubuntu, Xubuntu, Ebuntu, Edubuntu, Knoppik, Corel Linux, ed altre più o meno conosciute) rimando alla lettura del post "Compilazione ed Installazione in Debian e derivate".
Il procedimento fondamentale è descritto nel dettaglio nella prima e nella seconda parte, e generalmente è comune a tutte le distro.

||--->Per informazioni generali sulla compilazione riferitevi al thread "Che cos'è la compilazione? Come si compila?" in questa Sezione.<---||
---------------------------------------------------------------------------------------------------------------------------------------------------------

In un sistema operativo GNU/Linux è sempre possibile compilare un programma da sorgenti, quando siano essi resi disponibili agli utenti. Questo vale anche per la parte più importante del sistema operativo stesso, ovvero il kernel.
Linux è compilabile.
Scaricando i sorgenti dal sito http://www.kernel.org chiunque può tentare di ricostruire in casa un kernel ottimizzato per la propria macchina e per le proprie esigenze.
Gli indirizzi precisi sono questi:
ftp://ftp.kernel.org/pub/linux/kernel/v2.6
http://www.kernel.org/pub/linux/kernel/v2.6

Prenderemo in considerazione solo l'ultima versione stabile, la 2.6, con tutte le sottoversioni generiche.
Nella configurazione le sottoversioni differiscono leggermente per la quantità e la disponibilità delle opzioni, ma le differenze non sono sostanziali, e si limitano ad alcuni aspetti secondari.
Nelle pagine sono presenti tutti i documenti di changelog (Changelog-*), le patch (patch-*) e i kernel veri e propri (linux-*). Al fine di essere più chiaro possibile e per non causare probabili instabilità del sistema, parlerò della compilazione del kernel senza patch di sorta.
Prima di cominciare però è importante localizzare il vecchio kernel.
Generalmente è presente nella directory /boot, con nomi che possono cambiare al variare delle distro. Nella Slackware, ad esempio, il nome è vmlinuz; nella Gentoo può avere nome kernel-genkernel-<nomeversione+patch>, che può essere anche molto lungo. Di solito è possibile riconoscere i nomi kernel o linux (o linuz, con la z finale, segno che è compresso in formatogz).
Bene, abbiamo localizzato il (o i) kernel. Adesso suggerisco un procedimento che consente di raggruppare i kernel per versione e di mettere ordine nell'importantissima directory /boot, nucleo fondamentale di un sistema GNU/Linux. Quindi create una directory che come nome abbia la versione del kernel che volete compilare. Se, ad esempio, avete una 2.6.21.4, fate mkdir 2.6.21.4 nella directory /root
***Dovrete avere privilegi di root per poter creare directory in /boot.***
Quindi potreste dover mettere un sudo all'inizio della riga, così:
sudo mkdir /boot/2.6.21.4
NON FATE MODIFICHE all'interno della /boot, a parte quelle che vi dirò io. Potrebbero essere viste molto male dal sistema.
Ora l'ambiente è veramente pronto. Andiamo a cercare il kernel.

Scaricare il kernel
Potete scaricare il kernel dalle due pagine sopra elencate, prelevando il file che comincia per linux- ed è seguito dal numero della vrersione che vi interessa provare. Gli archivi che potete scaricare hanno estensioni .tar.gz e .tar.bz2. La differenza principale è che un archivio .bz2 è leggermente più compresso rispetto ad un archivio .gz.
Una volta scaricato il kernel potete scompattarlo con il seguente comando:
tar -xzf linux-<versione>.tar.gz
oppure
tar -xjf linux-<versione>.tar.bz2
L'opzione z di tar può gestire archivi compressi con gzip e che hanno estensione .gz. Viceversa, l'opzione j può gestire archivi con estensione .bz2 che sono stati compressi usando bzip2. E' perfettamente normale che un archivio kernel compresso abbia dimensioni di 40-50 megabyte. Le sorgenti del kernel non compresso arrivano ad occupare anche 300MB!! Quindi assicuratevi di avere spazio sufficiente nel sistema per ospitare sia l'archivio che i sorgenti, e tutti i file oggetto che verranno creati in fase di compilazione, per un totale di circa 360-380MB.
tar creerà automaticamente la directory dei sorgenti con lo stesso nome dell'archivio, meno le estensioni. Ciò significa che nel nome della cartella sarà presente l'intero numero della versione, e potrete identificarlo subito.
Una volta entrati nella directory un consiglio che do da fare subito è make mrproper, per 'pulire' eventuali file lasciati da compilazioni precedenti. Questo va fatto ogni volta che si vuole ricompilare il kernel, avendo cura prima di salvare un file che poi vi dirò, per evitare errori in fase di compilazione derivanti da vecchi file oggetto già presenti nella directory. Così facendo l'ambiente è nuovamente 'neutro' ed è possibile lavorare in tutta tranquillità.

Configurare il kernel
Il kernel deve essere configurato prima della compilazione. Non importa quale sistema abbiate, per quanto semplice possa essere. Il kernel va sempre configurato.
Per farlo digitate, da riga di comando e con privilegi di root, il comando make seguito da uno spazio e da una delle opzioni manuali elencate sotto.
---Importante---
L'intera configurazione viene salvata in un file nascosto di nome .config, che è buona norma salvare prima di fare una pulizia della cartella con make mrproper. Se .config non viene conservato, è necessario rifare il procedimento di configurazione, in quanto verranno caricate delle configurazioni predefinite.


Le possibili opzioni manuali sono:
config : Configurazione classica, testuale, per linee di comando. Complessa e poco chiara, soggettivamente parlando. Inoltre non si ha la visione dell'insieme.
menuconfig : A mio avviso la migliore. Veloce e completa, usa un'interfaccia basata su ncurses per orientarsi tra i menu e le opzioni. Ed è anche semplice da utilizzare.
xconfig : Apre una finestra in X Window System basata su librerie Qt. E' di semplice utilizzo, un po' come configurare un programma grafico, ma presuppone la presenza di una GUI, e non può essere fatta in ambienti minimali.
gconfig : Questa interfaccia è simile a menuconfig, ma utilizza GTK per la costruzione della finestra. E' semplice e veloce quanto menuconfig ma, come xconfig, presuppone la presenza di una GUI.

Configurazioni automatiche
Il kernel può essere configurato in automatico. Questo è possibile grazie ad alcune opzioni:
oldconfig : Il kernel viene configurato tramite un vecchio .config prefornito.
silentoldconfig : Come oldconfig, ma senza output testuale visibile.
randconfig : La configurazione viene creata con risposte casuali ad ogni opzione.
defconfig : Vengono generate risposte predefinite per ogni opzione.
allmodconfig : Ogni aspetto modulabile viene compilato come modulo.
allyesconfig : Il kernel verrà compilato con tutte le opzioni built-in possibili.
allnoconfig : Tutte le opzioni che è possibile eliminare vengono eliminate.

Personalmente consiglio menuconfig. Alla pari di gconfig è possibile utilizzarlo anche in un ambiente minimale, senza X. Quindi in questa "guida" illustrerò solamente il procedimento tramite menuconfig.
Basta digitare make menuconfig da riga di comando, nella cartella principale dei sorgenti del kernel.
« Last Edit: Sat 23 June 2007, 15:33 by MsZ »

Offline MsZ

  • Il Manutentore
  • Militante
  • ******
  • Posts: 913
  • GNUru Meditation
Re: Guida alla compilazione del kernel di Linux
« Reply #1 on: Sun 10 June 2007, 17:36 »
Seconda parte

---Nota---
Alcune di queste opzioni potrebbero non essere presenti nella configurazione, oppure potrebbero esistere opzioni che qui non sono descritte. Questo dipende dalla versione del kernel che si intende compilare. Come riferimento ho preso il kernel 2.6.21.1.

make menuconfig
Dopo una breve analisi del sistema ed il caricamento delle librerie principali viene creato il menu ncurses di menuconfig.
La prima schermata è la finestra principale.
In basso ci sono tre voci: <Select>, <Exit> e <Help>.
Con <Select> è possibile entrare nei sottomenu, selezionare le opzioni o deselezionarle se sono già selezionate. <Exit> esce dalle sottofinestre o, se si è nella finestra principale, fa uscire dalla configurazione dopo aver chiesto se si desidera salvare la configurazione fino adesso sviluppata. <Help> può dare indicazioni sulle numerose opzioni, qualora ne abbiano descrizioni visualizzabili. Se selezionato nella schermata principale o su una opzione che punta ad un sottomenu (--->) che non sia modificabile, apparirà una serie di indicazioni generali sull'utilizzo di menuconfig. E' possibile confermare le scelte con spazio (* per built-in oppure M per modulare), oppure uscire dal sottomenu premendo velocemente due volte di seguito ESC, oltre ad usare <Exit>.
Per muovervi tra <Select>, <Exit> e <Help> potete usare il tasto di tabulazione.
A sinistra di molte opzioni ci potranno essere dei simboli. Potrete incontrare delle parentesi quadre ([]), la cui rispettiva opzione può essere compilata direttamente nel kernel (built-in) selezionandola, con un asterisco (*); dei simboli minore-maggiore (<>) che potrete selezionare come moduli (M) o built-in (*), oppure un ---, che sta a significare che l'opzione è presente nel kernel per default e che non è possibile deselezionare.

Code maturity level options
Alcune parti del codice che possono essere compilate come moduli o all'interno del kernel stesso sono analizzate, ed in caso siano in versione sperimentale, selezionando questa opzione potranno essere compilate e provate. In caso contrario molte altre caratteristiche in fase di testing non saranno accessibili per l'utilizzo.
General setup
Queste sono tutte caratteristiche generali di codice e di compilazione. E' possibile anche scegliere se creare un disco virtuale iniziale per l'avvio in caso ci siano moduli da caricare per il corretto bootstrap del kernel. Nel caso in cui le funzioni principali siano built-in (filesystem, driver di chipset della scheda madre, grafica, tastiera, eccetera) l'unità virtuale non sarà necessaria.
Loadable module support
Varie parti del kernel possono essere compilate sotto forma di 'moduli', ossia piccole porzioni di codice che possono essere caricate in un secondo momento, o solo se ce ne sia bisogno. In questo modo è possibile 'restringere' l'essenziale nel kernel monolitico, facendo un sistema più svelto e leggero. Questa parte consente di gestire il caricamento dei moduli, e la rimozione degli stessi dal kernel.
Block layer
Tutti i file che vedete nella directory /dev sono creati dal kernel in fase di avvio. Il block layer consente di rimuovere questi file qualora non siano più necessari, ad esempio quando una periferica USB viene scollegata dal sistema. Nel sottomenu è presente anche l'opzione IO Schedulers, che consente di scegliere tra dei 'regolatori di traffico' dei dati da e per il kernel, e per gestire al meglio la memoria ed i segnali per il sistema operativo. Nel dubbio vi raccomando di selezionare solo l'opzione Deadline mettendola built-in (*).
Processor type and features
Qui bisogna fare attenzione. Dovrete scegliere il tipo di processore per cui ottimizzare il kernel, l'architettura (uni- o multi-processore) ed alcune caratteristiche fondamentali di adattamento all'ambiente hardware del bus che più da vicino riguarda il processore. Ricordate sempre di leggere le spiegazioni selezionando <Help> per avere una descrizione di massima di ogni opzione.
Power management options
Per la gestione di ACPI, APM e di tutti gli aspetti di accensione e spegnimento della macchina e delle periferiche, e della gestione della frequenza della CPU.
Bus options (PCI etc.)
PCI, PCMCIA, PCI Hotplug e PCI Express sono trattati qui. Se possibile, abilitate mmconfig per il riconoscimento del bus PCI.
Executable file formats / Emulations
I formati eseguibili ELF, a.out e binari generici, nonchè emulazione di binari a 32 bit se vi trovate in un ambiente a 64 bit, possono essere abilitati qui. Personalmente raccomando di mettere tutto built-in qui dentro.
Networking
Il network è l'aspetto più completo e complesso di Linux. Qui potete sbizzarrirvi, se sapete quello che fate, per personalizzare le vostre reti. Generalmente le opzioni di default sono più che accettabili e comunque il kernel è ottimamente configurato per lavorare con reti anche complesse. Se avete intenzione di usare iptables dovete abilitare Netfilter, che è il filtro di pacchetti caratteristico del kernel di Linux. Ed anche quello va configurato, e di opzioni ne ha molte.
Device drivers
Il sottomenu è pieno di altri sottomenu. Cercherò di spiegarli tutti nel modo più chiaro e breve possibile.
Generic Driver options
Opzioni generiche per tutti i driver presenti nel sistema, moduli compresi.
Connector - unified userspace <-> kernelspace linker
Lavora sopra netlink e crea un ambiente di comunicazione tra vari agenti sia nel kernel che nel sistema operativo, per l'invio di segnali tra i processi.
Insomma, fa 'parlare meglio' i programmi tra loro e con il kernel. Non è indispensabile abilitarlo.
Memory Technology Device (MTD)
Questo driver si prende cura di tutte le memorie RAM e Flash interne al sistema, generalmente per un utilizzo in ambito puramente integrato, come per server dedicati. Se avete flash USB questo non è il driver giusto.
Parallel port support
Se vi interessa ancora usare la vecchia porta parallela abilitatelo.
Plug and Play support
Plug and Play consente di far configurare l'hardware al BIOS o al software, se è PnP compatibile, come Linux. E' generalmente abilitato per default, ed è comunque sconsigliato disabilitarlo.
Block devices
Questo sottomenu può abilitare alcuni blocchi di periferiche secondari (ricordate la directory /dev?) come un blocco per il floppy disk, per il loopback (MOLTO utile per montare filesystem se sono sottoforma di file, come le immagini ISO) e per delle unità virtuali su RAM.
Misc devices
Periferiche secondarie che potreste non avere.
ATA/ATAPI/MFM/RLL support
Questo sottomenu è fondamentale per la configurazione delle unità di immagazzinamento dati interne, come dischi rigidi o lettori/masterizzatori CD/DVD. Supporta bus IDE e SCSI principalmente, e solitamente l'unica opzione da cambiare è quella relativa al vostro chipset di controllo di questi bus.
SCSI device support
SCSI (Small Computer System Interface) è un'interfaccia paragonabile alla IDE, ma molto più veloce e costosa. Ciononostante, la IDE si è affermata sulla SCSI, ed ora se si vuole montare un'unità SCSI sul proprio computer è necessario comprare un controller separato. In questo sottomenu si possono sistemare molte caratteristiche relative al bus SCSI.
Inoltre, se vorrete usare delle unità RAID sul sistema dovrete selezionare "RAID Transport Class" nella lista.
---Attenzione!!!---
Il bus USB nel kernel Linux 'parla' la lingua dello SCSI. Significa che le operazioni interne di lettura e scrittura su, ad esempio, un disco rigido o, in generale, un'unità esterna di immagazzinamento dati che sia collegata ad una presa USB usa il protocollo SCSI. Ciò vale anche per masterizzatori e scanner.
Quindi è necessario abilitare "SCSI disk support" e "SCSI generic support" se si vuole usare un disco rigido esterno, ad esempio, e "SCSI CDROM support" se si ha un masterizzatore/lettore CD/DVD esterno collegato alla porta USB. Ricordate che una qualsiasi periferica come una chiavetta USB o un qualche tipo di memoria esterna, non necessariamente un disco rigido o una memoria flash, collegata alla presa USB, sarà vista dal kernel come un disco rigido esterno, e verrà trattato di conseguenza. Verrà dunque creato il blocco corrispondente nella directory /dev per poterlo montare esattamente come una qualsiasi altra partizione.
Serial ATA (prod) and Parallel ATA (experimental) drivers
Driver ATA e SATA per il kernel. Dovrete selezionare il chipset ed i bus corretti dalla lista.
Multi-device support (RAID and LVM)
Consente di usare dischi e/o periferiche RAID nel sistema. Potrete selezionare i livelli 0,1,2,3,4,5 e 6, nonchè "linear" e "faulty" come caratteristiche RAID, sia modulari che direttamente nel kernel.
Fusion MPT device support
Sono driver SCSI per periferiche su porta parallela, fibra ottica o bus seriale.
IEEE 1394 (FireWire) support
Si spiega da solo.
I2O support
I2O (intelligent Input/Output) consente di dividere i driver dell'hardware in due parti: una parte specifica dell'hardware ed una per il software -in questo caso il sistema operativo. Così è possibile trasportare diversi sistemi operativi sulla stessa piattaforma, avendo lo stesso modulo software. E' però necessario un adattatore specifico, e questa sezione se ne prende cura.
Macintosh device driver
Nel caso abbiate una macchina Mac con un mouse ad un tasto solo, questo driver può emulare le pressioni dei tasti 2 e 3.
Network device support
La configurazione generale dei driver della rete e delle schede di rete. Qui potrete configurare al meglio la vostra Ethernet e, se è presente, il driver del vostro modem.
E' consuetudine nella comunità open source, ed in particolare per quanto riguarda GNU/Linux, consigliare di usare connessioni Ethernet dove possibile invece di connessioni modem dirette tramite USB. Usando un driver Ethernet la configurazione è estremamente più veloce, avendo il driver direttamente nel kernel, senza dover scaricare i driver per il modem, compilarli, ricompilarci il kernel, abilitare i moduli e riconfigurarli.
ISDN subsystem
Per periferiche che usino collegamenti ISDN.
Telephony support
Per la telefonia e il VoIP. Non ha NULLA a che vedere con i modem. Serve solo per far funzionare eventuali carte telefoniche.
Input device support
Driver per comuni periferiche di ingresso: mouse, tavolette grafiche, joystick, touchscreen, tastiere, eccetera.
Character devices
Molte di queste sono fondamentali per il DRM (Direct Rendering Manager) e la grafica 3d, se intendete averla. Generalmente le uniche opzioni che si possono modificare senza problemi sono quelle relative ad AGP e DRM. Ricordate di abilitare il supporto per rtc (Real Time Clock), in quanto serve almeno al 90% delle applicazioni che girano su GNU/Linux.
I2C support
E' un protocollo lento per il riconoscimento di chip di utilizzo meno indispensabile quali rilevatori di temperatura.
SPI support
"Serial Peripheral Interface" può essere usato con sensori, eeprom e memorie Flash esterne al sistema, convertitori DA e AD, codec, eccetera. Può anche essere usato come bus per la trasmissione di dati da una telecamera. Non è indispensabile, ed in caso abbiate flash esterne USB, il driver USB se ne prenderà cura.
Dallas's 1-wire bus
Ci potete collegare periferiche a bassa velocità con prese ad 1 pin, generalmente per sensori termici.
Hardware Monitoring Support
Se volete vedere qual è la temperatura del vostro sistema dovete selezionare il corretto chipset qui, selezionare "I2C support" e, in ACPI support, "Processor" e "Thermal Zone". Poi dovete scaricare lm_sensors e... farmi un fischio, perchè il procedimento è lunghetto. :D
Multifunction device drivers
Driver di periferiche multifunzione, che provvedono a fornire porte USB, audio, video extra eccetera. Sono poco usate.
Multimedia devices
Qui c'è Video for Linux, che potrete usare con una scheda di acquisizione video per registrare programmi televisivi su computer; Digital Video Broadcasting e Digital Audio Broadcasting.
Graphics support
Se non dovete giocare in Linux in modalità testuale vi raccomando di deselezionare "Support for frame buffer devices". Con molta probabilità, anche se avete una macchina veloce, potrebbe rallentare la scrittura e lo scrolling dei terminali nativi.
Sound
ALSA e OSS sono due protocolli di gestione del suono in Linux. OSS (Open Sound System) è ormai vecchio; vi raccomando di abilitare ALSA (Advanced Linux Sound Architecture) e di selezionare il drver giusto per la vostra scheda audio. Abilitate anche l'emulazione per OSS, potrebbe servire.
HID Devices
Una "Human Interface Device" è una periferica che prende ordini direttamente dall'utente. Non sono la solita tastiera o mouse. Sono alcuni tipi speciali degli stessi, che dialogano tramite protocollo USB o Bluetooth.
USB support
La stragrande maggioranza delle opzioni qui può essere tranquillamente disabilitata, ma le principali da tenere sono "USB device filesystem", "EHCI", "UHCI" e "OHCI", oltre al suppoorto per le stampanti USB e per la memoria di massa. Ecco qua il driver per tutte le chiavette ed i dischi rigidi esterni. ;)
MMC/SD Card support
Se avete una SanDisk o una MultiMediaCard generica, ed il rispettivo lettore, entrate qui.
LED devices
Se avete periferiche LED...
Infiniband support
Per periferiche InfiniBand.
EDAC - error detecting and reporting (RAS)
E' un driver avanzato per l'intercettazione ed il rapporto di errori di sistema. E' consigliabile abilitarlo. Potete  metterlo modulare e poi abilitare "Main Memory EDAC reporting."
Real Time Clock
il blocco rtc nella directory /dev è fondamentale, ma questo si riferisce alla classe rispettiva. E' utile solo se volete aggiungere orologi di sistema alla macchina. Il rtc primario è nella sezione "Character devices". Potete tranquillamente lasciar stare questo.
DMA Engine Support
In genere è una buona cosa abilitarlo, in quanto si occupa di tutto il DMA al di fuori delle comunicazioni tra schede PCI (bus-mastering) e Direct Memory Access (tra dischi rigidi e RAM) senza mettere di mezzo il processore.
Auxiliary Display Support
Generalmente si può lasciar stare, se avete configurato bene la sezione "Graphics support".
Virtualization
Permette (a quanto ho capito) di creare una migliore virtualizzazione a livello del kernel, favorendo l'emulazione di applicazioni o di processi anche di diversi sistemi operativi.

Firmware Drivers
Sono generalmente driver per firmware di sistemi DELL o portatili, ma sono solitamente poco usati.
File systems
La sezione è estremamente importante. Il kernel di Linux può supportare molti filesystem. I più usati sono ext2, ext3, ReiserFS, JFS e XFS. Consiglio di metterli tutti built-in, solo la prima opzione, senza selezionare le sottopzioni per ogni filesystem. Generalmente il solo supporto è più che sufficiente.
Più in basso c'è un sottomenu di nome "Native Language Support". Entrando troverete una lista di "codepage". Per l'Italia sono validi il "Codepage 850" e "iso8859-15". Selezionate anche "ASCII", "NLS ISO 8859-15" e "NLS UTF-8" (conosciuto anche come Unicode 8-bit).

Le restanti sezioni (Instrumentation support, Kernel hacking, Security options, Cryptographic options, Library routines) sono di esclusivo utilizzo del kernel. Meglio non modificare nulla qui. Solo per smanettoni o sviluppatori. Se volete, potete deselezionare "Kernel debugging" e "Debug Filesystem" nella sezione "Kernel hacking", in quanto non sono indispensabili.

Configurazione terminata!!!
...e adesso?
« Last Edit: Mon 11 June 2007, 13:35 by MsZ »

Offline MsZ

  • Il Manutentore
  • Militante
  • ******
  • Posts: 913
  • GNUru Meditation
Re: Guida alla compilazione del kernel di Linux
« Reply #2 on: Sun 10 June 2007, 17:44 »
Terza parte

E adesso, compiliamo. Potete uscire dalla finestra andando su <Exit> con il tasto di tabulazione, e confermate la domanda.
La configurazione avrà salvato un file chiamato .config, come ho già accennato. Se volete pulire la directory dovrete mandare il comando make mrproper, ma PRIMA dovrete salvare il file .config in una directory a parte, oppure rinominarlo, in modo che la procedura di pulizia non cancelli il faticoso lavoro di configurazione che avete fatto fino adesso.
Poi basterà un semplice make nella directory principale dei sorgenti per avviare la compilazione.
Se avete selezionato qualcosa come modulo dovrete anche digitare ed avviare make modules_install per installare i moduli nel posto giusto.

Installazione del kernel
Se avete seguito tutto quello che ho detto fino adesso avrete creato nella directory /boot una cartella dal nome della versione del kernel che avete compilato. Non dovete fare altro che andare nella cartella dei sorgenti, entrare nella directory arch e cercare l'architettura per la quale avete compilato il vostro nuovo kernel. All'interno c'è una cartella di nome boot: lì dentro c'è un file chiamato bzImage. Potete anche cercare il file digitando da terminale find . -name "bzImage", e avrete la directory esatta in cui è depositato.
Quello è il kernel.
Dovete copiarlo (con privilegi di root) nella cartella della versione del kernel.

Configurazione del bootloader
Come forse saprete già, un bootloader server per far partire uno o più sistemi operativi presenti nel sistema. Ma non si limita a questo: un bootloader serve a caricare in memoria l'indirizzo di un boot sector. In ogni kernel esistente c'è un boot sector: come si identifica il boot sector si identifica il kernel. Quindi un bootloader può far partire un kernel scelto fra molti. Le sue potenzialità si massimizzano con Linux.
Adesso avete il vostro bel kernel compilato. Per farlo partire dovrete dire al bootloader dove andarlo a cercare. Analizzeremo GrUB e LiLo, due dei principali bootloader in circolazione.

LiLo
LiLo (Linux Loader) è uno dei primi progetti (insieme a loadlin, ormai superato) di bootloader per Linux. Per configurarlo dovrete avere privilegi di root ed entrare nella directory /etc per cercare un file di nome lilo.conf. Potete aprirlo con un qualsiasi editor ASCII, per X o terminale.
Una volta aperto dovrete aggiungere le seguenti righe:
Quote
image = /boot/<versione>/bzImage
root = /dev/hda1
label = Default
read-only
La riga label non è obbligatoria, ma potrete fare una breve descrizione del kernel. Ricordate però che lilo non accetta spazi nella descrizione. Ciò è diverso per GrUB, ma lo analizzeremo dopo.
Con image si informa LiLo dove sta il kernel. Quindi andrà a prendere il boot sector rispettivo e lascerà il comando al nuovo kernel. La root è la partizione dove sta il kernel. Questa opzione è importantissima in quanto dice a LiLo in quale partizione deve andare a cercare. Solitamente è /dev/hda1. read-only è un comando passato al kernel e dice di montare la partizione di root in sola lettura per la prima volta. E' caldamente consigliato mettere questa opzione.

Salvate il file, uscite e digitate lilo da terminale.
Se avete fatto tutto correttamente LiLo aggiungerà le partizioni e/o i kernel alla lista e scriverà i cambiamenti nell'MBR. Ora avrete il sistema pronto per essere riavviato. Chiudete tutte le applicazioni, riavviate il sistema e... incrociate le dita.
Se non dovesse funzionare non dovete fare altro che resettare il sistema nei casi gravi, o semplicemente riavviare se il problema è meno significativo, e scegliere il kernel stabile già presente. Ecco perchè vi avevo detto di lasciare tutti i kernel.

GrUB
GrUB (Grand Unified Bootloader) è un progetto della FSF che mira a fornire un bootloader completo e stabile. Ha molte più possibliità e opzioni rispetto a LiLo, e mira ad essere il bootloader principale per sistemi GNU.
Per GrUB il discorso è leggermente diverso. Dovrete andare a cercare il file menu.lst, che di solito è presente nella directory /boot/grub.
Quando lo avrete trovato valgono le stesse regole per LiLo: editor ASCII, privilegi di root. Apritelo.
Ora dovrete aggiungere le righe seguenti:
Quote
title       <descrizione del kernel>
root    (hd0,0)
kernel  /boot/<versione>/bzImage
savedefault
Come descrizione potete mettere quello che volete. GrUB ha molte meno restrizioni di LiLo e avete libertà di scrittura.
La root del sistema è scritta in modo diverso: (hd0,0) sta a significare che è la partizione 0 del primo disco rigido (hd0) del sistema. E' esattamente come dire /dev/hda1 a LiLo.
Anche a GrUB dovrete dire dove andare a prendere l'immagine del kernel, e quel savedefault informa GrUB che dal prossimo avvio dovrà comunque caricare il default classico.
Salvate ed uscite; ora, per installare il nuovo GrUB nel sistema dovrete digitare grub-install hd0 (o grub-install /dev/hda per GrUB2). Ora potrete riavviare il sistema. Se qualcosa dovesse andare storto valgono le stesse raccomandazioni per LiLo.

Se non doveste essere soddisfatti del nuovo kernel... potete sempre ricompilarlo.
« Last Edit: Mon 11 June 2007, 13:35 by MsZ »

Offline franz1789

  • Vagrant
  • Administrator
  • Militante
  • *****
  • Posts: 767
    • Been Smoking Too Long
Re: Guida alla compilazione del kernel di Linux
« Reply #3 on: Mon 11 June 2007, 13:50 »
A tal proposito, ringraziandoti per l'ottima guida, che seguirò sempre da ora in poi, vorrei porti una domanda: dopo la mia compilazione del 2.6.21.4, risultato funzionante, ho trovato uno strano problema, l'estensione XFree86 non è funzionante, e non mi è possibile nemmeno usare Envy per reinstallare i driver. Sono sicuro di non aver fatto errori nella compilazione, dove ero in dubbio, ho lasciato come modulo. A questo punto mi chiedo: non è forse che Ubuntu carica dei moduli supplementari, o qualcosa di simile?
Ti ringrazio per quanto mi stai insegnando...

Offline MsZ

  • Il Manutentore
  • Militante
  • ******
  • Posts: 913
  • GNUru Meditation
Re: Guida alla compilazione del kernel di Linux
« Reply #4 on: Mon 11 June 2007, 18:37 »
Quote
l'estensione XFree86 non è funzionante
XFree86 è l'interfaccia grafica, non un'estensione... prova ad andare a vedere il file /var/log/Xorg.0.log e vedi se ci sono delle righe con (EE). Puoi fare
grep -i "(EE)" /var/log/Xorg.0.log
e avrai subito tutte le righe con gli errori.

Quote
non mi è possibile nemmeno usare Envy per reinstallare i driver
Ti viene mostrato qualche messaggio d'errore? Riusciresti a localizzare il log di Envy per vedere cosa c'è che non va?

Quote
non è forse che Ubuntu carica dei moduli supplementari, o qualcosa di simile?
E' possibile. Ma prima bisogna localizzare la fonte del problema.
« Last Edit: Mon 11 June 2007, 18:55 by MsZ »

Offline franz1789

  • Vagrant
  • Administrator
  • Militante
  • *****
  • Posts: 767
    • Been Smoking Too Long
Re: Guida alla compilazione del kernel di Linux
« Reply #5 on: Mon 11 June 2007, 21:16 »
Proverò a trovare qualche log e poi ti dirò. Anche perchè in questi giorni devo ricompilarlo un'altra volta, per via del timer dei midi. Rosegarden4 dice che nel kernel è impostato troppo basso, non so perchè...

Offline MsZ

  • Il Manutentore
  • Militante
  • ******
  • Posts: 913
  • GNUru Meditation
Re: Guida alla compilazione del kernel di Linux
« Reply #6 on: Mon 11 June 2007, 23:32 »
...nel kernel non c'è nessun timer per il MIDI, a parte Sound -> Advanced Linux Sound Architecture -> RTC timer support. Questo è il timer 'privilegiato' per ALSA e per il MIDI in ALSA in generale. Devi solo abilitare questo e l'RTC principale non ha nulla a che fare con questo. Forse devi anche abilitare Sequencer support e tutta l'emulazione OSS (OSS PCM API con plugins, OSS Mixer API, UART 16550, MPU 401 UART nella sezione Generic devices.

'Timer troppo basso'... l'unica cosa che mi viene in mente è mettere echo 1024 > /proc/sys/dev/rtc/max_user_freq, ma non mi risulta che abbia qualcosa a che fare con il MIDI.
Controlla e metti RTC ad ALSA, con l'emulazione OSS, poi vedi come va.

Offline Philip J. Fry

  • Delivery boy
  • Translator Crew
  • Accolito
  • ****
  • Posts: 424
Re: Guida alla compilazione del kernel di Linux
« Reply #7 on: Fri 15 June 2007, 18:48 »
Grazie MsZ, sei il mio profeta!  :wub: :angel:


 :smile:

Offline MsZ

  • Il Manutentore
  • Militante
  • ******
  • Posts: 913
  • GNUru Meditation
Re: Guida alla compilazione del kernel di Linux
« Reply #8 on: Sat 23 June 2007, 20:35 »
Compilazione ed Installazione in Debian e derivate

Per quanto riguarda la Debian, la questione è un po' diversa. La configurazione avviene esattamente nello stesso modo, ma l'installazione differisce per alcuni particolari importanti.
Per prima cosa, il reperimento del kernel. Si può sia scaricare dai repository o direttamente da Kernel.org.
In questa pagina trovate la descrizione dettagliata in inglese del procedimento, ed una lista completa ed esauriente di tutti i pacchetti che vi servono per compilare con successo il kernel.
Si raccomanda prima di tutto (come spiegato quasi subito nel sito) di creare un disco di ripristino floppy, in caso qualcosa dovesse andare storto.

Seguendo i consigli di questa pagina, bisogna fare le cose in quest'ordine:

---Reperimento ed installazione dei sorgenti del kernel---
Dopo aver scaricato tutti i pacchetti necessari avrete anche un archivio .tar.bz2 con i sorgenti del kernel. Dovunque l'abbiate messo potete scompattarlo (come già spiegato) con la riga
Quote
sudo tar -xjf kernel-source-<versione>.tar.bz2 -C <destinazione>
La <destinazione> può essere qualsiasi directory decidiate.
Poi andate a vedere nella directory /usr/src. Se trovate il nome linux scritto in celeste chiaro, cancellatelo. E' un symlink alla directory dei sorgenti originali del kernel della distribuzione che avete installato. Non vi preoccupate, perchè cancellando linux cancellerete solo il collegamento e non la directory in sè.
Dopo aver scompattato l'archivio e cancellato il symlink dovrete crearne uno nuovo, che faccia riferimento alla directory dei nuovi sorgenti:
Quote
ln -s </percorso/per/sorgenti> /usr/src/linux
E adesso siete pronti. Andate in /usr/src/linux e preparatevi a configurare. La configurazione avviene nello stesso modo che ho già descritto nella Seconda parte del thread.

---Dopo la configurazione---
Terminata la configurazione, uscite dal menu e nella stessa directory fate
fakeroot make-kpkg clean
per pulire qualsiasi riferimento a vecchie pacchettizzazioni del kernel della Debian (o derivate). Infine scrivete
fakeroot make-kpkg --append-to-version=<versione_custom> kernel_image.
Il comando comprende le quattro fasi di make dep, make clean, make bzImage, make modules, ossia la creazione delle dipendenze, la pulizia a riferimenti a vecchi kernel, la creazione del kernel e la compilazione dei moduli necessari. Al posto di <versione_custom> potete mettere un nome a piacere per identificare univocamente il kernel appena compilato.
Alla fine del processo potete notare il file kernel-image-versione-<versione_custom>.deb nella directory superiore (/usr/src). Ora potete installare il kernel con dpkg:
Quote
dpkg -i kernel-image-versione-<versione_custom>.deb

---LiLo---
Il programma chiederà se si vuole creare un disco di ripristino di emergenza. Se lo avete già fatto prima, o se volete rischiare, o se sapete esattamente quello che state facendo, potete rispondere "no". Poi vi verrà chiesto se vorrete installare nuovamente il bootloader usando la configurazione corrente in lilo.conf. E' caldamente consigliato rispondere di no, poichè il sistema tenterebbe di far avviare il kernel nuovo con la vecchia configurazione di boot, e non funzionerebbe (almeno, questo porterebbe ad un sistema potenzialmente instabile o non avviabile). Alla domanda successiva, quando vi verrà chiesto se vorrete creare una nuova configurazione, allora scegliete "si". A meno che non vogliate usare un bootloader diverso da LiLo, come GrUB. In questo caso, rispondete "no". Se risponderete "si", vi verrà chiesto di installare i boot record e di attivare la partizione.

---GrUB---
Per informazioni dettagliate sull'utilizzo di GrUB in Debian o derivate, riferitevi a questa pagina. Semplicemente, dopo aver installato GrUB (se non l'avete già) vi viene chiesto di creare un file in /etc di nome kernel-img.conf per essere utilizzato espressamente per la configurazione del bootloader a fronte dell'installazione di un nuovo kernel. Ogni volta che compilerete un nuovo kernel non dovrete fare altro che far partire update-grub per aggiornare il bootloader.

Bene, mi sembra che non manchi nulla. Se avete problemi in avvio a causa del bootloader potete sempre utilizzare il floppy d'emergenza che (forse) avrete creato. Oppure, se il kernel semplicemente non vi soddisfa o, una volta caricato, non ha alcuni requisiti che potrebbero servirvi, potete sempre riavviare il sistema con il vecchio kernel, ricompilare il nuovo, ripetere la procedura e ritentare.
Fra le altre cose potrei suggerirvi di cancellare il symlink (/usr/src/linux) non appena avete finito di compilarlo, a meno che non dobbiate installare nuovi moduli per il kernel al di fuori dell'albero ufficiale.

Offline Emulizzato

  • Super Mod
  • Translator Crew
  • Membro attivo
  • ****
  • Posts: 1223
  • El Niño
    • http://feffo.splinder.com/
Re: Guida alla compilazione del kernel di Linux
« Reply #9 on: Fri 31 August 2007, 19:15 »
MsZ,novità!Se passo il debito al primo round a settembre mi arriva il portatile!Al chè ci metterei sopra Ubuntu e mi servirebbe una mano...Anche con aMule...

PS:posso fare a meno di utilizzare aMule AdunanzA?? :folle:

 

Creative Commons License All ValerioCipriani.com contents are published according to Creative Common License, except different instructions. The Staff is not responsible of eventually guide, article and publishing mistakes. All published items are patent free. All trade marks reported are right reserved. Contact us, Info.