L’albero dei file ed il Filesystem Hierarchy Standard
Oltre al kernel e alla shell, l’altro componente principale di qualsiasi sistema operativo è il filesystem. Per l’utente, un filesystem è una gerarchia di directory e file con la directory root / nella parte superiore dell’albero delle directory. Per il sistema operativo, un filesystem è una struttura creata su una partizione del disco costituita da tabelle che definiscono le posizioni di directory e file. In questo corso, imparerai a conoscere i diversi file system Linux, i vantaggi del file system e come creare e gestire i file system utilizzando comandi come fsck, mount e altri comandi di gestione del disco e del file system.
Una delle caratteristiche peculiari di un sistema unix-like e che l’albero delle directory e’ unico; non esistono cioe i vari dischi (o volumi) che si possono trovare in altri sistemi, come su Windows, sul MacOS o sul VMS.
All’avvio il kernel monta quella che si chiama la directory radice (o root directory) dell’albero, che viene indicata con \/“, tutti i restanti dischi, il CDROM e qua-lunque altro dispositivo contenente le, verranno poi montati successivamente in opportune sotto-directory della radice
Un esempio di questa struttura ad albero, che al contempo ci mostra anche i contenuti delle directory principali, puo essere ottenuto con il comando tree.
Se chiamato senza parametri questo comando mostra l’albero completo a partire dalla directory corrente, scendendo in tutte le directory sottostanti; usando l’opzione -L si puo specificare il numero massimo di livelli a cui scendere, per cui andando su / avremo qualcosa del tipo:
piccardi@hain:~$ tree –charset=ASCII -L 2 /
e questo ci mostra il contenuto sommario dei primi due livelli dell’albero, con un esempio dei file e delle sottodirectory presenti in una versione di test di Debian (Wheezy).
L’organizzazione dell’albero delle directory e’ standardizzata in maniera molto accurata da un documento che si chiama Filesystem Hierarchy Standard (abbreviato in FHS), preso come riferimento da tutte le distribuzioni.
Lo standard descrive in dettaglio la struttura dell’albero delle directory e il relativo contenuto, prevedendo una divisione molto rigorosa che permette una notevole uniformità anche fra distribuzioni diverse; si organizzano così in maniera meticolosa ed ordinata dati, programmi, le di configurazione, documentazione, file degli utenti, ecc.
Directory | Contenuto |
/bin | comandi essenziali. |
/boot | file statici necessari al bootloader. |
/dev | file di dispositivo. |
/etc | file di con gurazione della macchina. |
/lib | librerie essenziali e moduli del kernel. |
/media | mount point per dispositivi rimovibili. |
/mnt | mount point montaggi temporanei. |
/opt | pacchetti software addizionali. |
/run | dati di run-time volatili. |
/sbin | comandi di sistema essenziali. |
/srv | dati per i servizi forniti dal sistema. |
/tmp | file temporanei. |
/usr | gerarchia secondaria. |
/var | dati variabili. |
In particolare le directory vengono suddivise sulla base di alcuni criteri fondamentali.
Il primo e quello della possibilità di contenere le il cui contenuto puo essere modificato (nel qual caso il filesystem che le contiene deve essere montato in lettura/scrittura) o meno (nel qual caso il filesystem puo essere montato in sola lettura).
Il secondo e quello della possibilita di contenere le come i programmi di sistema che possono essere condivisi (ad esempio utilizzando un lesystem di rete) fra piu stazioni di lavoro o le che invece sono locali e speci ci alla macchina in questione.
Il terzo criterio e quello di contenere o meno comandi o le (con gurazioni e le di dispositivo) che sono necessari all’avvio del sistema, e che pertanto devono essere situati sul lesystem usato per la directory radice, dato che essi non sarebbero disponibili se posti in lesystem diversi che possono essere montati solo dopo che il sistema e partito.
Lo standard prevede che debbano essere necessariamente presenti le sottodirectory di / mentre altre sono obbligatorie soltanto qualora si siano installati i sottosistemi a cui essi fanno riferimento (utenti, /proc lesystem, diversi formati binari).
Un elenco delle specifiche delle caratteristiche e del contenuto di ciascuna delle sottodirectory di / e riportato di seguito; per alcune di esse, come /usr e /var, sono previste delle ulteriori sotto-gerarchie che de niscono ulteriori dettagli dell’organizzazione dei le. Si e aggiunto all’elenco anche la directory /run, che pur non essendo prevista dal FHS e stata adottata da tutte le distribuzioni piu recenti.
/bin
Contiene i comandi essenziali del sistema (usati sia dall’amministratore che dagli utenti, come ls), che devono essere disponibili anche quando non ci sono altri lesystem montati oltre la radice, ad esempio all’avvio o quando si e in single user mode
Directory | Contenuto | ||
/lib<qual> | librerie in formati alternativi. | ||
/home | home directory degli utenti. | ||
/root | home directory dell’amministratore. | ||
/proc | filesystem virtuale con informazioni su processi | ||
e caratteristiche del sistema. | |||
/sys | filesystem virtuale con informazioni su driver | ||
e dispositivi |
Non deve avere sottodirectory e non puo stare su un lesystem diverso da quello della radice.
/boot
Contiene tutti i le necessari al procedimento di boot (immagini del kernel, del bootloa-der, ramdisk, ecc.) eccetto i le di con gurazione ed i programmi per l’impostazione del procedimento stesso, che vanno in /sbin. Puo stare su qualunque lesystem purche visibile dal bootloader
/dev
Contiene i file di dispositivo, che permettono l’accesso alle periferiche. Originariamen-te doveva stare sullo stesso filesystem della radice, dato che i file di dispositivo sono necessari alla procedura di avvio. Oggi il contenuto e nella maggior parte dei casi generato dinamicamente ed e montata su un filesystem temporaneo che viene popolato in fase di avvio tramite udev
/etc
Contiene i file di configurazione del sistema e gli script di avvio. Non deve contenere programmi binari e non può stare su un filesystem diverso da quello della radice. I file possono essere raggruppati a loro volta in directory; lo standard prevede solo che, qualora siano installati, siano presenti le directory /etc/opt (per i pacchetti opzionali), /etc/X11 (per la configurazione di X Window, e /etc/sgml e /etc/xml (per la configurazione di SGML e XML).
/home
Contiene le home directory degli utenti, la sola parte del filesystem (eccetto /tmp e /var/tmp) su cui gli utenti hanno diritto di scrittura, che viene usata per mantenere i loro le personali. Puo essere montata su qualunque filesystem.
/lib
Contiene le librerie condivise essenziali, usate dai programmi di /bin e /sbin, e deve essere sullo stesso filesystem della radice. Qualora sia stato installato un kernel modulare i moduli devono essere installati in /lib/modules.
/media
Contiene i mount point per i dispositivi rimovibili, come CDROM, oppy, chiavette USB, dischi USB o Firewire, ecc. Nelle distribuzioni meno recenti i oppy ed i CDROM hanno delle directory dedicate, ma con l’introduzione di meccanismi di rilevazione automatica dei dispositivi rimovibili e stata definita questa directory all’interno della quale vengono create le opportune sotto-directory su cui poi essi vengono montati un maniera automatica.
/mnt
Contiene i mount point per i montaggi temporanei ad uso dell’amministratore di sistema; i filesystem di periferiche permanenti con supporti rimovibili come i floppy o il CDROM che prima venivano tenuti sia in questa directory che direttamente sotto / devono essere spostati sotto /media. Normalmente e vuota e deve essere creata direttamente sotto la radice.
/opt
Contiene eventuali pacchetti software aggiuntivi. Può essere su qualunque filesystem. Un pacchetto deve installarsi nella directory /opt/package dove package e il nome del pacchetto. All’amministratore e riservato l’uso di alcune directory opzionali: /opt/bin, /opt/doc, /opt/include, /opt/info, /opt/lib e /opt/man. File variabili attinenti ai suddetti pacchetti devono essere installati in /var/opt ed i file di configurazione in /etc/opt, nessun file attinente ai pacchetti deve essere installato al di fuori di queste directory.
/proc
E il mount point standard del lesystem virtuale proc. Questo e un filesystem speciale che permette di accedere a tutta una serie di variabili interne al kernel (relative a parametri e impostazioni di tutti tipi) con l’interfaccia dei file. Così se si vogliono informazioni sugli interrupt ed i canali di DMA utilizzati dal sistema si potranno leggere i le /proc/interrupts e /proc/dma, mentre si potranno impostare varie caratteristiche del sistema scrivendo nei le sotto /proc/sys
/root
E’ la home directory dell’amministratore. Di norma la si mantiene nello stesso filesystem della radice; il suo uso e opzionale ma questa e la collocazione consigliata.
/run
Presente solo nelle distribuzioni piu recenti, viene utilizzata per mettere a disposizione fin dall’avvio una directory su cui viene montato un filesystem temporaneo e su cui sono mantenuti i cosiddetti dati di run-time volatili (come i file che registrano i PID dei programmi di servizio, i file di lock ed altri le il cui utilizzo attiene principalmente all’esecuzione di programmi) di cui non serve il mantenimento attraverso un riavvio. La directory consente di avere un posto dove anche i programmi lanciati all’avvio possono mantenere i loro dati, dato che in generale /var/run e /var/lock possono non essere disponibili quando /var viene mantenuta su un lesystem separato. Consente anche di unificare in un’unica directory e su un unico filesystem temporaneo tutti questi dati, dato che se viene utilizzata il contenuto di /var/run e /var/lock viene riportato al suo interno.
/sbin
Contiene i programmi essenziali ad uso dell’amministratore del sistema (come init o fsck). Deve stare sullo stesso filesystem della radice. Vanno messi in questa directory solo i programmi essenziali per l’avvio del sistema, il recupero e la manutenzione dei filesystem.
/srv
E stata introdotta per mantenervi i dati relativi ai vari servizi che possono essere stati installati su una macchina (come ad esempio le pagine servite da un web server) che in precedenza venivano installati direttamente sotto /var. Non ne e definita una ulteriore suddivisione, ma in genere si tende a creare una sottodirectory per ciascun servizio (ad esempio www, svn, ecc.).
/tmp
La directory viene usata per mantenere le temporanei. Viene cancellata ad ogni riavvio, ed i programmi non devono assumere che i file siano mantenuti fra due esecuzioni successive.
/usr
E la directory principale che contiene tutti i programmi, i file ed i dati non variabili, che possono anche essere condivisi fra piu stazioni di lavoro. Può essere montata su un filesystem separato rispetto a / e può essere montata in sola lettura, anche se questa scelta potrebbe rendere problematico l’uso di alcuni ambienti. Prevede una ulteriore gerarchia di directory in cui i vari le vengono organizzati; lo standard richiede obbligatoriamente le seguenti:
bin
Contiene i programmi usati dall’utente installati direttamente dal sistema (o dalla distribuzione originale). Non può essere ulteriormente suddivisa;
include
Contiene tutti i file di dichiarazione delle funzioni di libreria usati dal compilatore e dai programmi C e C++;
lib
Contiene le librerie, file oggetto e binari relativi ai programmi di bin e sbin. Può contenere sottodirectory con tutti i le relativi a singoli programmi;
local
Contiene una replica della gerarchia di /usr dedicata ai file installati localmente dall’amministratore. In genere qui vengono installati i programmi compilati dai sorgenti e tutto quello che non fa parte della distribuzione ufficiale;
sbin
Contiene i programmi per la gestione di sistema ad uso dell’amministratore non essenziali all’avvio;
share
Contiene una gerarchia in cui sono organizzati tutti i le e i dati che non dipendono dall’architettura hardware: sono sempre obbligatori man per le pagine di manuale, e misc; se installati vi si possono trovare anche una serie di altre directory come: dict per i dizionari, doc per la documentazione, games per i dati statici dei giochi, info per i le del relativo sistema di help terminfo per il database con le informazioni sui terminali, zoneinfo per i dati relativi ai fusi orari (per l’elenco completo si consulti il sito citato). Deve essere posto dentro misc tutto quello che non viene classi cato nelle altre directory opzionali; mentre sono obbligatorie solo se i relativi pacchetti sono installati, le seguenti directory:
X11R6
Conteneva la gerarchia dei le relativi ad X Window dalla versione 7.0 di X.org e stata rimossa;
games
Contiene i binari dei giochi;
src
Contiene i sorgenti dei pacchetti, per riferimenti, ed e opzionale;
/var
Contiene i le variabili: le directory di spool, i file di log, i dati transienti e temporanei, in modo che /usr possa essere montata in sola lettura. E preferibile montarla in un lesystem separato; alcune directory non possono essere condivise. Anche in questo caso i le sono organizzati in una ulteriore gerarchia standardizzata che prevede la presenza delle seguenti sottodirectory:
cache
Contiene dati di appoggio e memorizzazione temporanea per le applicazioni;
lib
Contiene informazioni di stato e dati delle applicazioni;
local
Contiene dati variabili relativi ai pacchetti di /usr/local;
lock
Contiene file di lock, se si usa /run e un collegamento simbolico a /run/lock;
log
Contiene file di log delle applicazioni
opt
Contiene file variabili per i pacchetti di /opt;
spool
Directory per le code contenenti i dati in transito delle applicazioni (lavori di stampa, posta elettronica, ecc.);
tmp
File temporanei non cancellati al riavvio del sistema; a queste si aggiungono tradizionalmente altre directory, come /var/backups, /var/cron, ecc. non indicate dallo standard.
L’importanza del Filesystem Hierarchy Standard diventa evidente quando si vanno ad esaminare le strategie di partizionamento dei dischi In tal caso infatti occorrerà stabilire quali directory dovranno restare sul filesystem usato come radice, e quali altre directory si potranno disporre su altre partizioni o altri dischi.
E evidente infatti che alcune directory (come /usr ed /opt) possono essere mantenute su partizioni e lesystem diversi rispetto alla directory radice.
Può risultare pertanto utile separare queste due directory che, contenendo le comuni di norma identici per le diverse installazioni, possono essere montate in sola lettura e non inserite nei backup (in quanto e possibile sempre ripristinarle dall’installazione), o addirittura montate via rete e condivise fra più macchine.
La situazione e invece del tutto diversa per directory come /home e /var. Anche in questo caso puo risultare utile separarle dalle altre directory, ma in questo caso e necessario l’accesso in scrittura e le informazioni variabili non saranno necessariamente condivisibili (ad esempio non lo sono /var/run e /var/lock che contengono informazioni sui processi locali). Inoltre essendo qui contenuti la gran parte dei dati del sistema (le altre directory sono solo /root per i le personali dell’amministratore e /etc per le con gurazioni) queste dovranno essere sottoposte a regolare backup.
Si tenga inoltre presente che alcune di queste directory (ad esempio /proc) devono essere lasciate vuote sul disco; esse infatti servono solo come riferimento per montare i relativi lesystem virtuali. Non ha quindi alcun senso e ettuare backup del contenuto di queste directory in quanto esse presentano solo una interfaccia di accesso (che permette pero l’uso dei normali comandi per i le) a variabili interne del kernel create dinamicamente.