Scritta anche umount
[gapil.git] / system.tex
index b92330733763e21707ac188fe34e51aaf27f5d69..9f07508f66e22de651a6092ec88c39c42758c40d 100644 (file)
@@ -517,8 +517,9 @@ implementazioni. Finora abbiamo visto come si pu
 di esaminare il meccanismo che permette, quando questi possono variare durante
 l'esecuzione del sistema, di modificarli.
 
 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.
 
 standardizzazione della sezione precedente, e per i quali occorre, oltre al
 meccanismo di settaggio, pure un meccanismo di lettura.
 
@@ -561,10 +562,10 @@ specifica di Linux; il suo prototipo 
 \end{functions}
 
 I parametri a cui la funzione permettere di accedere sono organizzati in
 \end{functions}
 
 I parametri a cui la funzione permettere di accedere sono organizzati in
-maniera gerarchica, e per accedere ad uno di essi occorre specificare un
-cammino attraverso le varie strutture, in maniera analoga a come si specifica
-un pathname (da cui l'uso alternativo del filesystem \file{/proc} che vedremo
-dopo).
+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},
 
 Ciascun nodo è identificato da un valore intero, ed il cammino che arriva ad
 identificare un parametro specifico è passato attraverso l'array \param{name},
@@ -620,8 +621,147 @@ del kernel, nella directory \file{Documentation/sysctl}.
 \subsection{La configurazione dei filesystem}
 \label{sec:sys_file_config}
 
 \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}
 
 
 
 
 
 
@@ -639,6 +779,8 @@ sul loro utilizzo.
 \label{sec:sys_resource_use}
 
 
 \label{sec:sys_resource_use}
 
 
+
+
 \subsection{Limiti sulle risorse}
 \label{sec:sys_resource_limit}
 
 \subsection{Limiti sulle risorse}
 \label{sec:sys_resource_limit}
 
@@ -906,9 +1048,6 @@ o la macro (\texttt{\small 15--17}) associate a quel codice.
 \end{figure}
 
 
 \end{figure}
 
 
-\section{La gestione di utenti e gruppi}
-\label{sec:sys_user_group}
-
 
 %%% Local Variables: 
 %%% mode: latex
 
 %%% Local Variables: 
 %%% mode: latex