From fd4e2fd24a218ef56953fd5a58d0b3c0bee8acb7 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sat, 14 Jan 2012 15:23:26 +0000 Subject: [PATCH] Materiale sui flag della system call mount. --- filedir.tex | 192 +++++++++++++++++++++++++++++++++++++++------------- process.tex | 9 +-- 2 files changed, 150 insertions(+), 51 deletions(-) diff --git a/filedir.tex b/filedir.tex index e95c7af..d9c98d8 100644 --- a/filedir.tex +++ b/filedir.tex @@ -726,27 +726,30 @@ doveva essere specificato obbligatoriamente,\footnote{il valore era il \itindex{magic~number} \textit{magic number} \code{0xC0ED}, si può usare la costante \const{MS\_MGC\_MSK} per ottenere la parte di \param{mountflags} riservata al \textit{magic number}, mentre per specificarlo si può dare un - OR aritmetico con la costante \const{MS\_MGC\_VAL}.} oggi invece sono -ignorati mentre i 16 meno significativi sono usati per specificare le opzioni -come maschera binaria e vanno impostati con un OR aritmetico dei valori -riportati nell'elenco seguente: + OR aritmetico con la costante \const{MS\_MGC\_VAL}.} e si potevano usare +solo i 16 meno significativi. Oggi invece, con un numero di opzioni superiore, +sono utilizzati tutti e 32 i bit, ma qualora nei 16 più significativi sia +presente detto valore, che non esprime una combinazione valida, esso viene +ignorato. Il valore dell'argomento deve essere espresso come maschera binaria +e i vari bit devono essere impostati con un OR aritmetico dei rispettivi flag, +identificati dalle costanti riportate nell'elenco seguente: \begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}} \itindbeg{bind~mount} \item[\const{MS\_BIND}] Effettua un cosiddetto \textit{bind mount}, in cui è possibile montare una directory di un filesystem in un'altra directory, l'opzione è disponibile a partire dai kernel della serie 2.4. In questo caso - verranno presi in considerazione solo gli argomenti \texttt{source}, che + verranno presi in considerazione solo gli argomenti \param{source}, che stavolta indicherà la directory che si vuole montare (e non un file di - dispositivo) e \texttt{target} che indicherà la directory su cui verrà + dispositivo) e \param{target} che indicherà la directory su cui verrà effettuato il \textit{bind mount}. Gli argomenti \param{filesystemtype} e \param{data} vengono ignorati. In sostanza quello che avviene è che in corrispondenza del \index{pathname} - \textit{pathname} indicato da \texttt{target} viene montato l'\textit{inode} - di \texttt{source}, così che la porzione di albero dei file presente sotto - \texttt{source} diventi visibile allo stesso modo sotto - \texttt{target}. Trattandosi esattamente di dati dello stesso filesystem, + \textit{pathname} indicato da \param{target} viene montato l'\textit{inode} + di \param{source}, così che la porzione di albero dei file presente sotto + \param{source} diventi visibile allo stesso modo sotto + \param{target}. Trattandosi esattamente dei dati dello stesso filesystem, ogni modifica fatta in uno qualunque dei due rami di albero sarà visibile nell'altro, visto che entrambi faranno riferimento agli stessi \textit{inode}. @@ -754,31 +757,31 @@ riportati nell'elenco seguente: Dal punto di vista del \itindex{Virtual~File~System} VFS l'operazione è analoga al montaggio di un filesystem proprio nel fatto che anche in questo caso si inserisce in corripondenza della \textit{dentry} di \texttt{target} - un diverso \textit{inode}, che stavolta invece di essere quello della radice - del filesystem indicato da un file di dispositivo è quello di una directory - già montata. + un diverso \textit{inode}, che stavolta, invece di essere quello della + radice del filesystem indicato da un file di dispositivo, è quello di una + directory già montata. - Si tenga presente che proprio per questo sotto \texttt{target} comparirà il - contenuto che è presente sotto \texttt{source} all'interno del filesystem in + Si tenga presente che proprio per questo sotto \param{target} comparirà il + contenuto che è presente sotto \param{source} all'interno del filesystem in cui quest'ultima è contenuta. Questo potrebbe non corrispondere alla - porzione di albero che sta sotto \texttt{source} qualora in una + porzione di albero che sta sotto \param{source} qualora in una sottodirectory di quest'ultima si fosse effettuato un altro montaggio. In - tal caso infatti nella porzione di albero sotto \texttt{source} si - troverebbe il contenuto del nuovo filesystem (o di un altro \textit{bind - mount}) mentre sotto \texttt{target} ci sarebbe il contenuto presente nel - filesystem originale.\footnote{questo evita anche il problema dei - \textit{loop} di fig.~\ref{fig:file_link_loop}, dato che se anche si - montasse su \texttt{target} una directory in cui essa è contenuta, il - cerchio non potrebbe chiudersi perché ritornati a \texttt{target} dentro - il \textit{bind mount} vi si troverebbe solo il contenuto originale e non - si potrebbe tornare indietro.} + tal caso infatti nella porzione di albero sotto \param{source} si troverebbe + il contenuto del nuovo filesystem (o di un altro \textit{bind mount}) mentre + sotto \param{target} ci sarebbe il contenuto presente nel filesystem + originale.\footnote{questo evita anche il problema dei \textit{loop} di + fig.~\ref{fig:file_link_loop}, dato che se anche si montasse su + \param{target} una directory in cui essa è contenuta, il cerchio non + potrebbe chiudersi perché ritornati a \param{target} dentro il + \textit{bind mount} vi si troverebbe solo il contenuto originale e non si + potrebbe tornare indietro.} Fino al kernel 2.6.26 questo flag doveva essere usato da solo, in quanto il \textit{bind mount} continuava ad utilizzare le stesse opzioni del montaggio originale, dal 2.6.26 è stato introdotto il supporto per il cosiddetto \textit{read-only bind mount} e viene onorata la presenza del flag \const{MS\_RDONLY}. In questo modo si ottiene che l'accesso ai file sotto - \texttt{target} sia effettuabile esclusivamente in sola lettura. + \param{target} sia effettuabile esclusivamente in sola lettura. Il supporto per il \textit{bind mount} consente di superare i limiti presenti per gli \textit{hard link} (di cui parleremo in @@ -794,33 +797,128 @@ riportati nell'elenco seguente: \item[\const{MS\_DIRSYNC}] Richiede che ogni modifica al contenuto di una directory venga immediatamente registrata su disco in maniera sincrona - (introdotta a partire dai kernel della serie 2.6). Questo significa che la - bufferizzazione effettuata dal - -\item[\const{MS\_MANDLOCK}] Consente il \textit{mandatory locking} - \itindex{mandatory~locking} (vedi sez.~\ref{sec:file_mand_locking}). - -\item[\const{MS\_MOVE}] Sposta atomicamente il punto di montaggio. - -\item[\const{MS\_NOATIME}] Non aggiorna gli \textit{access time} (vedi - sez.~\ref{sec:file_file_times}). - -\item[\const{MS\_NODEV}] Impedisce l'accesso ai file di dispositivo. - -\item[\const{MS\_NODIRATIME}] Non aggiorna gli \textit{access time} delle - directory. -\item[\const{MS\_NOEXEC}] Impedisce di eseguire programmi. - -\item[\const{MS\_NOSUID}] Ignora i bit \itindex{suid~bit} \acr{suid} e - \itindex{sgid~bit} \acr{sgid}. + (introdotta a partire dai kernel della serie 2.6). L'opzione si applica a + tutte le directory del filesystem, ma su alcuni filesystem è possibile + impostarla a livello di singole directory o per i sottorami di una directory + con il comando \cmd{lsattr}.\footnote{questo avviene tramite delle opportune + \texttt{ioctl} (vedi sez.~\ref{sec:file_ioctl}).} + + Questo consente di ridurre al minimo il rischio di perdita dei dati delle + directory in caso di crollo improvviso del sistema, al costo di una perdita + di prestazioni dato che le funzioni di scrittura relative ad operazioni + sulle directory non saranno più bufferizzate e si bloccheranno fino + all'arrivo dei dati sul disco prima che un programma possa proseguire. + +\item[\const{MS\_MANDLOCK}] Consente l'uso del \textit{mandatory locking} + \itindex{mandatory~locking} (vedi sez.~\ref{sec:file_mand_locking}) sui file + del filesystem. Per poterlo utilizzare effettivamente però esso dovrà essere + comunque attivato esplicitamente per i singoli file impostando i permessi + come illustrato in sez.~\ref{sec:file_mand_locking}. + +\item[\const{MS\_MOVE}] Effettua uno del spostamento del \itindex{mount~point} + \textit{mount point} di un filesystem. La directory del + \itindex{mount~point} \textit{mount point} originale deve essere indicata + nell'argomento \param{source}, e la sua nuova posizione + nell'argomento \param{target}. Tutti gli altri argomenti della funzione + vengono ignorati. + + Lo spostamento avviene atomicamente, ed il ramo di albero presente + sotto \param{source} sarà immediatamante visibile sotto \param{target}. Non + esiste cioè nessun momento in cui il filesystem non risulti montato in una o + nell'altra directory e pertanto è garantito che la risoluzione di + \textit{pathname} relativi all'interno del filesystem non possa fallire. + +\item[\const{MS\_NOATIME}] Viene disabilitato sul filesystem l'aggiornamento + degli \textit{access time} (vedi sez.~\ref{sec:file_file_times}) per + qualunque tipo di file. Dato che l'aggiornamento degli \textit{access time} + è una funzionalità la cui utilità è spesso irrilevante ma comporta un costo + elevato visto che una qualunque lettura comporta comunque una scrittura su + disco,\footnote{e questo ad esempio ha conseguenze molto pesanti nell'uso + della batteria sui portatili.} questa opzione consente di disabilitarla + completamente. La soluzione può risultare troppo drastica dato che + l'informazione viene comunque utilizzata da alcuni programmi, per cui nello + sviluppo del kernel sono state introdotte altre opzioni che forniscono + soluzioni più appropriate e meno radicali. + +\item[\const{MS\_NODEV}] Viene disabilitato sul filesystem l'accesso ai file + di dispositivo eventualmente presenti su di esso. L'opzione viene usata come + misura di precauzione per rendere inutile la presenza di eventuali file di + dispositivo su filesystem che non dovrebbero contenerne.\footnote{si ricordi + che le convenzioni del \itindex{Filesystem~Hierarchy~Standard~(FHS)} + \textit{Linux Filesystem Hierarchy Standard} richiedono che questi siano + mantenuti esclusivamente sotto \texttt{/dev}.} + + Viene utilizzata, assieme a \const{MS\_NOEXEC} e \const{MS\_NOSUID}, per + fornire un accesso più controllato a quei filesystem di cui gli utenti hanno + il controllo dei contenuti, in particolar modo quelli posti su dispositivi + rimuovibili. In questo modo si evitano alla radice possibili situazioni in + cui un utente malizioso inserisce su uno di questi filesystem dei file di + dispositivo con permessi ``opportunamente'' ampliati che gli consentano di + accedere anche a risorse cui non dovrebbe. + +\item[\const{MS\_NODIRATIME}] Viene disabilitato sul filesystem + l'aggiornamento degli \textit{access time} (vedi + sez.~\ref{sec:file_file_times}), ma soltanto per le directory. Costituisce + una alternativa per \const{MS\_NOATIME}, che elimina l'informazione per le + directory, che in pratica che non viene mai utilizzata, mantenendola per i + file in cui invece ha un impiego, sia pur limitato. + +\item[\const{MS\_NOEXEC}] Viene disabilitata sul filesystem l'esecuzione di un + qualunque file eseguibile eventualmente presente su di esso. L'opzione viene + usata come misura di precauzione per rendere impossibile l'uso di programmi + posti su filesystem che non dovrebbero contenerne. + + Anche in questo caso viene utilizzata per fornire un accesso più controllato + a quei filesystem di cui gli utenti hanno il controllo dei contenuti. Da + questo punto di vista l'opzione è meno importante delle analoghe + \const{MS\_NODEV} e \const{MS\_NOSUID} in quanto l'esecuzione di un + programma creato dall'utente pone un livello di rischio nettamente + inferiore, ed è in genere consentita per i file contenuti nella sua home + directory.\footnote{cosa che renderebbe superfluo l'attivazione di questa + opzione, il cui uso ha senso solo per ambienti molto controllati in cui si + vuole che gli utenti eseguano solo i programmi forniti + dall'amministratore.} + +\item[\const{MS\_NOSUID}] Viene disabilitato sul filesystem l'effetto dei bit + dei permessi \itindex{suid~bit} \acr{suid} e \itindex{sgid~bit} \acr{sgid} + (vedi sez.~\ref{sec:file_special_perm}) eventualmente presenti sui file in + esso contenuti. L'opzione viene usata come misura di precauzione per rendere + inefficace l'effetto di questi bit per filesystem in cui non ci dovrebbero + essere file dotati di questi permessi. + + Di nuovo viene utilizzata, analogamente a \const{MS\_NOEXEC} e + \const{MS\_NODEV}, per fornire un accesso più controllato a quei filesystem + di cui gli utenti hanno il controllo dei contenuti. In questo caso si evita + che un utente malizioso possa inserire su uno di questi filesystem un + eseguibile con il bit \itindex{suid~bit} \acr{suid} attivo e di proprietà + dell'amministratore o di un altro utente, che gli consentirebbe di eseguirlo + per conto di quest'ultimo. \item[\const{MS\_PRIVATE}] (non documentato). -\item[\const{MS\_RDONLY}] Monta in sola lettura. +\item[\const{MS\_RDONLY}] Esegue il montaggio del filesystem in sola lettura, + non sarà possibile nessuna modifica ai suoi contenuti. Viene usato tutte le + volte che si deve accedere ai contenuti di un filesystem con la certezza che + questo non venga modificato (ad esempio per ispezionare un filesystem + corrotto). All'avvio di default il kernel monta la radice in questa + modalità. \item[\const{MS\_RELATIME}] . -\item[\const{MS\_REMOUNT}] Rimonta il filesystem cambiando le opzioni. +\item[\const{MS\_REMOUNT}] Consente di rimontare un filesystem già montato + cambiandone le opzioni di montaggio in maniera atomica. In questo modo si + possono modificare le opzioni del filesystem anche se questo è in uso. Gli + argomenti \param{source} e \param{target} devono essere gli stessi usati per + il montaggio originale, mentre \param{data} che \param{mountflags} + conterranno le nuove opzioni, \param{filesystemtype} viene ignorato. + + Qualunque opzione specifica del filesystem indicata con \param{data} può + essere modificata, mentre con \param{mountflags} possono essere modificate + solo alcune opzioni generiche. Con i kernel più recenti queste sono soltanto + \const{MS\_MANDLOCK}, \const{MS\_RDONLY} e \const{MS\_SYNCHRONOUS}, prima + del kernel 2.6.16 potevano essere modificate anche le ulteriori + \const{MS\_NOATIME} e \const{MS\_NODIRATIME}, ed infine prima del kernel + 2.4.10 anche \const{MS\_NODEV}, \const{MS\_NOEXEC} e \const{MS\_NOSUID}. \item[\const{MS\_SHARE}] Shared mount (non documentato). diff --git a/process.tex b/process.tex index 29f4234..1194700 100644 --- a/process.tex +++ b/process.tex @@ -243,10 +243,11 @@ Un esempio di inclusione di questi file, preso da uno dei programmi di esempio, è il seguente, e si noti come gli \textit{header file} possano essere referenziati con il nome fra parentesi angolari, nel qual caso si indica l'uso di quelli installati con il sistema,\footnote{in un sistema GNU/Linux che - segue le specifiche del \textit{Filesystem Hierarchy Standard} (per maggiori - informazioni si consulti sez.~1.2.3 di \cite{AGL}) si trovano sotto - \texttt{/usr/include}.} o fra virgolette, nel qual caso si fa riferimento ad -una versione locale, da indicare con un pathname relativo: + segue le specifiche del \itindex{Filesystem~Hierarchy~Standard~(FHS)} + \textit{Filesystem Hierarchy Standard} (per maggiori informazioni si + consulti sez.~1.2.3 di \cite{AGL}) si trovano sotto \texttt{/usr/include}.} +o fra virgolette, nel qual caso si fa riferimento ad una versione locale, da +indicare con un pathname relativo: \includecodesnip{listati/main_include.c} Si tenga presente che oltre ai nomi riservati a livello generale di cui si è -- 2.30.2