From 2f4922efce6bcac7c6ff10a4c5af7bebccb1f151 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Tue, 6 Nov 2018 23:09:28 +0100 Subject: [PATCH] Documentati O_PATH (fine) e O_NOFOLLOW --- filedir.tex | 44 +++++++++---------- fileio.tex | 121 ++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 116 insertions(+), 49 deletions(-) diff --git a/filedir.tex b/filedir.tex index c78d42a..90e731e 100644 --- a/filedir.tex +++ b/filedir.tex @@ -407,7 +407,7 @@ per i dati in essi contenuti. \end{figure} Se si va ad esaminare con maggiore dettaglio la strutturazione -dell'informazione all'interno del filesystem \textsl{ext2}, tralasciando i +dell'informazione all'interno del filesystem \acr{ext2}, tralasciando i dettagli relativi al funzionamento del filesystem stesso come la strutturazione in gruppi dei blocchi, il \textit{superblock} e tutti i dati di gestione possiamo esemplificare la situazione con uno schema come quello @@ -514,7 +514,7 @@ tre, in quanto adesso sarà referenziata anche dalla voce ``\texttt{..}'' di \itindend{inode} -\subsection{Alcuni dettagli sul filesystem \textsl{ext2} e successori} +\subsection{Alcuni dettagli sul filesystem \acr{ext2} e successori} \label{sec:file_ext2} Benché non esista ``il'' filesystem di Linux, dato che esiste un supporto @@ -525,7 +525,7 @@ grande sviluppo e diverse evoluzioni, fra cui l'aggiunta del \textit{journaling} con il passaggio ad \acr{ext3}, che probabilmente è ancora il filesystem più diffuso, ed una serie di ulteriori miglioramenti con il successivo \acr{ext4}. In futuro è previsto che questo debba essere sostituito -da un filesystem completamente diverso, \acr{btrfs}, che dovrebbe diventare il +da un filesystem completamente diverso, \acr{Btrfs}, che dovrebbe diventare il filesystem standard di Linux, ma questo al momento è ancora in fase di sviluppo.\footnote{si fa riferimento al momento dell'ultima revisione di questo paragrafo, l'inizio del 2012.} @@ -597,8 +597,8 @@ lo schema in fig.~\ref{fig:file_ext2_dirs}; in questo modo è possibile implementare nomi per i file anche molto lunghi (fino a 1024 caratteri) senza sprecare spazio disco. -Con l'introduzione del filesystem \textit{ext3} sono state introdotte diverse -modifiche strutturali, la principale di queste è quella che \textit{ext3} è un +Con l'introduzione del filesystem \acr{ext3} sono state introdotte diverse +modifiche strutturali, la principale di queste è quella che \acr{ext3} è un filesystem \textit{journaled}, è cioè in grado di eseguire una registrazione delle operazioni di scrittura su un giornale (uno speciale file interno) in modo da poter garantire il ripristino della coerenza dei dati del @@ -610,7 +610,7 @@ filesystem\footnote{si noti bene che si è parlato di dati \textsl{del} della corrente o di crollo del sistema che abbia causato una interruzione della scrittura dei dati sul disco. -Oltre a questo \textit{ext3} introduce ulteriori modifiche volte a migliorare +Oltre a questo \acr{ext3} introduce ulteriori modifiche volte a migliorare sia le prestazioni che la semplicità di gestione del filesystem, in particolare per le directory si è passato all'uso di alberi binari con indicizzazione tramite \textit{hash} al posto delle \textit{linked list} che @@ -2363,8 +2363,8 @@ ecc.), e consente di evitare una successiva chiamata a \func{lstat} (vedi sez.~\ref{sec:file_stat}) per determinarlo. I suoi possibili valori sono riportati in tab.~\ref{tab:file_dtype_macro}. Si tenga presente che questo valore è disponibile solo per i filesystem che ne supportano la restituzione -(fra questi i più noti sono \textsl{btrfs}, \textsl{ext2}, \textsl{ext3}, e -\textsl{ext4}), per gli altri si otterrà sempre il valore +(fra questi i più noti sono \acr{Btrfs}, \acr{ext2}, \acr{ext3}, e +\acr{ext4}), per gli altri si otterrà sempre il valore \const{DT\_UNKNOWN}.\footnote{inoltre fino alla versione 2.1 della \acr{glibc}, pur essendo il campo \var{d\_type} presente, il suo uso non era implementato, e veniva restituito comunque il valore \const{DT\_UNKNOWN}.} @@ -4662,8 +4662,8 @@ in particolare accade che: quando l'\ids{UID} effettivo del processo è zero. \end{enumerate*} -Per alcuni filesystem\footnote{i filesystem più comuni (\textsl{ext2}, - \textsl{ext3}, \textsl{ext4}, \textsl{xfs}, \texttt{btrfs}) supportano +Per alcuni filesystem\footnote{i filesystem più comuni (\acr{ext2}, + \acr{ext3}, \acr{ext4}, \acr{XFS}, \acr{Btrfs}) supportano questa caratteristica, che è mutuata da BSD.} è inoltre prevista un'ulteriore misura di sicurezza, volta a scongiurare l'abuso dei bit \acr{suid} e \acr{sgid}; essa consiste nel cancellare automaticamente questi @@ -4986,11 +4986,11 @@ che ogni valore precedente sia sovrascritto. Si tenga presente che non tutti i filesystem supportano gli \textit{Extended Attributes}; al momento della scrittura di queste dispense essi sono -presenti solo sui vari \textsl{extN}, \textsl{ReiserFS}, \textsl{JFS}, -\textsl{XFS}, \textsl{Btrfs}, \textsl{Lustre} e \textsl{OCFS2}. Inoltre a +presenti solo sui vari \acr{extN}, \acr{ReiserFS}, \acr{JFS}, +\acr{XFS}, \acr{Btrfs}, \acr{Lustre} e \acr{OCFS2}. Inoltre a seconda della implementazione ci possono essere dei limiti sulla quantità di attributi che si possono utilizzare.\footnote{ad esempio nel caso di - \textsl{ext2} ed \textsl{ext3} è richiesto che essi siano contenuti + \acr{ext2} ed \acr{ext3} è richiesto che essi siano contenuti all'interno di un singolo blocco, pertanto con dimensioni massime pari a 1024, 2048 o 4096 byte a seconda delle dimensioni di quest'ultimo impostate in fase di creazione del filesystem, mentre con \textsl{XFS} e @@ -6172,14 +6172,14 @@ che ne fanno parte. Si può così porre dei limiti sul contenuto di un ramo di albero. Il meccanismo prevede che per ciascun filesystem che supporta le quote disco -(i vari \textit{extN}, \textit{btrfs}, \textit{XFS}, \textit{JFS}, -\textit{ReiserFS}) il kernel provveda sia a mantenere aggiornati i dati -relativi al consumo delle risorse da parte degli utenti e dei gruppi (e del -progetto), che a far rispettare i limiti imposti dal sistema, con la -generazione di un errore di \errcode{EDQUOT} per tutte le operazioni sui file -che porterebbero ad un superamento degli stessi. Si tenga presente che questi -due compiti sono separati, il primo si attiva al montaggio del filesystem con -il supporto per le quote, il secondo deve essere abilitato esplicitamente. +(i vari \acr{extN}, \acr{Btrfs}, \acr{XFS}, \acr{JFS}, \acr{ReiserFS}) il +kernel provveda sia a mantenere aggiornati i dati relativi al consumo delle +risorse da parte degli utenti e dei gruppi (e del progetto), che a far +rispettare i limiti imposti dal sistema, con la generazione di un errore di +\errcode{EDQUOT} per tutte le operazioni sui file che porterebbero ad un +superamento degli stessi. Si tenga presente che questi due compiti sono +separati, il primo si attiva al montaggio del filesystem con il supporto per +le quote, il secondo deve essere abilitato esplicitamente. Per il mantenimento dei dati di consumo delle risorse vengono usati due file riservati nella directory radice del filesystem su cui si sono attivate le @@ -6776,7 +6776,7 @@ librerie) di cui il server potrebbe avere bisogno. % LocalWords: version libcap lcap clear ncap caps pag capgetp CapInh CapPrm RT % LocalWords: fffffeff CapEff getcap scheduling lookup dqinfo SETINFO GETFMT % LocalWords: NEWNS unshare nice NUMA ioctl journaling close XOPEN fdopendir -% LocalWords: btrfs mkostemp extN ReiserFS JFS Posix usrquota grpquota EDQUOT +% LocalWords: Btrfs mkostemp extN ReiserFS JFS Posix usrquota grpquota EDQUOT % LocalWords: aquota quotacheck limit grace period quotactl cmd caddr addr dqb % LocalWords: QUOTAON ENODEV ENOPKG ENOTBLK GETQUOTA SETQUOTA SETUSE SETQLIM % LocalWords: forced allowed sendmail SYSLOG WAKE ALARM CLOCK BOOTTIME dqstats diff --git a/fileio.tex b/fileio.tex index acbedc2..dc5bdfa 100644 --- a/fileio.tex +++ b/fileio.tex @@ -258,7 +258,7 @@ corrispondente,\footnote{è \func{open} che alloca \kstruct{file}, la inserisce supporta la funzionalità. \item[\errcode{EFBIG}] il file è troppo grande per essere aperto, in genere dovuto al fatto che si è compilata una applicazione a 32 bit senza - abilitare il supporto per le dimesioni a 64 bit; questo è il valore + abilitare il supporto per le dimensioni a 64 bit; questo è il valore restituito fino al kernel 2.6.23, coi successivi viene restituito \errcode{EOVERFLOW} come richiesto da POSIX.1. \item[\errcode{ELOOP}] si sono incontrati troppi collegamenti simbolici nel @@ -451,6 +451,11 @@ sez.~\ref{sec:file_fcntl_ioctl}). aggiunta in Linux a partire dal kernel 2.1.126, ed utilizzabile soltanto se si è definita la macro \macro{\_GNU\_SOURCE}.\\ + \const{O\_TMPFILE} & Consente di creare un file temporaneo anonimo, non + visibile con un pathname sul filesystem, ma + leggibile e scrivibile all'interno del processo. + Introdotto con il kernel 3.11, è specifico di + Linux.\\ \constd{O\_TRUNC} & Se usato su un file di dati aperto in scrittura, ne tronca la lunghezza a zero; con un terminale o una \textit{fifo} viene ignorato, negli altri casi @@ -471,7 +476,7 @@ Si è riportato in tab.~\ref{tab:open_time_flag} l'elenco dei flag delle \textsl{modalità di apertura}.\footnote{la \acr{glibc} definisce anche i due flag \constd{O\_SHLOCK}, che aprirebbe il file con uno \textit{shared lock} e \constd{O\_EXLOCK} che lo aprirebbe con un \textit{exclusive lock} (vedi - sez.~\ref{sec:file_locking}, si tratta di opzioni specifiche di BSD, che non + sez.~\ref{sec:file_locking}), si tratta di opzioni specifiche di BSD, che non esistono con Linux.} Uno di questi, \const{O\_EXCL}, ha senso solo se usato in combinazione a \const{O\_CREAT} quando si vuole creare un nuovo file per assicurarsi che questo non esista di già, e lo si usa spesso per creare i @@ -481,7 +486,7 @@ Si tenga presente che questa opzione è supportata su NFS solo a partire da NFSv3 e con il kernel 2.6, nelle versioni precedenti la funzionalità viene emulata controllando prima l'esistenza del file per cui usarla per creare un file di lock potrebbe dar luogo a una \textit{race condition}, in tal caso -infatto un file potrebbe venir creato fra il controllo la successiva apertura +infatti un file potrebbe venir creato fra il controllo la successiva apertura con \const{O\_CREAT}; la cosa si può risolvere comunque creando un file con un nome univoco ed usando la funzione \func{link} per creare il file di lock, (vedi sez.~\ref{sec:ipc_file_lock}). @@ -505,6 +510,56 @@ tab.~\ref{tab:file_file_times} vengono impostati al tempo corrente. Se invece si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il \textit{modification time} e lo \textit{status change time}. +Il flag \constd{O\_TMPFILE}, introdotto con il kernel +3.11,\footnote{inizialmente solo su alcuni filesystem (i vari \acr{extN}, + \acr{Minix}, \acr{UDF}, \acr{shmem}) poi progressivamente esteso ad altri + (\acr{XFS} con il 3.15, \acr{Btrfs} e \acr{F2FS} con il 3.16, \acr{ubifs} + con il 4.9).} consente di aprire un file temporaneo senza che questo venga +associato ad un nome e compaia nel filesystem. In questo caso la funzione +restituirà un file descriptor da poter utilizzare per leggere e scrivere dati, +ma il contenuto dell'argomento \param{path} verrà usato solamente per +determinare, in base alla directory su cui si verrebbe a trovare il +\textit{pathname} indicato, il filesystem all'interno del quale deve essere +allocato l'\textit{inode} e lo spazio disco usato dal file +descriptor. L'\textit{inode} resterà anonimo e l'unico riferimento esistente +sarà quello contenuto nella \textit{file table} del processo che ha chiamato +\func{open}. + +Lo scopo principale del flag è quello fornire una modalità atomica, semplice e +sicura per applicare la tecnica della creazione di un file temporaneo seguita +dalla sua immediata cancellazione con \func{unlink} per non lasciare rimasugli +sul filesystem, di cui è parlato in sez.~\ref{sec:link_symlink_rename}. +Inoltre, dato che il file non compare nel filesystem, si evitano alla radice +tutti gli eventuali problemi di \textit{race condition} o \textit{symlink + attack} e non ci si deve neanche preoccupare di ottenere un opportuno nome +univoco con l'uso delle funzioni di sez.~\ref{sec:file_temp_file}. + +Una volta aperto il file vi si potrà leggere o scrivere a seconda che siano +utilizzati \const{O\_RDWR} o \const{O\_WRONLY}, mentre l'uso di +\func{O\_RDONLY} non è consentito, non avendo molto senso ottenere un file +descriptor da cui non si potrà comunque mai leggere nulla. L'unico altro flag +che può essere utilizzato insieme a \const{O\_TMPFILE} è \const{O\_EXCL}, che +in questo caso assume però un significato diverso da quello ordinario, dato +che in questo caso non avrebbe senso fallire se il file non esiste, dato che +questo è sempre vero. + +L'uso di \const{O\_EXCL} attiene all'altro possibile impiego di +\const{O\_TMPFILE} oltre a quello della creazione sicura di un file temporaneo +come sostituto di \func{tmpfile}: la possibilità di creare un eventuale +contenuto iniziale ed impostare permessi, proprietario e attributi estesi con +\func{fchmod}, \func{fchown} e \func{fsetxattr} operando sul file descriptor, +senza possibilità di \textit{race condition} ed interferenze esterne, per poi +far apparire il tutto sul filesystem in un secondo tempo utilizzando +\func{linkat} sul file descriptor (torneremo su questo in +sez.~\ref{sec:file_openat}) per dargli un nome. Questa operazione però non +sarà possibile se si è usato \const{O\_EXCL}, che in questo caso viene ad +assumere il significato di escludere la possibilità di far esistere il file +anche in un secondo tempo. + +% NOTE: per O_TMPFILE vedi: http://kernelnewbies.org/Linux_3.11 +% https://lwn.net/Articles/558598/ http://lwn.net/Articles/619146/ + + \begin{table}[!htb] \centering \footnotesize @@ -542,7 +597,7 @@ si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il l'impostazione della suddetta modalità con \func{fcntl} (vedi sez.~\ref{sec:file_fcntl_ioctl}).\\ - \constd{O\_DIRECT} & Esegue l'I/O direttamente dalla memoria in + \const{O\_DIRECT} & Esegue l'I/O direttamente dalla memoria in \textit{user space} in maniera sincrona, in modo da scavalcare i meccanismi di bufferizzazione del kernel. Introdotto con il kernel 2.4.10 ed @@ -592,11 +647,6 @@ si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il dell'arrivo degli stessi e della parte di metadati ad essi relativa sull'hardware sottostante (in questo significato solo dal kernel 2.6.33).\\ - \const{O\_TMPFILE} & Consente di creare un file temporaneo anonimo, non - visibile con un pathname sul filesystem, ma - leggibile e scrivibile all'iterno del processo. - Introdotto con il kernel 3.11, è specifico di - Linux.\\ \hline \end{tabular} \caption{Le costanti che identificano le \textit{modalità di operazione} di @@ -628,7 +678,7 @@ specifica di definirlo in fase di apertura del file, è sempre opportuno attivarlo in un secondo tempo con \func{fcntl} (vedi sez.~\ref{sec:file_fcntl_ioctl}). -Il flag \const{O\_DIRECT} non è previsto da nessuno standard, anche se è +Il flag \constd{O\_DIRECT} non è previsto da nessuno standard, anche se è presente in alcuni kernel unix-like.\footnote{il flag è stato introdotto dalla SGI in IRIX, ma è presente senza limiti di allineamento dei buffer anche in FreeBSD.} Per i kernel della serie 2.4 si deve garantire che i buffer in @@ -656,7 +706,7 @@ completamente equivalente all'uso di \const{O\_SYNC} che garantisce anche sulla scrittura sincrona dei metadati associati alla scrittura dei dati del file.\footnote{la situazione si complica ulteriormente per NFS, in cui l'uso del flag disabilita la bufferizzazione solo dal lato del client, e può - causare problemi di prestazioni.} Per questo in genere è opportuno se si usa + causare problemi di prestazioni.} Per questo in genere se si usa \const{O\_DIRECT} è opportuno richiedere anche \const{O\_SYNC}. Si tenga presente infine che la implementazione di \const{O\_SYNC} di Linux @@ -697,7 +747,6 @@ all'identificazione di una posizione sul filesystem (ad uso delle operazioni che riguardano il file descriptor in quanto tale, senza consentire operazioni sul file; in sostanza se si apre un file con \const{O\_PATH} si potrà soltanto: - \begin{itemize*} \item usare il file descriptor come indicatore della directory di partenza con una delle \textit{at-functions} (vedi sez.~\ref{sec:file_openat}); @@ -714,24 +763,34 @@ potrà soltanto: flags} con \func{fcntl} (rispettivamente con le operazioni \const{F\_GETFL}, \const{F\_SETFD} e \const{F\_GETFD}, vedi sez.~\ref{sec:file_fcntl_ioctl}). -\item chiudere il file con \func{close}; +\item chiudere il file con \func{close}. \end{itemize*} -In realtà usando \const{O\_PATH} il file non viene effettivamente aperto per +In realtà usando \const{O\_PATH} il file non viene effettivamente aperto, per cui ogni tentativo di usare il file descriptor così ottenuto con funzioni che operano effettivamente sul file (come ad esempio \func{read}, \func{write}, -\func{fchown}, \func{fchmod}, \func{ioctl}, ecc.) fallirano con un errore di -\errval{EBADF}, come se questo non fosse un file descriptor valido. +\func{fchown}, \func{fchmod}, \func{ioctl}, ecc.) fallirà con un errore di +\errval{EBADF}, come se questo non fosse un file descriptor valido. Per questo +motivo usando questo flag non è necessario avere nessun permesso per aprire un +file, neanche quello di lettura (occorre ovviamente avere il permesso di +esecuzione per le directory sovrastanti). + +Questo consente di usare il file descriptor con funzioni che non richiedono +permessi sul file, come \func{fstat}, laddove un'apertura con +\const{O\_RDONLY} sarebbe fallita. I permessi verranno eventualmente +controllati, se necessario, nelle operazioni seguenti, ad esempio per usare +\func{fchdir} con il file descriptor (se questo fa riferimento ad una +directory) occorrerà avere il permesso di esecuzione. Se si usa \const{O\_PATH} tutti gli altri flag eccettuati \const{O\_CLOEXEC}, -\const{O\_DIRECTORY} e \const{O\_NOFOLLOW} verranno ignorati. - -% TODO: aggiungere O_TMPFILE per la creazione di file temporanei senza che -% questi appaiano sul filesystem, introdotto con il 3.11, vedi: -% https://lwn.net/Articles/556512/, http://kernelnewbies.org/Linux_3.11 -% https://lwn.net/Articles/558598/ http://lwn.net/Articles/619146/ - - +\const{O\_DIRECTORY} e \const{O\_NOFOLLOW} verranno ignorati. I primi due +mantengono il loro significato usuale, mentre \const{O\_NOFOLLOW} fa si che se +il file indicato è un un link simbolico venga aperto quest'ultimo (cambiando +quindi il comportamento ordinario che prova il fallimento della chiamata), +così da poter usare il file descriptor ottenuto per le funzioni +\func{fchownat}, \func{fstatat}, \func{linkat} e \func{readlinkat} che ne +supportano l'uso come come primo argomento (torneremo su questo in +sez.~\ref{sec:file_openat}). Nelle prime versioni di Unix i valori di \param{flag} specificabili per @@ -1774,7 +1833,12 @@ anche l'aggiunta di un ulteriore argomento finale, \param{flags}. % TODO manca prototipo di linkat, verificare se metterlo o metter menzione % altre modifiche al riguardo nel 3.11 (AT_EMPTY_PATH?) vedi -% http://lwn.net/Articles/562488/ +% http://lwn.net/Articles/562488/ + +% TODO: Trattare esempio di inzializzazione di file e successivo collegamento +% con l'uso di O_TMPFILE e linkat, vedi man open + + % TODO manca prototipo di utimensat, verificare se metterlo o metter menzione % TODO manca prototipo di renameat2, introdotta nel 3.15, vedi % http://lwn.net/Articles/569134/ @@ -4406,5 +4470,8 @@ con uno dei valori \const{FSETLOCKING\_INTERNAL} o %%% mode: latex %%% TeX-master: "gapil" %%% End: -% LocalWords: l'I nell' du vm Documentation Urlich Drepper futimesat times -% LocalWords: futimens fs Tread all'I ll + +% LocalWords: nell' du vm Documentation Urlich Drepper futimesat times +% LocalWords: futimens fs Tread all'I ll TMPFILE EDQUOT extN Minix UDF XFS +% LocalWords: shmem Btrfs ubifs tmpfile fchmod fchown fsetxattr fchdir PF +% LocalWords: fstatfs sull' -- 2.30.2