Reindicizzazioni varie e riscrittura totale della sezione sul
[gapil.git] / system.tex
index cd62e7c97e325d3c8a6334ecaca66d0100c85d56..ff4033dcba52b0878bb368e9b0878f62215bf468 100644 (file)
@@ -663,270 +663,12 @@ inclusa nei sorgenti del kernel, nella directory \file{Documentation/sysctl}.
 Ma oltre alle informazioni ottenibili da \func{sysctl} dentro \file{proc} sono
 disponibili moltissime altre informazioni, fra cui ad esempio anche quelle
 fornite da \func{uname} (vedi sez.~\ref{sec:sys_uname}) che sono mantenute nei
-file \procrelfile{/proc/sys/kernel}{ostype},
-\procrelfile{/proc/sys/kernel}{hostname},
-\procrelfile{/proc/sys/kernel}{osrelease},
-\procrelfile{/proc/sys/kernel}{version} e
-\procrelfile{/proc/sys/kernel}{domainname} di \file{/proc/sys/kernel/}.
+file \sysctlrelfile{kernel}{ostype}, \sysctlrelfile{kernel}{hostname},
+\sysctlrelfile{kernel}{osrelease}, \sysctlrelfile{kernel}{version} e
+\sysctlrelfile{kernel}{domainname} di \file{/proc/sys/kernel/}.
 
 
 
