X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=filedir.tex;h=14156497144947ade7ad776d88c5f4f2374f2408;hb=250b32a55733b307d2eae8afb50b64af1b7c0bc8;hp=239c9950e51c5db9d8bcdc0ef509dbf7e1858d35;hpb=ff76d56c6a2c280cbe4f153173488871d7b12336;p=gapil.git diff --git a/filedir.tex b/filedir.tex index 239c995..1415649 100644 --- a/filedir.tex +++ b/filedir.tex @@ -8,6 +8,7 @@ %% license is included in the section entitled "GNU Free Documentation %% License". %% + \chapter{File e directory} \label{cha:files_and_dirs} @@ -429,10 +430,9 @@ buffer, e lo richiude. Si tenga presente che la funzione non termina la stringa con un carattere nullo e la tronca alla dimensione specificata da \param{size} per evitare di sovrascrivere oltre le dimensioni del buffer. - \begin{figure}[htb] \centering - \includegraphics[width=9cm]{img/link_loop} + \includegraphics[width=8.5cm]{img/link_loop} \caption{Esempio di loop nel filesystem creato con un link simbolico.} \label{fig:file_link_loop} \end{figure} @@ -486,10 +486,10 @@ ci mostrerebbe invece l'esistenza di \file{temporaneo}. Benché in sostanza le directory non siano altro che dei file contenenti elenchi di nomi ed \index{inode} inode, non è possibile trattarle come file ordinari e devono essere create direttamente dal kernel attraverso una -opportuna system call.\footnote{questo permette anche, attraverso l'uso del - VFS, l'utilizzo di diversi formati per la gestione dei suddetti elenchi.} -La funzione usata per creare una directory è \funcd{mkdir}, ed il suo -prototipo è: +opportuna system call.\footnote{questo è quello che permette anche, attraverso + l'uso del VFS, l'utilizzo di diversi formati per la gestione dei suddetti + elenchi.} La funzione usata per creare una directory è \funcd{mkdir}, ed il +suo prototipo è: \begin{functions} \headdecl{sys/stat.h} \headdecl{sys/types.h} @@ -500,18 +500,17 @@ prototipo \bodydesc{La funzione restituisce zero in caso di successo e -1 per un errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\errcode{EEXIST}] Un file (o una directory) con quel nome esiste di + \item[\errcode{EEXIST}] un file (o una directory) con quel nome esiste di già. - \item[\errcode{EACCES}] - Non c'è il permesso di scrittura per la directory in cui si vuole inserire - la nuova directory. - \item[\errcode{EMLINK}] La directory in cui si vuole creare la nuova - directory contiene troppi file. Sotto Linux questo normalmente non avviene + \item[\errcode{EACCES}] non c'è il permesso di scrittura per la directory in + cui si vuole inserire la nuova directory. + \item[\errcode{EMLINK}] la directory in cui si vuole creare la nuova + directory contiene troppi file; sotto Linux questo normalmente non avviene perché il filesystem standard consente la creazione di un numero di file maggiore di quelli che possono essere contenuti nel disco, ma potendo avere a che fare anche con filesystem di altri sistemi questo errore può presentarsi. - \item[\errcode{ENOSPC}] Non c'è abbastanza spazio sul file system per creare + \item[\errcode{ENOSPC}] non c'è abbastanza spazio sul file system per creare la nuova directory o si è esaurita la quota disco dell'utente. \end{errlist} ed inoltre anche \errval{EPERM}, \errval{EFAULT}, \errval{ENAMETOOLONG}, @@ -520,19 +519,21 @@ prototipo \end{functions} La funzione crea una nuova directory vuota, che contiene cioè solo le due voci -standard (\file{.} e \file{..}), con il nome indicato dall'argomento -\param{dirname}. Il nome può essere indicato sia come \itindex{pathname} -\textit{pathname} assoluto che relativo. - -I permessi di accesso alla directory (vedi sez.~\ref{sec:file_access_control}) -sono specificati da \param{mode}, i cui possibili valori sono riportati in -tab.~\ref{tab:file_permission_const}; questi sono modificati dalla maschera di -creazione dei file (si veda sez.~\ref{sec:file_perm_management}). La -titolarità della nuova directory è impostata secondo quanto riportato in +standard presenti in ogni directory (cioè ``\file{.}'' e ``\file{..}''), con +il nome indicato dall'argomento \param{dirname}. Il nome può essere indicato +sia come \itindex{pathname} \textit{pathname} assoluto che come +\itindex{pathname} \textit{pathname} relativo. + +I permessi di accesso (vedi sez.~\ref{sec:file_access_control}) con cui la +directory viene creata sono specificati dall'argomemto \param{mode}, i cui +possibili valori sono riportati in tab.~\ref{tab:file_permission_const}; si +tenga presente che questi sono modificati dalla maschera di creazione dei file +(si veda sez.~\ref{sec:file_perm_management}). La titolarità della nuova +directory è impostata secondo quanto riportato in sez.~\ref{sec:file_ownership_management}. -La funzione per la cancellazione di una directory è \funcd{rmdir}, il suo -prototipo è: +La funzione che permette la cancellazione di una directory è invece +\funcd{rmdir}, ed il suo prototipo è: \begin{prototype}{sys/stat.h}{int rmdir(const char *dirname)} Cancella una directory. @@ -556,8 +557,8 @@ prototipo \end{prototype} La funzione cancella la directory \param{dirname}, che deve essere vuota (la -directory deve cioè contenere soltanto le due voci standard \file{.} e -\file{..}). Il nome può essere indicato con il \itindex{pathname} +directory deve cioè contenere soltanto le due voci standard ``\file{.}'' e +``\file{..}''). Il nome può essere indicato con il \itindex{pathname} \textit{pathname} assoluto o relativo. La modalità con cui avviene la cancellazione è analoga a quella di @@ -565,8 +566,8 @@ La modalit directory non diventa nullo e nessun processo ha la directory aperta lo spazio occupato su disco non viene rilasciato. Se un processo ha la directory aperta la funzione rimuove il link \index{inode} all'inode e nel caso sia l'ultimo, -pure le voci standard \file{.} e \file{..}, a questo punto il kernel non -consentirà di creare più nuovi file nella directory. +pure le voci standard ``\file{.}'' e ``\file{..}'', a questo punto il kernel +non consentirà di creare più nuovi file nella directory. \subsection{La creazione di file speciali} @@ -774,16 +775,16 @@ struttura precedentemente allocata e specificata dall'argomento \param{entry} (anche se non è assicurato che la funzione usi lo spazio fornito dall'utente). I vari campi di \struct{dirent} contengono le informazioni relative alle voci -presenti nella directory; sia BSD che SVr4\footnote{POSIX prevede invece solo - la presenza del campo \var{d\_fileno}, identico \var{d\_ino}, che in Linux è - definito come alias di quest'ultimo. Il campo \var{d\_name} è considerato - dipendente dall'implementazione.} prevedono che siano sempre presenti il -campo \var{d\_name}, che contiene il nome del file nella forma di una stringa -terminata da uno zero,\footnote{lo standard POSIX non specifica una lunghezza, - ma solo un limite \const{NAME\_MAX}; in SVr4 la lunghezza del campo è - definita come \code{NAME\_MAX+1} che di norma porta al valore di 256 byte - usato anche in Linux.} ed il campo \var{d\_ino}, che contiene il numero di -\index{inode} inode cui il file è associato (di solito corrisponde al campo +presenti nella directory; sia BSD che SVr4\footnote{lo standard POSIX prevede + invece solo la presenza del campo \var{d\_fileno}, identico \var{d\_ino}, + che in Linux è definito come alias di quest'ultimo. Il campo \var{d\_name} è + considerato dipendente dall'implementazione.} prevedono che siano sempre +presenti il campo \var{d\_name}, che contiene il nome del file nella forma di +una stringa terminata da uno zero,\footnote{lo standard POSIX non specifica + una lunghezza, ma solo un limite \const{NAME\_MAX}; in SVr4 la lunghezza del + campo è definita come \code{NAME\_MAX+1} che di norma porta al valore di 256 + byte usato anche in Linux.} ed il campo \var{d\_ino}, che contiene il numero +di \index{inode} inode cui il file è associato (di solito corrisponde al campo \var{st\_ino} di \struct{stat}). \begin{figure}[!htb] @@ -808,16 +809,16 @@ il nome del relativo campo; nel nostro caso sono definite le macro \footnotesize \begin{tabular}[c]{|l|l|} \hline - \textbf{Valore} & \textbf{Significato} \\ + \textbf{Valore} & \textbf{Tipo di file} \\ \hline \hline - \const{DT\_UNKNOWN} & tipo sconosciuto. \\ - \const{DT\_REG} & file normale. \\ - \const{DT\_DIR} & directory. \\ - \const{DT\_FIFO} & fifo. \\ - \const{DT\_SOCK} & socket. \\ - \const{DT\_CHR} & dispositivo a caratteri. \\ - \const{DT\_BLK} & dispositivo a blocchi. \\ + \const{DT\_UNKNOWN} & tipo sconosciuto\\ + \const{DT\_REG} & file normale\\ + \const{DT\_DIR} & directory\\ + \const{DT\_FIFO} & fifo\\ + \const{DT\_SOCK} & socket\\ + \const{DT\_CHR} & dispositivo a caratteri\\ + \const{DT\_BLK} & dispositivo a blocchi\\ \hline \end{tabular} \caption{Costanti che indicano i vari tipi di file nel campo \var{d\_type} @@ -828,11 +829,11 @@ il nome del relativo campo; nel nostro caso sono definite le macro Per quanto riguarda il significato dei campi opzionali, il campo \var{d\_type} indica il tipo di file (fifo, directory, link simbolico, ecc.); i suoi possibili valori\footnote{fino alla versione 2.1 delle \acr{glibc} questo - campo, pur presente nella struttura, non è implementato, e resta sempre al + campo, pur presente nella struttura, non era implementato, e resta sempre al valore \const{DT\_UNKNOWN}.} sono riportati in -tab.~\ref{tab:file_dtype_macro}; per la conversione da e verso l'analogo valore -mantenuto dentro il campo \var{st\_mode} di \struct{stat} sono definite anche -due macro di conversione \macro{IFTODT} e \macro{DTTOIF}: +tab.~\ref{tab:file_dtype_macro}; per la conversione da e verso l'analogo +valore mantenuto dentro il campo \var{st\_mode} di \struct{stat} sono definite +anche due macro di conversione \macro{IFTODT} e \macro{DTTOIF}: \begin{functions} \funcdecl{int IFTODT(mode\_t MODE)} Converte il tipo di file dal formato di \var{st\_mode} a quello di \var{d\_type}. @@ -897,7 +898,7 @@ ed ordinamento) del contenuto di una directory; la funzione \funcd{scandir}\footnote{in Linux questa funzione è stata introdotta fin dalle libc4.} ed il suo prototipo è: \begin{prototype}{dirent.h}{int scandir(const char *dir, - struct dirent ***namelist, int(*select)(const struct dirent *), + struct dirent ***namelist, int(*filter)(const struct dirent *), int(*compar)(const struct dirent **, const struct dirent **))} Esegue una scansione di un \textit{directory stream}. @@ -909,27 +910,33 @@ ed ordinamento) del contenuto di una directory; la funzione Al solito, per la presenza fra gli argomenti di due puntatori a funzione, il prototipo non è molto comprensibile; queste funzioni però sono quelle che controllano rispettivamente la selezione di una voce (quella passata con -l'argomento \param{select}) e l'ordinamento di tutte le voci selezionate +l'argomento \param{filter}) e l'ordinamento di tutte le voci selezionate (quella specificata dell'argomento \param{compar}). La funzione legge tutte le voci della directory indicata dall'argomento -\param{dir}, passando ciascuna di esse (una struttura \struct{dirent}) come -argomento della funzione di selezione specificata da \param{select}; se questa -ritorna un valore diverso da zero la voce viene inserita in un vettore che -viene allocato dinamicamente con \func{malloc}. Qualora si specifichi un -valore \val{NULL} per \func{select} vengono selezionate tutte le voci. +\param{dir}, passando un puntatore a ciascuna di esse (una struttura +\struct{dirent}) come argomento della funzione di selezione specificata da +\param{filter}; se questa ritorna un valore diverso da zero il puntatore viene +inserito in un vettore che viene allocato dinamicamente con \func{malloc}. +Qualora si specifichi un valore \val{NULL} per l'argomento \func{filter} non +viene fatta nessuna selezione e si ottengono tutte le voci presenti. Le voci selezionate possono essere riordinate tramite \func{qsort}, le modalità del riordinamento possono essere personalizzate usando la funzione -\param{compar} come criterio di ordinamento di\func{qsort}, la funzione prende -come argomenti le due strutture \struct{dirent} da confrontare restituendo un -valore positivo, nullo o negativo per indicarne l'ordinamento; alla fine -l'indirizzo della lista delle strutture \struct{dirent} così ordinate viene -restituito nell'argomento \param{namelist}. - -Per l'ordinamento (vale a dire come valori possibili per l'argomento -\param{compar}) sono disponibili anche due funzioni predefinite, -\funcd{alphasort} e \funcd{versionsort}, i cui prototipi sono: +\param{compar} come criterio di ordinamento di \func{qsort}, la funzione +prende come argomenti le due strutture \struct{dirent} da confrontare +restituendo un valore positivo, nullo o negativo per indicarne l'ordinamento; +alla fine l'indirizzo della lista ordinata dei puntatori alle strutture +\struct{dirent} viene restituito nell'argomento +\param{namelist}.\footnote{la funzione alloca automaticamente la lista, e + restituisce, come \itindex{value~result~argument} \textit{value result + argument}, l'indirizzo della stessa; questo significa che \param{namelist} + deve essere dichiarato come \code{struct dirent **namelist} ed alla funzione + si deve passare il suo indirizzo.} + +Per l'ordinamento, vale a dire come valori possibili per l'argomento +\param{compar} sono disponibili due funzioni predefinite, \funcd{alphasort} e +\funcd{versionsort}, i cui prototipi sono: \begin{functions} \headdecl{dirent.h} @@ -1612,13 +1619,6 @@ cancellare i file che non servono pi il programma \cmd{leafnode} cancella i vecchi articoli sulla base di questo tempo). -Il tempo di ultima modifica invece viene usato da \cmd{make} per decidere -quali file necessitano di essere ricompilati o (talvolta insieme anche al -tempo di cambiamento di stato) per decidere quali file devono essere -archiviati per il backup. Il comando \cmd{ls} (quando usato con le opzioni -\cmd{-l} o \cmd{-t}) mostra i tempi dei file secondo lo schema riportato -nell'ultima colonna di tab.~\ref{tab:file_file_times}. - \begin{table}[htb] \centering \footnotesize @@ -1692,6 +1692,14 @@ nell'ultima colonna di tab.~\ref{tab:file_file_times}. \label{tab:file_times_effects} \end{table} + +Il tempo di ultima modifica invece viene usato da \cmd{make} per decidere +quali file necessitano di essere ricompilati o (talvolta insieme anche al +tempo di cambiamento di stato) per decidere quali file devono essere +archiviati per il backup. Il comando \cmd{ls} (quando usato con le opzioni +\cmd{-l} o \cmd{-t}) mostra i tempi dei file secondo lo schema riportato +nell'ultima colonna di tab.~\ref{tab:file_file_times}. + L'effetto delle varie funzioni di manipolazione dei file sui tempi è illustrato in tab.~\ref{tab:file_times_effects}. Si sono riportati gli effetti sia per il file a cui si fa riferimento, sia per la directory che lo contiene; @@ -1769,7 +1777,7 @@ realizzare. Una delle caratteristiche fondamentali di tutti i sistemi unix-like è quella del controllo di accesso ai file, che viene implementato per qualunque filesystem standard.\footnote{per standard si intende che implementa le - caratteristiche previste dallo standard POSIX. In Linux sono disponibili + caratteristiche previste dallo standard POSIX; in Linux sono disponibili anche una serie di altri filesystem, come quelli di Windows e del Mac, che non supportano queste caratteristiche.} In questa sezione ne esamineremo i concetti essenziali e le funzioni usate per gestirne i vari aspetti. @@ -1783,7 +1791,7 @@ cosiddetto \textit{owner}) ed un gruppo di appartenenza, secondo il meccanismo degli identificatori di utente e gruppo (\acr{uid} e \acr{gid}). Questi valori sono accessibili da programma tramite la funzione \func{stat}, e sono mantenuti nei campi \var{st\_uid} e \var{st\_gid} della struttura -\struct{stat} (si veda sez.~\ref{sec:file_stat}).\footnote{Questo è vero solo +\struct{stat} (si veda sez.~\ref{sec:file_stat}).\footnote{questo è vero solo per filesystem di tipo Unix, ad esempio non è vero per il filesystem vfat di Windows, che non fornisce nessun supporto per l'accesso multiutente, e per il quale i permessi vengono assegnati in maniera fissa con un opzione in @@ -1792,12 +1800,12 @@ mantenuti nei campi \var{st\_uid} e \var{st\_gid} della struttura Il controllo di accesso ai file segue un modello abbastanza semplice che prevede tre permessi fondamentali strutturati su tre livelli di accesso. Esistono varie estensioni a questo modello,\footnote{come le \textit{Access - Control List} che possono essere aggiunte al filesystem standard con - opportune patch, la cui introduzione nei kernel ufficiali è iniziata con la - serie 2.5.x. per arrivare a meccanismi di controllo ancora più sofisticati - come il \textit{mandatory access control} di SE-Linux.} ma nella maggior -parte dei casi il meccanismo standard è più che sufficiente a soddisfare tutte -le necessità più comuni. I tre permessi di base associati ad ogni file sono: + Control List} che sono state aggiunte ai filesystem standard con opportune + estensioni (vedi sez.~\ref{sec:file_ACL}) per arrivare a meccanismi di + controllo ancora più sofisticati come il \textit{mandatory access control} + di SE-Linux.} ma nella maggior parte dei casi il meccanismo standard è più +che sufficiente a soddisfare tutte le necessità più comuni. I tre permessi di +base associati ad ogni file sono: \begin{itemize*} \item il permesso di lettura (indicato con la lettera \texttt{r}, dall'inglese \textit{read}). @@ -2420,17 +2428,19 @@ riepilogo in cui si riassumono le caratteristiche di ciascuno di essi, in modo da poter fornire un quadro d'insieme. In tab.~\ref{tab:file_fileperm_bits} si sono riassunti gli effetti dei vari -bit per un file; per quanto riguarda l'applicazione dei permessi per -proprietario, gruppo ed altri si ricordi quanto illustrato in -sez.~\ref{sec:file_perm_overview}. Si rammenti che il valore dei permessi non -ha alcun effetto qualora il processo possieda i privilegi di amministratore. +bit dei permessi per un file; per quanto riguarda l'applicazione dei permessi +per proprietario, gruppo ed altri si ricordi quanto illustrato in +sez.~\ref{sec:file_perm_overview}. Per compattezza, nella tabelle si sono +specificati i bit di \itindex{suid~bit} \textit{suid}, \itindex{sgid~bit} +\textit{sgid} e \textit{sticky} \itindex{sticky~bit} con la notazione +illustrata anche in fig.~\ref{fig:file_perm_bit}. \begin{table}[!htb] \centering \footnotesize \begin{tabular}[c]{|c|c|c|c|c|c|c|c|c|c|c|c|l|} \hline - \multicolumn{3}{|c|}{}& + \multicolumn{3}{|c|}{special}& \multicolumn{3}{|c|}{user}& \multicolumn{3}{|c|}{group}& \multicolumn{3}{|c|}{other}& @@ -2439,20 +2449,20 @@ ha alcun effetto qualora il processo possieda i privilegi di amministratore. \acr{s}&\acr{s}&\acr{t}&r&w&x&r&w&x&r&w&x& \\ \hline \hline - 1&-&-&-&-&-&-&-&-&-&-&-&Se eseguito ha i permessi del proprietario\\ - -&1&-&-&-&1&-&-&-&-&-&-&Se eseguito ha i permessi del gruppo proprietario\\ - -&1&-&-&-&0&-&-&-&-&-&-&Il \itindex{mandatory~locking} - \textit{mandatory locking} è abilitato\\ - -&-&1&-&-&-&-&-&-&-&-&-&Non utilizzato\\ - -&-&-&1&-&-&-&-&-&-&-&-&Permesso di lettura per il proprietario\\ - -&-&-&-&1&-&-&-&-&-&-&-&Permesso di scrittura per il proprietario\\ - -&-&-&-&-&1&-&-&-&-&-&-&Permesso di esecuzione per il proprietario\\ - -&-&-&-&-&-&1&-&-&-&-&-&Permesso di lettura per il gruppo proprietario\\ - -&-&-&-&-&-&-&1&-&-&-&-&Permesso di scrittura per il gruppo proprietario\\ - -&-&-&-&-&-&-&-&1&-&-&-&Permesso di esecuzione per il gruppo proprietario\\ - -&-&-&-&-&-&-&-&-&1&-&-&Permesso di lettura per tutti gli altri\\ - -&-&-&-&-&-&-&-&-&-&1&-&Permesso di scrittura per tutti gli altri \\ - -&-&-&-&-&-&-&-&-&-&-&1&Permesso di esecuzione per tutti gli altri\\ + 1&-&-&-&-&-&-&-&-&-&-&-&Se eseguito ha i permessi del proprietario.\\ + -&1&-&-&-&1&-&-&-&-&-&-&Se eseguito ha i permessi del gruppo proprietario.\\ + -&1&-&-&-&0&-&-&-&-&-&-&Il \itindex{mandatory~locking} + \textit{mandatory locking} è abilitato.\\ + -&-&1&-&-&-&-&-&-&-&-&-&Non utilizzato.\\ + -&-&-&1&-&-&-&-&-&-&-&-&Permesso di lettura per il proprietario.\\ + -&-&-&-&1&-&-&-&-&-&-&-&Permesso di scrittura per il proprietario.\\ + -&-&-&-&-&1&-&-&-&-&-&-&Permesso di esecuzione per il proprietario.\\ + -&-&-&-&-&-&1&-&-&-&-&-&Permesso di lettura per il gruppo proprietario.\\ + -&-&-&-&-&-&-&1&-&-&-&-&Permesso di scrittura per il gruppo proprietario.\\ + -&-&-&-&-&-&-&-&1&-&-&-&Permesso di esecuzione per il gruppo proprietario.\\ + -&-&-&-&-&-&-&-&-&1&-&-&Permesso di lettura per tutti gli altri.\\ + -&-&-&-&-&-&-&-&-&-&1&-&Permesso di scrittura per tutti gli altri.\\ + -&-&-&-&-&-&-&-&-&-&-&1&Permesso di esecuzione per tutti gli altri.\\ \hline \end{tabular} \caption{Tabella riassuntiva del significato dei bit dei permessi per un @@ -2460,11 +2470,6 @@ ha alcun effetto qualora il processo possieda i privilegi di amministratore. \label{tab:file_fileperm_bits} \end{table} -Per compattezza, nella tabella si sono specificati i bit di \itindex{suid~bit} -\textit{suid}, \itindex{sgid~bit} \textit{sgid} e \textit{sticky} -\itindex{sticky~bit} con la notazione illustrata anche in -fig.~\ref{fig:file_perm_bit}. - In tab.~\ref{tab:file_dirperm_bits} si sono invece riassunti gli effetti dei vari bit dei permessi per una directory; anche in questo caso si sono specificati i bit di \itindex{suid~bit} \textit{suid}, \itindex{sgid~bit} @@ -2476,7 +2481,7 @@ illustrata in fig.~\ref{fig:file_perm_bit}. \footnotesize \begin{tabular}[c]{|c|c|c|c|c|c|c|c|c|c|c|c|l|} \hline - \multicolumn{3}{|c|}{}& + \multicolumn{3}{|c|}{special}& \multicolumn{3}{|c|}{user}& \multicolumn{3}{|c|}{group}& \multicolumn{3}{|c|}{other}& @@ -2485,18 +2490,23 @@ illustrata in fig.~\ref{fig:file_perm_bit}. \acr{s}&\acr{s}&\acr{t}&r&w&x&r&w&x&r&w&x& \\ \hline \hline - 1&-&-&-&-&-&-&-&-&-&-&-&Non utilizzato\\ - -&1&-&-&-&-&-&-&-&-&-&-&Propaga il gruppo proprietario ai nuovi file creati\\ - -&-&1&-&-&-&-&-&-&-&-&-&Limita l'accesso in scrittura dei file nella directory\\ - -&-&-&1&-&-&-&-&-&-&-&-&Permesso di visualizzazione per il proprietario\\ - -&-&-&-&1&-&-&-&-&-&-&-&Permesso di aggiornamento per il proprietario\\ - -&-&-&-&-&1&-&-&-&-&-&-&Permesso di attraversamento per il proprietario\\ - -&-&-&-&-&-&1&-&-&-&-&-&Permesso di visualizzazione per il gruppo proprietario\\ - -&-&-&-&-&-&-&1&-&-&-&-&Permesso di aggiornamento per il gruppo proprietario\\ - -&-&-&-&-&-&-&-&1&-&-&-&Permesso di attraversamento per il gruppo proprietario\\ - -&-&-&-&-&-&-&-&-&1&-&-&Permesso di visualizzazione per tutti gli altri\\ - -&-&-&-&-&-&-&-&-&-&1&-&Permesso di aggiornamento per tutti gli altri \\ - -&-&-&-&-&-&-&-&-&-&-&1&Permesso di attraversamento per tutti gli altri\\ + 1&-&-&-&-&-&-&-&-&-&-&-&Non utilizzato.\\ + -&1&-&-&-&-&-&-&-&-&-&-&Propaga il gruppo proprietario ai nuovi file + creati.\\ + -&-&1&-&-&-&-&-&-&-&-&-&Limita l'accesso in scrittura dei file nella + directory.\\ + -&-&-&1&-&-&-&-&-&-&-&-&Permesso di visualizzazione per il proprietario.\\ + -&-&-&-&1&-&-&-&-&-&-&-&Permesso di aggiornamento per il proprietario.\\ + -&-&-&-&-&1&-&-&-&-&-&-&Permesso di attraversamento per il proprietario.\\ + -&-&-&-&-&-&1&-&-&-&-&-&Permesso di visualizzazione per il gruppo + proprietario.\\ + -&-&-&-&-&-&-&1&-&-&-&-&Permesso di aggiornamento per il gruppo + proprietario.\\ + -&-&-&-&-&-&-&-&1&-&-&-&Permesso di attraversamento per il gruppo + proprietario.\\ + -&-&-&-&-&-&-&-&-&1&-&-&Permesso di visualizzazione per tutti gli altri.\\ + -&-&-&-&-&-&-&-&-&-&1&-&Permesso di aggiornamento per tutti gli altri.\\ + -&-&-&-&-&-&-&-&-&-&-&1&Permesso di attraversamento per tutti gli altri.\\ \hline \end{tabular} \caption{Tabella riassuntiva del significato dei bit dei permessi per una @@ -2504,17 +2514,122 @@ illustrata in fig.~\ref{fig:file_perm_bit}. \label{tab:file_dirperm_bits} \end{table} -Nelle tabelle si è indicato con ``-'' il fatto che il valore degli altri bit -non è influente rispetto a quanto indicato in ciascuna riga; l'operazione fa -riferimento soltanto alla combinazione di bit per i quali il valore è -riportato esplicitamente. +Nelle tabelle si è indicato con il carattere ``-'' il fatto che il valore del +bit in questione non è influente rispetto a quanto indicato nella riga della +tabella; la descrizione dell'operazione fa riferimento soltanto alla +combinazione di bit per i quali è stato riportato esplicitamente un valore. +Si rammenti infine che il valore dei bit dei permessi non ha alcun effetto +qualora il processo possieda i privilegi di amministratore. + + + +\section{Caratteristiche e funzionalità avanzate} +\label{sec:file_dir_advances} + +Tratteremo qui alcune caratteristiche e funzionalità avanzate della gestione +di file e directory, affrontando anche una serie di estensioni +dell'interfaccia classica dei sistemi unix-like, principalmente utilizzate a +scopi di sicurezza, che sono state introdotte nelle versioni più recenti di +Linux. + + +\subsection{Gli attributi estesi} +\label{sec:file_xattr} + +\itindbeg{Extended~Attributes} + +Nelle sezioni precedenti abbiamo trattato in dettaglio le varie informazioni +che il sistema mantiene negli inode, e le varie funzioni che permettono di +modificarle. Si sarà notato come in realtà queste informazioni siano +estremamente ridotte. Questo è dovuto al fatto che Unix origina negli anni +'70, quando le risorse di calcolo e di spazio disco erano minime. Con il venir +meno di queste restrizioni è incominciata ad emergere l'esigenza di poter +associare ai file delle ulteriori informazioni astratte (quelli che vengono +chiamati i \textsl{meta-dati}) che però non potevano trovar spazio nei dati +classici mantenuti negli inode. + +Per risolvere questo problema alcuni sistemi unix-like (e fra questi anche +Linux) hanno introdotto un meccanismo generico che consenta di associare delle +informazioni ai singoli file,\footnote{l'uso più comune è quello della ACL, + che tratteremo a breve, ma si possono inserire anche altre informazioni.} +detto \textit{Extended Attributes}. Gli \textsl{attributi estesi} non sono +altro che delle coppie nome/valore che sono associate permanentemente ad un +oggetto sul filesystem, analoghi di quello che sono le variabili di ambiente +(vedi sez.~\ref{sec:proc_environ}) per un processo. + +Altri sistemi (come Solaris, MacOS e Windows) hanno adottato un meccanismo +diverso in cui ad un file sono associati diversi flussi di dati, su cui +possono essere mantenute ulteriori informazioni, che possono essere accedute +con le normali operazioni di lettura e scrittura. Questi non vanno confusi con +gli \textit{Extended Attributes} (anche se su Solaris hanno lo stesso nome), +che sono un meccanismo molto più semplice, che pur essendo limitato (potendo +contenere solo una quantità limitata di informazione) hanno il grande +vantaggio di essere molto più semplici da realizzare e più +efficienti,\footnote{cosa molto importante, specie per le applicazioni che + richiedono una gran numero di accessi, come le ACL.} e di garantire +l'atomicità di tutte le operazioni. + + + + +\itindend{Extended~Attributes} + +% TODO trattare gli attributi estesi e le funzioni la documentazione di +% sistema è nei pacchetti libxattr1-dev e attr + + +\subsection{Le ACL} +\label{sec:file_ACL} + + +\itindbeg{Access~Control~List} + +Il modello classico dei permessi di Unix, per quanto funzionale ed efficiente, +è comunque piuttosto limitato e per quanto possa aver coperto per lunghi anni +le esigenze più comuni con un meccanismo semplice e potente, non è in grado di +rispondere in maniera adeguata a situazioni che richiedono una gestione +complessa dei permessi di accesso.\footnote{già un requisito come quello di + dare accesso in scrittura ad alcune persone ed in sola lettura ad altre non + si può soddisfare in maniera soddifacente.} + +Per questo motivo erano state progressivamente introdotte nelle varie versioni +di Unix dei meccanismi di gestione dei permessi dei file più flessibili, nella +forma delle cosiddette \textit{Access Control List}. Nello sforzo di +standardizzare queste funzionalità era stato creato un gruppo di lavoro il cui +scopo era estendere lo standard POSIX 1003 attraverso due nuovi insiemi di +specifiche, la POSIX 1003.1e per l'interfaccia di programmazione e la POSIX +1003.2c per i comandi di shell. + +Gli obiettivi erano però forse troppo ambizioni, e nel gennaio del 1998 i +finanziamenti vennero ritirati senza che si fosse arrivati alla definizione di +uno standard, dato però che una parte della documentazione prodotta era di +alta qualità venne deciso di rilasciare al pubblico la diciassettesima bozza +del documento, quella che va sotto il nome di POSIX 1003.1e Draft 17, che è +divenuta la base sulla quale si definiscono quelle che vanno sotto il nome di +\textit{Posix ACL}. + +A differenza di altri sistemi (ad esempio FreeBSD) nel caso di Linux si è +scelto di realizzare le ACL attraverso l'interfaccia degli \textit{Extended + Attributes}, e fornire tutte le relative funzioni di gestione tramite una +liberia, \texttt{libacl} che nasconde i dettagli implementativi delle stesse e +presenta ai programmi una interfaccia che fa riferimento allo standard POSIX +1003.1e. + +\itindend{Access~Control~List} + + +% TODO trattare le ACL, la documentazione di sistema è nei pacchetti +% libacl1-dev e acl +% vedi anche http://www.suse.de/~agruen/acl/linux-acls/online/ + -% TODO intrudurre nuova sezione sulle funzionalità di sicurezza avanzate, con -% dentro chroot, gli attributi estesi, ecc. \subsection{La funzione \func{chroot}} \label{sec:file_chroot} +% TODO intrudurre nuova sezione sulle funzionalità di sicurezza avanzate, con +% dentro chroot SELinux e AppArmor ??? + Benché non abbia niente a che fare con permessi, utenti e gruppi, la funzione \func{chroot} viene usata spesso per restringere le capacità di accesso di un programma ad una sezione limitata del filesystem, per cui ne parleremo in @@ -2596,11 +2711,6 @@ contiene i file. Si tenga presente per replicare all'interno della \textit{chroot jail} tutti i file (in genere programmi e librerie) di cui il server potrebbe avere bisogno. -%%% Local Variables: -%%% mode: latex -%%% TeX-master: "gapil" -%%% End: - % LocalWords: sez like filesystem unlink MacOS Windows VMS inode kernel unistd % LocalWords: un'etichetta int const char oldpath newpath errno EXDEV EPERM st % LocalWords: EEXIST EMLINK EACCES ENAMETOOLONG ENOTDIR EFAULT ENOMEM EROFS ls @@ -2630,4 +2740,9 @@ programmi e librerie) di cui il server potrebbe avere bisogno. % LocalWords: gid Control List patch mandatory control execute group other all % LocalWords: dell' effective passwd IGID locking swap saved text IRWXU IRWXG % LocalWords: IRWXO ext reiser capability FSETID mask capabilities chroot jail -% LocalWords: FTP Di +% LocalWords: FTP Di filter reiserfs + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "gapil" +%%% End: