%% filedir.tex
%%
-%% Copyright (C) 2000-2012 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2000-2014 Simone Piccardi. Permission is granted to
%% copy, distribute and/or modify this document under the terms of the GNU Free
%% Documentation License, Version 1.1 or any later version published by the
%% Free Software Foundation; with the Invariant Sections being "Un preambolo",
collegamento simbolico può fare riferimento anche ad un file che non esiste;
ad esempio possiamo usare il comando \cmd{ln} per creare un collegamento
simbolico nella nostra directory con:
-\begin{Command}
-$ ln -s /tmp/tmp_file symlink
-\end{Command}
+\begin{Console}
+piccardi@hain:~/gapil$ \textbf{ln -s /tmp/tmp_file symlink}
+\end{Console}
%$
e questo avrà successo anche se \file{/tmp/tmp\_file} non esiste:
-\begin{Command}
-$ ls symlink
-\end{Command}
-\begin{Terminal}
+\begin{Console}
+piccardi@hain:~/gapil$ \textbf{ls symlink}
symlink
-\end{Terminal}
+\end{Console}
%$
ma questo può generare confusione, perché accedendo in sola lettura a
\file{symlink}, ad esempio con \cmd{cat}, otterremmo un errore:
-\begin{Command}
-$ cat symlink
-\end{Command}
-\begin{Terminal}
+\begin{Console}
+piccardi@hain:~/gapil$ \textbf{cat symlink}
cat: symlink: No such file or directory
-\end{Terminal}
+\end{Console}
%$
con un errore che può sembrare sbagliato, dato che \cmd{ls} ci ha mostrato
l'esistenza di \file{symlink}, se invece scrivessimo su \file{symlink}
trovato coi sorgenti allegati alla guida nel file \file{myls.c}.
In sostanza tutto quello che fa il programma, dopo aver controllato
-(\texttt{\small 12--15}) di avere almeno un argomento, che indicherà la
+(\texttt{\small 12-15}) di avere almeno un argomento, che indicherà la
directory da esaminare, è chiamare (\texttt{\small 16}) la funzione
\myfunc{dir\_scan} per eseguire la scansione, usando la funzione \code{do\_ls}
-(\texttt{\small 22--29}) per fare tutto il lavoro.
+(\texttt{\small 22-29}) per fare tutto il lavoro.
Quest'ultima si limita (\texttt{\small 26}) a chiamare \func{stat} sul file
indicato dalla directory entry passata come argomento (il cui nome è appunto
riportata in fig.~\ref{fig:file_dirscan}. La funzione è volutamente generica e
permette di eseguire una funzione, passata come secondo argomento, su tutte le
voci di una directory. La funzione inizia con l'aprire (\texttt{\small
- 18--22}) uno \textit{stream} sulla directory passata come primo argomento,
+ 18-22}) uno \textit{stream} sulla directory passata come primo argomento,
stampando un messaggio in caso di errore.
-Il passo successivo (\texttt{\small 23--24}) è cambiare
+Il passo successivo (\texttt{\small 23-24}) è cambiare
\index{directory~di~lavoro} directory di lavoro (vedi
sez.~\ref{sec:file_work_dir}), usando in sequenza le funzioni \func{dirfd} e
\func{fchdir} (in realtà si sarebbe potuto usare direttamente \func{chdir} su
\var{dirname}), in modo che durante il successivo ciclo (\texttt{\small
- 26--30}) sulle singole voci dello \textit{stream} ci si trovi all'interno
+ 26-30}) sulle singole voci dello \textit{stream} ci si trovi all'interno
della directory.\footnote{questo è essenziale al funzionamento della funzione
\code{do\_ls}, e ad ogni funzione che debba usare il campo \var{d\_name}, in
quanto i nomi dei file memorizzati all'interno di una struttura
Un classico esempio di directory che ha questo bit impostato è \file{/tmp}, i
cui permessi infatti di solito sono i seguenti:
-\begin{Command}
-$ ls -ld /tmp
-\end{Command}
-\begin{Terminal}
+\begin{Console}
+piccardi@hain:~/gapil$ \textbf{ls -ld /tmp}
drwxrwxrwt 6 root root 1024 Aug 10 01:03 /tmp
-\end{Terminal}
+\end{Console}
%$
quindi con lo \textit{sticky bit} bit impostato. In questo modo qualunque
utente nel sistema può creare dei file in questa directory, che come
La sezione principale del programma, da cui si è rimossa la sezione sulla
gestione delle opzioni, è riportata in fig.~\ref{fig:proc_mygetfacl}. Il
-programma richiede un unico argomento (\texttt{\small 16--20}) che indica il
+programma richiede un unico argomento (\texttt{\small 16-20}) che indica il
file di cui si vuole leggere la ACL. Se questo è presente si usa
(\texttt{\small 22}) la funzione \func{get\_acl\_file} per leggerne la ACL, e
-si controlla (\texttt{\small 23--26}) se l'operazione ha successo, uscendo con
+si controlla (\texttt{\small 23-26}) se l'operazione ha successo, uscendo con
un messaggio di errore in caso contrario.
Ottenuta la ACL la si converte in formato testuale (\texttt{\small 27}) con la
funzione \func{acl\_to\_text}, controllando di nuovo se l'operazione ha
-successo (\texttt{\small 28--31}) ed uscendo in caso contrario. Si provvede
+successo (\texttt{\small 28-31}) ed uscendo in caso contrario. Si provvede
infine a stampare la rappresentazione testuale (\texttt{\small 32}) e dopo
-aver liberato (\texttt{\small 33--34}) le risorse allocate automaticamente, si
+aver liberato (\texttt{\small 33-34}) le risorse allocate automaticamente, si
conclude l'esecuzione.
con \macro{QCMD} al comando \const{Q\_GETQUOTA} per ottenere i dati.
La funzione viene eseguita all'interno di un condizionale (\texttt{\small
- 5--16}) che in caso di successo provvede a costruire (\texttt{\small 6--12})
+ 5-16}) che in caso di successo provvede a costruire (\texttt{\small 6-12})
opportunamente una risposta restituendo tramite la opportuna funzione di
interfaccia un oggetto Python contenente i dati della struttura \struct{dqblk}
relativi a uso corrente e limiti sia per i blocchi che per gli \itindex{inode}
-\textit{inode}. In caso di errore (\texttt{\small 13--15}) si usa un'altra
+\textit{inode}. In caso di errore (\texttt{\small 13-15}) si usa un'altra
funzione dell'interfaccia per passare il valore di \var{errno} come eccezione.
\begin{figure}[!htbp]
della precedente, con lo stesso significato, a cui si aggiungono i valori per
il \textit{soft limit} e l'\textit{hard limit}. In questo caso occorrerà,
prima di chiamare \func{quotactl}, inizializzare opportunamente
-(\texttt{\small 5--7}) i campi della struttura \struct{dqblk} che si vogliono
+(\texttt{\small 5-7}) i campi della struttura \struct{dqblk} che si vogliono
utilizzare (quelli relativi ai limiti sui blocchi) e specificare gli stessi
con \const{QIF\_BLIMITS} in \var{dq.dqb\_valid}.
Fatto questo la chiamata a \func{quotactl}, stavolta con il comando
\const{Q\_SETQUOTA}, viene eseguita come in precedenza all'interno di un
-condizionale (\texttt{\small 9--14}). In questo caso non essendovi da
+condizionale (\texttt{\small 9-14}). In questo caso non essendovi da
restituire nessun dato in caso di successo si usa (\texttt{\small 10}) una
apposita funzione di uscita, mentre si restituisce come prima una eccezione
-con il valore di \var{errno} in caso di errore (\texttt{\small 12--13}).
+con il valore di \var{errno} in caso di errore (\texttt{\small 12-13}).
\subsection{La gestione delle \textit{capabilities}}
\itindend{file~capabilities}
-% TODO verificare per process capability bounding set, vedi:
-% http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3b7391de67da515c91f48aa371de77cb6cc5c07e
+% NOTE per dati relativi al process capability bounding set, vedi:
+% http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3b7391de67da515c91f48aa371de77cb6cc5c07e
-% TODO capire cosa cambia con i patch vari, vedi
+% NOTE riferimenti ai vari cambiamenti vedi:
% http://lwn.net/Articles/280279/
% http://lwn.net/Articles/256519/
% http://lwn.net/Articles/211883/
in tab.~\ref{tab:proc_capabilities};\footnote{l'elenco presentato questa
tabella, ripreso dalla pagina di manuale (accessibile con \texttt{man
capabilities}) e dalle definizioni in
- \texttt{include/linux/capabilities.h}, è aggiornato al kernel 2.6.26.} la
+ \texttt{include/linux/capabilities.h}, è aggiornato al kernel 3.2.} la
tabella è divisa in due parti, la prima riporta le \textit{capabilities}
previste anche nella bozza dello standard POSIX1.e, la seconda quelle
specifiche di Linux. Come si può notare dalla tabella alcune
\const{CAP\_AUDIT\_WRITE}&Scrivere dati nel giornale di
auditing del kernel (dal kernel 2.6.11).\\
% TODO verificare questa roba dell'auditing
+ \const{CAP\_BLOCK\_SUSPEND}&Utilizzare funzionalità che possono bloccare
+ la sospensione del sistema (dal kernel 3.5).\\
\const{CAP\_CHOWN} & Cambiare proprietario e gruppo
proprietario di un file (vedi
sez.~\ref{sec:file_ownership_management}).\\
funzioni \func{mlock}, \func{mlockall},
\func{shmctl}, \func{mmap} (vedi
sez.~\ref{sec:proc_mem_lock} e
- sez.~\ref{sec:file_memory_map}). \\
+ sez.~\ref{sec:file_memory_map}). \\
+% TODO verificare l'interazione con SHM_HUGETLB
\const{CAP\_IPC\_OWNER} & Evitare il controllo dei permessi
per le operazioni sugli oggetti di
intercomunicazione fra processi (vedi
sez.~\ref{sec:file_asyncronous_lease})
pur non essendo proprietari del file (dal kernel
2.4).\\
- \const{CAP\_LINUX\_IMMUTABLE}& Impostare sui file gli
- attributi \textit{immutable} e
- \itindex{append~mode} \textit{append-only} (vedi
+ \const{CAP\_LINUX\_IMMUTABLE}& Impostare sui file gli attributi
+ \textit{immutable} e \itindex{append~mode}
+ \textit{append-only} (vedi
sez.~\ref{sec:file_perm_overview}) se
supportati.\\
- \const{CAP\_MKNOD} & Creare
- \index{file!di~dispositivo} file di dispositivo
- con \func{mknod} (vedi
+ \const{CAP\_MKNOD} & Creare \index{file!di~dispositivo} file di
+ dispositivo con \func{mknod} (vedi
sez.~\ref{sec:file_mknod}) (dal kernel 2.4).\\
\const{CAP\_NET\_ADMIN} & Eseguire alcune operazioni
privilegiate sulla rete.\\
- \const{CAP\_NET\_BIND\_SERVICE}& Porsi in ascolto
- su porte riservate (vedi
+ \const{CAP\_NET\_BIND\_SERVICE}& Porsi in ascolto su porte riservate (vedi
sez.~\ref{sec:TCP_func_bind}).\\
\const{CAP\_NET\_BROADCAST}& Consentire l'uso di socket in
\itindex{broadcast} \textit{broadcast} e
\itindex{multicast} \textit{multicast}.\\
- \const{CAP\_NET\_RAW} & Usare socket \texttt{RAW} e
- \texttt{PACKET} (vedi sez.~\ref{sec:sock_type}).\\
+ \const{CAP\_NET\_RAW} & Usare socket \texttt{RAW} e \texttt{PACKET}
+ (vedi sez.~\ref{sec:sock_type}).\\
\const{CAP\_SETPCAP} & Effettuare modifiche privilegiate alle
\textit{capabilities}.\\
- \const{CAP\_SYS\_ADMIN} & Eseguire una serie di compiti
- amministrativi.\\
- \const{CAP\_SYS\_BOOT} & Eseguire un riavvio del
- sistema (vedi sez.~\ref{sec:sys_reboot}).\\
- \const{CAP\_SYS\_CHROOT}& Eseguire la funzione
- \func{chroot} (vedi sez.~\ref{sec:file_chroot}).\\
+ \const{CAP\_SYS\_ADMIN} & Eseguire una serie di compiti amministrativi.\\
+ \const{CAP\_SYS\_BOOT} & Eseguire un riavvio del sistema (vedi
+ sez.~\ref{sec:sys_reboot}).\\
+ \const{CAP\_SYS\_CHROOT}& Eseguire la funzione \func{chroot} (vedi
+ sez.~\ref{sec:file_chroot}).\\
\const{CAP\_MAC\_ADMIN} & Amministrare il \textit{Mandatory
Access Control} di Smack (dal kernel 2.6.25).\\
\const{CAP\_MAC\_OVERRIDE}& Evitare il \textit{Mandatory
Access Control} di Smack (dal kernel 2.6.25).\\
- \const{CAP\_SYS\_MODULE}& Caricare e rimuovere moduli del
- kernel.\\
- \const{CAP\_SYS\_NICE} & Modificare le varie priorità dei
- processi (vedi sez.~\ref{sec:proc_priority}).\\
- \const{CAP\_SYS\_PACCT} & Usare le funzioni di
- \textit{accounting} dei processi (vedi
- sez.~\ref{sec:sys_bsd_accounting}).\\
+ \const{CAP\_SYS\_MODULE}& Caricare e rimuovere moduli del kernel.\\
+ \const{CAP\_SYS\_NICE} & Modificare le varie priorità dei processi (vedi
+ sez.~\ref{sec:proc_priority}).\\
+ \const{CAP\_SYS\_PACCT} & Usare le funzioni di \textit{accounting} dei
+ processi (vedi
+ sez.~\ref{sec:sys_bsd_accounting}).\\
\const{CAP\_SYS\_PTRACE}& La capacità di tracciare qualunque processo con
\func{ptrace} (vedi
sez.~\ref{sec:process_ptrace}).\\
- \const{CAP\_SYS\_RAWIO} & Operare sulle porte
- di I/O con \func{ioperm} e \func{iopl} (vedi
+ \const{CAP\_SYS\_RAWIO} & Operare sulle porte di I/O con \func{ioperm} e
+ \func{iopl} (vedi
sez.~\ref{sec:process_io_port}).\\
- \const{CAP\_SYS\_RESOURCE}& Superare le varie limitazioni
- sulle risorse.\\
- \const{CAP\_SYS\_TIME} & Modificare il tempo di sistema
- (vedi sez.~\ref{sec:sys_time}).\\
- \const{CAP\_SYS\_TTY\_CONFIG}&Simulare un \textit{hangup}
- della console, con la funzione
- \func{vhangup}.\\
+ \const{CAP\_SYS\_RESOURCE}& Superare le varie limitazioni sulle risorse.\\
+ \const{CAP\_SYS\_TIME} & Modificare il tempo di sistema (vedi
+ sez.~\ref{sec:sys_time}).\\
+ \const{CAP\_SYS\_TTY\_CONFIG}&Simulare un \textit{hangup} della console,
+ con la funzione \func{vhangup}.\\
\const{CAP\_SYSLOG} & Gestire il buffer dei messaggi
del kernel, (vedi sez.~\ref{sec:sess_daemon}),
introdotta dal kernel 2.6.38 come capacità
\errval{ESRCH}. Gli stessi valori possono essere letti direttamente nel
filesystem \textit{proc}, nei file \texttt{/proc/<pid>/status}; ad esempio per
\texttt{init} si otterrà qualcosa del tipo:
-\begin{Command}
-$ cat /proc/1/status
-\end{Command}
-\begin{Terminal}
+\begin{Console}
+piccardi@hain:~/gapil$ \textbf{cat /proc/1/status}
...
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff
...
-\end{Terminal}
+\end{Console}
%$
\itindend{capability~state}
l'opzione \texttt{-p} è impostata (nella sezione di gestione delle opzioni,
che si è tralasciata) al valore del \ids{PID} del processo di cui si vuole
leggere le \textit{capabilities} e nulla altrimenti. Nel primo caso
-(\texttt{\small 1--6}) si utilizza (\texttt{\small 2}) \func{cap\_get\_proc}
+(\texttt{\small 1-6}) si utilizza (\texttt{\small 2}) \func{cap\_get\_proc}
per ottenere lo stato delle capacità del processo, nel secondo (\texttt{\small
- 7--13}) si usa invece \func{cap\_get\_pid} (\texttt{\small 8}) per leggere
+ 7-13}) si usa invece \func{cap\_get\_pid} (\texttt{\small 8}) per leggere
il valore delle capacità del processo indicato.
Il passo successivo è utilizzare (\texttt{\small 15}) \func{cap\_to\_text} per
tradurre in una stringa lo stato, e poi (\texttt{\small 16}) stamparlo; infine
-(\texttt{\small 18--19}) si libera la memoria allocata dalle precedenti
+(\texttt{\small 18-19}) si libera la memoria allocata dalle precedenti
funzioni con \func{cap\_free} per poi ritornare dal ciclo principale della
funzione.
% cgroup o altro
% TODO: trattare la funzione setns e i namespace file descriptors (vedi
-% http://lwn.net/Articles/407495/) introdotti con il kernel 3.0
+% http://lwn.net/Articles/407495/) introdotti con il kernel 3.0, altre
+% informazioni su setns qui: http://lwn.net/Articles/532748/
+% http://lwn.net/Articles/531498/
+
% TODO: spostare chroot e le funzioni affini relative ai container da qualche
% parte diversa se è il caso.