Continua da CentOS 5.5 & ALIX - Configurazione di base

Se tutto ha funzionato alla perfezione tramite la console vedrete la vostra macchina Linux che funziona sulla scheda Alix: non vi meravigliate se, al primo boot, il sistema si lamenterà che sono trascorsi troppi giorni dall'ultimo FSCK e, dopo averlo fatto, effettuerà un reboot. La scheda Alix (almeno quella in mio possesso) non è dotata di batteria tampone e di conseguenza "perde" l'orario ad ogni reboot (meglio: la scheda in mio possesso non ha la batteria tampone che, però, puo' sempre essere saldata sulla scheda alla bisogna, come poi ho fatto successivamente ripescando una CR2032 dalla scatola delle schede elettroniche da cannibalizzare).

Per completare l'opera rimangono ancora alcune finezze da fare: la prima cosa che mi viene in mente è aggiungere i files con le impostazioni predefinite di BASH all'utente root. Non appena si fa login, per la prima volta, sulla macchina si scopre che il prompt è abbastanza scarno:

-bash-3.2#

Questo accade perchè l'utente root non è stato creato attraverso gli appositi tool (useradd tanto per capirci) ma è stato attivato dall'installazione fatta dalla CF. Per ovviare a questo problema è sufficiente copiare gli "scheletri" della bash nell'utente root:

# cp /etc/skel/bash* /root

E dopo un logoff e logon tutto dovrebbe riprendere il consueto aspetto...

[root@hostname ~]#

Come accennato nella premesas, il mio serverino utilizzerà un disco USB esterno per memorizzare tutti i files "variabili" ed i dati: in altre parole la directory /var che è normalmente indicata come punto di partenza per la parte "dati" dovrà risiedere sul disco e non sulla CF. In maniera analoga, anche la /tmp dovrà essere esterna, dato che là sopra normalmente chiunque può leggere e scrivere senza ritegno (e le scritture sono da evitare come la peste!).
Quando si collega l'unità USB, il sistema provvederà a riconoscerla ed affibbiare, al nostro disco un percorso del tipo /dev/sdx dove x è una generica lettera (e con poca fantasia, essendo l'unico device USB, la lettera sarà a). C'è un però in tutto questo ragionamento: come facciamo ad essere matematicamente sicuri che ad ogni boot il disco sarà identificato come /dev/sda? Magari potreste lasciare una chiavetta USB collegata e, al successivo boot, Linux "reindirizzerà" le risorse identificando il disco come /deb/sdb e la chiavetta come /dev/sda.

