X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=system.tex;h=55d09eec1d56e3b8dd85c93cfb782d35ceab8751;hp=27f484c83ad837d969c5fe75a91f6aec45365ad4;hb=c316b51fbaa9a5bb04e72b1e7e9b3eb7ab96fd62;hpb=7bd1670460aea5107ad0aeeb5f0639587ceb4399 diff --git a/system.tex b/system.tex index 27f484c..55d09ee 100644 --- a/system.tex +++ b/system.tex @@ -8,6 +8,7 @@ stesso, quelle per il controllo dell'uso delle risorse da parte dei processi, quelle per la gestione dei tempi e degli errori. + \section{La lettura delle caratteristiche del sistema} \label{sec:sys_characteristics} @@ -179,7 +180,7 @@ A complicare la faccenda si aggiunge il fatto che POSIX.1 prevede una serie di altre macro (che iniziano sempre con \code{\_POSIX\_}) che definiscono i valori minimi le stesse caratteristiche devono avere, perché una implementazione possa dichiararsi conforme allo standard; detti valori sono -riportati in \tabref{tab:sys_posix1_base}. +riportati in \tabref{tab:sys_posix1_general}. \begin{table}[htb] \centering @@ -217,11 +218,11 @@ riportati in \tabref{tab:sys_posix1_base}. \label{tab:sys_posix1_general} \end{table} -In genere questi valori non servono a molto, la loro unica utilità è quella -di indicare un limite superiore che assicura la portabilità senza necessità di -ulteriori controlli. Tuttavia molti di essi sono troppo ristretti, ed -ampiamente superati in tutti i sistemi POSIX in uso oggigiorno. Per questo è -sempre meglio usare i valori provvisti da \func{sysconf}. +In genere questi valori non servono a molto, la loro unica utilità è quella di +indicare un limite superiore che assicura la portabilità senza necessità di +ulteriori controlli. Tuttavia molti di essi sono ampiamente superati in tutti +i sistemi POSIX in uso oggigiorno. Per questo è sempre meglio utilizzare i +valori ottenuti da \func{sysconf}. \begin{table}[htb] \centering @@ -247,12 +248,12 @@ sempre meglio usare i valori provvisti da \func{sysconf}. \label{tab:sys_posix1_other} \end{table} -Oltre ai precedenti valori (e a quelli elencati in +Oltre ai precedenti valori (e a quelli relativi ai file elencati in \tabref{tab:sys_posix1_file}), che devono essere obbligatoriamente definiti, -lo standard POSIX.1 ne prevede parecchi altri; in Linux la lista completa si -può ricavare dall'header file \file{bits/posix1\_lim.h} (da non usare mai -direttamente, è incluso automaticamente all'interno di \file{limits.h}); di -questi vale la pena menzionare quelli di uso più comune, riportati in +lo standard POSIX.1 ne prevede parecchi altri. La lista completa si trova +dall'header file \file{bits/posix1\_lim.h} (da non usare mai direttamente, è +incluso automaticamente all'interno di \file{limits.h}); di questi vale la +pena menzionare quelli di uso più comune, riportati in \tabref{tab:sys_posix1_other}, che permettono di ricavare alcune caratteristiche del sistema (come il supporto del \textit{job control} o dei \textit{saved id}). @@ -469,16 +470,19 @@ suo prototipo \subsection{La funzione \func{uname}} \label{sec:sys_uname} -Una altra funzione che si può utilizzare per raccogliere informazioni riguardo -al sistema ed al computer su cui esso sta girando è \func{uname}, il suo -prototipo è: +Una altra funzione che si può utilizzare per raccogliere informazioni sia +riguardo al sistema che al computer su cui esso sta girando è \func{uname}, il +suo prototipo è: \begin{prototype}{sys/utsname.h}{int uname(struct utsname *info)} Restituisce informazioni sul sistema nella struttura \param{info}. \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di fallimento, nel qual caso \var{errno} viene settata a \macro{EFAULT}.} \end{prototype} -\noindent la struttura è anch'essa definita in \file{sys/utsname.h} come: + +La funzione, che viene usata dal comando \cmd{umane}, restituisce le +informazioni richieste nella struttura \param{info}, anche questa struttura è +definita in \file{sys/utsname.h} come: \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{} struct utsname { char sysname[_UTSNAME_LENGTH]; @@ -491,39 +495,183 @@ prototipo #endif }; \end{lstlisting} -ed i suoi menbri indicano rispettivamente: +e le informazioni memorizzate nei suoi membri indicano rispettivamente: \begin{itemize*} \item il nome del systema operativo; \item il nome della release del kernel; \item il nome della versione del kernel; \item il tipo di macchina in uso; \item il nome della stazione; -\item il nome del domino (è una estensione recente). +\item il nome del domino. \end{itemize*} - +(l'ultima informazione è stata aggiunta di recente e non è prevista dallo +standard POSIX). \section{Opzioni e configurazione del sistema} \label{sec:sys_config} -In questa sezione prenderemo in esame le funzioni per leggere e settare i vari -parametri di configurazione del sistema. +Come abbiamo accennato nella sezione precedente, non tutti i limiti che +caratterizzano il sistema sono fissi, o perlomeno non lo sono in tutte le +implementazioni. Finora abbiamo visto come si può fare per leggerli, ci manca +di esaminare il meccanismo che permette, quando questi possono variare durante +l'esecuzione del sistema, di modificarli. + +Inoltre, al di la di quelli che possono essere limiti caratteristici previsti +da uno standard, ogni sistema può avere una sua serie di altri parametri di +configurazione, che non essendo mai fissi, non sono stati inclusi nella +standardizzazione della sezione precedente, e per i quali occorre, oltre al +meccanismo di settaggio, pure un meccanismo di lettura. +Affronteremo questi argomenti in questa sezione, insieme alle funzioni che si +usano per la gestione ed il controllo dei filesystem. -\subsection{La funzione \func{sysctl}} + +\subsection{La funzione \func{sysctl} ed il filesystem \file{/proc}} \label{sec:sys_sysctl} -\subsection{Il filesystem \file{/proc}} -\label{sec:sys_proc_files} +La funzione che permette la lettura ed il settaggio dei parametri del kernel è +\func{sysctl}, è una funzione derivata da BSD4.4, ma l'implementazione è +specifica di Linux; il suo prototipo è: +\begin{functions} +\headdecl{unistd.h} +\headdecl{linux/unistd.h} +\headdecl{linux/sysctl.h} +\funcdecl{int sysctl(int *name, int nlen, void *oldval, size\_t *oldlenp, void + *newval, size\_t newlen)} + + +\bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di + errore, nel qual caso \var{errno} viene settato ai valori: + \begin{errlist} + \item[\macro{EPERM}] il processo non ha il permesso di accedere ad uno dei + componenti nel cammino specificato per il parametro, o non ha il permesso + di accesso al parametro nella modalità scelta. + \item[\macro{ENOTDIR}] non esiste un parametro corrispondente al nome + \param{name}. + \item[\macro{EFAULT}] si è specificato \param{oldlenp} zero quando + \param{oldval} è non nullo. + \item[\macro{EINVAL}] o si è specificato un valore non valido per il + parametro che si vuole settare o lo spazio provvisto per il ritorno di un + valore non è delle giuste dimensioni. + \item[\macro{ENOMEM}] talvolta viene usato più correttamente questo errore + quando non si è specificato sufficiente spazio per ricevere il valore di un + parametro. + \end{errlist} +} +\end{functions} + +I parametri a cui la funzione permettere di accedere sono organizzati in +maniera gerarchica ad albero, e per accedere ad uno di essi occorre +specificare un cammino attraverso i vari nodi dell'albero, in maniera analoga +a come si specifica un pathname (da cui l'uso alternativo del filesystem +\file{/proc} che vedremo dopo). + +Ciascun nodo è identificato da un valore intero, ed il cammino che arriva ad +identificare un parametro specifico è passato attraverso l'array \param{name}, +di lunghezza \param{nlen}, che contiene la sequenza dei vari nodi da +attraversare. Il formato del valore di un parametro dipende dallo stesso e può +essere un intero, una stringa o anche una struttura complessa. + +L'indirizzo a cui il valore deve essere letto è specificato da +\param{oldvalue}, e lo spazio ivi disponibile è specificato da \param{oldlenp} +(passato come puntatore per avere indietro la dimensione effettiva di quanto +letto); il valore che si vuole scrivere è passato in \param{newval} e la sua +dimensione in \param{newlen}. + +Si può effettuare anche una lettura e scrittura simultanea, nel qual caso il +valore letto è quello precedente alla scrittura. + +I parametri accessibili attraverso questa funzione sono moltissimi, e possono +essere trovati in \file{sysctl.h}, essi inoltre dipendono anche dallo stato +corrente del kernel (ad esempio dai moduli che sono stati caricati nel +sistema) e in genere i loro nomi possono variare da una versione di kernel +all'altra; per questo è sempre il caso di evitare l'uso di \func{sysctl} +quando esistono modalità alternative per ottenere le stesse informazioni, +alcuni esempi di parametri ottenibili sono: +\begin{itemize*} +\item il nome di dominio +\item i parametri del meccanismo di \textit{paging}. +\item il filesystem montato come radice +\item la data di compilazione del kernel +\item i parametri dello stack TCP +\item il numero massimo di file aperti +\end{itemize*} + +Come accennato in Linux si ha una modalità alternativa per accedere alle +stesse informazioni di \func{sysctl} attaverso l'uso del filesystem +\file{/proc}. Questo è un filesystem virtuale, generato direttamente dal +kernel, che non fa riferimento a nessun dispositivo fisico, ma presenta in +forma di file alcune delle strutture interne del kernel stesso. + +In particolare l'albero dei valori di \func{sysctl} viene presentato in forma +di file nella directory \file{/proc/sys}, cosicché è possibile accedervi +speficando un pathname e leggendo e scrivendo sul file corrispondente al +parametro scelto. Il kernel si occupa di generare al volo il contenuto ed i +nomi dei file corrispondenti, e questo ha il grande vantaggio di rendere +accessibili i vari parametri a qualunque comando di shell e di permettere la +navigazione dell'albero dei valori. + +Alcune delle corrispondenze con i valori di \func{sysctl} sono riportate nei +commenti in \file{linux/sysctl.h}, la informazione disponibile in +\file{/proc/sys} è riportata inoltre nella documentazione inclusa nei sorgenti +del kernel, nella directory \file{Documentation/sysctl}. \subsection{La configurazione dei filesystem} \label{sec:sys_file_config} +Come accennato in \secref{sec:file_organization} per poter accedere ai file +occorre prima rendere disponibile al sistema il filesystem su cui essi sono +memorizzati; l'operazione di attivazione del filesystem è chiamata +\textsl{montaggio}, per far questo si usa la funzione \func{mount} il cui +prototipo è: +\begin{prototype}{sys/mount.h} +{mount(const char *source, const char *target, const char *filesystemtype, + unsigned long mountflags, const void *data)} + +Monta il filesystem di tipo \param{filesystemtype} contenuto in \param{source} +sulla directory \param{target}. + + \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di + fallimento, nel qual caso \var{errno} viene settata a: + \begin{errlist} + \item[\macro{EPERM}] il processo non ha i provilegi di amministratore. + \item[\macro{ENODEV}] \param{filesystemtype} non esiste o non è configurato + nel kernel. + \item[\macro{ENOTBLK}] non si è usato un \textit{block device} per + \param{source} quando era richiesto. + \item[\macro{EBUSY}] \param{source} è già montato, o non può essere + rimontato in read-only perché ci sono ancora file aperti in scrittura, o + \param{target} è ancora in uso. + \item[\macro{EINVAL}] il device \param{source} presenta un + \textit{superblock} non valido, o si è cercato di rimontare un filesystem + non ancora montato, o di montarlo senza che \param{target} sia un + \type{mount point} o di spostarlo quando \param{target} non è un + \type{mount point} o è \file{/}. + \item[\macro{EACCES}] non si ha il permesso di accesso su uno dei componenti + del pathname, o si è cercato di montare un filesystem disponibile in sola + lettura senza averlo specificato o il device \param{source} è su un + filesystem montato con l'opzione \macro{MS\_NODEV}. + \item[\macro{ENXIO}] il \textit{major number} del device \param{source} è + sbagliato. + \item[\macro{EMFILE}] la tabella dei device \textit{dummy} è piena. + \end{errlist} + ed inoltre \macro{ENOTDIR}, \macro{EFAULT}, \macro{ENOMEM}, + \macro{ENAMETOOLONG}, \macro{ENOENT} o \macro{ELOOP}.} +\end{prototype} + + + + \subsection{La funzione \func{statfs}} \label{sec:sys_file_stafs} +\subsection{La gestione di utenti e gruppi} +\label{sec:sys_user_group} + + \section{Limitazione ed uso delle risorse} \label{sec:sys_res_limits} @@ -539,6 +687,8 @@ sul loro utilizzo. \label{sec:sys_resource_use} + + \subsection{Limiti sulle risorse} \label{sec:sys_resource_limit} @@ -806,9 +956,6 @@ o la macro (\texttt{\small 15--17}) associate a quel codice. \end{figure} -\section{La gestione di utenti e gruppi} -\label{sec:sys_user_group} - %%% Local Variables: %%% mode: latex