LKN: Installare ed Avviare con un Kernel

Da Guide@Debianizzati.Org.
Versione del 22 ago 2007 alle 18:13 di TheNoise (discussione | contributi) (aggiunto link pdf originale)
Vai alla navigazione Vai alla ricerca

Torna all'indice: Linux Kernel in a Nutshell

I precedenti capitoli hanno mostrato come scaricare e compilare il kernel. Ora che si ha un file eseguibile -- con tutti i moduli compilati -- è ora di installare il kernel e provare a fare il boot. In questo capitolo, a differenza dei precedenti, tutti i comandi necessitano di essere eseguiti come utente root. Questo può essere fatto anteponendo ad ogni comando sudo, usando il comando su per diventare root, oppure accedendo come root.

Per vedere se si ha sudo installato e gli appropriati diritti di accesso, lanciate:

  $ sudo ls ~/linux/linux-2.6.17.11/Makefile
  Password:
  Makefile

Inserite la vostra password personale al prompt di password, o la password dell'amministratore di sistema (root). La scelta dipende da come il comando di sudo è stato impostato. Se non ci sono problemi, e si vede una riga che contiene:

 Makefile 

allora potete passare alla prossima sezione.

Se sudo non è installato o non si hanno i diritti appropriati, si provi ad usare il comando su:

  $ su
  Password:
  # exit
  exit
  $

Al prompt della password, inserite la password dell'amministratore di sistema (root). Quando su accetta con successo la password, si è trasferiti ad eseguire ogni cosa con i pieni privilegi di root. State molto attenti mentre siete root, e fate solo il minimo necessario; dopodiché uscite dal programma per tornare con il vostro utente normale.


Usare uno script di installazione di una distribuzione

Quasi tutte le distribuzioni hanno uno script chiamato installkernel che può essere usato dal sistema di creazione del kernel per installarne uno pronto automaticamente nel giusto posto e per modificare il bootloader così che nulla di più debba essere fatto dallo sviluppatore *.

Le distribuzioni offrono installkernel solitamente in un pacchetto chiamato mkinitrd, provate ad installare 
questo pacchetto se non trovate lo script sulla vostra macchina.

Se avete compilato qualsiasi modulo e volete usare questo metodo per installare un kernel, inserite:

# make modules_install

Questo installerà tutti i moduli che avete compilato e li metterà nelle appropriate locazioni del filesystem per farli trovare correttamente dal nuovo kernel. I moduli sono posti in /lib/modules/kernel_version, dove per kernel_version si intende la versione del nuovo kernel che state preparando.

Dopo che i moduli sono stati installati con successo, l'immagine principale del kernel deve essere installata:

# make install

Questo causerà:

1. Il sistema di creazione del kernel verificherà che il kernel sia stato correttamente costruito.

2. Il sistema di creazione copierà la parte statica nella directory /boot e rinominerà l'eseguibile sulla base della versione del kernel.

3. Qualsiasi immagine di ramdisk iniziale necessaria verrà creata automaticamente, usando i moduli che sono appena stati installati durante la fase di modules_install.

4. Al programma di bootloader verrà correttamente notificato che un nuovo kernel è presente, e verrà aggiunto nel giusto menu così che l'utente possa selezionarlo la prossima volta che la macchina verrà avviata.

5. Dopo questo ha finito, il kernel è installato con successo, si può tranquillamente riavviare e provare la nuova immagine di kernel. Notare che questa installazione non sovrascrive nessuna vecchia immagine dei kernel, così se c'è un problema con la vostra nuova immagine del kernel, il vecchio kernel potrà essere selezionato al boot time.

 * Eccezioni da riportare a questa regola sono Gentoo e altre distribuzioni tipo "from scratch", le quali si
 aspettano che l'utente sappia come installare i kernel da solo. Questi tipi di distribuzioni includono la 
 documentazione su come installare un nuovo kernel, si consulti quest'ultima per l'esatto metodo richiesto.

Installazione manuale

Se la distribuzione non è provvista del comando installkernel, o si desidera semplicemente fare il lavoro a mano per capire i passi che servono, eccoli qua:

I moduli devono essere installati:

  # make modules_install 

L'immagine statica del kernel deve essere copiata nella directory /boot. Per un kernel basato su piattaforma i386, fare:

  
  # make kernelversion 
  2.6.17.11

Notare che la versione del kernel probabilmente sarà differente da quella del vostro. Usate questo valore al posto del testo KERNEL_VERSION nei seguenti passaggi:

  # cp arch/i386/boot/bzImage /boot/bzImage-KERNEL_VERSION
  # cp System.map /boot/System.map-KERNEL_VERSION

Modificate il bootloader in modo che conosca il nuovo kernel. Questo implica modificare il file di configurazione per il bootloader che si usa, è spiegato più avanti in "Modificare il bootloader per il nuovo kernel" in GRUB e LILO.

Se il processo di avvio non funziona, solitamente è perché una immagine iniziale di ramdisk (initial ramdisk) è necessaria. Per crearla correttamente, si usino i passi all'inizio di questo capitolo per installare un kernel automaticamente, poiché lo script di installazione della distribuzione sa come creare adeguatamente il ramdisk usando gli script e gli strumenti necessari. Dato che ogni distribuzione fa questo in maniera differente, è oltre lo scopo di questo libro ricoprire tutti i differenti metodi di costruzione dell'immagine di ramdisk.

Qui c'è uno script comodo che può essere usato per installare un kernel automaticamente invece di dover digitare tutti i precedenti comandi ogni volta:

  #!/bin/sh
  #
  # installs a kernel
  #
  make modules_install

  # find out what kernel version this is
  for TAG in VERSION PATCHLEVEL SUBLEVEL EXTRAVERSION ; do
    eval `sed -ne "/^$TAG/s/ //gp" Makefile`
  done
  SRC_RELEASE=$VERSION.$PATCHLEVEL.$SUBLEVEL$EXTRAVERSION

  # figure out the architecture
  ARCH=`grep "CONFIG_ARCH " include/linux/autoconf.h | cut -f 2 -d "\""`

  # copy the kernel image
  cp arch/$ARCH/boot/bzImage /boot/bzImage-"$SRC_RELEASE"

  # copy the System.map file
  cp System.map /boot/System.map-"$SRC_RELEASE"

  echo "Installed $SRC_RELEASE for $ARCH"


Modificare il bootloader per il nuovo kernel

Esistono due bootloader comuni per i kernel Linux: GRUB e LILO. GRUB è quello maggiormente usato nelle distribuzioni moderne, e fa' alcune cose un po' più facilmente di LILO, ma LILO é tuttora anch'esso utilizzato. Li vedremo entrambi in questa sezione.

Per determinare quale bootloader il vostro sistema usa, guardate nella directory /boot/. Se esiste una sottodirectory grub:

  $ ls -F /boot | grep grub
  grub/

allora si sta utilizzando GRUB come programma per fare il boot. Se questa directory non è presente, si guardi se è presente il file /etc/lilo.conf:

  $ ls /etc/lilo.conf
  /etc/lilo.conf

se è presente, state usando LILO come programma per fare il boot. I passi che implicano l'aggiunta del nuovo kernel a ognuno di questi programmi sono differenti, per cui si segua solo la sezione che corrisponde al programma che si sta usando.

GRUB

Per fare in modo che GRUB sappia che un nuovo kernel è presente, tutto ciò che dovete fare è modificare il file /boot/grub/menu/lst. Per i dettagli completi della struttura di questo file, e tutte le differenti opzioni disponibili, consultate le pagine di info di GRUB:


$ info grub


Il metodo più veloce per aggiungere una nuova voce kernel a /boot/grub/menu.lst è quello di copiare una voce già esistente. Per esempio, considerate il seguente menu.lst da un sistema Gentoo:

  timeout 300
  default 0

  splashimage=(hd0,0)/grub/splash.xpm.gz

  title 2.6.16.11
    root (hd0,0)
    kernel /bzImage-2.6.16.11 root=/dev/sda2 vga=0x0305

  title 2.6.16
    root (hd0,0)
    kernel /bzImage-2.6.16 root=/dev/sda2 vga=0x0305

