
La "vita'' dei file in un sistema GNU/Linux
Il file system è soggetto a mutamenti continui e in costante evoluzione ma il kernel sa sempre cosa accade e agisce di conseguenza. Scopri come
(pagina 1 di 10)
Il concetto di file è fondamentale in tutti
i sistemi operativi. In particolare lo è
in quelli Unix, o derivati come GNU/
Linux. In pratica, rappresenta l’entità
fondamentale attraverso la quale il sistema
riesce ad eseguire le operazioni fondamentali.
È ovvia, quindi, la necessità di dover
monitorare in tempo reale i file, tracciandone
i cambiamenti per poi poter agire di conseguenza.
Ad esempio, per un software di ricerca come Beagle
questo aspetto è fondamentale. Immaginate cosa succederebbe
se ogni volta che un file presente all’interno del file system subisce
una modifica il programma dovesse indicizzare nuovamente
tutto il contenuto del disco. Sarebbe uno spreco inutile di tempo
e risorse. Ma per fortuna, il sistema operativo dispone di uno
strumento in grado di “intercettare” i cambiamenti e comunicarli
tempestivamente ai programmi. In particolare, nel caso del kernel
Linux esiste da tempo una prima soluzione chiamata dnotify
per la gestione di questo aspetto; dnotify ha però delle grosse
limitazioni, infatti, è ancora presente nel kernel solo per garantire
il buon funzionamento di vecchi
programmi e di parti del kernel stesso
che ne fanno ancora uso. Oggi la scelta
d’elezione per questo tipo di problematica
è inotify ovvero il nuovo
sistema di notifica automatica degli
eventi che subiscono i file. Inotify
è incluso nel kernel dalla versione
2.6.13 in poi; senza entrare troppo nel
dettaglio elenchiamo alcune importanti differenze tra dnotify e
inotify e i principali vantaggi dell’utilizzo di quest’ultimo:
- inotify non richiede che il file da controllare sia aperto e ciò, oltre a
ridurre il numero dei cosiddetti file descriptor utilizzati e mantenerlo
al di sotto dei limiti di sistema, permette di monitorare anche i file su
supporti removibili senza impedirne l’eventuale rimozione;
- con inotify il kernel non si serve dei segnali per comunicare i
cambiamenti sui file ma li notifica utilizzando un particolare file
descriptor. Questo facilita la gestione in tempo reale degli eventi, in
generale difficoltosa tramite i segnali ma agevole se si possono usare
le system call (chiamate di sistema) di tipo select e poll;
- inotify permette di monitorare il singolo file (la “ i” sta per inode)
mentre la granularità di dnotify non va oltre la directory (la “d” indica
directory) costringendo il programmatore a costruirsi un meccanismo
di cache per individuare il file coinvolto nel cambiamento.
L’argomento come potete vedere è abbastanza complesso, ma è
fondamentale capirne la dinamica per comprendere il funzionamento
del sistema operativo e come questo risponde agli eventi.
Requisiti da soddisfare
Come accennato nel paragrafo precedente, dalla versione 2.6.13,
inotify è incluso nei sorgenti ufficiali del kernel. Per utilizzarne i
servizi basta abilitare la voce CONFIG_INOTIFY nel file di
configurazione. Tramite lo strumento di configurazione del kernel
(make menuconfig) basta optare per le seguenti scelte:
File systems --->
[*] Inotify file change notification support
[*] Inotify support for userspace
A questo punto il kernel così compilato è pronto ad offrire i servizi
della piattaforma inotify tramite interfacciamento di basso livello
ovvero programmi C che utilizzano particolari system call.
Ovviamente, se utilizzate il comando make xconfig per configurare
il kernel, l’opzione per abilitare inotify è accessibile dalla
voce File systems.
 |
Configurazione di inotify nel kernel Linux |
 |
Una fase della configurazione di base di logsend |
I programmi necessari
Esistono molti pacchetti software che utilizzano i servizi di inotify e
permettono un utilizzo più agevole di tale infrastruttura del kernel
laddove
sia richiesto il monitoraggio in tempo reale dei file. Possiamo
suddividere le applicazioni in più categorie:
- binding o wrapper per sviluppatori. Sono particolari librerie
che permettono un interfacciamento con linguaggi di livello più
alto o linguaggi script. Tra questi troviamo: inotify-cxx
(C++),Linux::Inotify2 (Perl), Pyinotify (Python), JNotify (Java), Ocaml
Inotify (Ocaml);
- programmi veri e propri che danno soluzioni a necessità ben precise,
tra i quali: inotify-tools, incron, logsend, inotail, IWatch, mswatch.
Nel corso dell’articolo analizzeremo alcuni di questi programmi
utilizzando
come sistema di riferimento una distro Debian GNU/Linux.