  AGX's "USER PROFILES", Design & Implementation
 Release 1.6.0 dell 1999-10-14 by AGX [CANDIDATE] 
-------------------------------------------------



=================================
	La Sequenza di Boot
=================================

Dopo il boot della macchina il sistema controlla la presenza di un 
qualsiasi dispositivo di boot. Il Linux-loader di solito carica il 
kernel in memoria e monta la partizione root "/". Il kernel di linux,
a questo punto, non fa null'altro che lanciare il processo "init" 
che ha PID 1 (uno). "init" si occupera' di avviare la procedura 
di boot, interpretando le indicazioni contenute nel file /etc/inittab.

Il file /etc/inittab contiene informazioni circa i vari runlevel. Un
sistema Linux puo' essere eseguito ad uno specifico runlevel. Ad
ognuno di essi sono affidati compiti diversi
 :

	S	- eseguito una sola volta al boot;
	0	- eseguito quando si arresta il sistema;
	1	- (K), "single user mode" (modalita' a singolo utente, usata
		  per recuperare il sistema in caso di disastri);
	2 	- in genere non usato ma noi lo implementeremo come un single 
		  user mode ma con piu' console virtuali;
	3 	- (M), Full multiuser system, Sistema Multiutente (questo e'
		  il default)
	4 	- per effettuare il login grafico su un'altra macchina
	5 	- non usato
	6	- chiamato quando si effettua il riavvio del sistema.



----------------------------
Organizzazione dei Runlevels
----------------------------

Ci sono due filosofie su come organizzare gli script e le directory
relative alla sequenza di boot. BSD, la prima, e' usata dalla Slackware
e da altri sistemi Unix (AIX, ecc.). System V, la seconda, dalle altre
distribuzioni Linux, in particola la Debian. Per essere Debian-like
il piu' possibile (perche' le Policies definite da Debian sono molto
valide), viene usata la stessa struttura delle directory.

Ecco la struttura delle directory associata ad ogni runlevel: 
	S	- /etc/rcS.d/
		  /etc/rc.boot/   --> rcS.d/
	0	- /etc/rc0.d/
	1	- /etc/rc1.d/
		  /etc/rcK.d/     --> rc1.d/
	2 	- /etc/rc2.d/     --> rc1.d/
	3 	- /etc/rc3.d/
		  /etc/rcM.d/     --> rc3.d/
	4 	- /etc/rc4.d/
	5 	- /etc/rc5.d/     --> rc3.d/
	6	- /etc/rc6.d/

Di solito queste directory contengono solo dei symlinks a degli script
che risiedono in /etc/init.d/ la directory piu' importante.



--------------------
La variabile PROFILE
--------------------

Di solito Linux viene avviato tramite LILO. Questi permette di specificare
qualsiasi parametro addizionale da passare al kernel, in particolare la
variabile "PROFILE" che conterra' il nome del profilo utente da utilizzare.

Gli User Profiles sono l'equivalente degli "Hardware Profiles" di Winzozz,
quindi non usatene piu' di 1 se non ne avete bisogno !!! Di solito averne
2 o piu' e' utile solo per gli utenti di notebook che si connettono
a diversi network mentre sono 'on the road'.

Il profilo utente e' identificato dalla variabile globale PROFILE
che deve seguire le seguenti regole:
	(1) Il nome del profilo deve essere in maiuscolo;
	(2) Si possono avere anche piu' profili sulla stessa macchina;
	(3) Non si puo' cambiare profilo senza riavviare il sistema,
	    lo si desume dal fatto che le impostazioni dell'hardware
	    sono diverse;
	(4) Non usare inutilmente piu' profili, un profilo 
	    di default viene fornito automaticamente con il nome 'DEFAULT'.


La variabile PROFILE puo' essere comunicata al sistema attraverso diversi
metodi:

1) Con LILO si puo' specificare al prompt
   PROFILE=NOME_DEL_PROFILO

2) oppure, sempre con lilo, rendendolo permanente:
   APPEND="PROFILE=NOME_DEL_PROFILO"

3) con LoadLin :
   loadlin kernel_da_caricate root=/dev/tuo_root_device PROFILE=NOME_DEL_PROFILO

Se non viene settata, allora viene utilizzato l'ultimo profilo utilizzato
in precedenza, oppure il profilo di default che ha nome 'DEFAULT', appunto.



[Scleta del profilo al boot]
Ad ogni modo dopo che viene lanciato /sbin/init, in /etc/init.d/rc
vengono contati i profili disponibili. Se il numero di profili e'
maggiore di 1 viene data la possibilita' di premere 1 tasto entro 2
secondi. Se questa possibilita' si avvera, sara' allora possibile
selezionare il profilo con cui effettuare l'avvio.
Il profilo scelto dopo questo punto viene scritto comunque in /etc/agx_profile

NOTA:
Per assicurarsi che ogni shell abbia la variabile setta correttamente,
in /etc/profile viene caricato il file /etc/agx_profile.


--------------------
Cosa esegue "init"
--------------------

L'esecuzione di Linux inizia sempre con il runlevel "S", quindi init
esegue lo script /etc/init.d/rc passandogli il nome del runlevel da
avviare.

