Continua dall'articolo precedente

Iniziamo quindi dal punto 1 e aggiungiamo il boot manager alla scheda compact flash:

# grub-install --root-directory=/mnt/cf /dev/sda


Con questo comando installiamo il boot manager sulla scheda di memoria (/dev/sda) indicandogli però di prendere i dati presenti in /mnt/cf (se non facciamo questo comando, grub-install userà la /boot della macchina virtuale). Non preoccupatevi se vengono fuori errori relativi a fd0 (il floppy), ma verificate che alla fine grub riporti esito positivo (immagino che i messaggi ci siano perchè GRUB si aspetta un floppy che sulla mia VM non esisteva).
Al termine GRUB riporterà anche il contenuto del file device.map che indica appunto la mappatura tra i device disco e gli "alias" usati da grub nel suo file di configurazione:

(fd0)    /dev/fd0
(hd0)    /dev/hda
(hd1)    /dev/sda


Personalmente non ho avuto bisogno di modificare questa configurazione dato che il disco che userò per il boot è proprio /dev/hda ovvero hd0 nella sintassi GRUB.
 

Per far funzionare GRUB è necessario un file di configurazione (grub.conf) che indichi a grub stesso da dove caricare il sistema operativo: anche in questo caso, anzichè partire da zero, ho preferito copiare


# cp /boot/grub/grub.conf /mnt/cf/boot/grub

e modificare il grub.conf della macchina virtuale (le modifiche sono al solito riportate in rosso)


serial --unit=0 --speed=38400 --word=8 --parity=no --stop=1
terminal serial

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
#          initrd /initrd-version.img
#boot=/dev/hda
default=0
timeout=5
#splashimage=(hd0,0)/grub/splash.xpm.gz
#hiddenmenu

title CentOS (2.6.18-194.el5)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.18-194.el5 ro root=/dev/hda1 console=ttyS0,38400n8
        initrd /boot/initrd-2.6.18-194.el5.img