-\subsection{La gestione delle proprietà dei filesystem}
-\label{sec:sys_file_config}
-
-Come accennato in sez.~\ref{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 \funcd{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[\errcode{EPERM}] il processo non ha i privilegi di amministratore.
-  \item[\errcode{ENODEV}] \param{filesystemtype} non esiste o non è configurato
-    nel kernel.
-  \item[\errcode{ENOTBLK}] non si è usato un \textit{block device} per
-    \param{source} quando era richiesto.
-  \item[\errcode{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[\errcode{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
-    \textit{mount point} o di spostarlo quando \param{target} non è un
-    \textit{mount point} o è \file{/}.
-  \item[\errcode{EACCES}] non si ha il permesso di accesso su uno dei
-    componenti del \itindex{pathname} \textit{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 \const{MS\_NODEV}.
-  \item[\errcode{ENXIO}] il \itindex{major~number} \textit{major number} del
-    device \param{source} è sbagliato.
-  \item[\errcode{EMFILE}] la tabella dei device \textit{dummy} è piena.
-  \end{errlist}
-  ed inoltre \errval{ENOTDIR}, \errval{EFAULT}, \errval{ENOMEM},
-  \errval{ENAMETOOLONG}, \errval{ENOENT} o \errval{ELOOP}.}
-\end{prototype}
-
-La funzione monta sulla directory \param{target}, detta \textit{mount point},
-il filesystem contenuto in \param{source}. In generale un filesystem è
-contenuto su un disco, e l'operazione di montaggio corrisponde a rendere
-visibile al sistema il contenuto del suddetto disco, identificato attraverso
-il file di dispositivo ad esso associato.
-
-Ma la struttura del virtual filesystem vista in sez.~\ref{sec:file_vfs} è molto
-più flessibile e può essere usata anche per oggetti diversi da un disco. Ad
-esempio usando il \textit{loop device} si può montare un file qualunque (come
-l'immagine di un CD-ROM o di un floppy) che contiene un filesystem, inoltre
-alcuni filesystem, come \file{proc} o \file{devfs} sono del tutto virtuali, i
-loro dati sono generati al volo ad ogni lettura, e passati al kernel ad ogni
-scrittura. 
-
-Il tipo di filesystem è specificato da \param{filesystemtype}, che deve essere
-una delle stringhe riportate nel file \procfile{/proc/filesystems}, che
-contiene l'elenco dei filesystem supportati dal kernel; nel caso si sia
-indicato uno dei filesystem virtuali, il contenuto di \param{source} viene
-ignorato.
-
-Dopo l'esecuzione della funzione il contenuto del filesystem viene resto
-disponibile nella directory specificata come \textit{mount point}, il
-precedente contenuto di detta directory viene mascherato dal contenuto della
-directory radice del filesystem montato.
-
-Dal kernel 2.4.x inoltre è divenuto possibile sia spostare atomicamente un
-\textit{mount point} da una directory ad un'altra, sia montare in diversi
-\textit{mount point} lo stesso filesystem, sia montare più filesystem sullo
-stesso \textit{mount point} (nel qual caso vale quanto appena detto, e solo il
-contenuto dell'ultimo filesystem montato sarà visibile).
-
-Ciascun filesystem è dotato di caratteristiche specifiche che possono essere
-attivate o meno, alcune di queste sono generali (anche se non è detto siano
-disponibili in ogni filesystem), e vengono specificate come opzioni di
-montaggio con l'argomento \param{mountflags}.  
-
-In Linux \param{mountflags} deve essere un intero a 32 bit i cui 16 più
-significativi sono un \textit{magic number}\footnote{cioè un numero speciale
-  usato come identificativo, che nel caso è \code{0xC0ED}; si può usare la
-  costante \const{MS\_MGC\_MSK} per ottenere la parte di \param{mountflags}
-  riservata al \textit{magic number}.} mentre i 16 meno significativi sono
-usati per specificare le opzioni; essi sono usati come maschera binaria e
-vanno impostati con un OR aritmetico della costante \const{MS\_MGC\_VAL} con i
-valori riportati in tab.~\ref{tab:sys_mount_flags}.
-
-\begin{table}[htb]
-  \footnotesize
-  \centering
-  \begin{tabular}[c]{|l|r|l|}
-    \hline
-    \textbf{Parametro} & \textbf{Valore}&\textbf{Significato}\\
-    \hline
-    \hline
-    \const{MS\_RDONLY}     &  1 & Monta in sola lettura.\\
-    \const{MS\_NOSUID}     &  2 & Ignora i bit \itindex{suid~bit} \acr{suid} e
-                                  \itindex{sgid~bit} \acr{sgid}.\\ 
-    \const{MS\_NODEV}      &  4 & Impedisce l'accesso ai file di dispositivo.\\
-    \const{MS\_NOEXEC}     &  8 & Impedisce di eseguire programmi.\\
-    \const{MS\_SYNCHRONOUS}& 16 & Abilita la scrittura sincrona.\\
-    \const{MS\_REMOUNT}    & 32 & Rimonta il filesystem cambiando le opzioni.\\
-    \const{MS\_MANDLOCK}   & 64 & Consente il \textit{mandatory locking} 
-                                  \itindex{mandatory~locking} (vedi
-                                  sez.~\ref{sec:file_mand_locking}).\\
-    \const{S\_WRITE}      & 128 & Scrive normalmente.\\
-    \const{S\_APPEND}     & 256 & Consente la scrittura solo in
-                                  \itindex{append~mode} \textit{append mode} 
-                                  (vedi sez.~\ref{sec:file_sharing}).\\
-    \const{S\_IMMUTABLE}  & 512 & Impedisce che si possano modificare i file.\\
-    \const{MS\_NOATIME}   &1024 & Non aggiorna gli \textit{access time} (vedi
-                                  sez.~\ref{sec:file_file_times}).\\
-    \const{MS\_NODIRATIME}&2048 & Non aggiorna gli \textit{access time} delle
-                                  directory.\\
-    \const{MS\_BIND}      &4096 & Monta il filesystem altrove.\\
-    \const{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}
-
-% TODO aggiornare con i nuovi flag di man mount
-% gli S_* non esistono più come segnalato da Alessio...
-% verificare i readonly mount bind del 2.6.26
-
-Per l'impostazione delle caratteristiche particolari di ciascun filesystem si
-usa invece l'argomento \param{data} che serve per passare le ulteriori
-informazioni necessarie, che ovviamente variano da filesystem a filesystem.
-
-La funzione \func{mount} può essere utilizzata anche per effettuare il
-\textsl{rimontaggio} di un filesystem, cosa che permette di cambiarne al volo
-alcune delle caratteristiche di funzionamento (ad esempio passare da sola
-lettura a lettura/scrittura). Questa operazione è attivata attraverso uno dei
-bit di \param{mountflags}, \const{MS\_REMOUNT}, che se impostato specifica che
-deve essere effettuato il rimontaggio del filesystem (con le opzioni
-specificate dagli altri bit), anche in questo caso il valore di \param{source}
-viene ignorato.
-
-Una volta che non si voglia più utilizzare un certo filesystem è possibile
-\textsl{smontarlo} usando la funzione \funcd{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} assumerà uno dei valori:
-  \begin{errlist}
-  \item[\errcode{EPERM}] il processo non ha i privilegi di amministratore.
-  \item[\errcode{EBUSY}]  \param{target} è la directory di lavoro di qualche
-  processo, o contiene dei file aperti, o un altro mount point.
-  \end{errlist}
-  ed inoltre \errval{ENOTDIR}, \errval{EFAULT}, \errval{ENOMEM},
-  \errval{ENAMETOOLONG}, \errval{ENOENT} o \errval{ELOOP}.}
-\end{prototype}
-\noindent la funzione prende il nome della directory su cui il filesystem è
-montato e non il file o il dispositivo che è stato montato,\footnote{questo è
-  vero a partire dal kernel 2.3.99-pre7, prima esistevano due chiamate
-  separate e la funzione poteva essere usata anche specificando il file di
-  dispositivo.} in quanto con il kernel 2.4.x è possibile montare lo stesso
-dispositivo in più punti. Nel caso più di un filesystem sia stato montato
-sullo stesso \textit{mount point} viene smontato quello che è stato montato
-per ultimo.
-
-Si tenga presente che la funzione fallisce quando il filesystem è
-\textsl{occupato}, questo avviene quando ci sono ancora file aperti sul
-filesystem, se questo contiene la directory di lavoro corrente di un qualunque
-processo o il mount point di un altro filesystem; in questo caso l'errore
-restituito è \errcode{EBUSY}.
-
-Linux provvede inoltre una seconda funzione, \funcd{umount2}, che in alcuni
-casi permette di forzare lo smontaggio di un filesystem, anche quando questo
-risulti occupato; il suo prototipo è:
-\begin{prototype}{sys/mount.h}{umount2(const char *target, int flags)}
-  
-  La funzione è identica a \func{umount} per comportamento e codici di errore,
-  ma con \param{flags} si può specificare se forzare lo smontaggio.
-\end{prototype}
-
-Il valore di \param{flags} è una maschera binaria, e al momento l'unico valore
-definito è il bit \const{MNT\_FORCE}; gli altri bit devono essere nulli.
-Specificando \const{MNT\_FORCE} la funzione cercherà di liberare il filesystem
-anche se è occupato per via di una delle condizioni descritte in precedenza. A
-seconda del tipo di filesystem alcune (o tutte) possono essere superate,
-evitando l'errore di \errcode{EBUSY}.  In tutti i casi prima dello smontaggio
-viene eseguita una sincronizzazione dei dati. 
-
-% TODO documentare MNT_DETACH e MNT_EXPIRE ...
-
-Altre due funzioni specifiche di Linux,\footnote{esse si trovano anche su BSD,
-  ma con una struttura diversa.} utili per ottenere in maniera diretta
-informazioni riguardo al filesystem su cui si trova un certo file, sono
-\funcd{statfs} e \funcd{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{Le funzioni ritornano 0 in caso di successo e -1 in caso di
-    errore, nel qual caso \var{errno} assumerà uno dei valori:
-  \begin{errlist}
-  \item[\errcode{ENOSYS}] il filesystem su cui si trova il file specificato non
-  supporta la funzione.
-  \end{errlist}
-  e \errval{EFAULT} ed \errval{EIO} per entrambe, \errval{EBADF} per
-  \func{fstatfs}, \errval{ENOTDIR}, \errval{ENAMETOOLONG}, \errval{ENOENT},
-  \errval{EACCES}, \errval{ELOOP} per \func{statfs}.}
-\end{functions}
-
-Queste funzioni permettono di ottenere una serie di informazioni generali
-riguardo al filesystem su cui si trova il file specificato; queste vengono
-restituite all'indirizzo \param{buf} di una struttura \struct{statfs} definita
-come in fig.~\ref{fig:sys_statfs}, ed i campi che sono indefiniti per il
-filesystem in esame sono impostati a zero.  I valori del campo \var{f\_type}
-sono definiti per i vari filesystem nei relativi file di header dei sorgenti
-del kernel da costanti del tipo \var{XXX\_SUPER\_MAGIC}, dove \var{XXX} in
-genere è il nome del filesystem stesso.
-
-\begin{figure}[!htb]
-  \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
-    \includestruct{listati/statfs.h}
-  \end{minipage}
-  \normalsize 
-  \caption{La struttura \structd{statfs}.} 
-  \label{fig:sys_statfs}
-\end{figure}
-
-
-Le \acr{glibc} provvedono infine una serie di funzioni per la gestione dei due
-file \conffile{/etc/fstab} ed \conffile{/etc/mtab}, che convenzionalmente sono
-usati in quasi tutti i sistemi unix-like per mantenere rispettivamente le
-informazioni riguardo ai filesystem da montare e a quelli correntemente
-montati. Le funzioni servono a leggere il contenuto di questi file in
-opportune strutture \struct{fstab} e \struct{mntent}, e, per
-\conffile{/etc/mtab} per inserire e rimuovere le voci presenti nel file.
-
-In generale si dovrebbero usare queste funzioni (in particolare quelle
-relative a \conffile{/etc/mtab}), quando si debba scrivere un programma che
-effettua il montaggio di un filesystem; in realtà in questi casi è molto più
-semplice invocare direttamente il programma \cmd{mount}, per cui ne
-tralasceremo la trattazione, rimandando al manuale delle \acr{glibc}
-\cite{glibc} per la documentazione completa.
-
-% TODO scrivere relativamente alle varie funzioni (getfsent e getmntent &C)
-% TODO documentare swapon e swapoff (man 2 ...)
-
-
 % TODO documentare keyctl ????
 % (fare sezione dedicata ????)
 %\subsection{La gestione delle chiavi crittografiche}
@@ -1531,7 +1273,7 @@ fatto solo fino al valore del secondo, che per questo viene detto \textit{hard
                               un errore di \errcode{EFBIG}.\\
     \const{RLIMIT\_LOCKS}&    È un limite presente solo nelle prime versioni
                               del kernel 2.4 sul numero massimo di
-                              \index{file!locking} \textit{file lock} (vedi
+                              \itindex{file~locking} \textit{file lock} (vedi
                               sez.~\ref{sec:file_locking}) che un
                               processo poteva effettuare.\\ 
     \const{RLIMIT\_MEMLOCK}&  L'ammontare massimo di memoria che può essere
@@ -1804,15 +1546,14 @@ semplice esempio per l'uso di questa funzione è riportato nel programma
 \texttt{AcctCtrl.c} dei sorgenti allegati alla guida.
 
 Quando si attiva la contabilità, il file che si indica deve esistere; esso
-verrà aperto in sola scrittura;\footnote{si applicano al pathname indicato da
-  \param{filename} tutte le restrizioni viste in cap.~\ref{cha:file_intro}.}
-le informazioni verranno registrate in \itindex{append~mode} \textit{append}
-in coda al file tutte le volte che un processo termina. Le informazioni
-vengono salvate in formato binario, e corrispondono al contenuto della
-apposita struttura dati definita all'interno del kernel.
+verrà aperto in sola scrittura; le informazioni verranno registrate in
+\itindex{append~mode} \textit{append} in coda al file tutte le volte che un
+processo termina. Le informazioni vengono salvate in formato binario, e
+corrispondono al contenuto della apposita struttura dati definita all'interno
+del kernel.
 
 Il funzionamento di \func{acct} viene inoltre modificato da uno specifico
-parametro di sistema, modificabile attraverso \procfile{/proc/sys/kernel/acct}
+parametro di sistema, modificabile attraverso \sysctlfile{kernel/acct}
 (o tramite la corrispondente \func{sysctl}). Esso contiene tre valori interi,
 il primo indica la percentuale di spazio disco libero sopra il quale viene
 ripresa una registrazione che era stata sospesa per essere scesi sotto il