DebianKernel-4-DUMMIES written by Luca Gibelli (nervous at nervous.it) Latest version available at: http://www.nervous.it/txt/DebianKernel-4-DUMMIES.txt Licenza: Creative Commons, Attribuzione - Non commerciale - Non opere derivate 2.0 Italia Tu sei libero: di riprodurre, distribuire, comunicare al pubblico, esporre in pubblico, rappresentare, eseguire o recitare l'opera Alle seguenti condizioni: Attribuzione. Devi riconoscere il contributo dell'autore originario. Non commerciale. Non puoi usare quest'opera per scopi commerciali. Non opere derivate. Non puoi alterare, trasformare o sviluppare quest'opera. In occasione di ogni atto di riutilizzazione o distribuzione, devi chiarire agli altri i termini della licenza di quest'opera. Se ottieni il permesso dal titolare del diritto d'autore, è possibile rinunciare ad ognuna di queste condizioni. Le tue utilizzazioni libere e gli altri diritti non sono in nessun modo limitati da quanto sopra. ----------------------------------------------------------------------------- Installare un kernel alla "debian way" -------------------------------------- Ricompilare o aggiornare un kernel su una distribuzione Debian, contrariamente a quanto si potrebbe pensare, e' piu' facile e piu' rapido che su molte altre distribuzioni. Debian mette a disposizione moltissimi kernel precompilati ottimizzati per le varie architetture, quindi nella maggior parte dei casi troverete tra essi un pacchetto contenente un kernel adatto alle vostre esigenze. In caso contrario, Debian mette a disposizione dell'utente "make-kpkg", uno strumento che rende in grado chiunque di creare un pacchetto .deb contenente un kernel personalizzato. Scegliere il kernel precompilato giusto --------------------------------------- Per sapere qualche versione del kernel state correntemente utilizzando eseguite: # uname -r Al termine dell'installazione di Debian il vostro sistema gira con lo stesso kernel utilizzato dal CDROM di installazione, ovvero il cosiddetto "bf24" (sta per boot floppy ver. 2.4). Si tratta di un kernel il piu' generico possibile, privo di ottimizzazioni particolari, non pensato per l'utilizzo in produzione, ma semplicemente per far partire il sistema al primo boot. E' caldamente consigliabile sostituirlo con uno piu' adatto al vostro sistema. Supponendo di aver opportunamente configurato apt, eseguite: # apt-cache search ^kernel-image e avrete la lista dei kernel precompilati disponibili. Prendete in considerazione i pacchetti che hanno un nome del seguente tipo: "kernel-image-versione-release-architettura": - "versione" indica quali sorgenti del kernel di Linux (quelli che trovate su www.kernel.org tanto per intenderci) sono stati utilizzati. - "release" e' un numero progressivo che indica quante volte e' stato aggiornato il pacchetto: i maintainer dei pacchetti kernel-image infatti applicano al kernel alcune patch contenenti i fix piu' importanti scoperti dalla data di rilascio del kernel ufficiale. Ogni volta che si rende necessario aggiungere delle patch e rilasciare dei nuovi pacchetti il numero di "release" viene incrementato. - "architettura" indica per quale architettura e' stato ottimizzato il kernel. La scelta del kernel giusto dovrebbe essere a questo punto abbastanza ovvia. Supponiamo di avere un sistema dual athlon: in tal caso si installera' il pacchetto: kernel-image-2.4.21-5-k7-smp ovvero la versione 2.4.21 del kernel ufficiale (-2.4.21) con aggiunta la 5^ versione della patch mantenuta dagli sviluppatori Debian (-5) e ottimizzato per sistemi multiprocessore (-smp) che montano Athlon K7 (-k7). Ovviamente se decideste di installare il pacchetto kernel-image-2.4.21-5-386, il sistema partirebbe comunque, semplicemente non avreste delle prestazioni ottimali. Di cosa si compone un pacchetto kernel-image -------------------------------------------- I pacchetti kernel-image si compongono generalmente delle seguenti parti: - l'immagine del kernel - i moduli che possono essere inseriti nel kernel - un _eventuale_ ramdisk "initrd" Il kernel viene posizionato in /boot/vmlinuz-x-y-z. I moduli vengono installati nella directory /lib/modules/x.y.z/ L'initrd viene installato in /boot/initrd.img-x-y-z initrd e' l'immagine compressa di un disco che puo' essere acceduta dal kernel ancora prima che il sistema sia stato avviato. In essa vengono di solito salvati tutti quei moduli che sono necessari per accedere al disco e che allo stesso tempo non e' possibile compilare staticamente all'interno del kernel per motivi di spazio. Vengono inoltre creati i seguenti file: - /boot/config-x.y.z: file di configurazione utilizzato per compilare il kernel. - /usr/share/doc/kernel-image-x.y.z: directory contenente varie informazioni riguardo l'immagine del kernel, tra cui la ver. del compilatore e delle librerie utilizzate in fase di compilazione (si veda il file buildinfo.gz) - /lib/modules/x.y.z/build: symlink che punta alla directory contenente i sorgenti del kernel o, nel caso mancassero, i soli header. Cautela ------- Per evitare che il sistema diventi non avviabile nel caso l'aggiornamento del kernel fallisca, e' consigliabile per prima cosa creare un disco di avvio di emergenza con il comando: # mkboot /boot/vmlinuz-2.4.21-5-k7 E' possibile anche utilizzare il 1^ cdrom di installazione di Debian per effettuare un boot di emergenza: e' sufficiente che quando appare il prompt "boot:" scriviate: rescbf24 root=/dev/XXXX Prima di poter utilizzare questo metodo e' necessario conoscere quale sia la vostra partizione di root, percio' prima di upgradare il kernel e riavviare, eseguite il comando: # rdev | cut -d ' ' -f 1 e segnatevi il suo output. Prepararsi a sostituire il kernel --------------------------------- Occorre modificare il file /etc/kernel-img.conf. Il mio consiglio e' di inserire le seguenti opzioni di configurazione: clobber_modules=yes do_symlinks=no do_bootfloppy=no do_bootloader=no relink_build_link=yes Sostituire il kernel -------------------- Supponiamo di stare utilizzando il kernel 2.4.21-5-k7 e di voler upgradare a kernel-image-2.4.22-1-k7. 1) Si esegua: # apt-get install kernel-image-2.4.22-1-k7 2) Si verifichi il contenuto del pacchetto con: # dpkg -L kernel-image-2.4.22-1-k7 | more 2) Si aggiungano al file /etc/lilo.conf le seguenti righe: image=/boot/vmlinuz-2.4.22-1-k7 label=2.4.22-1-k7 initrd=/boot/initrd.img-2.4.22-1-k7 read-only optional 3) Si esegua: # lilo -v -t e si controlli di avere il seguente output: Boot image: /boot/vmlinuz-2.4.22-1-k7 Mapping RAM disk /initrd.img -> boot/initrd.img-2.4.22-1-k7 Added 2.4.22-1-k7 Se appare una riga che comincia con "Fatal" allora avete commesso un errore in una delle precedenti fasi e non potete continuare la procedura. 4) Si esegua: # lilo -v # lilo -R 2.4.22-1-k7 # reboot 5) Nel caso il sistema riparta correttamente con il nuovo kernel (verificare con uname -r) si imposti come default il nuovo kernel: nel file /etc/lilo.conf si modifichi la seguente riga: default=2.4.22-1-k7 e si esegua: # lilo -v -t && lilo -v Custom kernel ------------- Supponiamo di stare utilizzando il kernel 2.4.22-1-k7. Supponiamo inoltre che sia appena uscito il kernel 2.4.23 e che non esista ancora un pacchetto .deb di tale kernel, oppure che si preferisca compilarlo da soli eventualmente rimuovendo alcune parti che non ci interessano. Supponiamo di voler inoltre avere l'ultima versione del supporto per ACPI, non inclusa nel kernel ufficiale. 1) Scaricate il file ftp://ftp.it.kernel.org/pub/linux/kernel/v2.4/linux-2.4.23.tar.bz2 in /usr/src 1b) Scaricate il file ftp://ftp.it.kernel.org/pub/linux/kernel/v2.4/linux-2.4.23.tar.bz2.sign Verificate l'autenticita' dei sorgenti del kernel con: # gpg --keyserver wwwkeys.pgp.net --recv-keys 0x517D0F0E # gpg --verify linux-2.4.23.tar.bz2.sign linux-2.4.23.tar.bz2 2) Scaricate in /usr/src le patch di vostro interesse (nel nostro caso http://ftp.kernel.org/pub/linux/kernel/people/lenb/acpi/patches/release/2.4.23/acpi-20031203-2.4.23.diff.bz2) 3) Decomprimete il kernel: # cd /usr/src/ # tar xvjf linux-2.4.23.tar.bz2 # mv linux linux.old # ln -s linux-2.4.23 linux 4) Applicate le eventuali patch: # cd /usr/src/linux # bzip2 -dc ../acpi-20031203-2.4.23.diff.bz2 | patch -p1 NB: scegliete sempre la versione della patch adatta ai sorgenti del kernel che state utilizzando. NB2: se la patch ha estensione .gz anziche' .bz2 o .bz, usate gzip anziche' bzip2. 5) Copiate il file di configurazione del kernel correntemente in uso: # cp /boot/config-`uname -r` /usr/src/linux/.config in modo da non dover riconfigurare il kernel da zero e poter riutilizzare la configurazione attualmente in uso. 6) Eventualmente riconfigurate il kernel, togliendo quello che non vi serve e aggiungendo quello che vi serve e non e' stato abilitato nel kernel precompilato: # cd /usr/src/linux-2.4.23 # make menuconfig NB: per utilizzare menuconfig occorre installare il pacchetto libncurses5-dev 7) Ricompilate il kernel e i moduli: # cd /usr/src/linux-2.4.23 # make-kpkg kernel_image Il programma "make-kpkg" fa parte del pacchetto kernel-package. 8) Verra' creato un file in /usr/src con un nome del tipo: kernel-image-2.4.23_10.00.Custom_i386.deb Potete verificarne il contenuto con: # dpkg -L /usr/src/kernel-image-2.4.23_10.00.Custom_i386.deb | more 9) Installate il kernel con: # dpkg -i /usr/src/kernel-image-2.4.23_10.00.Custom_i386.deb 10) Aggiungete a /etc/lilo.conf la seguente sezione: image=/boot/vmlinuz-2.4.23 label=2.4.23 read-only optional NB: nei kernel Custom difficilmente utilizzerete un initrd. 11) Eseguite: # lilo -v -t e controllate di avere il seguente output: Boot image: /boot/vmlinuz-2.4.23 Added 2.4.23 Se appare una riga che comincia con "Fatal" allora significa che avete commesso un errore in una delle precedenti fasi e non potete continuare la procedura. 12) Eseguite: # lilo -v # lilo -R 2.4.23 # reboot Moduli di terze parti --------------------- Debian dispone di alcuni pacchetti contenenti moduli sviluppati da terze parti che non possono essere inclusi nel kernel. Esempi di questi moduli sono i driver per le schede NVidia (nvidia-kernel-source) e i driver per i modem Smart Link (sl-modem-source); altri esempi possono essere visualizzati con il comando: # apt-cache search "\-source$" La compilazione di questi moduli richiede la presenza degli header del kernel con il quale verranno utilizzati. Supponiamo di voler installare i driver per i modem Smart Link. Si possono presentare due situazioni. - se state usando un kernel precompilato, ad es. 2.4.22-1-k7: 1) Installate i seguenti pacchetti: # apt-get install kernel-headers-2.4.22-1-k7 # apt-get install module-assistant # apt-get install sl-modem-source 2) Eseguite: # module-assistant auto-install sl-modem-source - se avete compilato un vostro kernel, ad es. 2.4.23 1) Eseguite: # apt-get install sl-modem-source # cd /usr/src # tar xvjf sl-modem.tar.bz2 # cd /usr/src/linux-2.4.23 # make-kpkg kernel_image 2) Installate il pacchetto appena prodotto con: # dpkg -i /usr/src/sl-modem-modules-2.4.23_2.9.1-1+2.4.23_i386.deb