%--------------------------------------------------------------------
\chapter{L'albero delle directory} \label{chap:walkabout}
%--------------------------------------------------------------------

        \begin{chapterquote}
	Due giorni dopo, c'era Pooh, \\
	seduto sul suo ramo, che faceva dondolare \\
	le gambe, e l\`i, vicino a lui, c'erano \\
	quattro vasi di miele\dots \\
	(A.A.\ Milne) \\
        \end{chapterquote}

	\noindent
	Questo capitolo descrive le parti più importanti di un albero delle directory standard di Linux, basato sullo standard FSSTND per i filesystem. Descrive come normalmente l'albero delle directory viene diviso in filesystem separati con scopi diversi, e spiega le motivazioni che stanno dietro questo modo di fare. Vengono descritti anche altri tipi di divisione.

%	\meta The next version of the FSSTND (1.3?) will cause many
%	minor changes, and some new ones, due to work to make the
%	FSSTND work for BSD systems as well.

\section{Premesse}

	Questo capitolo è basato sullo standard dei filesystem Linux, FSSTND, versione 1.2 (vedere la bibliografia, \cite{fsstnd-1.2}), che tenta di impostare uno standard per l'organizzazione dell'albero delle directory nei sistemi Linux. Uno standard del genere ha il vantaggio che sarà più facile scrivere o portare del software per Linux, e amministrare le macchine Linux, dato che tutto sarà nel posto designato.
Non c'è nessuna autorità che impone a nessuno di uniformarsi allo standard, ma questo ha il supporto della maggior parte, se non di tutte, le distribuzioni Linux. Non è una buona idea rompere con lo standard FSSTND se non per ragioni molto particolari. Il FSSTND tenta di seguire la tradizione Unix e le tendenze più recenti, rendendo i sistemi Linux familiari per chi ha esperienza con altri sistemi Unix, e viceversa.

	Questo capitolo non è dettagliato come il FSSTND. Gli amministratori di sistema dovrebbero leggere anche il FSSTND per avere una comprensione completa dell'argomento.

	Questo capitolo non descrive tutti i file in dettaglio. L'intenzione non è di descrivere ciascun file, ma di dare una visione del sistema dal punto di vista del filesystem. Ulteriori informazioni su ciascun file possono essere trovate in altre parti di questo manuale o nelle pagine man.

	L'albero delle directory completo può essere diviso in parti più piccole, ciascuna sulla sua partizione di disco, per ottimizzare le cose in dipendenza dalla dimensione dei dischi e per rendere più semplice il backup e il resto dell'amministrazione. Le parti principali sono i filesystem root, \fn{/usr}, \fn{/var} e \fn{/home} (vedere la figura~\ref{fig:fstree}). Ciascuna parte ha uno scopo diverso. L'albero delle directory è stato strutturato in modo che funzioni bene in una rete di macchine Linux che condividano delle parti del filesystem su un dispositivo a sola lettura (ad esempio un CD-ROM), o sulla rete con NFS.
	
		\begin{figure}[htb]
		\begin{center}
		\includegraphics{walkabout/fstree.ps}
		\end{center}
		\caption{Parti di un albero delle directory Unix.
			Le linee tratteggiate indicano i limiti delle partizioni.}
		\label{fig:fstree}
		\end{figure}

	I ruoli delle diverse parti dell'albero delle directory sono descritte qui sotto.
		%
	\begin{itemize}
	\item
	Il filesystem root è specifico per ciascuna macchina (generalmente viene immagazzinato su un disco locale, anche se può trattarsi di un ramdisk o di un disco in rete) e contiene i file necessari per avviare il sistema e per portarlo ad uno stato tale che possa montare gli altri filesystem. Il contenuto del filesystem di root sarà quindi sufficiente per la modalità a singolo utente. Conterrà anche gli strumenti per recuperare un filesystem danneggiato o copiare dai backup i file perduti.

	\item
	Il filesystem \fn{/usr} contiene tutti i comandi, le librerie, le pagine man e altri file che non vengono modificati durante le normali operazioni. Nessun file in \fn{/usr} dovrebbe essere specifico per nessuna macchina data, né dovrebbe essere modificato durante il normale uso. Questo permette che il file venga condiviso in rete, cosa che può portare ad un risparmio economico dato che permette di risparmiare in spazio disco (facilmente ci possono  essere centinaia di megabyte in \fn{/usr}), e può rendere l'amministrazione molto più semplice (basta modificare solo l'\fn{/usr} principale quando si aggiorna un'applicazione, e non c'\'e bisogno di farlo separatamente su ciascuna macchina). Anche se il filesystem si trova su un disco locale, può essere montato con accesso a sola lettura, per diminuire le possibilità di corruzione durante un crash.

	\item
	Il filesystem \fn{/var} contiene dei file che cambiano, come le directory di spool (per la posta, le news, le stampanti eccetera), i file di log, le pagine man formattate e i file temporanei. Tradizionalmente tutto quello che si trova in \fn{/var} si trovava in qualche posto sotto \fn{/usr}, ma questo rendeva impossibile montare \fn{/usr} a sola lettura.

	\item
	Il filesystem \fn{/home} contiene le home directory degli utenti, cioè tutti i veri dati sul sistema. Separare le home directory su un albero o su un filesystem separato rende molto più semplici i backup: le altre parti in genere non hanno bisogno di backup, o almeno non frequentemente (cambiano poco nel tempo). Una \fn{/home} grande potrebbe dover essere separata in vari filesystem, cosa che richiede di aggiungerci sotto dei livelli aggiuntivi, ad esempio \fn{/home/students} e \fn{/home/staff}.
	\end{itemize}
		%
	Anche se le diverse parti sono state chiamate fino ad ora filesystem, non è richiesto che si trovino realmente su filesystem diversi; possono essere tenute su uno stesso filesystem se il sistema è piccolo e monoutente, e l'utente vuole mantenere le cose semplici. L'albero delle directory può essere diviso in filesystem in modo diverso da quanto spiegato, a seconda di quanto sono grandi i dischi e di come lo spazio è allocato per i vari scopi. 
	La parte importante, piuttosto, è che tutti i \emph{nomi} importanti funzionino, anche se, diciamo, \fn{/var} e \fn{/usr} sono in realtà sulla stessa partizione, i nomi \fn{/usr/lib/libc.a} e \fn{/var/adm/messages} devono funzionare, ad esempio spostando i file sotto \fn{/var} in \fn{/usr/var}, e rendendo \fn{/var} un link simbolico a \fn{/usr/var}.

	La struttura dei filesystem Unix raggruppa i file a seconda dello scopo, cioè tutti i comandi si trovano nello stesso posto, tutti i file di dati in un altro, la documentazione in un terzo e così via. Un'alternativa sarebbe raggruppare i file a seconda del programma a cui appartengono, cioè tutti i file di Emacs sarebbero in una stessa directory, tutti quelli di \TeX\ in un altra, e così via. Il problema di quest'ultimo approccio è che rende difficile condividere i file (le directory dei programmi spesso contengono sia file statici che condivisibili, e sia file che cambiano che file che restano invariati), e spesso anche trovare dei file (ad esempio, le pagine man sarebbero in un numero enorme di posti, e fare in modo che i programmi di lettura delle pagine man le possano trovare è l'incubo degli amministratori di sistema).


\section{Il filesystem root}

	Il filesystem root dovrebbe generalmente essere piccolo, dato che contiene file estremamente critici, e un filesystem piccolo che viene modificato poco ha migliori possibilità di non venire corrotto. Un filesystem di root corrotto in genere significa che diventa impossibile avviare il sistema tranne che con misure eccezionali (ad esempio da un floppy), quindi è meglio non rischiare.

	La directory principale in genere non contiene nessun file, tranne forse l'immagine standard di avvio per il sistema, che di solito si chiama \fn{/vmlinuz}. Tutti gli altri file sono in sottodirectory del filesystem root:
		%
	\begin{dispitems}
	\item[\fn{/bin}]
		Comandi necessari durante il boot del sistema che devono essere usati dagli utenti normali (probabilmente dopo il boot).
	\item[\fn{/sbin}]
		Come \fn{/bin}, ma i comandi non sono intesi per gli utenti normali, anche se questi li possono usare se necessario e se hanno i permessi.
	\item[\fn{/etc}]
		I file di configurazione specifici per la macchina.	
	\item[\fn{/root}]
		La home directory dell'utente \texttt{root}.
	\item[\fn{/lib}]
		Le librerie condivise necessarie ai programmi sui filesystem root.
	\item[\fn{/lib/modules}]
		I moduli del kernel caricabili, specialmente quelli che sono necessari per avviare il sistema quando lo si sta recuperando da un disastro (ad esempio i driver di rete e dei filesystem).
	\item[\fn{/dev}]
		I file di device.	
	\item[\fn{/tmp}]
		I file temporanei. I programmi che vengono avviati dopo il boot dovrebbero usare \fn{/var/tmp}, non \fn{/tmp}, dato che il primo si trova probabilmente in un disco con più spazio.
	\item[\fn{/boot}]
		I  file usati dal boot manager, come LILO. Le immagini del kernel spesso vengono tenute qui invece che nella directory root. Se ci sono diverse immagini di kernel, la directory può facilmente crescere parecchio, e spesso può essere meglio tenerla in un filesystem separato. Un'altra ragione può essere di assicurarsi che le immagini del kernel siano comprese nei primi 1024 cilindri di un disco IDE.
	\item[\fn{/mnt}]
		Il punto di mount dove l'amministratore di sistema possa montare temporaneamente delle directory. I programmi non dovrebbero montarsi su \fn{/mnt} automaticamente.
		\fn{/mnt} può essere diviso in sottodirectory (esempio 
		\fn{/mnt/dosa} può essere il floppy che usa un filesystem MS-DOS, e 
	\fn{/mnt/exta} lo stesso con un filesystem ext2).
	\item[\fn{/proc}, \fn{/usr}, \fn{/var}, \fn{/home}]
		Punti di mount per gli altri filesystem.
	\end{dispitems}

\subsection{La directory \fn{/etc}}

	La directory \fn{/etc} contiene moltissimi file. Alcuni di questi sono descritti qui sotto, per gli altri, dovreste determinare a quale programma appartengono, e leggere la pagina man corrispondente. Anche molte configurazioni di rete si trovano in \fn{/etc}, e sono descritte nella Guida dell'amministratore di rete.
		%
	\begin{dispitems}
	\item[\fn{/etc/rc} o \fn{/etc/rc.d} o \fn{/etc/rc?.d}]
	Script o directory di script da eseguire all'avvio o quando si cambia il runlevel. Vedere il capitolo su \cmd{init} per altre informazioni.

	\item[\fn{/etc/passwd}]
	Il database degli utenti, con dei campi che danno il nome dell'utente, il vero nome, la home directory, la password criptata ed altre informazioni su ciascun utente. Il formato è documentato nella pagina man di \man{passwd}.

	\item[\fn{/etc/fdprm}]
	La tabella dei parametri dei floppy disk. Descrive le caratteristiche di diversi formati di floppy disk. Viene usata da \cmd{setfdprm}; vedere la pagina man di \man{setfdprm} per altre informazioni.

	\item[\fn{/etc/fstab}]
	Elenca i filesystem montati automaticamente all'avvio dal comando \texttt{mount -a} (in \fn{/etc/rc} o da un file di avvio equivalente). Sotto Linux contiene anche delle informazioni sulle aree di swap usate automaticamente da \texttt{swapon -a}. Vedere la sezione~\ref{subsec:mount} e la pagina man di \man{mount} per ulteriori informazioni.

	\item[\fn{/etc/group}]
	Simile a \fn{/etc/passwd}, ma descrive i gruppi anziché gli utenti. Vedere la pagina man di \man{group} per altre informazioni.

	\item[\fn{/etc/inittab}]
	File di configurazione di \cmd{init}.

	\item[\fn{/etc/issue}]
	L'output di \cmd{getty} prima del prompt di login. Di solito contiene una breve descrizione del sistema o un messaggio di benvenuto. La scelta del contenuto è lasciata all'amministratore di sistema.

	\item[\fn{/etc/magic}]
	Il file di configurazione di \cmd{file}.  Contiene la descrizione di vari formati di file, basandosi sui quali \cmd{file} indovina il tipo di file. Vedere la pagina man di \man{magic} e \man{file} per altre informazioni.

	\item[\fn{/etc/motd}]
	Il \defin{messaggio del giorno}, che viene visualizzato subito dopo ogni login riuscito. Il contenuto è a scelta dell'amministratore di sistema. Spesso viene usato per dare delle informazioni agli utenti, come ad esempio l'avviso dello spegnimento del sistema.

	\item[\fn{/etc/mtab}]
	Elenco dei filesystem correntemente montati. Impostato inizialmente dagli script, ed aggiornato automaticamente dal comando \cmd{mount}. Viene usato quando c'è bisogno di un elenco dei filesystem montati, come per il comando \cmd{df}.

	\item[\fn{/etc/shadow}]
	Il file delle shadow password sui sistemi in cui sono installate. Le shadow password spostano le password criptate da \fn{/etc/passwd} a \fn{/etc/shadow}; quest'ultimo non è leggibile da nessuno tranne \texttt{root}; così è più difficile craccare le password.

	\item[\fn{/etc/login.defs}]
	File di configurazione per il comando \cmd{login}.

	\item[\fn{/etc/printcap}]
	Come \fn{/etc/termcap}, ma inteso per le stampanti. La sintassi è diversa.

	\item[\fn{/etc/profile}, \fn{/etc/csh.login}, \fn{/etc/csh.cshrc}]
	File eseguiti al login o all'avvio dalle shell di tipo Bourne o C. Permettono all'amministratore di sistema di impostare dei valori di default globali per tutti gli utenti. Vedere le pagine man per le rispettive shell.

	\item[\fn{/etc/securetty}]
	Identifica i terminali sicuri, cioè quelli da cui \texttt{root} può accedere al sistema. Tipicamente vengono elencati solo le console virtuali, in modo che sia impossibile (o almeno più difficile) acquistare i privilegi di superutente craccando un sistema da un modem o dalla rete.

	\item[\fn{/etc/shells}]
	Elenca le shell tra cui scegliere. Il comando \cmd{chsh} permette agli utenti di cambiare la loro shell di login solo con le shell elencate in questo file. \cmd{ftpd}, il processo server che dà i servizi FTP per la macchina controllerà che la shell dell'utente sia elencata in \fn{/etc/shells} e non permetterà di collegarsi a chi usa una shell non in elenco.

	\item[\fn{/etc/termcap}]
	Il database dei terminali. Descrive quali ``sequenze di escape'' controllano i vari terminali. I programmi vengono scritti in modo che invece di mandare in output una sequenza di escape che funziona solo su una particolare marca di terminali, cercano la sequenza corretta per fare quello che vogliono fare in \fn{/etc/termcap}. Come risultato la maggior parte dei programmi funzionano con quasi tutti i tipi di terminali. Vedere le pagine man di \man{termcap}, \man{curs\_termcap}, e \man{terminfo} per altre informazioni.
	 \end{dispitems}

 %	\meta HOSTNAME, adjtime, disktab, gettydefs, networking
 %	(exports, host.conf, hosts, hosts.equiv, inetd.conf, named.*,
 %	networks, ntp.conf, protocols, resolv.conf, rpc, services,
 %	syslog.conf), mtools, and so forth.

 \subsection{La directory \fn{/dev}}

	 La directory \fn{/dev} contiene degli speciali file di device, uno per ciascun dispositivo. I file di device vengono chiamati usando delle speciali convenzioni, che sono descritte nel'elenco dei dispositivi (Device list, vedi~\cite{device-list}).
 I file di device vengono creati durante l'installazione, ma possono essere creati anche in seguito usando lo script \cmd{/dev/MAKEDEV}. \cmd{/dev/MAKEDEV.local} è uno script scritto dall'amministratore di sistema che crea file di device o collegamenti solo locali (cioè quelli che non fanno parte dello standard \cmd{MAKEDEV}, come dei file di device per dei driver di dispositivi non standard).

 \section{Il filesystem \fn{/usr}}

	Il filesystem \fn{/usr} è spesso grande, dato che vi sono installati tutti i programmi. Tutti i file in \fn{/usr} vengono di solito da una distribuzione di Linux; i programmi installati in locale e il resto vanno sotto \fn{/usr/local}; in questo modo è possibile aggiornare il sistema a una nuova versione della distribuzione, o addirittura ad una distribuzione completamente nuova, senza dover reinstallare tutti i programmi da capo. 
	Alcune delle sottodirectory di \fn{/usr} sono elencate qui sotto (alcune di quelle meno importanti sono state saltate, vedere il FSSTND per altre informazioni).
		%
	\begin{dispitems}
	\item[\fn{/usr/X11R6}]
		Il sistema X Window, tutti i file. Per semplificare lo sviluppo e l'installazione di X, i suoi file non sono stati integrati nel resto del sistema. C'è un albero di directory sotto \fn{/usr/X11R6} simile a quello sotto \fn{/usr} stesso.
	\item[\fn{/usr/X386}]
		Simile a \fn{/usr/X11R6}, ma per X11 versione 5 (X11 Release 5).
	\item[\fn{/usr/bin}]
		Quasi tutti i comandi utente. Alcuni sono in 
		\fn{/bin} o in \fn{/usr/local/bin}.
	\item[\fn{/usr/sbin}]
		I comandi di amministrazione di sistema che non sono necessari sotto il filesystem root, come la maggior parte dei programmi di server, \item[\fn{/usr/man}, \fn{/usr/info}, \fn{/usr/doc}]: rispettivamente le pagine man, la documentazione info della GNU, ed altri file di documentazione sparsi.
	\item[\fn{/usr/include}]
		File di header per il linguaggio di programmazione C. Per essere consistenti con il resto del filesystem si sarebbero dovuti trovare in \fn{/usr/lib}, ma la tradizione è del tutto in favore di questo nome.
	\item[\fn{/usr/lib}]
		File di dati che non vengono modificati per i programmi ed i sottosistemi, tra cui anche alcuni file di configurazione validi per tutto il sistema. Il nome \texttt{lib} viene da libreria: originariamente erano librerie di subroutine di programmazione.
	\item[\fn{/usr/local}]
		Il posto per il software installato in locale e per altri file.
	\end{dispitems}

\section{Il filesystem \fn{/var}}

	\fn{/var} contiene i dati che vengono modificati quando il sistema lavora normalmente. è specifico per ciascun sistema, cioè non viene condiviso in rete con altri computer.
		%
	\begin{dispitems}
	\item[\fn{/var/catman}]
		Una cache per le pagine man che vengono formattate a richiesta. I sorgenti delle pagine man vengono di solito immagazzinati in \fn{/usr/man/man*}; alcune hanno una versione preformattata, che si trova in \fn{/usr/man/cat*}, altre devono essere formattate la prima volta che vengono visualizzate; la versione formattata viene posta in \fn{/var/man} in modo che chi le volesse visualizzare di nuovo non debba riformattarle (\fn{/var/catman} viene ripulita spesso nello stesso modo delle directory temporanee).
	\item[\fn{/var/lib}]
		I file che vengono modificati mentre il sistema viene normalmente usato.
	\item[\fn{/var/local}]
		I dati variabili per i programmi che vengono installati in \fn{/usr/local} (cioè quelli che sono stati installati dall'amministratore di sistema). Notate che anche i programmi installati in locale dovrebbero usare le altre directory \fn{/var} se sono appropriate, come \fn{/var/lock}. 
	\item[\fn{/var/lock}]
		File di blocco. Molti programmi seguono una convenzione per creare dei file di blocco in \fn{/var/lock} per indicare che stanno usando un particolare dispositivo o file; altri programmi noteranno il blocco e non accetteranno di usare il dispositivo o il file in questione.
	\item[\fn{/var/log}]
		I file di log di vari programmi, specialmente \cmd{login} (\fn{/var/log/wtmp}, che loggano tutti i login e i logout del sistema) e \cmd{syslog} (\fn{/var/log/messages}, dove vengono immagazzinati tutti i messaggi del kernel e dei programmi di sistema). I file in \fn{/var/log} possono spesso crescere indefinitamente, e possono richiedere che la directory venga ripulita ad intervalli regolari.
	\item[\fn{/var/run}]
		File che contengono informazioni sul sistema valide fino al reboot del sistema. Ad esempio, \fn{/var/run/utmp} contiene informazioni sugli utenti collegati correntemente.
	\item[\fn{/var/spool}]
		Directory per le mail, le news, le code di stampa ed altre code. Ciascuno spool diverso ha la sua sottodirectory sotto \fn{/var/spool}, ad esempio le caselle di posta degli utenti sono in \fn{/var/spool/mail}.
	\item[\fn{/var/tmp}]
		File temporanei che sono troppo grandi o devono esistere per un tempo più lungo di quello permesso per \fn{/tmp} (anche se l'amministratore di sistema può non permettere file molto vecchi neanche in \fn{/var/tmp}).
	\end{dispitems}


\section{Il filesystem \fn{/proc}}

	Il filesystem \fn{/proc} contiene un filesystem virtuale: non esiste sul disco, ma viene creato nella memoria dal kernel. Viene usato per fornire informazioni sul sistema (originariamente sui processi, da cui il suo nome). Alcuni dei file e delle directory più importanti sono descritti sotto. Il filesystem \fn{/proc} è descritto in maggior dettaglio nella pagina man di \man{proc}.
		%
	\begin{dispitems}
	\item[\fn{/proc/1}]
		Una directory con le informazioni sul processo numero 1. Ciascun processo ha una directory sotto \fn{/proc} indicata dal numero di identificazione del processo.
	\item[\fn{/proc/cpuinfo}]
		Informazioni sul processore, come il tipo, la marca, il modello e la performance.
	\item[\fn{/proc/devices}]
		Un elenco dei device driver configurati nel kernel in uso.
	\item[\fn{/proc/dma}]
		I canali DMA usati al momento.
	\item[\fn{/proc/filesystems}]
		I filesystem configurati nel kernel.
	\item[\fn{/proc/interrupts}]
		Gli interrupt in uso, e quanti ne sono stati chiamati di ciascuno.
	\item[\fn{/proc/ioports}]
		Le porte I/O in uso al momento.
	\item[\fn{/proc/kcore}]
		Un'immagine della memoria fisica del sistema, della stessa dimensione della memoria fisica; non occupa così tanta memoria, ma viene generata in tempo reale quando i programmi vi accedono (ricordate: a meno che non lo copiate da qualche altra parte, nessun file sotto \fn{/proc} occupa spazio disco).
	\item[\fn{/proc/kmsg}]
		Messaggi di output del kernel. Vengono mandati anche a \cmd{syslogd}.
	\item[\fn{/proc/ksyms}]
		La tabella dei simboli per il kernel.
	\item[\fn{/proc/loadavg}]
		La `media del carico' (load average) del sistema: tre indicatori senza significato di quanto lavoro deve fare il sistema in ciascun momento.
        \item[\fn{/proc/meminfo}]
		Informazioni sull'uso della memoria, sia fisica che di swap.
        \item[\fn{/proc/modules}]
		Quali moduli del kernel sono caricati al momento.
	\item[\fn{/proc/net}]
		Informazioni di stato sui protocolli di rete.
	\item[\fn{/proc/self}]
		Un link simbolico alla directory dei processi del programma che sta guardando in \fn{/proc}. Quando due processi guardano in \fn{/proc}, ottengono link diversi. \`E più che altro conveniente per facilitare ai programmi il raggiungimento della loro directory dei processi.
	\item[\fn{/proc/stat}]
		Varie statistiche sul sistema, come il numero di page fault da quando è stato avviato.
	\item[\fn{/proc/uptime}]
		Il tempo per cui il sistema è stato attivo.
	\item[\fn{/proc/version}]
		La versione del kernel.
	\end{dispitems}
		%
	Notate che mentre i file descritti qui sopra tendono ad essere file di testo leggibili facilmente, a volte possono essere formattati in modo da non essere facilmente digeribili. Ci sono molti comandi che fanno poco più che leggere questi ultimi file per poterli capire meglio. Ad esempio, il programma \cmd{free} legge \fn{/proc/meminfo}, e converte le quantità date in byte a kilobyte (ed aggiunge anche altre informazioni).