'rc' provvede a testare la viariabile PROFILE
se e' vuota viene letto il file /etc/agx_profile
CHE CONTIENE L'ULTIMO PROFILO CON SUI SI E' AVVIATO IL SISTEMA
altrimenti viene usato il profilo "DEFAULT".

Se sono presenti piu' di 2 profili sulla macchina
viene visualizzato un'apposito messaggio e si hanno a disposizione 2
secondi per poter cambiare profilo.

Se 'rc' sta avviando un runlevel vengono eseguiti gli script che iniziano
con S* prendendo il parametro 'start'. Altrimenti, se sta fermando
un runlevel vengono avviati gli script K* passando loro il parametro
'stop'.
'rc' passa anche agli script il parametro 'relaxed' che sopprime la
visualizzazione di messaggi non significativi in fase di boot.

In particolare, dopo che vengono montati i file-systems in modalita R/W,
viene eseguito /etc/init.d/clean-up che provvede ad eliminare
eventuali file temporanei. E' all'interno di questo script che abbiamo 
la riga 
	echo $PROFILE > /etc/agx_profile
che salva il profilo che stiamo usando come profilo di default
per il prossimo avvio.


Dopo aver avviato il runlevel "S", init avvia anche il runlevel 
di default che e' il "3". Infine esegue i programmi getty/mingetty 
che permettono il login degli utenti via console.



=================================
Lo scopo della variabile PROFILE
=================================

Storicamente, gli script di inizializzazione sotto Unix, contengo direttamente,
al loro interno, i parametri per la configurazione del sistema.
Lo scopo della variabile PROFILE e' quello di disacoppiare i parametri
dallo script che li utilizza. 

Il concetto e' in pratica molto semplice. Ad esempio, in una distribuzione 
classica, lo script per il settaggio del layout della tastiera contiene,
in maniera, inperativa, il comando:
	loadkey /usr/share/keytables/us.map
mentre in BP avremo:
	. /etc/sysconfig/$PROFILE/keyboard-layout
	loadkey $KEYBOARD_LAYOUT
dove, la prima riga provvede a caricare il file di configurazione,
sotto forma di variabili d'ambiente, che
 contiene le variabili 
con i parametri; e la seconda provvede ad eseguire
il programma di configurazione.

Come possiamo notare, ogni script legge un file di configurazione
contenente i valori da caricare, questo ha due vantaggi:
	1) per cambiare il valore basta modificare il file con i settaggi
	   senza toccare lo script;
	2) si possono avere diversi settaggi a seconda del PROFILE che
	   si sta usando.

Un esempio banale di cio' e' il mio portatile che ha 3 profili:
	UFFICIO, dove carico i settaggi della rete aziendale;
	TRENO, dove parto con il minimo dei servizi e senza lo swap file;
	CASA, dove parto a razzo con GNOME + "E"

OGNI SCRIPT IN /etc/init.d/* DEVE USARE QUESTA CONVENZIONE PER LEGGERE
I PARAMETRI DI CONFIGURAZIONE !



-------------------------------
     Auto configurazione
-------------------------------
Cosa accade se il file /etc/sysconfig/$PROFILE/$SERVICE contenente le
impostazioni dello script non viene trovato ?
Semplice, lo script dovra' gestire questa situazione avviando lo script
di configurazione appropriato (di solito fa parte del controlpanel).
Questo permette al sistema di configurarsi nel modo piu' semplice 
durante l'installazione, oppure, quando viene riavviato con un nuovo
profilo, oppure quando qualche parametro viene erroneamente cancellato.

Ad esempio il servizio di gestione dello swapfile, se non trova il file
di configurazione /etc/sysconfig/$PROFILE/swap provvede ad eseguire
lo script di configurazione /usr/local/lib/agx-userprofiles/swap.sh

L'assenza del file di configurazione infatti implica il solo fatto che
il servizio/device NON E' CONFIGURATO. Per la gestione dei servizi
(avvio in automatico, manuale, disabilitato) fare riferimento alla
sezione successiva.



============================
Arresto o Reboot del sistema
============================
Quando si decide di arrestare o riavviare il sistema allora tutti i servizi al
livello attuale (il 3 di default) vengono "stoppati". Di seguito 
vengono "avviati" quelli del livello "0" (halt) oppure "6" (reboot) 
ed infine vengono "stoppati" tutti i servizi del runlevel "S" fino ad 
applicare il comando desiderato (halt o reboot).

Prima della chiusura del FS alla scrittura, l'ultimo profilo usato
viene scritto in /etc/agx_lastprofile

Questo e' tutto per ora. Fare riferimento a
    controlpanel.txt    - per la spiegazione dei vari script del pannello di
                          controllo e le variabili utilizzate;
    service-manager.txt - per la descrizione dei servizi;
    packagement.txt     - per le specifiche sulla pacchettizzazione;

---------------------------------------------------------------------------
   __   _
  / /  (_)__  __ ____  __
 / /__/ / _ \/ // /\ \/ /  . .  t h e   c h o i c e   o f   a
/____/_/_//_/\_,_/ /_/\_\            G N U   g e n e r a t i o n . .

