969c05db00568956836ea4bafe8cc1fd63fa949a
[gapil.git] / session.tex
1 \chapter{Sessioni di lavoro}
2 \label{cha:session}
3
4 Esamineremo in questo capitolo le modalità in cui sono organizzati i processi
5 all'interno del sistema e le varie relazioni che intercorrono fra di essi, e
6 le modalità che permettono, a partire dall'avvio del sistema, di organizzare
7 il lavoro degli utenti in sessioni di lavoro associate ai terminali di
8 controllo con cui essi si sono collegati al sistema.
9
10 \section{La procedura di login}
11 \label{sec:sess_login}
12
13 L'organizzazione del sistema del \textit{Job Control}\footnote{viene
14   usualmente chiamata così la capacità del sistema di poter gestire più
15   processi (i \textit{job}) lanciati in contemporanea a partire da una shell,
16   di solito associata al terminale su cui si è appunto effettuato il login, in
17   modo da poter gestire la possibile presenza di più di un processo che
18   necessita di accedere a quest'ultimo.} è strettamente connessa alle modalità
19 con cui un utente accede al sistema, collegandosi ad esso con un terminale,
20 che sia questo realmente tale, come un VT100 collegato ad una seriale o
21 virtuale, come quelli associati a schermo e tastiera, o semplicemente
22 associato ad una connessione di rete. Per questo motivo in questa prima
23 sezione prenderemo in esame le modalità di come avviene tutto ciò e di come il
24 sistema (a partire da \cmd{init}) sia in grado di gestire il tutto.
25
26
27 \subsection{Il login su terminale}
28 \label{sec:sess_tty_log}
29
30 La modalità più classica di accesso ad un sistema Unix è quella del login su
31 terminale, che pertanto esamineremo per prima. Abbiamo già brevemente
32 illustrato in \secref{sec:intro_kern_and_sys} le modalità con cui il sistema
33 si avvia, e di come, a partire da \cmd{init}, vengano lanciati tutti gli altri
34 programmi. Adesso prenderemo in esame in maniera dettagliata le modalità con
35 cui si arriva a fornire ad un utente la shell che gli permette di lanciare i
36 suoi comandi.
37
38 Nella maggior parte delle distribuzioni di GNU/Linux\footnote{fa eccezione la
39   distribuzione \textit{Slackware}, come alcune distribuzioni su dischetto, ed
40   altre distribuzioni dedicate a compiti limitati e specifici.}  viene usata
41 la procedura di avvio di System V; questa prevede che \cmd{init} legga dal
42 file di configurazione \file{/etc/inittab} quali programmi devono essere
43 lanciati, ed in quali modalità, a seconda del cosiddetto \textit{run level},
44 anch'esso definito nello stesso file.
45
46 Tralasciando la descrizione del sistema dei run level, (per il quale si
47 rimanda alla lettura della pagina di manuale di \cmd{init} e di
48 \file{inittab}) quello che comunque viene sempre fatto è di lanciare almeno
49 una istanza di un programma che permetta l'accesso ad un terminale.
50
51 Un terminale, che esso sia un terminale effettivo, attaccato ad una seriale o
52 ad un altro tipo di porta di comunicazione, o una delle console virtuali
53 associate allo schermo, viene sempre visto attraverso attraverso un device
54 driver che ne presenta un'interfaccia comune su un apposito file di
55 dispositivo. Storicamente i primi terminali erano appunto terminali di
56 telescriventi (\textit{teletype}), da cui deriva sia il nome dell'interfaccia,
57 \textit{tty}, che quello dei relativi file di dispositivo, che sono sempre
58 della forma \texttt{/dev/tty*}.
59
60 Per controllare i terminali si usa di solito il programma \cmd{getty} (od una
61 delle sue varianti), che permette di mettersi in ascolto sugli stessi. Alla
62 radice della catena che porta ad una shell per i comandi perciò c'è sempre
63 \cmd{init} che esegue prima una \func{fork} e poi una \func{exec} per lanciare
64 una istanza di questo programma su un terminale, il tutto ripetuto per
65 ciascuno dei terminali che si hanno a disposizione (o per un certo numero di
66 essi, nel caso delle console virtuali), secondo quanto indicato
67 dall'amministratore in \file{/etc/inittab}.
68
69 Il programma viene lanciato da \texttt{init} con i privilegi di
70 amministratore, e con un ambiente vuoto; \cmd{getty} si cura di aprire il
71 terminale in lettura sullo standard input ed in scrittura sullo standard
72 output e sullo standard error, di effettuare, qualora servano, ulteriori
73 settaggi,\footnote{ad esempio, come qualcuno si sarà accorto scrivendo un nome
74   di login in maiuscolo, può effettuare la conversione in minuscole
75   automaticamente, ponendosi in una modalità speciale che non distingue fra i
76   due tipi di caratteri (a beneficio di vecchi terminali che non supportano le
77   minuscole).} ed infine di stampare un messaggio di benvenuto e porsi in
78 attesa dell'immissione del nome di un utente.
79
80 Una volta che si sia immesso un nome di login \cmd{getty} esegue il programma
81 \cmd{login} con una \func{exevle}, passando come argomento la suddetta stringa
82 ed un ambiente opportunamente costruito che contenga quanto necessario (ad
83 esempio di solito viene opportunamente inizializzata la variabile di ambiente
84 \texttt{TERM}) ad identificare il terminale su cui si sta operando, a
85 beneficio dei programmi che verranno lanciati in seguito.
86
87 A sua volta \cmd{login}, che mantiene i privilegi di amministratore, usa il
88 nome dell'utente per effettuare una ricerca nel database degli
89 utenti,\footnote{in genere viene chiamata \func{getpwnam}, che abbiamo visto
90   in \secref{sec:sys_user_group}, per leggere la password e gli altri dati dal
91   database degli utenti.} e richiede una password. Se l'utente non esiste o se
92 la password non corrisponde\footnote{il confronto non viene effettuato con un
93   valore in chiaro; quanto immesso da terminale viene invece a sua volta
94   criptato, ed è il risultato che viene confrontato con il valore che viene
95   mantenuto nel database degli utenti.} la richiesta viene ripetuta un certo
96 numero di volte dopo di che \cmd{login} esce ed \cmd{init} provvede a
97 rilanciare un'altra istanza di \func{getty}.
98
99 Se invece la password corrisponde a questo punto \cmd{login} esegue
100 \func{chdir} per settare la \textit{home directory} dell'utente, cambia i
101 diritti di accesso al terminale (con \func{chown} e \func{chmod}) per
102 assegnarne la titolarità all'utente ed al suo gruppo principale, assegnandogli
103 al contempo i diritti di lettura e scrittura. Inoltre il programma provvederà
104 a costruire gli opportuni valori per le variabili di ambiente, come
105 \texttt{HOME}, \texttt{SHELL}, ecc. Infine attraverso l'uso di \func{setuid},
106 \func{setpid} e \func{initgroups} verrà cambiata l'identità del proprietario
107 del processo, infatti, come spiegato in \secref{sec:proc_setuid}, avendo
108 invocato tali funzioni con i privilegi di amministratore, tutti gli userid ed
109 i groupid (reali, effettivi e salvati) saranno settati a quelli dell'utente.
110
111 A questo punto \cmd{login} provvederà (fatte salve eventuali altre azioni
112 iniziali, come la stampa di messaggi di benvenuto o il controllo della posta)
113 ad eseguire con un'altra \func{exec} la shell di login, che si troverà con un
114 ambiente già pronto e con file standard di \secref{sec:file_std_descr}
115 impostati sul terminale, pronta ad eseguire i comandi fino all'uscita. Dato
116 che il processo genitore resta sempre \cmd{init} quest'ultimo provvederà,
117 ricevendo un \macro{SIGCHLD} all'uscita della shell, a rilanciare \cmd{getty}
118 per ripetere da capo tutto il procedimento.
119
120
121 \subsection{Il login via rete}
122 \label{sec:sess_net_log}
123
124 Nel caso di un login via rete la cosa si fa leggermente diversa, in tal caso
125 infatti non essendo possibile prevedere 
126
127
128 \subsection{Il login attraverso X}
129 \label{sec:sess_X_log}
130
131 Quanto scritto finora riguardo i terminali è piuttosto diverso quando si ha a
132 che fare con X. In tal caso infatti la procedura grafica per il login è
133 gestira da un apposito programma (il cosiddetto \textit{Display Manager}, come
134 \cmd{xdm}, che fa parte della distribuzione base di X o uno dei suoi molti
135 cloni) che viene lanciato all'avvio insieme agli altri demoni, e che si cura
136 di gestire la procedura di login, lanciare eventuali programmi che si vogliono
137 attivare all'avvio (sia fondamentali, come il gestore delle fineste, che
138 effimeri, come un notificatore di posta in arrivo).
139
140 In questo caso q
141
142 \section{Il \textit{Job control}}
143 \label{sec:sess_job_control}
144
145 Lo scopo del \textit{Job control} è quello di permettere ad un utente di poter
146 sfruttare le capacità multitasking di un sistema Unix per eseguire in
147 contemporanea più processi, pur potendo accedere, di solito, ad un solo
148 terminale,\footnote{con X e con i terminali vituali tutto questo non è più
149   vero, dato che si può accedere a molti terminali in contemporanea, ma il
150   sistema è nato prima dell'esistenza di tutto ciò.} avendo cioè un solo punto
151 in cui su può avere accesso all'input ed all'output degli stessi.
152
153
154
155 \subsection{La struttura di base}
156 \label{sec:sess_relation}
157
158
159
160
161 \subsection{I \textit{process group}}
162 \label{sec:sess_proc_group}
163
164
165
166 \subsection{Le sessioni}
167 \label{sec:sess_sessions}
168
169
170
171 \subsection{Il terminale di controllo}
172 \label{sec:sess_ctrl_term}
173
174
175
176 \subsection{La shell e i programmi}
177 \label{sec:sess_shell}
178
179
180 %%% Local Variables: 
181 %%% mode: latex
182 %%% TeX-master: "gapil"
183 %%% End: