\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
\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
\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.}
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
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
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}.}
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
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
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
% 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
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
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
\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
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}).
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
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
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
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
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
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});
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
% 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/
%%% 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'