X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=system.tex;h=ff4033dcba52b0878bb368e9b0878f62215bf468;hp=cd62e7c97e325d3c8a6334ecaca66d0100c85d56;hb=94b4d603807121b40eef06d22d2b6cd6e06ec7fd;hpb=4cbeb0e4fa1d31da798c8e68108eb6785586ab34 diff --git a/system.tex b/system.tex index cd62e7c..ff4033d 100644 --- a/system.tex +++ b/system.tex @@ -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