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.
 
-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.
 
@@ -561,10 +562,10 @@ specifica di Linux; il suo prototipo 
 \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},
@@ -620,8 +621,147 @@ 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}
 
 
 
@@ -639,6 +779,8 @@ sul loro utilizzo.
 \label{sec:sys_resource_use}
 
 
+
+
 \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}
 
 
-\section{La gestione di utenti e gruppi}
-\label{sec:sys_user_group}
-
 
 %%% Local Variables: 
 %%% mode: latex