Si prosegue con sysctl
[gapil.git] / system.tex
index 8cc2af886434136d8f085e1155bc475d53aa3890..691edbde5eac62625b6c8b7996fd8612b08de46c 100644 (file)
@@ -517,24 +517,113 @@ implementazioni. Finora abbiamo visto come si pu
 di esaminare il meccanismo che permette, quando questi possono variare durante
 l'esecuzione del sistema, di modificarli.
 
-Oltre ai precedenti poi ci sono anche tutta una serie di parametri di
-configurazione, che non essendo mai fissi non sono stati inclusi nella
+Inoltre, al di la di quelli che possono essere limiti caratteristici previsti
+da uno standard, ogni sistema può avere una sua serie di altri parametri di
+configurazione, che non essendo mai fissi, non sono stati inclusi nella
 standardizzazione della sezione precedente, e per i quali occorre, oltre al
 meccanismo di settaggio, pure un meccanismo di lettura.
 
 Affronteremo questi argomenti in questa sezione, insieme alle funzioni che si
 usano per la gestione ed il controllo dei filesystem. 
 
-\subsection{La funzione \func{sysctl}}
+
+\subsection{La funzione \func{sysctl} ed il filesystem \file{/proc}}
 \label{sec:sys_sysctl}
 
-\subsection{Il filesystem \file{/proc}}
-\label{sec:sys_proc_files}
+La funzione che permette la lettura ed il settaggio dei parametri del kernel è
+\func{sysctl}, è una funzione derivata da BSD4.4, ma l'implementazione è
+specifica di Linux; il suo prototipo è:
+\begin{functions}
+\headdecl{unistd.h}
+\headdecl{linux/unistd.h}
+\headdecl{linux/sysctl.h}
+\funcdecl{int sysctl(int *name, int nlen, void *oldval, size\_t *oldlenp, void
+  *newval, size\_t newlen)}
+
+
+\bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
+  errore, nel qual caso \var{errno} viene settato ai valori:
+  \begin{errlist}
+  \item[\macro{EPERM}] il processo non ha il permesso di accedere ad uno dei
+    componenti nel cammino specificato per il parametro, o non ha il permesso
+    di accesso al parametro nella modalità scelta.
+  \item[\macro{ENOTDIR}] non esiste un parametro corrispondente al nome
+    \param{name}.
+  \item[\macro{EFAULT}] si è specificato \param{oldlenp} zero quando
+    \param{oldval} è non nullo. 
+  \item[\macro{EINVAL}] o si è specificato un valore non valido per il
+    parametro che si vuole settare o lo spazio provvisto per il ritorno di un
+    valore non è delle giuste dimensioni.
+  \item[\macro{ENOMEM}] talvolta viene usato più correttamente questo errore
+    quando non si è specificato sufficiente spazio per ricevere il valore di un
+    parametro.
+  \end{errlist}
+}
+\end{functions}
+
+I parametri a cui la funzione permettere di accedere sono organizzati in
+maniera gerarchica ad albero, e per accedere ad uno di essi occorre
+specificare un cammino attraverso i vari nodi dell'albero, in maniera analoga
+a come si specifica un pathname (da cui l'uso alternativo del filesystem
+\file{/proc} che vedremo dopo).
+
+Ciascun nodo è identificato da un valore intero, ed il cammino che arriva ad
+identificare un parametro specifico è passato attraverso l'array \param{name},
+di lunghezza \param{nlen}, che contiene la sequenza dei vari nodi da
+attraversare. Il formato del valore di un parametro dipende dallo stesso e può
+essere un intero, una stringa o anche una struttura complessa. 
+
+L'indirizzo a cui il valore deve essere letto è specificato da
+\param{oldvalue}, e lo spazio ivi disponibile è specificato da \param{oldlenp}
+(passato come puntatore per avere indietro la dimensione effettiva di quanto
+letto); il valore che si vuole scrivere è passato in \param{newval} e la sua
+dimensione in \param{newlen}.
+
+Si può effettuare anche una lettura e scrittura simultanea, nel qual caso il
+valore letto è quello precedente alla scrittura.
+
+I parametri accessibili attraverso questa funzione sono moltissimi, e possono
+essere trovati in \file{sysctl.h}, essi inoltre dipendono anche dallo stato
+corrente del kernel (ad esempio dai moduli che sono stati caricati nel
+sistema) e in genere i loro nomi possono variare da una versione di kernel
+all'altra; per questo è sempre il caso di evitare l'uso di \func{sysctl}
+quando esistono modalità alternative per ottenere le stesse informazioni,
+alcuni esempi di parametri ottenibili sono:
+\begin{itemize*}
+\item il nome di dominio
+\item i parametri del meccanismo di \textit{paging}.
+\item il filesystem montato come radice
+\item la data di compilazione del kernel
+\item i parametri dello stack TCP
+\item il numero massimo di file aperti
+\end{itemize*}
+
+Come accennato in Linux si ha una modalità alternativa per accedere alle
+stesse informazioni di \func{sysctl} attaverso l'uso del filesystem
+\file{/proc}. Questo è un filesystem virtuale, generato direttamente dal
+kernel, che non fa riferimento a nessun dispositivo fisico, ma presenta in
+forma di file alcune delle strutture interne del kernel stesso.
+
+In particolare l'albero dei valori di \func{sysctl} viene presentato in forma
+di file nella directory \file{/proc/sys}, cosicché è possibile accedervi
+speficando un pathname e leggendo e scrivendo sul file corrispondente al
+parametro scelto.  Il kernel si occupa di generare al volo il contenuto ed i
+nomi dei file corrispondenti, e questo ha il grande vantaggio di rendere
+accessibili i vari parametri a qualunque comando di shell e di permettere la
+navigazione dell'albero dei valori.
+
+Alcune delle corrispondenze con i valori di \func{sysctl} sono riportate nei
+commenti in \file{linux/sysctl.h}, la informazione disponibile in
+\file{/proc/sys} è riportata inoltre nella documentazione inclusa nei sorgenti
+del kernel, nella directory \file{Documentation/sysctl}.
 
 
 \subsection{La configurazione dei filesystem}
 \label{sec:sys_file_config}
 
+
+
+
 \subsection{La funzione \func{statfs}}
 \label{sec:sys_file_stafs}
 
@@ -554,6 +643,8 @@ sul loro utilizzo.
 \label{sec:sys_resource_use}
 
 
+
+
 \subsection{Limiti sulle risorse}
 \label{sec:sys_resource_limit}