Vediamo di commentare queste righe, in ordine di apparizione:

  1. Il comando serial definisce i parametri della porta seriale da utilizzare (i nomi delle varie voci dovrebbero essere chiari). Attenzione! molte guide su Internet si fermano al parametro speed senza poi indicare gli altri. La mia esperienza personale però mi dice che è necessario aggiungere anche tutte le altre voci affinchè il tutto funzioni (e d'altra parte una poveria seriale ne abbisogna!)
  2. La voce terminal indica a GRUB quale dispositivo di output utilizzare: terminal serial significa quindi "GRUB, usa la seriale per inviare i tuoi messaggi" (è il completamento della riga precedente).
  3. Le voci splashimage hiddenmenu sono state commentate: la prima indica l'immagine grafica di sfondo da utilizzare (e ovviamente su una seriale di grafico c'è ben poco...) mentre la seconda serve a nascondere il meù di GRUB (e personalmente invece voglio vedere il meù).
  4. Veniamo ora alle modifiche nella riga kernella prima cosa che si deve aggiungere riguarda la redirezione della console (console=porta,velocità - La ALIX ha una sola seriale per cui il valore da usare è ttyS0 (= COM1))  verso la seriale. In questo modo sarà possibile vedere, durante il boot, tutti i messaggi del kernel. Inoltre, è necessario modificare il percorso della root: dato che la CF viene vista come un disco IDE, la root userà la normale sintassi di tali dischi e quindi /dev/hdxy. L'installazione è avvenuta nella prima partizione, ecco quindi spiegato il perchè del /dev/hda1. Infine, ho aggiunto il percorso completo per le immagini del kernel e di initrd: nella versione originale il /boot non c'era ma non so spiegarmi il perchè (forse perchè l'originale usava LVM? Se qualcuno mi spiega perchè qui ci vuole e nella mia VM no gliene sarò grato).
     

Il passo successivo consiste nella creazione del file /etc/fstab che viene usato da Linux per sapere quali dischi montare. Anche in questo caso, per fare prima, conviene prendere il file della macchina virtuale

# cp /etc/fstab /mnt/cf/etc/

e modificarlo come segue (si, non uso vi, qualche problema?):
# nano /mnt/cf/etc/fstab

/dev/hda1           /              ext3    defaults,noatime,nodiratime     1 1
tmpfs               /dev/shm       tmpfs   defaults        0 0
devpts              /dev/pts       devpts  gid=5,mode=620  0 0
sysfs               /sys           sysfs   defaults        0 0
proc                /proc          proc    defaults        0 0
# /dev/VolGroup00/LogVol01 swap                    swap    defaults     0 0

Solite breve spiegazioni per evitare di essere dei pigiabottoni:

  1. Nella prima riga riportiamo nuovamente il percorso che verrà montato come root, nella stessa forma già vista precedentemente. Nelle opzioni per il mount però sono state specificate le voci noatime e nodiratime :
    • No noatime significa che Linux NON deve tenere traccia degli accessi in lettura ai files: normalmente infatti Linux tiene traccia anche quando si apre un file per sola lettura. Dato che l'informazione viene scritta sul disco, questa operazione comporta un aumento dei cicli di scrittura, che è proprio quello da evitare sulle CF.
    • Il nodiratime ha lo stesso significato del precedente, solo che si applica alle directories e non ai files.
  2. La riga con lo swap è stata commentata in quanto non vogliamo usarlo per evitare troppi cicli di scrittura.

Adesso è necessario dire al sistema operativo che sulla nostra piattaforma la console è seriale: il comando che abbiamo messo nel grub.conf, infatti, serve soltanto in fase di inizializzazione della macchina; una volta che il "boot" è terminato il controllo passa ad altri oggetti che non sanno minimamente di dover usare la seriale come console.
La modifica viene fatta sui due files /etc/inittab e /etc/securetty che, ricordiamo, stanno in /mnt/cf/.

Iniziamo con inittab ovvero con /mnt/cf/inittab (stavolta non è necessario copiarlo dato che il file è già presente nell'installazione di default)

# nano /mnt/cf/etc/fstab


# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

s0:2345:respawn:/sbin/agetty -L 38400 ttyS0 vt100


La riga rossa va aggiunta al termine del file, poco prima del "blocco" riportato sopra: mingetty è il programam che apre le console virtuali (per intendersi, quelle che si richiamano con ALT+F1 ... ALT+F6). agetty è un programma simile, solo che lavora sulla seriale anzichè sul video/tastiera.
Oltre a questo file dobbiamo anche modificare /mnt/cf/etc/securetty: questo file indica infatti tutte le console che possono essere usati da root per fare login e che normalmente non include la ttyS0. Basta quindi aggiungere ttyS0 IMMEDIATAMENTE sotto la voce console (non mi chiedete perchè ma se lo aggiungete prima di console oppure in coda al file non funziona - immagino che il modulo pam_securetty abbia al suo interno un qualche algoritmo che si aspetta di trovare le seriali proprio sotto console)..
 
# nano /mnt/cf/etc/fstab

console
ttyS0
vc/1
vc/2
....

Per poter fare gli ultimi due passaggi è utile passare in chroot sulla CF

# chroot /mnt/cf

In pratica, da questo momento in poi la root coinciderà con la root della scheda CF anzichè quella della macchina virtuale.
La prima modifica da fare riguarda la password dell'utente root: come tutti sanno, nel mondo Linux gli utenti risiedono nel file /et/passwd mentre le password (originariamente in chiaro nello stesso files) sono state spostate "criptate" all'interno di /etc/shadow. Se però guardiamo in /etc (dopo il chroot la /etc è quella della CF e non quella della VM che stavamo usando) si scopre velocemente che non c'è traccia di quest'ultimo. Per rimediare potremmo facilmente creare un file a mano, ma Linux mette a disposizione un comando che consente di "convertire" il passwd dal vecchio formato al nuovo, generando al contempo il file shadow:


# pwconv

Adesso che esiste shadow, possiamo usare il comando passwd per cambiare la password

# passwd
Changing password for user root.
New UNIX password: ****
Retype new UNIX password: ****
passwd: all authentication tokens updated successfully.


P.S. mettete una password semplice da cambiare alla fine dei giochi.
Infine dobbiamo ricompilare il file initrd per inglobare le modifiche fatte, in particolare su /etc/fstab

# cd /boot
# mv initrd.2.6.18-194.el5.img initrd.2.6.18-194.el5.img.old
# mkinitrd initrd.2.6.18-194.el5.img
2.6.18-194.el5

In pratica mkinitrd ricrea il file precedentemente rinominato prendendo i sorgenti da una specifica versione del kernel.

A questo punto siamo in grado di uscire dal chroot, smontare la CF

# exit
# umount /mnt/cf

inserirla sulla ALIX e, da un terminale seriale, vederne il boot e passare alle fasi finali.