La linea che comincia con la parola title definisce una nuova voce di kernel, in questo modo questo file contiene due voci. Copiate semplicemente un blocco di linee che cominciano con la linea title, come:

  title 2.6.16.11
    root (hd0,0)
    kernel /bzImage-2.6.16.11 root=/dev/sda2 vga=0x0305

Dopodiché aggiungete il blocco alla fine del file, e modificate il numero di versione con la nuova versione del nuovo kernel che si è appena installato. Il titolo non ha alcuna importanza, purché unico, ma visualizzato nel menu di boot, per cui si dovrebbe dargli qualcosa che abbia un significato. Nel nostro esempio, abbiamo installato il kernel 2.6.17.11, per tanto la copia finale del file assomiglierà a:

  timeout 300
  default 0

  splashimage=(hd0,0)/grub/splash.xpm.gz

  title 2.6.16.11
    root (hd0,0)
    kernel /bzImage-2.6.16.11 root=/dev/sda2 vga=0x0305

  title 2.6.16
    root (hd0,0)
    kernel /bzImage-2.6.16 root=/dev/sda2 vga=0x0305

  title 2.6.17.11
    root (hd0,0)
    kernel /bzImage-2.6.17.11 root=/dev/sda2 vga=0x0305

Dopo che si è salvato il file, riavviate il sistema e assicuratevi che il titolo della nuova immagine del kernel sia presente nel menu di boot. Usate la freccia verso il basso per evidenziare la versione del nuovo kernel, e premete enter per avviare la nuova immagine.

LILO

Per fare in modo che LILO sappia che un nuovo kernel è presente, dovete modificare il file di configurazione /etc/lilo.conf ed eseguire il comando lilo per applicare le modifiche fatte al file di configurazione. Per i dettagli completi sulla struttura del file di configurazione di LILO, consultate la manpage di LILO:

$ man lilo

Il modo più facile per aggiungere una nuova voce di kernel nel file /etc/lilo.conf è copiare una voce esistente. Per esempio, considerate il seguente file di configurazione di LILO di un sistema Gentoo:

  boot=/dev/hda
  prompt
  timeout=50
  default=2.6.12

  image=/boot/bzImage-2.6.15
    label=2.6.15
    read-only
    root=/dev/hda2

  image=/boot/bzImage-2.6.12
    label=2.6.12
    read-only
    root=/dev/hda2

La linea che comincia con la parola image= definisce una nuova voce kernel, quindi questo file contiene due voci. Copiate semplicemente un blocco di linee che cominciano con image=, come:

  image=/boot/bzImage-2.6.15
    label=2.6.15
    read-only
    root=/dev/hda2

Aggiungete dopo il blocco alla fine del file, e modificate il numero di versione per contenere quella del nuovo kernel appena installato. La label non ha alcuna importanza, purché unica, ma è visualizzata nel menu di boot, per cui dovreste dargli qualcosa di sensato. Nel nostro esempio, abbiamo installato il kernel 2.6.17.11, per cui la copia finale del file sarà:

  boot=/dev/hda
  prompt
  timeout=50
  default=2.6.12

  image=/boot/bzImage-2.6.15
    label=2.6.15
    read-only
    root=/dev/hda2

  image=/boot/bzImage-2.6.12
    label=2.6.12
    read-only
    root=/dev/hda2

  image=/boot/bzImage-2.6.17
    label=2.6.17
    read-only
    root=/dev/hda2

Dopo aver salvato il file, lanciate il programma /sbin/lilo per salvare i cambiamenti del file di configurazione nella sezione di boot del disco:

 # /sbin/lilo 

Ora il sistema può essere riavviato in sicurezza. La scelta del nuovo kernel si può vedere tra le scelte disponibili al momento del boot. Usate la freccia verso il basso per evidenziare la versione del nuovo kernel, premete Invio per avviare la nuova immagine.



This is an indipendent translation of the book Linux Kernel in a Nutshell by Greg Kroah-Hartman. This translation (like the original work) is available under the terms of Creative Commons Attribution-ShareAlike 2.5.


Capitolo originale