Fortunatamente arriva in nostro aiuto udev che altro non è che un demone che gestisce i dispositivi hardware in linux (almeno dal kernel 2.6 in avanti - prima c'era devfs): in pratica, udev ha il compito di creare e mantenere dinamnicamente la struttura in /dev su un sistema Linux. Una delle funzionalità offerte da udev è la possibilità di creare dei "filtri" ovvero delle regole che stabiliscono quale "nome" assegnare ad un dispositivo sulla base, ad esempio, della tipologia o del numero seriale.

Le regole di udev sono memorizzate in /etc/udev/rules.d sotto forma di un insieme di files con estensione .rules: per evitare problemi ho preferito creare un file ad hoc con la mia regola anzichè aggiungerla ai files preesistenti. Il file che ho creato si chiama:

[root@hostname ~]# touch /etc/udev/rules.d/10-local.rules

(per essere onesti non ho chiare se ci sia un motivo più o meno ovvio per chiamarlo 10-local.rules, ma così ho raccattato su Internet - non avevo troppa voglia di imparare da zero come funziona udev! Sarà per la prossima volta...wink smile).
Dopo aver aggiunto il file, ho inserito al suo interno una riga simile alla seguente:

BUS=="scsi", SYSFS{model}=="XXXXX", NAME="usbdisk%n"

Proviamo a dare qualche minima spiegazione per il poco che ho capito su udev: ogni riga è composta da due parti, una di filtro ed una di azioni. E' importante però chiarire che questo non significa che ogni riga abbia solo DUE voci, dato che i filtri e le azioni possono anche essere più di uno. A differenziare quindi il filtro dall'azione non è quindi tanto la posizione (es. il filtro viene prima dell'azione) quanto il tipo di comando.  Per capirsi meglio, riferiamoci all'esempio di cui sopia:
  • BUS=="scsi" è un filtro e significa che la regola si applica solo ai devices collegati attraverso un bus SCSI (ricordo che in Linux le USB sono viste come SCSI)
  • SYSFS{model}=="XXXXX" è un filtro e indica che la regola si applicherà solo ad un device il cui modello sia quello indicato (vedi oltre come fare a capire il modello del disco)
  • NAME="usbdisk%n" è finalmente una azione che dice ad UDEV di creare dei devices chiatati usbdiskN dove N è il numeo della partizione; ovvero, se il disco contiene 3 partizioni, verranno creati tre link dev/usbdisk1, /dev/usbdisk2 e /dev/usbdisk3


Come spiegazione è abbastanza alla buona, ma questo è quanto sono riuscito a capire (incidentalmente è anche quello che mi serviva). Per vedere il modello del disck è sufficiente dare un LSDEV e verificare l'output

Una volta assegnato un "percorso" fisso al disco USB, possiamo essere certi che in qualunque momento saremo in grado di referenziarlo sempre con lo stesso nome. La creazione delle partizioni può avvenire analogamente a quanto fatto in precendenza per partizionare la CF, ovvero con il comando FDISK: l'unica differenza è che stavolta dovremo ripetere il comando due volte, la prima volta per creare la partizione per la /tmp e la seconda per la /var:

  1. creare una nuova partizione (comandoN),
  2. specificare che si tratta di una partizione primaria (P),
  3. Specificare il numero della partizione primaria (1 essendo appunto la prima)
  4. Specificare il cilindro di inizio (lasciare pure il valore predefinito)
  5. Specificare il cilindro di fine oppure la dimensione della partizione (soluzione che ho preferito: quindi ho specificato +900M alla richiesta sul valore del cilindro finale dato che la prima partizione sarà per la /tmp)
  6. Rendere la partizione attiva con il comandoa(viene nuovamente richiesta la conferma di quale partizione attivare)
  7. Ripetere le perazioni dal punto 1 al punto 6 per la seconda partizione, con la differenza che, alla richiesta della dimensione, ho lasciato il valore predefinito per usare tutto lo spazio rimanente.
  8. Salvare le configurazioni sul disco con il comandow

A questo punto è necessario formattare la partizione ovvero, usando i termini del mondo Linux, creare un file system con il comando:

 

# mkfs.ext3 /dev/usbdisk1
# mkfs.ext3 /dev/usbdisk2


Per poi far si che la partizione 1 sia montata come /tmp è sufficiente modificare il file /etc/fstab

/dev/usbdisk1           /tmp                    ext3    defaults        0 0

A questo si aggunge un bel

# chmod 777 /tmp

In modo da dare il permesso a tutti di scrivere/leggere da /tmp (come normalmente succede).

Il problema maggiore riguarda però la /var: infatti la /var è "piena" ovvero già contiene un bel po' di roba. Se ci limitassimo a "montarla" come abbiamo fatto per la /tmp perderemmo tutto quanto presente là sopra (es. i package YUM scaricati, il suo daatabase oltre a tante altre belle cosine). Prima quindi di montarla è necessario copiare dentro la destinazione tutti i files nonchè gli altri oggetti presenti sul file system (es. link); e questa copia deve essere fatta, per stare tranquilli, quando il sistema è spento o comunque in una fase dove la /var non gli possa servire più di tanto.
Nel primo caso ci è sufficiente "rimontare" sia la CF che il disco USB sulla macchina virtuale e fare le copie. Ho trovato però più semplice lavorare direttamente dentro la macchina in modalità "single user" ovvero dopo un bel init 1: come saprete, in init1 la macchina ha ben pochi servizi attivi e non attiva il multitasking, per cui la probabilità che ci sia qualcuno che "usa" la /var è decisamente bassa (anche perchè la macchina ancora non ha niente dentro!).

Una volta in runlevel 1 è possibile montare la partizione

# mount /dev/usbdisk2 /mnt

E copiare il contenuto  da una parte all'altra  (lo ammetto: l'ho scopiazzato da Internet, io avrei a naso fatto un cp ma così si copiano anche gli oggetti "strani")

# cd /var
# find . -depth -print0 | cpio --null --sparse -pvd /mnt

E smontare il tutto

# umount /dev/usbdisk2

Naturalmente va rimodificato anche il /etc/fstab

/dev/usbdisk2           /var                    ext3    defaults        0 0

Con questo ultimo passaggio, ovviamente seguito da un riavvio, si chiude questa mini guida. Naturalmente rimane da fare tutta la normale configurazione come le schede di rete ed i servizi che volete.