Scritta anche umount
[gapil.git] / system.tex
index 8cc2af886434136d8f085e1155bc475d53aa3890..9f07508f66e22de651a6092ec88c39c42758c40d 100644 (file)
@@ -517,26 +517,251 @@ 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}
+Come accennato in \secref{sec:file_organization} per poter accedere ai file
+occorre prima rendere disponibile al sistema il filesystem su cui essi sono
+memorizzati; l'operazione di attivazione del filesystem è chiamata
+\textsl{montaggio}, per far questo in Linux\footnote{la funzione è specifica
+  di Linux e non è portabile} si usa la funzione \func{mount} il cui prototipo
+è:
+\begin{prototype}{sys/mount.h}
+{mount(const char *source, const char *target, const char *filesystemtype, 
+  unsigned long mountflags, const void *data)}
+
+Monta il filesystem di tipo \param{filesystemtype} contenuto in \param{source}
+sulla directory \param{target}.
+  
+  \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di
+  fallimento, nel qual caso gli errori comuni a tutti i filesystem che possono
+  essere restituiti in \var{errno} sono:
+  \begin{errlist}
+  \item[\macro{EPERM}] il processo non ha i provilegi di amministratore.
+  \item[\macro{ENODEV}] \param{filesystemtype} non esiste o non è configurato
+    nel kernel.
+  \item[\macro{ENOTBLK}] non si è usato un \textit{block device} per
+    \param{source} quando era richiesto.
+  \item[\macro{EBUSY}] \param{source} è già montato, o non può essere
+    rimontato in read-only perché ci sono ancora file aperti in scrittura, o
+    \param{target} è ancora in uso.
+  \item[\macro{EINVAL}] il device \param{source} presenta un
+    \textit{superblock} non valido, o si è cercato di rimontare un filesystem
+    non ancora montato, o di montarlo senza che \param{target} sia un
+    \type{mount point} o di spostarlo quando \param{target} non è un
+    \type{mount point} o è \file{/}.
+  \item[\macro{EACCES}] non si ha il permesso di accesso su uno dei componenti
+  del pathname, o si è cercato di montare un filesystem disponibile in sola
+  lettura senza averlo specificato o il device \param{source} è su un
+  filesystem montato con l'opzione \macro{MS\_NODEV}.
+  \item[\macro{ENXIO}] il \textit{major number} del device \param{source} è
+    sbagliato.
+  \item[\macro{EMFILE}] la tabella dei device \textit{dummy} è piena.
+  \end{errlist}
+  ed inoltre \macro{ENOTDIR}, \macro{EFAULT}, \macro{ENOMEM},
+  \macro{ENAMETOOLONG}, \macro{ENOENT} o \macro{ELOOP}.}
+\end{prototype}
+
+La funzione monta sulla directory \param{target}, detta \textit{mount point},
+il filesystem contenuto in \param{source}. Di norma questo è un file di
+dispositivo che fa riferimento al disco (o al device a blocchi) che deve
+essere montato, ma può anche essere un file normale che contiene un
+filesystem, (che può essere montato \textit{in loopback}) o anche una
+directory. Dal kernel 2.4.x infatti è divenuto possibile sia spostare
+atomicamente un \textit{mount point} da una directory ad un'altra, che montare
+in più punti lo stesso filesystem.
+
+Con \param{filesystemtype} si indica il tipo di filesystem (che
+deve essere supportato dal kernel) indicato dalla stringa che lo identifica
+(che per quelli supportati è mantenuta in \file{/proc/filesystems}).
+
+Il parametro \param{mountflags} serve invece per specificare le opzioni di
+montaggio, esso è passato come intero a 32 bit i cui 16 più significativi
+devono essere \code{0xC0ED} mentre i 16 meno significativi costituiscono una
+maschera specificabile con un and binario dei valori riportati in \ntab.
+
+\begin{table}[htb]
+  \centering
+  \begin{tabular}[c]{|l|r|l|}
+    \hline
+    \textbf{Parametro} & \textbf{Valore}&\textbf{Significato}\\
+    \hline
+    \hline
+    \macro{MS\_RDONLY}     &  1 & montain sola lettura\\
+    \macro{MS\_NOSUID}     &  2 & ignora i bit \acr{suig} e \acr{sgid}\\
+    \macro{MS\_NODEV}      &  4 & impedisce l'accesso ai file di dispositivo\\
+    \macro{MS\_NOEXEC}     &  8 & impedisce di eseguire programmi \\
+    \macro{MS\_SYNCHRONOUS}& 16 & abilita la scrittura sincrona \\
+    \macro{MS\_REMOUNT}    & 32 & rimonta il filesystem cambiando i flag\\
+    \macro{MS\_MANDLOCK}   & 64 & consente il \textit{mandatory locking} (vedi
+                                 \secref{sec:file_mand_locking})\\
+    \macro{MS\_NOATIME}   &1024 & non aggiorna gli \textit{access time} (vedi
+                                 \secref{sec:file_file_times})\\
+    \macro{MS\_NODIRATIME}&2048 & non aggiorna gli \textit{access time} delle
+                                 directory\\
+    \macro{MS\_BIND}      &4096 & monta il filesystem altrove\\
+    \macro{MS\_MOVE}      &8192 & sposta atomicamente il punto di montaggio \\
+    \hline
+  \end{tabular}
+  \caption{Tabella dei codici dei flag di montaggio di un filesystem.}
+  \label{tab:sys_mount_flags}
+\end{table}
+
+Infine l'aromento \param{data} serve per passare ulteriori informazioni che
+possono essere necessarie ai vari filesystem e che variano da filesystem a
+filesystem. 
+
+Si tenga presente inoltre che, sempre a partire dal kernel 2.4.x, è possibile
+sovrapporre più montaggi su una stessa directory, nel qual caso si vedrà
+sempre l'ultimo filesystem che è stato montato. 
+
+Una volta che non si voglia più utilizzare un certo filesystem è possibile
+\textsl{smontarlo} usando la funzione \func{umount}, il cui prototipo è:
+\begin{prototype}{sys/mount.h}{umount(const char *target)}
+  
+  Smonta il filesystem montato sulla directory \param{target}.
+  
+  \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di
+    fallimento, nel qual caso \var{errno} viene settata a:
+  \begin{errlist}
+  \item[\macro{EPERM}] il processo non ha i provilegi di amministratore.
+  \item[\macro{EBUSY}]  \param{target} è la directory di lavoro di qualche
+  processo, o contiene dei file aperti, o un altro mount point.
+  \end{errlist}
+  ed inoltre \macro{ENOTDIR}, \macro{EFAULT}, \macro{ENOMEM},
+  \macro{ENAMETOOLONG}, \macro{ENOENT} o \macro{ELOOP}.}
+\end{prototype}
+\noindent la funzione prende il nome della directory su cui il filesystem è
+montato e non il file che è stato montato, in quanto con il kernel 2.4.x è
+possibile montare lo stesso dispositivo in più punti; inoltre nel caso più di
+un filesystem sia stato montato sullo stesso \textit{mount point} viene
+smontato quello che è stato montato per ultimo.
+
+Due funzioni, utili per ottenere in maniera diretta informazioni riguardo al
+filesystem su cui si trova un certo file, sono \func{statfs} e \func{fstatfs},
+i cui prototipi sono:
+\begin{functions}
+  \headdecl{sys/vfs.h} \funcdecl{int statfs(const char *path, struct statfs
+    *buf)} \funcdecl{int fstatfs(int fd, struct statfs *buf)} Restituisce in
+  \param{buf} le informazioni relative al filesystem su cui è posto il file
+  specificato.
+
+\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{ENOSYS}] il filesystem su cui si trova il file specificato non
+  supporta la funzione.
+  \end{errlist}
+  e \macro{EFAULT} ed \macro{EIO} per entrambe, \macro{EBADF} per
+  \func{fstatfs}, \macro{ENOTDIR}, \macro{ENAMETOOLONG}, \macro{ENOENT},
+  \macro{EACCES}, \macro{ELOOP} per \func{statfs}.}
+\end{functions}
+
+
+
+\subsection{La gestione di utenti e gruppi}
+\label{sec:sys_user_group}
 
 
 
@@ -554,6 +779,8 @@ sul loro utilizzo.
 \label{sec:sys_resource_use}
 
 
+
+
 \subsection{Limiti sulle risorse}
 \label{sec:sys_resource_limit}
 
@@ -821,9 +1048,6 @@ o la macro (\texttt{\small 15--17}) associate a quel codice.
 \end{figure}
 
 
-\section{La gestione di utenti e gruppi}
-\label{sec:sys_user_group}
-
 
 %%% Local Variables: 
 %%% mode: latex