
Rilascio del kernel Linux 3.x http://kernel.org/
Queste sono le note di rilascio per Linux versione 3. Leggerle attentamente, poiché spiegano di cosa si tratta, come installare il kernel e cosa fare se qualcosa va storto.
CHE COS'È LINUX?
Linux è un clone del sistema operativo Unix, scritto da zero da Linus Torvalds con l'assistenza di un gruppo informale di hacker provenienti da tutta la Rete. Punta alla conformità con POSIX e Single UNIX Specification.
Ha tutte le funzionalità che ci si aspetterebbe da uno Unix moderno e completo, inclusi vero multitasking, memoria virtuale, librerie condivise, caricamento on-demand, eseguibili condivisi copy-on-write, una corretta gestione della memoria e networking multistack che include IPv4 e IPv6.
È distribuito sotto GNU General Public License - vedere il file COPYING allegato per maggiori dettagli.
SU QUALE HARDWARE GIRA?
Sebbene sia stato sviluppato originariamente per PC a 32 bit basati su x86 (386 o successivi), oggi Linux gira anche (almeno) sulle architetture Compaq Alpha AXP, Sun SPARC e UltraSPARC, Motorola 68000, PowerPC, PowerPC64, ARM, Hitachi SuperH, Cell, IBM S/390, MIPS, HP PA-RISC, Intel IA-64, DEC VAX, AMD x86-64, AXIS CRIS, Xtensa, Tilera TILE, AVR32 e Renesas M32R.
Linux è facilmente portabile alla maggior parte delle architetture general-purpose a 32 o 64 bit, purché abbiano una memory management unit a pagine (PMMU) e una versione del compilatore GNU C (gcc) (parte della GNU Compiler Collection, GCC). Linux è stato anche portato su numerose architetture senza PMMU, sebbene in tal caso la funzionalità sia ovviamente alquanto limitata. Linux è stato anche portato a sé stesso. Ora si può eseguire il kernel come applicazione userspace: questa modalità si chiama UserMode Linux (UML).
DOCUMENTAZIONE:
Esiste molta documentazione disponibile sia in forma elettronica su Internet sia in libri, sia specifica per Linux sia relativa a questioni UNIX generali. Consiglio di cercare nei sottodirectory di documentazione su qualsiasi sito FTP Linux i libri del LDP (Linux Documentation Project). Questo README non vuole essere la documentazione del sistema: ci sono fonti molto migliori disponibili.
Ci sono vari file README nel sottodirectory Documentation/: questi contengono in genere note di installazione specifiche del kernel per alcuni driver, per esempio. Vedere Documentation/00-INDEX per un elenco di ciò che è contenuto in ogni file. Si prega di leggere il file Changes, poiché contiene informazioni sui problemi che possono derivare dall'aggiornamento del kernel.
Il sottodirectory Documentation/DocBook/ contiene diverse guide per sviluppatori e utenti del kernel. Queste guide possono essere generate in vari formati: PostScript (.ps), PDF, HTML e pagine man, tra gli altri. Dopo l'installazione, "make psdocs", "make pdfdocs", "make htmldocs", o "make mandocs" genereranno la documentazione nel formato richiesto.
INSTALLAZIONE del sorgente del kernel:
Se si installano i sorgenti completi, inserire l'archivio del kernel in una directory su cui si hanno i permessi (ad es. la propria home directory) e estrarlo:
gzip -cd linux-3.X.tar.gz | tar xvf -
oppure bzip2 -dc linux-3.X.tar.bz2 | tar xvf -
Sostituire "XX" con il numero di versione dell'ultimo kernel.
NON usare l'area /usr/src/linux! Quest'area contiene un insieme (di solito incompleto) di header del kernel usati dai file header delle librerie. Essi dovrebbero corrispondere alla libreria e non essere alterati da qualunque kernel del momento capiti.
È anche possibile aggiornare tra le release 3.x tramite patch. Le patch sono distribuite nel tradizionale formato gzip e nel più recente formato bzip2. Per installare tramite patch, procurarsi tutti i file di patch più recenti, entrare nella directory di livello principale del sorgente del kernel (linux-3.x) ed eseguire:
gzip -cd ../patch-3.x.gz | patch -p1
oppure bzip2 -dc ../patch-3.x.bz2 | patch -p1
(ripetere xx per tutte le versioni successive a quella del proprio albero dei sorgenti corrente, in ordine) e tutto dovrebbe funzionare. Si può voler rimuovere i file di backup (xxx~ o xxx.orig), e assicurarsi che non ci siano patch fallite (xxx# o xxx.rej). Se ci sono, o voi o io abbiamo commesso un errore.
A differenza delle patch per i kernel 3.x, le patch per i kernel 3.x.y (note anche come kernel -stable) non sono incrementali ma si applicano direttamente al kernel base 3.x. Si prega di leggere Documentation/applying-patches.txt per maggiori informazioni.
In alternativa, lo script patch-kernel può essere usato per automatizzare questo processo. Determina la versione corrente del kernel e applica tutte le patch trovate.
linux/scripts/patch-kernel linux
Il primo argomento nel comando precedente è la posizione del sorgente del kernel. Le patch vengono applicate dalla directory corrente, ma è possibile specificare una directory alternativa come secondo argomento.
Se si aggiorna tra release usando le patch della serie stabile (ad esempio, patch-3.x.y), notare che queste "dot-releases" non sono incrementali e devono essere applicate all'albero base 3.x. Per esempio, se il kernel base è 3.0 e si vuole applicare la patch 3.0.3, non si deve e anzi non bisogna assolutamente applicare prima le patch 3.0.1 e 3.0.2. Allo stesso modo, se si sta eseguendo la versione 3.0.2 del kernel e si vuole passare alla 3.0.3, bisogna prima annullare la patch 3.0.2 (cioè patch -R) di applicare la patch 3.0.3. Si può leggere altro su questo in Documentation/applying-patches.txt
REQUISITI SOFTWARE
La compilazione e l'esecuzione dei kernel 3.x richiedono versioni aggiornate di vari pacchetti software. Consultare Documentation/Changes per i numeri di versione minimi richiesti e per come ottenere aggiornamenti per questi pacchetti. Attenzione: l'uso di versioni eccessivamente vecchie di questi pacchetti può causare errori indiretti molto difficili da rintracciare, quindi non dare per scontato di poter semplicemente aggiornare i pacchetti quando sorgono problemi evidenti durante la compilazione o l'esecuzione.
DIRECTORY di BUILD per il kernel:
Quando si compila il kernel, tutti i file di output saranno per impostazione predefinita memorizzati insieme al codice sorgente del kernel. Usando l'opzione "make O=output/dir" è possibile specificare una posizione alternativa per i file di output (incluso .config). Esempio: codice sorgente del kernel: /usr/src/linux-3.N directory di build: /home/name/build/kernel
Per configurare e compilare il kernel usare: cd /usr/src/linux-3.N make O=/home/name/build/kernel menuconfig make O=/home/name/build/kernel sudo make O=/home/name/build/kernel modules_install install
Si prega di notare: se si usa l'opzione 'O=output/dir', essa deve essere usata per tutte le invocazioni di make.
CONFIGURAZIONE del kernel:
Non si salti questo passaggio anche se si sta solo aggiornando una versione minore. In ogni release vengono aggiunte nuove opzioni di configurazione, e se i file di configurazione non sono impostati come previsto compariranno strani problemi. Se si vuole portare la propria configurazione esistente a una nuova versione con il minimo lavoro, usare "make oldconfig", che chiederà solo le risposte alle nuove domande.
I comandi di configurazione alternativi sono: "make config" Interfaccia a testo semplice. "make menuconfig" Menu colorati, elenchi radio e dialoghi basati su testo. "make nconfig" Menu colorati basati su testo potenziati. "make xconfig" Strumento di configurazione basato su X windows (Qt). "make gconfig" Strumento di configurazione basato su X windows (Gtk). "make oldconfig" Risponde per impostazione predefinita a tutte le domande in base al contenuto del file ./.config esistente e chiede informazioni sui nuovi simboli di configurazione. "make silentoldconfig" Come sopra, ma evita di ingombrare lo schermo con domande a cui è già stato risposto. Aggiorna inoltre le dipendenze. "make defconfig" Crea un file ./.config usando i valori predefiniti dei simboli da arch/$ARCH/defconfig o arch/$ARCH/configs/${PLATFORM}_defconfig, a seconda dell'architettura. "make ${PLATFORM}_defconfig" Crea un file ./.config usando i valori predefiniti dei simboli da arch/$ARCH/configs/${PLATFORM}_defconfig. Usare "make help" per ottenere un elenco di tutte le piattaforme disponibili per la propria architettura. "make allyesconfig" Crea un file ./.config impostando i valori dei simboli su 'y' il più possibile. "make allmodconfig" Crea un file ./.config impostando i valori dei simboli su 'm' il più possibile. "make allnoconfig" Crea un file ./.config impostando i valori dei simboli su 'n' il più possibile. "make randconfig" Crea un file ./.config impostando i valori dei simboli su valori casuali.
Si possono trovare maggiori informazioni sull'uso degli strumenti di configurazione del kernel Linux in Documentation/kbuild/kconfig.txt.
NOTE su "make config":
COMPILAZIONE del kernel:
Assicurarsi di avere almeno gcc 3.2 disponibile. Per maggiori informazioni, fare riferimento a Documentation/Changes.
Si noti che è ancora possibile eseguire programmi utente a.out con questo kernel.
Eseguire "make" per creare un'immagine del kernel compressa. È anche possibile eseguire "make install" se si ha lilo installato in modo da adattarsi ai makefile del kernel, ma potrebbe essere opportuno controllare prima la propria configurazione lilo.
Per eseguire l'installazione vera e propria si deve essere root, ma nessuna delle normali operazioni di build dovrebbe richiederlo. Non invocare il nome di root invano.
Se si sono configurate alcune parti del kernel come `modules', si dovrà anche eseguire "make modules_install".
Output di compilazione/build del kernel in modalità verbose:
Normalmente il sistema di build del kernel opera in una modalità piuttosto silenziosa (ma non del tutto silenziosa). Tuttavia, a volte voi o altri sviluppatori del kernel avete bisogno di vedere i comandi di compilazione, collegamento o altri comandi esattamente come vengono eseguiti. Per questo, usare la modalità di build "verbose". Ciò si ottiene inserendo "V=1" nel comando "make". Ad es.:
make V=1 all
Per fare in modo che il sistema di build indichi anche il motivo della ricompilazione di ogni target, usare "V=2". Il valore predefinito è "V=0".
Tenere a portata di mano un kernel di backup in caso qualcosa vada storto. Ciò è particolarmente vero per le release di sviluppo, poiché ogni nuova release contiene nuovo codice non ancora ripulito dai bug. Assicurarsi di conservare anche un backup dei moduli corrispondenti a quel kernel. Se si installa un nuovo kernel con lo stesso numero di versione del kernel funzionante, fare un backup della propria directory dei moduli prima di eseguire "make modules_install". In alternativa, prima di compilare, usare l'opzione di configurazione del kernel "LOCALVERSION" per aggiungere un suffisso univoco alla normale versione del kernel. LOCALVERSION può essere impostata nel menu "General Setup".
Per avviare il nuovo kernel, bisognerà copiare l'immagine del kernel (ad es. .../linux/arch/i386/boot/bzImage dopo la compilazione) nel punto in cui si trova il normale kernel avviabile.
L'avvio di un kernel direttamente da un floppy senza l'assistenza di un bootloader come LILO non è più supportato.
Se si avvia Linux dal disco rigido, è probabile che si usi LILO, che utilizza l'immagine del kernel specificata nel file /etc/lilo.conf. Il file immagine del kernel è di solito /vmlinuz, /boot/vmlinuz, /bzImage o /boot/bzImage. Per usare il nuovo kernel, salvare una copia della vecchia immagine e copiare la nuova immagine sopra quella vecchia. Quindi, BISOGNA RIESEGUIRE LILO per aggiornare la mappa di caricamento!! Se non lo si fa, non si riuscirà ad avviare la nuova immagine del kernel.
SE QUALCOSA VA STORTO:
Se si hanno problemi che sembrano dovuti a bug del kernel, controllare il file MAINTAINERS per vedere se c'è una persona specifica associata alla parte del kernel con cui si hanno problemi. Se non c'è nessuno elencato lì, la seconda cosa migliore è inviare una e-mail a me ([email protected]), e possibilmente a qualsiasi altra mailing-list pertinente o al newsgroup.
In tutte le segnalazioni di bug, si prega di indicare di quale kernel si sta parlando, come riprodurre il problema e qual è la propria configurazione (usare il buon senso). Se il problema è nuovo, segnalarmelo, e se il problema è vecchio, cercare di dirmi quando lo si è notato per la prima volta.
Se il bug produce un messaggio come
unable to handle kernel paging request at address C0000010 Oops: 0002 EIP: 0010:XXXXXXXX eax: xxxxxxxx ebx: xxxxxxxx ecx: xxxxxxxx edx: xxxxxxxx esi: xxxxxxxx edi: xxxxxxxx ebp: xxxxxxxx ds: xxxx es: xxxx fs: xxxx gs: xxxx Pid: xx, process nr: xx xx xx xx xx xx xx xx xx xx xx
o informazioni di debug del kernel simili sullo schermo o nel log di sistema, si prega di riprodurle esattamente. Il dump può sembrare incomprensibile, ma contiene informazioni che possono aiutare a fare debug del problema. Anche il testo sopra il dump è importante: dice qualcosa sul motivo per cui il kernel ha scaricato il codice (nell'esempio sopra è dovuto a un puntatore del kernel non valido). Ulteriori informazioni su come interpretare il dump sono in Documentation/oops-tracing.txt
Se si è compilato il kernel con CONFIG_KALLSYMS, si può inviare il dump così com'è; altrimenti si dovrà usare il programma "ksymoops" per dare un senso al dump (ma compilare con CONFIG_KALLSYMS è di solito preferibile). Questa utilità può essere scaricata da ftp://ftp..kernel.org/pub/linux/utils/kernel/ksymoops/ . In alternativa, si può effettuare la ricerca nel dump manualmente:
Nel fare debug di dump come quello sopra, aiuta enormemente riuscire a cercare cosa significa il valore EIP. Il valore esadecimale in sé non aiuta molto me né chiunque altro: dipende dalla propria particolare configurazione del kernel. Quello che si dovrebbe fare è prendere il valore esadecimale dalla riga EIP (ignorare "0010:") e cercarlo nella namelist del kernel per vedere quale funzione del kernel contiene l'indirizzo incriminato.
Per scoprire il nome della funzione del kernel, bisognerà trovare il binario di sistema associato al kernel che ha mostrato il sintomo. Questo è il file 'linux/vmlinux'. Per estrarre la namelist e confrontarla con l'EIP del crash del kernel, eseguire:
nm vmlinux | sort | less
Questo fornirà un elenco di indirizzi del kernel ordinati in ordine crescente, dal quale è semplice trovare la funzione che contiene l'indirizzo incriminato. Notare che l'indirizzo fornito dai messaggi di debug del kernel non corrisponderà necessariamente in modo esatto agli indirizzi delle funzioni (anzi, è molto improbabile), quindi non si può semplicemente fare un 'grep' dell'elenco: l'elenco fornirà comunque il punto di partenza di ogni funzione del kernel, quindi cercando la funzione che ha un indirizzo di partenza inferiore a quello che si sta cercando ma è seguita da una funzione con un indirizzo superiore, si troverà quella desiderata. In effetti, può essere una buona idea includere un po' di "contesto" nella segnalazione del problema, fornendo alcune righe attorno a quella interessante.
Assicurarsi di non avere file .o obsoleti e dipendenze in giro:
cd linux
make mrproper
A questo punto i sorgenti dovrebbero essere installati correttamente.
Reinstallare LILO di solito consiste nell'eseguire /sbin/lilo. Si potrebbe desiderare di modificare /etc/lilo.conf per specificare una voce per la vecchia immagine del kernel (ad esempio, /vmlinux.old) nel caso in cui quella nuova non funzioni. Vedere la documentazione LILO per maggiori informazioni.
Dopo aver reinstallato LILO, dovrebbe essere tutto pronto. Spegnere il sistema, riavviare e godersela!
Se si ha mai bisogno di cambiare il dispositivo root predefinito, la modalità video, la dimensione del ramdisk, ecc. nell'immagine del kernel, usare il programma 'rdev' (o in alternativa le opzioni di avvio di LILO quando appropriate). Non c'è bisogno di ricompilare il kernel per cambiare questi parametri.
Riavviare con il nuovo kernel e godersela.
Se per qualche motivo non si può fare quanto sopra (si ha un'immagine del kernel precompilata o simile), fornirmi quante più informazioni possibili sulla propria configurazione aiuterà. Si prega di leggere il documento REPORTING-BUGS per i dettagli.
In alternativa, si può usare gdb su un kernel in esecuzione. (sola lettura; cioè non si possono cambiare valori o impostare punti di interruzione.) Per fare ciò, compilare prima il kernel con -g; modificare arch/i386/Makefile in modo appropriato, quindi eseguire "make clean". Sarà inoltre necessario abilitare CONFIG_PROC_FS (tramite "make config").
Dopo aver riavviato con il nuovo kernel, eseguire "gdb vmlinux /proc/kcore". Ora si possono usare tutti i soliti comandi di gdb. Il comando per cercare il punto in cui il sistema è andato in crash è "l *0xXXXXXXXX". (Sostituire le XXX con il valore EIP.)
L'uso di gdb su un kernel non in esecuzione attualmente fallisce perché gdb (erroneamente) ignora l'offset iniziale per il quale il kernel è compilato.